【Unity2DMobileGame

it2023-01-09  65

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 和FixedDurationTransition Duration设置为0添加conditions修改为less-0.1

如下图所示

2.3 修改跳跃的切换条件

目前在跳跃的过程中播放的也是移动的动画,修改相关的逻辑条件如下图:

Parameters添加布尔值jump用来判断当前player是否跳跃。修改run–>jump的切换条件为jump==true,取消勾选Has Exit Time 和FixedDuration,Transition Duration设置为0idle–>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设置为0run–>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); } }
最新回复(0)