简介:我是一名Unity
游戏开发工程师,皮皮是我养的猫,会讲人话,它接到了喵星的特殊任务:学习编程,学习Unity
游戏开发。
于是,发生了一系列有趣的故事。
上次做了一个打字机游戏给皮皮。
前情回顾:《学Unity的猫》——第十三章:Unity使用Animator控制动画播放,皮皮猫打字机游戏
我:“上次那个打字机游戏有个逻辑可以优化一下。”
皮皮:“我觉得你可以把难度再加大十倍。”
猫族果然有种族优势,现在打字速度已经远超于我。
我:“我想说的是,动画控制的逻辑可以优化一下。”
皮皮:“我记得你是用Animator
组件来控制动画的。”
我:“是的,打字速度快,连击达到一定数量后,动画状态从慢走变成快跑,这里可以使用混合树来控制。”
皮皮:“什么是混合树呀?”
我:“混合树可以很方便地通过变量控制多个动画的混合效果,比如角色的idle
(站立)、walk
(慢走)、run
(快跑)。”
idle
、walk
、run
三个动画独立效果如下:
idle
walk
run
我们想要通过一个速度变量movespeed
来混合这三个动画,这个时候就可以使用混合树。
最终效果如下:
从AssetsStore
下载一个带动画的模型,比如这个猫女孩
资源地址:https://assetstore.unity.com/packages/2d/characters/fancydoll-c000-little-cat-girl-112776
将模型导入Unity
工程中。
点击菜单Window -> Animation -> Animator
。
即可打开Animator
编辑器,界面没有显示内容是因为我们没有选中.controller
文件。
选中.controller
文件。
即可看到具体的动画状态机。
在Animator
编辑器界面空白处鼠标右键点击Create State -> From New Blend Tree
。
即可创建一棵混合树。
选中它,可以在Inspector
窗口中对节点进行重命名,比如重命名为MoveBlendTree
。
点击顶部栏的Base Layer
即可退出当前的混合树。
退出成功
创建混合树时,会自动创建一个float
类型的变量,可在Paramters
标签页中看到,默认变量名为Blend
。
我们可以双击变量,将变量进行重命名,比如重名名为movespeed
。
我们可以设置混合树使用的变量,如下,使用movespeed
变量。
设置成功。
在混合树根节点上右键鼠标,点击菜单Add Motion
。
即可添加一个Motion
。
我们想要混合idle
、walk
、run
三个动画,所以需要三个Motion
。
将具体的Motion
设置成具体的动画。
调整混合树的movespeed
变量,可以看到Motion
之间的过渡。
将混合树节点设置为默认状态
将猫女孩模型拖到场景中
如下
运行Unity
,可以看到状态机正常进入混合树种循环。
进入混合树节点,调节movespeed
变量,可以看到混合过渡效果
上面我们是手动修改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。
完成。
如果有什么疑问,欢迎留言或私信。
《学Unity的猫》——第十七集:Unity的UGUI布局,皮皮猫的简历