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

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

16.1 动画混合树BlendTree

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

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

我:“上次那个打字机游戏有个逻辑可以优化一下。”
皮皮:“我觉得你可以把难度再加大十倍。”
猫族果然有种族优势,现在打字速度已经远超于我。
在这里插入图片描述

我:“我想说的是,动画控制的逻辑可以优化一下。”
皮皮:“我记得你是用Animator组件来控制动画的。”
我:“是的,打字速度快,连击达到一定数量后,动画状态从慢走变成快跑,这里可以使用混合树来控制。”
在这里插入图片描述
皮皮:“什么是混合树呀?”
我:“混合树可以很方便地通过变量控制多个动画的混合效果,比如角色的idle(站立)、walk(慢走)、run(快跑)。”
idlewalkrun三个动画独立效果如下:
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
在这里插入图片描述
我们想要混合idlewalkrun三个动画,所以需要三个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。

在这里插入图片描述

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


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

  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值