1.添加Player各状态的动画
为游戏人物添加动画之前需要选中需要添加动画的物体。这里为player创建动画player_idle来添加游戏主人公闲置状态的动画。
当前的动画播放是稍快的,修改采样率为20,表示1秒内为20帧。
以上面描述的的方式为游戏人物添加跑步、跳跃、落地等动画。
当为一个游戏物体创建动画之后会自动添加一个controller与游戏物体同名。
在window-Animation-Animator下可以看到创建的动画的片段。
如图黄色的默认线是播放player_idle,但在游戏启动后,并不会根据操作来变更动画的效果。
2.动画控制器状态
2.1 修改动画循环
Loop Time指的是东环循环,游戏人物处于闲置和跑步状态下动画是需要进行循环播放的,但是跳跃,落地以及着陆的动画是不可以循环,否则当进行跳跃操作,游戏人物处于半空中的时候,跳跃的动画也会一直播放,所以只能进行1此播放,直到播放下一个动画。
2.2 制作idle和run的动画切换
点击player_idle右键选择Make Transition创建一个切换到player_run(在状态机里表示为一条带有箭头的线,需要手动连接到player_run)使动画可以从闲置状态切换到跑步状态。
此时,就已经创建好了Transition。
点击箭头可以进一步调整切换的条件以及转换的时间,而切换的条件是需要在左侧的窗口(Parameters)创建的。 条件可以创建浮点型、条件型、整型和触发型。
从idle的状态切换到run状态用速度来判断,如果速度大于0.1,说明物体已经开始移动了,就播放跑步的状态,如果小于0.1趋于0,就播放闲置的状态。
关于idle切换run参数的设定
Has Exit Time 是否有退出时间,如果勾选了的话,两个动画切换的时间点就会在头一个动画播放到80%。⚠️Exit Time的参数是百分比的意思,如果是1就代表需要完全播放完当前动画才会切换到另一个动画,因为idle是循环播放的,所以在这里不需要等到idle播放完,而是需要在任何一个时间点只要按下键盘移动就会切换到run动画。所以取消勾选Has Exit Time和FixedDuration并且需要把过渡时间TransitionDuration设置为0(即刻转换不需要动画时间)。
在下面的conditions添加切换条件,设置为0.1。表示大于0.1切换。
同理run切换idle
- Make Transition
- 取消勾选Has Exit Time 和FixedDuration
- Transition Duration设置为0
- 添加conditions修改为less-0.1
如下图所示
2.3 修改跳跃的切换条件
目前在跳跃的过程中播放的也是移动的动画,修改相关的逻辑条件如下图:
- Parameters添加布尔值jump用来判断当前player是否跳跃。
- 修改run–>jump的切换条件为
jump==true,取消勾选Has Exit Time 和FixedDuration,Transition Duration设置为0 - idle–>jump的切换条件同样为jump==true,取消勾选Has Exit Time 和FixedDuration,Transition Duration设置为0
跳跃切换到下落,或者原地移动切换到下落,需要考虑用一个float数值来检测纵向的力的方向。所以添加一个float型Parameters命名为velocityY,如果小于0就切换到下落效果。
- 修改jump–>fall 切换条件为
velocityY--less--0.1,取消勾选Has Exit Time 和FixedDuration,Transition Duration设置为0 - run–>fall同理切换条件
velocityY--less--0,取消勾选Has Exit Time 和FixedDuration,Transition Duration设置为0
下落到着落需要一个bool的判断条件,这个布尔值判断是否落地,它与上一节中的玩家是否在地面的物理检测是一样的,只需要检测是否在地面就可以判断是否已经下落到地面。添加bool型Parameters名为ground。修改fall–>ground的参数ground==true,取消勾选Has Exit Time 和FixedDuration,Transition Duration设置为0。
最后的ground切换到idle其实不需要什么条件,应该在动画播放结束就切换到idle。前面也设置了ground不进行循环播放,那么设置的时候把Exit Time设置为1表示百分百播放。过渡时间改为0。
2.4 通过代码来实现动画切换
public class PlayerAnimation : MonoBehaviour
{
private Animator anim;
private PlayerController controller;
// 获取刚体用于得到物体的x,y轴移动
private Rigidbody2D rb;
void Start()
{
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
controller = GetComponent<PlayerController>();
}
void Update()
{
anim.SetFloat("speed", Mathf.Abs(rb.velocity.x)); // 需要使用绝对值,左移是一个-1~0的值
anim.SetFloat("velocityY", rb.velocity.y);
// 是否跳跃和是否落地可以通过PlayerController中的isJump和isGround来进行判断
anim.SetBool("jump", controller.isJump);
anim.SetBool("ground", controller.isGround);
}
}