unity 动画系统简单教程
demo仓库
https://github.com/wyy5552/lifecycle
前言
unity动画根据使用方式划分,分为两种:一种是Animation,一种是Animator。其中Animation可以实现一些基本的动画操作,如果要制作复杂的,比如动画有各种状态切换,比如人型动画,则需要使用Animator。
当然,Animator需要通过控制Animation来实现状态管理。
一、简单动画Animation
我们来实现一个立方体在1s内运动的动画。场景创建一个立方体,打开Animation窗口,通过windows/windows/Animation打开。


不要直接点击Create按钮,如果点击后,则会通过Animator来管理。
选中立方体,在Inspector界面添加组件Animation,然后点击Animation窗口里面的Create按钮,会单独创建一个影片,保存。(记得场景树要选中需要被编辑的节点)


1. 手动设置关键帧
点击AddProperty,选择Position,默认会生成两个关键帧0s && 60s位置。默认0s处,选中60s处,设置位置。点击播放,则可以看到移动的动画。


2. 录制
点击红色按钮,开始录制。拖动游标到动画结束的时间,设置结束时候的位置。


二、新版动画
我们需要一个角色模型来介绍。并不是说只能用来控制角色,而是因为角色控制相对繁琐,可以展示更多的Animator功能。
1. 导入模型
我们拷贝.fbx 模型到assets目录。设置好材质。点击fbx模型,在Inspector里面选择Animation,将动画根据类型进行划分。我们分割出来5个动画:站立(idle),死亡(die),重生(reborn),跑步(run),射击(fire)。


2. 设置状态机
将模型拖入场景,创建Animator Controller,拖入到节点的组件上。


双击创建的控制器组件,进入状态机编辑。展开模型,拖动idle动画到animator面板,默认会创建一个状态转移,从Entry到idle。点击播放按钮,场景角色循环播放待机状态。默认也有一个Base Layer的层。


我们继续完善状态机。然后编写脚本,实现:场景初始状态角色待机,1s后进入射击状态,当射击结束后,返回待机状态。


public class PlayerFsm : MonoBehaviour
{
public Animator ani;
void Start()
{
this.Invoke("changeState", 1);
}
void changeState()
{
ani.SetInteger("player_state", (int)Player_State_Trans.ToFire);
}
// Update is called once per frame
void Update()
{
AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
if(info.normalizedTime>=1.0f && info.IsName(Player_State.fire))
{
Debug.Log(info.normalizedTime);
ani.SetInteger("player_state", (int)Player_State_Trans.ToIdle);
}
}
}
添加脚本到角色节点身上。点击播放,则角色按照我们的预期执行。
注意
transition上面的has exit time参数,如果勾选,则在状态转换的时候会增加一个延迟时间。
3. blendTree
如果我们需要一个混合的状态,比如边跑边射击,则需要新增一个blend tree。编辑器窗口创建,双击进入编辑模式。选择节点,然后右键add motion,添加两个。将run、fire拖入对应的框中。我们发现,在parameters里面多出一个参数blend,这个参数是用来设置混合位置的。我们可以拖动inspector里面的混合图来进行设置。脚本同普通参数。


我们可以测试一下效果。
4. layer
新建一个layer,我们拖一个fire上去,让其循环播放,方便观察。运行游戏。发现生成的效果与我们做的blend tree类似。
BaseLayer默认run,New Layer默认fire。


5. Avatar Mask
我们发现,通过上面的设置,一边跑动,一边射击,模型状态非常不自然。是因为射击的时候,脚的运动是跑动,受到射击的影响。
此时有个问题,如果直接导入模型,并没有人型状态。需要我们设置一下模型。


新建一个avatar mask,添加给New Layer。


双击mask文件,进入编辑。绿色身体表示当前层级能够影响。点击任意部位,红色表示不影响当前部位。


观察新的动画样式,边跑边射击看起来就非常自然了。


6. 脚本
点击Layer,点击Add behaviour,可以新增 状态机的脚本。也可以点击状态,同样有Add behaviour按钮。两者生命周期有些区别。注意区分。
后记
通过层层尝试,我们大致了解了unity动画系统的使用。当然,真实做项目的时候复杂程度要远远高于本Demo。
参考列表:
unity】角色动画的 Has Exit Time是什么?什么时候需要打钩?
https://blog.csdn.net/weixin_37749732/article/details/121979165
Unity Animator Layer动画分层
https://www.jianshu.com/p/9a90496764b6
unity Animator 怎么判断一个动画播放结束
https://blog.csdn.net/tomato00001/article/details/78427538
Unity动画系统详解3:如何播放、切换动画?
https://blog.csdn.net/zhenghongzhi6/article/details/106459895
Unity 动画系统 Animation 和 Animator 联系与区别
https://www.cnblogs.com/01zxs/p/9965115.html
浙公网安备 33010602011771号