July 30, 2024
Views : 👀

Unity出题-代码编写篇

前言

上一篇介绍了一下素材的设计工作,这里我们来实现逻辑

正篇

下面我们会部分介绍一下关键的功能代码

void start ()方法叫做生命周期函数,

1
2
3
4
5
6
7
8
9
10
11
//设计相应的变量
//动画组件
private Animator animator;
//是否在地面上
private bool isOnGround = false;

void Start()
{
//获取animator组件
animator = GetComponent<Animator>();
}

脚本部分展示

玩家行走

updata就是更新的意思,方法的实现就是每帧更新方法内的内容。这里展示一下updata函数里怎么样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void Update()
{
//获取玩家的左右键按键 -1,0,1 (a和d)
float h = Input.GetAxis("Horizontal");

if (h != 0)
{
//移动.方向 * 上一帧花费的时间*玩家按键
transform.Translate(transform.right*Time.deltaTime*h);
//这里实现的是人物的方向,为了让人物行走更加真实,方向判断根据上面的h
if (h<0)
{
GetComponent<SpriteRenderer>().flipX = false;
}

if(h>0)
{
GetComponent<SpriteRenderer>().flipX = true;
}

animator.SetBool("run",true);
}
else
{
animator.SetBool("run",false);
}


if(isOnGround && Input.GetKeyDown(KeyCode.W))
{
GetComponent<Rigidbody2D>().AddForce(Vector2.up*180);
}

}
}

这里的transform就是我们unity界面的这个窗口,直接通过上面的语法就可以实现人物的移动

img

animator.SetBool("run",true);语句就是联动我们上一篇讲到的参数 条件的设置,

这里的run就是我们设计play动画run的时候设置的bool参数,这里只要有位移的键盘输入,h的值就会非0,设置相关的动画。

设置跳跃动作,先使用GetComponent获取对应的刚体,然后施加一个向上的力,就实现了跳跃动作,这里最关键的就是isOnGround变量的值 是决定是否跳跃的条件,怎么改变这个值会在下面讲到

触碰互动(跳跃,死亡)

在unity中有一些特殊情况下调用的方法,如OnCollisionEnter2D,OnCollisionExit2D,OnTriggerEnter2D,下面这个就是当碰撞时就调用此方法,在这里我们就可以设计碰到敌人死亡和碰掉地面才跳跃的条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//碰撞则进入调用的方法
private void OnCollisionEnter2D(Collision2D collision)
{
//如果碰到标签为Ground的地面
if(collision.gameObject.tag == "Ground")
{
animator.SetBool("jump",false);
isOnGround = true;
}
else if(collision.gameObject.tag=="Enemy")
{
animator.SetTrigger("die");
GetComponent<Rigidbody2D>().AddForce(Vector2.up*150);
Destroy(GetComponent<CapsuleCollider2D>());
Invoke("GameOver",1f); //延迟多少秒触发这个函数
}
}

还有OnCollisionExit2D,就是和上面相反的,离开碰撞时触发的条件,[那么这个方法便是控制能否无限空气跳的关键函数,只要修改此处便可破解。]

1
2
3
4
5
6
7
private void OnCollisionExit2D(Collision2D collision) {
if(collision.gameObject.tag == "Ground")
{
animator.SetBool("jump",true);
isOnGround = false;
}
}

关卡逻辑

上面还提到了OnTriggerEnter2D函数,这个函数是只要碰到就触发,我们在这里实现player的进入下一关卡的逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void OnTriggerEnter2D(Collider2D collision) {

//碰到flag进入下一关
if(collision.gameObject.tag == "flag")
{ //记录我们设置当前的而关卡数 ,比如当前在第一关时,index的值是0
int current_Level = SceneManager.GetActiveScene().buildIndex;
//这里记录了关卡的总数,这里判断到最后一关之后,我们就返回第一关0
if (current_Level == SceneManager.sceneCountInBuildSettings-1)
{
SceneManager.LoadScene(0);
}else
{//其他情况就让当前关卡加一
SceneManager.LoadScene(current_Level+1);
}
}

}

这里要注意的是 我们首先要设置物体tag为‘flag’其次,还要添加组件选中是触发器

img

敌人死亡

我们首先在最上面设置了敌人是否死亡的标志位,在这里会用到,每当条件触发时,即标签为player的刚体触发了我们相应的位置,那么变死亡,写这里的触发器和上面的flag设计相似我们在一个物体上设计了两个box collider,头部是玩家可以踩到的地方,那么设置为小一点的触发器,玩家一旦从侧面或者正面接触,都会死亡。

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.tag == "Player")
{
//播放死亡动画
animator.SetTrigger("die");
AudioManager.Instance.Play(2);
//制作死亡效果(压扁之类的)
//transform.position = new Vector3(transform.position.x, transform.position.y,0);
//改变死亡的flag
isDie = true;
//创建一个列表
BoxCollider2D[] collider2Ds;
//向列表中存储元素
collider2Ds = GetComponents<BoxCollider2D>();
//for循环依次摧毁我们上面的俩boxcollider
foreach (var item in collider2Ds)
{
Destroy(item);
}
//把创建的这个物件也摧毁 这里实现的就是物体不会再触发任何的效果 以防尸体还在,我们却死亡了
Destroy(GetComponent<Rigidbody2D>());
//把这个敌人画面摧毁
Destroy(gameObject,0.7f);



}
}

摄像机跟踪

在这里设置了min和max之后,就可以在unity可视化界面去修改对应的值,我们先把这个脚本组件给摄像机物体

img

记得选中我们要跟踪的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Transform Player;
public float MaxX;

public float MinX;
// Start is called before the first frame update


// Update is called once per frame
void Update()
{
Vector3 newPos = new Vector3(Player.position.x, transform.position.y, transform.position.z);
newPos.x = Mathf.Clamp(newPos.x,MinX,MaxX);

transform.position = newPos;
}

音效加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static AudioManager Instance;  //设置单例
private AudioSource audioSource;
public AudioClip[] audioClips;
// Start is called before the first frame update
void Awake() {
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
audioSource = GetComponent<AudioSource>();
}else
{
Destroy(gameObject);
}
}

public void CheckBG()
{
if(audioSource.isPlaying==false)
{
audioSource.Play();
}
}

public void Play(int index,bool bgOver = false)
{
if(bgOver)
{
audioSource.Stop();
}
audioSource.PlayOneShot(audioClips[index]);
}

将一系列的脚本加载之后,我们的人物就可以动起来了,我们的游戏就算是基本设置完成了。下一篇就是系列的最后一篇文章了,重点会讲到从逆向出题角度,去了解unity系列的题目。

微信
Thank U 🐟

About this Post

This post is written by xianyuuuan, licensed under CC BY-NC 4.0.