unity 动画系统简单教程

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

🖌️ 相关文章

笑逐颜开
Bet体育365提款要多久2022

笑逐颜开

📅 11-29 👁️ 2730
多一半打一字(多一半打一字谜)
365bet足球网投

多一半打一字(多一半打一字谜)

📅 02-14 👁️ 4232
dnf90级深渊刷哪个图好?dnf90时间广场深渊技巧
Bet体育365提款要多久2022

dnf90级深渊刷哪个图好?dnf90时间广场深渊技巧

📅 07-07 👁️ 1215