前言 上一篇介绍了一下素材的设计工作,这里我们来实现逻辑
正篇 下面我们会部分介绍一下关键的功能代码
void start ()方法叫做生命周期函数,
1 2 3 4 5 6 7 8 9 10 11 private Animator animator; private bool isOnGround = false ; void Start () { 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 (){ float h = Input.GetAxis("Horizontal" ); if (h != 0 ) { transform.Translate(transform.right*Time.deltaTime*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界面的这个窗口,直接通过上面的语法就可以实现人物的移动
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 ) { 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 ) { if (collision.gameObject.tag == "flag" ) { int current_Level = SceneManager.GetActiveScene().buildIndex; if (current_Level == SceneManager.sceneCountInBuildSettings-1 ) { SceneManager.LoadScene(0 ); }else { SceneManager.LoadScene(current_Level+1 ); } } }
这里要注意的是 我们首先要设置物体tag为‘flag’其次,还要添加组件选中是触发器
敌人死亡 我们首先在最上面设置了敌人是否死亡的标志位,在这里会用到,每当条件触发时,即标签为player的刚体触发了我们相应的位置,那么变死亡,写这里的触发器和上面的flag设计相似我们在一个物体上设计了两个box collider,头部是玩家可以踩到的地方,那么设置为小一点的触发器,玩家一旦从侧面或者正面接触,都会死亡。
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 ); isDie = true ; BoxCollider2D[] collider2Ds; collider2Ds = GetComponents<BoxCollider2D>(); foreach (var item in collider2Ds) { Destroy(item); } Destroy(GetComponent<Rigidbody2D>()); Destroy(gameObject,0.7f ); } }
摄像机跟踪 在这里设置了min和max之后,就可以在unity可视化界面去修改对应的值,我们先把这个脚本组件给摄像机物体
记得选中我们要跟踪的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public Transform Player; public float MaxX; public float MinX; 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;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系列的题目。