Jump animation
红色为相较于上节新增的代码部分,本p主要讲解在unity中的动画器中创建混合树。来使得2D横版小人在跳起拥有一个动作,在跳起后下落的过程业拥有一个动作。
在上面创建的混合树之中,我们加入跳起动画和下落动画。并将混合树的参数设置为yVelocity,以便得知此时刚体的状态,当这个参数大于0时,激活跳跃动画,反之则反。
上图为动画器中的连接结构,如果此时我们位于地面(此时的isGrounded为true),当我们按下跳跃键的时候,isGrounded变为flase,连接传递的条件达成(上图右下角),图中的Any state会传入信息给Jump/Fall(也就是我们的混合树),激活刚体动作。
public class player : MonoBehaviour
{
private Rigidbody2D rb;
// rb目前处于未被初始化的状态,值为null,不能被调用,不指向任何对象。
private Animator anim;
[SerializeField]private float moveSpeed;
[SerializeField]private float jumpForce;
private float xInput;
private int facingDirection = 1;
private bool facingRight = true;
[Header("Collision info")]
[SerializeField] private float groundCheckDistance;
[SerializeField] private LayerMask whatIsground;
private bool isGrounded;
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponentInChildren<Animator>();
}
void Update()
{
Movement();
CheckInput();
CollisionCheck();
FlipController();
AnimatorControllers();
}
private void CollisionCheck()
// 如果 groundCheckDistance 碰到地面就是true,没有碰到地面是 flase
{
isGrounded = Physics2D.Raycast(transform.position, Vector2.down, groundCheckDistance, whatIsground);
}
private void CheckInput()
{
xInput = Input.GetAxisRaw("Horizontal");
// 设置 x 的输入,获得移动的机会
if (Input.GetKeyDown(KeyCode.Space))
// 如果输入 空格 就会进行跳跃
{
Jump();
}
}
private void Movement()
// 移动由 x 输入 和 移动速度控制
{
rb.velocity = new Vector2(xInput * moveSpeed, rb.velocity.y);
}
private void Jump()
// 跳跃由跳跃强度控制
{
if (isGrounded)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
}
private void AnimatorControllers()
// 动画控制器控制动画的播出
{
bool isMoving = rb.velocity.x != 0;
anim.SetFloat("yVelocity", rb.velocity.y);
anim.SetBool("isMoving", isMoving);
// 1.调用 Animator = anim 组件中的 SetBool 方法,将 isMoving 参数的值设置到 Animator 组件中
// 2.后面的 isMoving 这个变量的值将被传递给 SetBool 方法,用于设置 "isMoving" 参数的值
// 要求:player或者其子对象Animitor中必须有一个 Animator 的组件,并且Animator Controller中必须有一个名为 isMoving 的布
anim.SetBool("isGrounded", isGrounded);
}
private void Flip()
// 进行角色翻转
{
facingDirection = facingDirection * -1;
facingRight = !facingRight;
transform.Rotate(0, 180, 0);
}
private void FlipController()
// 角色翻转控制器
{
if (rb.velocity.x > 0 && !facingRight)
{
Flip();
}
else if(rb.velocity.x < 0 && facingRight)
{
Flip();
}
}
private void OnDrawGizmos()
{
Gizmos.DrawLine(transform.position, new Vector3(transform.position.x, transform.position.y - groundCheckDistance));
}
}