Session16:Animation Events动画事件
解决问题
首先有一个问题,就是人物从高处下落的时候不是falling动画,我们需要在 SwitchAnimation()
里添加以下语句
if(rb.velocity.y < 0.1f && !coll.IsTouchingLayers(ground))
{
animator.SetBool("falling", true);
}
只要人物没有接触地面并且y轴速度小于0.1,就切换为falling动画
Animation Event
依旧仿照之前的方法,为青蛙创建idle和jump的动画效果,并创建状态机的转换,设置过渡条件

添加代码:
private Animator animator;
void Movement()
{
if(faceLeft)
{
if(coll.IsTouchingLayers(ground))
{
animator.SetBool("jumping", true);
rb.velocity = new Vector2(-speed, jumpSpeed);
}
if(transform.position.x < leftx)
{
transform.localScale = new Vector3(-1, 1, 1);
faceLeft = false;
}
}
else
{
if (coll.IsTouchingLayers(ground))
{
animator.SetBool("jumping", true);
rb.velocity = new Vector2(speed, jumpSpeed);
}
if (transform.position.x > rightx)
{
transform.localScale = new Vector3(1, 1, 1);
faceLeft = true;
}
}
}
相较于之前的改动是:
因为青蛙要跳动,所以要添加一个y轴方向的速度。
但这样写青蛙一直接触地面,就会一直处于jumping的状态,没法回到idle,所以我们需要新的方法来解决这个问题,让每次跳完都回到idle状态,我们需要用到Aniamtion Event,在Animation界面可以找到,点击add event,右边就会出现一个小东西
我们可以挪动event的位置,并可在右侧设置想要执行的函数,我们想要执行Movement(),把它添加进去

这样青蛙每一次执行了idle的动画之后,就会自动调用Movement()函数,进行一次jump。
最后添加一个切换动画的函数:
void SwitchAnimator()
{
if (animator.GetBool("jumping"))
{
if(rb.velocity.y < 0.1f)
{
animator.SetBool("jumping", false);
animator.SetBool("falling", true);
}
}
if (coll.IsTouchingLayers(ground) && animator.GetBool("falling") )
{
animator.SetBool("falling", false);
}
}
在Update()里调用就可以了。