Unity动画系统详解5:BlendTree混合树是什么?

2023-11-19

摘要:“Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树。

洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

“智哥,我用Animator做了一个人物移动的状态机,怎么看怎么不顺眼,这也太复杂了,你来看看?”

小新做的人物移动的状态机

“哟,这不是挺规整的嘛,我看起来挺顺眼的,哈哈哈”

“去去去,我这光一个走路的就得搞这么复杂,而且还没法斜着跑,我这做一个动画,这得多少个状态啊”

“emmm,我这有一个秒招,不知道你想学不想学?”

“那当然想学了,看我每天学习的热情多么高涨”

“那你先带我去把晚饭解决了”

“哎呀,咱们点个外卖,我已经等不及了,吃饭这都不重要”

“那也成,给我来个10斤的龙虾,点好了再来找我”

小新花了30秒搞定外卖,“快快快,开始上课!”

“看你小子猴急的,以后能成大器,嘿嘿”

BlendTree 混合树

“Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树。

“混合树和Transition中的混合有啥区别呢?”

“混合树和Transition中的混合不同,**Transition中的混合只是在两个State转换时,在给定的时间内进行混合,避免动画切换过于突兀。而混合树中的混合,是时时刻刻进行不同程度的混合。**比如你的角色有站立、走、跑三个动作,走路的速度是2m/s,跑的速度是5m/s,那你想让角色的速度是3m/s,这时候怎么办?这时候用混合树就能很简单地解决。”

“听起来很厉害,那你用我的这个移动的例子给我讲讲怎么搞呗?”

“不要着急,这时候你应该先去看看混合树的文档,自己试试,看看会遇到什么问题”

“好,那我先去看看文档”

“嗯,对了,我的大龙虾呢?”

“嘿嘿,大龙虾没有,不过给你点了个龙虾饭,看我够意思吧”

“哎,凑活吧,以后再让我教你可就难啦”

小新回到自己的房间,开始学习混合树的文档,并且记了笔记。

创建混合树

在Animator窗口的空白处右键,Create State > From New Blend Tree,双击这个节点可以进入混合树图。

混合树有3种类型,在右边的Blend Type中可以设置。分别为:

  • 1D
  • 2D
  • Direct

1D混合

1D混合是根据一个参数进行动画混合。

1、首先要设置用于混合的参数,也就是从Animator的Parameters中的选择一个参数。

2、添加动画:可以点击小加号按钮,或者在Blend Tree节点上右键Add Motion。点击后会在Motion列表中添加一个条目,可以将Animation Clip拖进来。

添加完动画,整个混合的样子:

最上面的图显示了参数对每个动画的影响。每个动画显示为一个蓝色的三角形。如果点击这个三角形,会在下面的动画列表中高亮一下。**每个三角形的顶角位置定义了参数在该位置时,会完全使用这个动画,这个值也叫做该动画的阈值(Threshold)。**比如上图中的run动画,阈值是0.5,在混合图的中心位置。

图中的红线代表了参数的数值,主要是用来预览调试。可以拖动红线,在下面预览窗口观察动画式如何混合的。

注意点播放按钮,可以预览动画播放的状态

参数范围

上图中,左右两个数字代表了参数的范围。点击数字可以变成输入框修改,也可以在数字上拖拽调节。修改时会影响到第一个动画和最后一个动画的阈值。

Threshold 阈值

修改动画对应的阈值可以直接拖拽对应的蓝色三角形。如果没有勾选Automate Threshold(自动计算阈值),也可以在阈值编辑框中直接输入数值。选中Automate Threshold(自动计算阈值)时,阈值会自动在最小值和最大值之间自动平均分布。

下面有一个Compute Thresholds下拉框,使用这个下拉框,可以根据动画中的数据,自动计算阈值。数据包括:speed(速度),velocity x、y、z(xyz三个轴分别的速度),angular speed(转动速度,单位是角度或弧度)。这些数据如何知道呢?

比如:走路动画的速度是1.5m/s,跑的速度是4m/s,如果选择Compute Thresholds中的Speed,walk动画的阈值会被设置为1.5,run动画的阈值会被设置为4。

Time Scale

通过动画速度这一列(图标是一个表)可以调节动画的播放速度,比如你想让跑步的动画播放速度变为原来的2倍,可以设置为2。

**Adjust Time Scale > Homogeneous Speed ** 可以将动画的速度调整对应到参数的最小值和最大值,但是保持动画的初始相对速度。
这句话看得我欲生欲死,得问问大智是什么意思

按钮可以将动画的播放速度调整到动画列表中所有动画速度的平均值。

Mirroring 镜像

上面复选框可以左右镜像一个humanoid类型的动画Clip。这个功能可以使用同一个动画创建出来两个方向的动画,可以节省一倍的存储空间和内存。

比如一个向左走的动画,通过镜像可以创建出一个向右走的动画。

难点解析

这时候门铃响了,“先生,您的龙虾饭到了。祝您用餐愉快,给个5星好评呗~”

“大智,吃饭前问你两个问题呗”

“不行,我得看看这个龙虾饭到底怎么样”

说着大智以迅雷不及掩耳之速拆开了包装,吃了几口。

“嗯,还不错,心情大好,来问吧!”

“我选的,能不好吃嘛!”

“第一个问题:自动计算Threshold的时候,那些动画的速度啊,旋转速度怎么知道啊?”

“选中一个Animation Clip,你可以看到这些数据,比如这个:”

“第一行是这个动画在xyz轴上的速度,第二行是旋转速度。”

“原来在这,这里我还没仔细看过呢”

“以后会用到的”

“第二个问题:**Adjust Time Scale > Homogeneous Speed **这个到底是干嘛的,怎么我看了半天都没看明白文档中的含义?”

“我记得文档中的解释有一些难理解,其实这个按钮的作用就是:先将所有动画的平均速度算出来,然后通过调节动画的speed让所有动画的速度都一致。

“啊?真的么?我怎么看文档跟这个一点联系都没有呢?”

“不信你去试试,看看是不是我说的这样”

“OK,你赶紧吃饭吧,我要继续去看了,2D混合树还没看呢”

小新回到房间继续学习2D混合树,下面是他做的学习笔记。

2D混合树

2D混合树可以根据2个参数进行动画混合。

最终效果展示

2D混合树有三个选项,分别是:

  • 2D Simple Directional(2D简单方向):当你的运动代表不同的方向,如“向前走”,“向后走”,“向左走”,“向右走”,或“向上瞄准”,“向下瞄准”,“左瞄“和”右瞄“。当然了,可以在(0,0)处包含一个默认动作类似“空闲站立”或“直线瞄准”。与1D混合树不同的是,2D Simple Directional不是在同一个方向上的多个动作,比如“走”和“跑”。

  • 2D Freeform Directional(2D自由方向):动画运用有不同的方向时,也可以使用这种混合类型:可以在同一个方向上有多个运动,例如“走”和“跑”。在Freeform Directional类型中,(0,0)位置必须包含一个默认动作,如“空闲站立”。

  • 2D Freeform Cartesian(2D自由笛卡儿):当混合的2个参数代表不同的方向时使用。使用Freeform Cartesian,参数X和Y可以表示不同的概念类型,例如角速度和线速度。举个例子:“向前走不转向”,“向前跑不转向”,“向前走并右转”,“向前跑并右转”等动作。

如果角色动画包含站立、走、跑和转向,非常符合2D Freeform Cartesian这种类型。后面以2D Freeform Cartesian举例说明。

将Blend Type设置为2D Freeform Cartesian

设置Blend Type之后,首先需要两个参数控制这个Blend Tree。

在Animator中添加两个float参数:Turn和Forward分别代表转向速度和向前行进速度,然后将这两个值设置为混合树的参数(注意顺序)

注意参数的顺序

然后点击 + > Add Motion Field 添加下列动画clip到混合树动画列表。(先不管后面的值)

下面,我们可以使用Unity中提供的自动计算Pos值的功能,来自动计算混合树的阈值。

Positions详解

每一个Motion都有一个自己的位置,当参数(x,y)靠近这个位置时,这个动画就会参与混合。离得越近,这个动画的比重就越大。

选中一个Motion时,图中的蓝点会有选中的状态;同样选中混合图中一个蓝点,对应的Motion也会有选中的状态。

Motion选中状态

可以拖动混合图中相应的蓝点来修改位置,也可以直接修改Motion后面的值。

Compute Positions

Unity提供了自动计算Position的功能。

通过Compute Position下拉菜单可以选择不同的计算方式:

属性 功能
Velocity XZ 根据动画自身的速度,将velocity.x设置每个动画的Pos X,将velocity.z设置Pos Y。适合2D Simple Directional和2D Freeform Directional类型的混合树。
Speed And Angular Speed 将动画的Y轴角速度(弧度每秒)设置到Pos X,速度设置到Pos Y。适合2D Freeform Cartesian类型的混合树。

另外,还可以通过 Compute Position -> X Position FromCompute Position -> Y Position From 单独计算X或Y的值。

属性 功能
Speed 动画的速度
Velocity X 沿X轴的速度
Velocity Y 沿Y轴的速度
Velocity Z 沿Z轴的速度
Angular Speed (Rad) Y轴的角速度,单位是弧度/秒
Angular Speed (Deg) Y轴的角速度,单位是角度/秒

Rad 和 Deg 分别代表了弧度和角度,弧度π(3.1415…) = 180°
可以根据项目的需要来选择,两种都可行,但是如果X,Y的数值相差过大的话,在混合图上显示会不便于调试。

在模型的Import Settings面板可以看到动画的速度

查看动画的速度和角速度

回到我们的混合树:
参考上面的内容,我们可以使用Speed And Angular Speed来计算每个Motion的位置。

选择Compute Positions中的Speed And Angular Speed

设置完后,整个混合树如下图所示:

现在我们来测试一下,看看怎么样。

设置完毕后的效果

Preview窗口中,记得一定要点击左上角的播放,动画才会实时播放看到效果。

混合的原理

动画混合时,会根据X和Y两个值来确定混合的动画以及各自所占的比重。上面动图中我们可以看到,拖动红点时,可以看到不同的节点上面圆圈在发生不同的变化,圆圈的大小即这个动画所占比重的大小。

6个动画混合的效果
红点所在的位置代表了X和Y两个参数的值对应的位置。横轴是X,纵轴是Y。

Direct Blending 直接混合

直接混合可以直接将animator的参数映射到混合树动画的权重。这在什么时候使用呢?如果你想用参数精确控制混合的动画,而不是通过以两个参数间接控制动画的混合。

设置一个direct混合树时,motion列表中的每一个动画需要对应一个参数,用来控制这个动画的混合权重。

难点解析

“大智,这个2D混合树中的阈值和动画中的真实速度是对应关系么?”

“其实只要保持对应的相对比例就可以,并不一定要真实的速度:”

1、X,Y的值和动画的实际速度没有映射关系。我们也可以将“走”的动画的Y值设置的大一些,将跑的动画设置的小一些。但是这样设置会在表现上不符合玩家的预期,感觉怪怪的。

2、在手动调整时,只要点之间的相对位置保持不变,混合效果不会受太大的影响。

3、但是要注意在写代码的时候,要根据调整过后值的范围来设置对应的参数。

“这样调整完参数就感觉整个图好看了好多,哈哈!”

总结

“现在你知道混合树是干嘛的了吧?”
“知道了,混合树可以根据参数,混合多个动画,每个动画有不同的权重,这样就有了很多中间状态。”
“想要把混合树用好,需要多去尝试一下”
“嗯,我这就准备把我那个移动的Animator Controller改成混合树的方式呢”

今日思考题

“正好,给你布置个思考题,实现人物的前后左右走、跑的动态混合,正好也能用到你的吃鸡游戏里”
“收到!我去也!”
“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

扩展阅读

【扩展学习】洪流学堂公众号回复动画可以阅读本系列所有文章,更有视频教程等着你!


呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

我是大智(微信:zhz11235),你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity动画系统详解5:BlendTree混合树是什么? 的相关文章

随机推荐

  • python 读写数据文件的6种常用方式

    本文主要介绍python读写数据文件的6种常用方式 1 python内置方法 with open r test xlsx as f a f read 一般 在应用上述上下文管理器后 可以用如下三种方式进行内置方法的读写操作 read 一次性
  • java实现区块链_用Java实现一个简单的区块链

    前面的文章 笔者花了不少的文字来介绍区块链的基础概念 以太坊的概念和开发 大家是否感觉区块链开发还是挺复杂的呢 但其实区块链技术本质就是一个分布式账本 在技术上本质就是一个链表 链表里面有一个个的区块 每个区块有自己的数字签名 涉及到加密技
  • Android Log-日志介绍

    一 基本介绍 Logcat是Android日常开发过程中的重要组成部分 Logcat上会显示系统消息 使用Log类添加到应用的消息 应用运行异常信息等 通过日志 我们可以实时监控应用运行状态 为应用调试提供重要参考 Log格式 一条标准的日
  • Appium抓取app数据

    主流APP数据抓取难点 1 请求参数加密 sign签名 使用sha1加上md5做辅助加密 2 请求body加密 整个请求体使用DES算法做加解密 3 代理检测反爬 抓包设置代理后 直接不再加载数据 4 私有CA证书反爬 由于公有的证书需要付
  • Scala中sorted、sortBy、sortWith区别

    1 sorted方法真正排序的逻辑是调用的java util Arrays sort 源码 def sorted B gt A implicit ord Ordering B Repr val len this length val b n
  • UG NX10.0软件安装教程

    软件下载 名称 UG NX 10 0 语言 简体中文 安装环境 Windows 下载链接 链接 https pan baidu com s 1SkskLU2CYLQznfGWM7O4HQ 提取码 ersv 安装中有问题请咨询管家微信 don
  • Android面试题最新整理,2022年最新版

    每年的9月和10月 是互联网大厂疯狂招人的时期 也是程序员们跳槽的黄金期 不知道你有没有幻想过这样一个场景 大厂的面试官说 恭喜你通过面试 明天来办理入职吧 今天 为大家整理了2022年Android大厂面试真题 刷企业历年真题 助你轻松搞
  • 大话西游手游有双系统服务器吗,大话西游手游有几个版本_大话西游手游官服和混服怎么区分_玩游戏网...

    大话西游 手游时间服点卡是互通的吗 点卡有两种 一种是大话西游手游内部的点卡 这种点数是在游戏里面购买道具或者计时用的 分为绑定点和交易点 这种是不能通用的 比如我在时间服有两个号 一个是绝代佳人区 另外一个是勿忘初心区 绝代佳人的点卡是不
  • 基于Matlab实现图像融合技术(附上多个仿真源码+数据)

    图像融合技术是一种将多幅图像融合为一幅图像的方法 使得这幅融合图像包含原始图像的所有信息 近年来 图像融合技术已经广泛应用于图像分割 变换和裁剪等领域 本文将介绍如何使用Matlab实现图像融合技术 实现步骤 首先 我们需要了解图像融合的基
  • linux下c语言实现tail -f功能---实时读取变化文件中的增量内容

    最近由于项目需要 需要对文件中实时新增的数据进行处理 结合tail f的逻辑 用c语言实现了这一功能 代码如下 cpp view plain copy include
  • jquery获取select值

  • ARM架构学习(二)——流水线

    本期主题 ARM流水线 往期地址 ARMv7架构学习 ARM流水线 1 流水线概念 2 指令的分解步骤 1 流水线概念 硬件资源总是有限的 有一个明显的方法能改善硬件资源的利用率 这就是pipeline 流水线 技术 其实就是在当前指令结束
  • std::nth_element bug引起的crash问题

    1 源码 auto less compare const MirroringGroup mg1 const MirroringGroup mg2 gt bool return mg1 usage lt mg2 usage std nth e
  • 腾讯云服务器配置选择方法

    腾讯云服务器配置如何选择 CPU内存 带宽和系统盘怎么选择合适 个人用户可以选择轻量应用服务器 企业用户可以选择云服务器CVM 2核2G3M带宽轻量服务器95元一年 2核4G5M服务器168元一年 企业用户可以选择标准型S5云服务器 可以一
  • idea 生成类图

    选中类 ctrl alt u或者ctrl alt shift u 生成类图
  • ArcGIS GraphicsLayer层的特殊要求

    如果你要使用GraphicsLayer这个绘图层 那么你需要注意自己的布局的模式不可以使用 layout absolute 如果你使用了这个布局 那么你的GraphicsLayer层可能会无法使用 比如下面的程序就是因为设置了 layout
  • java 最大公约数和最小公倍数

    题目 题目 输入两个正整数m和n 求其最大公约数和最小公倍数 比如 12和20的最大公约数是4 最小公倍数是60 说明 break关键字的使用 代码一 package l2 for 题目 输入两个正整数m和n 求其最大公约数和最小公倍数 比
  • Counter统计列表中元素出现次数

    使用Counter方法 统计元素在列表中出现的次数 from collections import Counter k labels 1 1 0 1 0 0 1 1 2 2 3 2 2 2 2 Counter返回的是字典 key为列表中元素
  • TVM系列---1.开始使用Tensor Expression

    Author Tianqi Chen https docs tvm ai tutorials tensor expr get started html Tensor Expression入门 这是TVM中Tensor表达语言的入门教程 TV
  • Unity动画系统详解5:BlendTree混合树是什么?

    摘要 Animator中有一个功能 用来解决多个动画之间的混合 经常用于移动动画之间的混合 这个功能叫做BlendTree 混合树 洪流学堂 让你快人几步 你好 我是跟着大智学Unity的萌新 我叫小新 这几周一起来复 yu 习 xi 动画