《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制

文章目录

        • 16.1 动画混合树BlendTree
        • 16.2 具体流程
          • 16.2.1 导入模型
          • 16.2.2 打开Animator编辑器
          • 16.2.3 创建混合树Blend Tree
          • 16.2.4 进入混合树
          • 16.2.5 混合树重命名
          • 16.2.6 退出混合树
          • 16.2.7 混合树变量
          • 16.2.8 给混合树添加动画(Motion)
          • 16.2.8 调整混合树中不同动画过渡的临界值
          • 16.2.9 测试混合过渡
          • 16.2.10 使用代码设置Animator变量

简介:我是一名Unity游戏开发工程师,皮皮是我养的猫,会讲人话,它接到了喵星的特殊任务:学习编程,学习Unity游戏开发。
于是,发生了一系列有趣的故事。
在这里插入图片描述

16.1 动画混合树BlendTree

上次做了一个打字机游戏给皮皮。

前情回顾:《学Unity的猫》——第十三章:Unity使用Animator控制动画播放,皮皮猫打字机游戏

我:“上次那个打字机游戏有个逻辑可以优化一下。”
皮皮:“我觉得你可以把难度再加大十倍。”
猫族果然有种族优势,现在打字速度已经远超于我。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第1张图片

我:“我想说的是,动画控制的逻辑可以优化一下。”
皮皮:“我记得你是用Animator组件来控制动画的。”
我:“是的,打字速度快,连击达到一定数量后,动画状态从慢走变成快跑,这里可以使用混合树来控制。”

皮皮:“什么是混合树呀?”
我:“混合树可以很方便地通过变量控制多个动画的混合效果,比如角色的idle(站立)、walk(慢走)、run(快跑)。”
idlewalkrun三个动画独立效果如下:
idle
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第2张图片
walk
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第3张图片
run
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第4张图片
我们想要通过一个速度变量movespeed来混合这三个动画,这个时候就可以使用混合树。
最终效果如下:

16.2 具体流程

16.2.1 导入模型

AssetsStore下载一个带动画的模型,比如这个猫女孩

《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第5张图片
资源地址:https://assetstore.unity.com/packages/2d/characters/fancydoll-c000-little-cat-girl-112776
将模型导入Unity工程中。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第6张图片

16.2.2 打开Animator编辑器

点击菜单Window -> Animation -> Animator
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第7张图片
即可打开Animator编辑器,界面没有显示内容是因为我们没有选中.controller文件。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第8张图片
选中.controller文件。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第9张图片
即可看到具体的动画状态机。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第10张图片

16.2.3 创建混合树Blend Tree

Animator编辑器界面空白处鼠标右键点击Create State -> From New Blend Tree
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第11张图片
即可创建一棵混合树。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第12张图片
选中它,可以在Inspector窗口中对节点进行重命名,比如重命名为MoveBlendTree
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第13张图片

16.2.4 进入混合树

鼠标双击混合树节点,可以进入混合树内部。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第14张图片
混合树内部如下
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第15张图片

16.2.5 混合树重命名

我们可以对混合树进行重名名。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第16张图片
重命名后
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第17张图片

16.2.6 退出混合树

点击顶部栏的Base Layer即可退出当前的混合树。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第18张图片
退出成功
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第19张图片

16.2.7 混合树变量

创建混合树时,会自动创建一个float类型的变量,可在Paramters标签页中看到,默认变量名为Blend
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第20张图片
我们可以双击变量,将变量进行重命名,比如重名名为movespeed
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第21张图片
我们可以设置混合树使用的变量,如下,使用movespeed变量。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第22张图片
设置成功。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第23张图片

16.2.8 给混合树添加动画(Motion)

在混合树根节点上右键鼠标,点击菜单Add Motion
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第24张图片
即可添加一个Motion
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第25张图片
我们想要混合idlewalkrun三个动画,所以需要三个Motion
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第26张图片
将具体的Motion设置成具体的动画。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第27张图片

16.2.8 调整混合树中不同动画过渡的临界值

可以直接拖动混合视图调整临界值Threshold
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第28张图片

16.2.9 测试混合过渡

调整混合树的movespeed变量,可以看到Motion之间的过渡。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第29张图片
将混合树节点设置为默认状态
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第30张图片
将猫女孩模型拖到场景中
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第31张图片
如下
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第32张图片
运行Unity,可以看到状态机正常进入混合树种循环。
《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第33张图片
进入混合树节点,调节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的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制_第34张图片
运行Unity,按下空白键,即可自增movespeed,松开空白键,movespeed就会自减到0。

完成。
如果有什么疑问,欢迎留言或私信。


《学Unity的猫》——第十七集:Unity的UGUI布局,皮皮猫的简历

你可能感兴趣的:(Unity3D,学Unity的猫,Animator,动画,BlendTree,混合树)