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