学习目标:
实现人物跳跃二段跳以及掉落的动画和代码
参考视频:秦无邪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<Animator>();
boxcollid2D = GetComponent<BoxCollider2D>();
rb2D = GetComponent<Rigidbody2D>();
}
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