文章目录
简介:我是一名Unity
游戏开发工程师,皮皮是我养的猫,会讲人话,它接到了喵星的特殊任务:学习编程,学习Unity
游戏开发。
于是,发生了一系列有趣的故事。
16.1 动画混合树BlendTree
上次做了一个打字机游戏给皮皮。
我:“上次那个打字机游戏有个逻辑可以优化一下。”
皮皮:“我觉得你可以把难度再加大十倍。”
猫族果然有种族优势,现在打字速度已经远超于我。
我:“我想说的是,动画控制的逻辑可以优化一下。”
皮皮:“我记得你是用Animator
组件来控制动画的。”
我:“是的,打字速度快,连击达到一定数量后,动画状态从慢走变成快跑,这里可以使用混合树来控制。”
皮皮:“什么是混合树呀?”
我:“混合树可以很方便地通过变量控制多个动画的混合效果,比如角色的idle
(站立)、walk
(慢走)、run
(快跑)。”
idle
、walk
、run
三个动画独立效果如下:
idle
walk
run
我们想要通过一个速度变量movespeed
来混合这三个动画,这个时候就可以使用混合树。
最终效果如下:
16.2 具体流程
16.2.1 导入模型
从AssetsStore
下载一个带动画的模型,比如这个猫女孩
资源地址:https://assetstore.unity.com/packages/2d/characters/fancydoll-c000-little-cat-girl-112776
将模型导入Unity
工程中。
16.2.2 打开Animator编辑器
点击菜单Window -> Animation -> Animator
。
即可打开Animator
编辑器,界面没有显示内容是因为我们没有选中.controller
文件。
选中.controller
文件。
即可看到具体的动画状态机。
16.2.3 创建混合树Blend Tree
在Animator
编辑器界面空白处鼠标右键点击Create State -> From New Blend Tree
。
即可创建一棵混合树。
选中它,可以在Inspector
窗口中对节点进行重命名,比如重命名为MoveBlendTree
。
16.2.4 进入混合树
鼠标双击混合树节点,可以进入混合树内部。
混合树内部如下
16.2.5 混合树重命名
我们可以对混合树进行重名名。
重命名后
16.2.6 退出混合树
点击顶部栏的Base Layer
即可退出当前的混合树。
退出成功
16.2.7 混合树变量
创建混合树时,会自动创建一个float
类型的变量,可在Paramters
标签页中看到,默认变量名为Blend
。
我们可以双击变量,将变量进行重命名,比如重名名为movespeed
。
我们可以设置混合树使用的变量,如下,使用movespeed
变量。
设置成功。
16.2.8 给混合树添加动画(Motion)
在混合树根节点上右键鼠标,点击菜单Add Motion
。
即可添加一个Motion
。
我们想要混合idle
、walk
、run
三个动画,所以需要三个Motion
。
将具体的Motion
设置成具体的动画。
16.2.8 调整混合树中不同动画过渡的临界值
可以直接拖动混合视图调整临界值Threshold
。
16.2.9 测试混合过渡
调整混合树的movespeed
变量,可以看到Motion
之间的过渡。
将混合树节点设置为默认状态
将猫女孩模型拖到场景中
如下
运行Unity
,可以看到状态机正常进入混合树种循环。
进入混合树节点,调节movespeed
变量,可以看到混合过渡效果
16.2.10 使用代码设置Animator变量
上面我们是手动修改movespeed
变量,实际运用中,我们很可能需要使用代码来设置。
创建一个Main
脚本,代码如下
using UnityEngine;
public class Main : MonoBehaviour
{
public Animator ani;
private float m_speed;
private float m_interpolation = 1.5f;
void Update()
{
if (Input.GetKey(KeyCode.Space))
{
if (m_speed < 1)
{
m_speed += Time.deltaTime * m_interpolation;
if (m_speed > 1)
m_speed = 1;
ani.SetFloat("movespeed", m_speed);
}
}
else
{
if (m_speed > 0)
{
m_speed -= Time.deltaTime * m_interpolation;
if (m_speed < 0)
m_speed = 0;
ani.SetFloat("movespeed", m_speed);
}
}
}
}
将Main
脚本挂到模型预设上,并赋值Ani
对象
运行Unity
,按下空白键,即可自增movespeed
,松开空白键,movespeed
就会自减到0。
完成。
如果有什么疑问,欢迎留言或私信。