实现人物跳跃二段跳以及掉落的动画和代码
参考视频:秦无邪OvO的个人空间_哔哩哔哩_Bilibili
上一篇文章:CSDN
学习Idle,Walk,Jump的切换:首先先实现Idle,Walk,Jump的切换,需要现在ProjectSetting上找到这个Jump
然后再Animator动画系统中创建四个条件
接着再加入每个Animation的Condition中,它们都不需要等待时间
再代码中封装一个叫SwitchAnimation的方法,再用一个地面检测的方法
void CheckOnGround() { isGround = boxcollid2D.IsTouchingLayers(LayerMask.GetMask("Ground")); }
并在Jump中先添加
void Jump() { if (Input.GetButtonDown("Jump")) { if (isGround) { myAnim.SetBool("Jump", true); Vector2 jumpVel = new Vector2(0, jumpSpeed); rb2D.velocity = Vector2.up * jumpVel; } } }
切换动画
void SwitchAnimation() { myAnim.SetBool("Idle", false); if (myAnim.GetBool("Jump")) { if(rb2D.velocity.y < 0.0f) { myAnim.SetBool("Jump", false); myAnim.SetBool("Fall", true); } } else if(isGround) { myAnim.SetBool("Fall", false); myAnim.SetBool("Idle", true); } }
实现二段跳:
下面来实现一个二段跳的动画
首先要有个DoubleJump,DoubleFall的动画(我DoubleFall和Fall的动画是一样的,二段跳我用了帝王之翼的动画)
加多两个条件,然后其它Transition和第一段是一样的。
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class PlayerController : MonoBehaviour { public float walkSpeed; public float jumpSpeed; public float doubleJumpSpeed;
private Animator myAnim; private BoxCollider2D boxcollid2D; private Rigidbody2D rb2D;
private bool isGround = false; private bool canDoubleJump = false; void Start() { myAnim = GetComponent(); boxcollid2D = GetComponent(); rb2D = GetComponent(); }
void Update() { CheckOnGround(); Flip(); Walk(); Jump(); SwitchAnimation(); } void CheckOnGround() { isGround = boxcollid2D.IsTouchingLayers(LayerMask.GetMask("Ground")); } void Flip() { // Mathf.Epsilon是一个很小的浮点值 bool isPlayerHasXAxis = Mathf.Abs(rb2D.velocity.x) > Mathf.Epsilon; //如果x轴上有速度 if (isPlayerHasXAxis) { //如果速度的方向是向右 if(rb2D.velocity.x > 0.1f) { transform.localRotation = Quaternion.Euler(0, 0, 0); } //如果速度的方向是向左 if (rb2D.velocity.x < -0.1f) { transform.localRotation = Quaternion.Euler(0,180, 0); } } } void Walk() { float moveDir = Input.GetAxis("Horizontal"); Vector2 playerVel = new Vector2(moveDir * walkSpeed, rb2D.velocity.y); rb2D.velocity = playerVel; bool isPlayerHasXAxis = Mathf.Abs(rb2D.velocity.x) > Mathf.Epsilon; //true则向右,false则向左 myAnim.SetBool("Walk", isPlayerHasXAxis); }
void Jump() { if (Input.GetButtonDown("Jump")) { //如果在地面上 if (isGround) { myAnim.SetBool("Jump", true); Vector2 jumpVel = new Vector2(0, jumpSpeed); rb2D.velocity = Vector2.up * jumpVel; //将可以doublejump设置为true canDoubleJump = true; } else { if (canDoubleJump) { myAnim.SetBool("DoubleJump", true); Vector2 doubleJumpVel = new Vector2(0, doubleJumpSpeed); rb2D.velocity = Vector2.up * doubleJumpVel; canDoubleJump = false; } } } } void SwitchAnimation() { myAnim.SetBool("Idle", false); if (myAnim.GetBool("Jump")) { if(rb2D.velocity.y < 0.0f) { myAnim.SetBool("Jump", false); myAnim.SetBool("Fall", true); } } else if(isGround) { myAnim.SetBool("Fall", false); myAnim.SetBool("Idle", true); }
if (myAnim.GetBool("DoubleJump")) { if (rb2D.velocity.y < 0.0f) { myAnim.SetBool("DoubleJump", false); myAnim.SetBool("DoubleFall", true); } } else if (isGround) { myAnim.SetBool("DoubleFall", false); myAnim.SetBool("Idle", true); } } }别忘了设置Player上的参数
实际效果:
要想清楚各个动画之间的关系,是否要停留时间,还要设置好条件,
同时代码中,也要有bool类型来判断是否可以二段跳,二段跳后不能再跳跃,跳跃同样要站在Ground的Layer层上才允许跳跃,膨胀检测IsTouchingLayer,利用跳跃到最高点后速度小于0来判断动画到下落的条件
myAnim.SetBool("条件名", bool值);来给条件名设置bool