Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)

认识Blend Tree

我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下:

那么我们看下新创建的Blend Tree和State有什么区别:

唯一的区别就是Montion指向的类型变成了Blend Tree类型,那么一个Blend Tree其实也就是一个状态,和状态不同的地方就是一个状态只能设定一个动画,而一个Blend Tree则可以设定为多个动画的混合。

混合树是Mecanim动画系统中比较复杂的一个内容,且其分为多个维度,下面我们逐个的来进行学习。

一维混合树

我们以官方的例子使用一维混合树来实现下面的效果:我们人物的跑动分为3个动画,分别是向前跑、向左跑和向右跑,其中向左跑和向右跑人物都会有一定的倾斜,这样更加符合现实的情况,那么我们在状态机中跑动只有一个状态,所以我们的跑动需要设置为混合树来混合这3个动画。

首先我们需要创建一个新的场景,拖入我们的人物模型,然后创建一个Animator Controller并对其进行配置:

注意我们的Run是Blend Tree而不是State,双击Run就可以进入混合树的编辑界面。

右击我们的混合树添加3个Motion,如下:

同时我们设定好3个方向的跑动动画:

我们还需要设定一个名为Direction的Float类型的参数来控制这个混合树:

接下来我们取消Automate Thresholds的选项,并按下图进行选择,系统会为我们配置好阀值:

现在我们点击预览框查看动画播放时就可以通过拖拽小红线来看不同的变化了,我们的可使用的角度范围为-130到130之间。

到现在我们的动画控制器就配置好了。

脚本

下面我们使用脚本来控制一下人物,我们给人物添加下面的脚本即可:

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class TestBlendTree : MonoBehaviour
 5 {
 6     public float DirectionDampTime = 30.0f;
 7
 8     private Animator _animator;
 9
10     void Start()
11     {
12         _animator = this.GetComponent<Animator>();
13     }
14
15     void Update()
16     {
17         if(Input.GetKeyDown(KeyCode.W))
18         {
19             _animator.SetBool("run", true);
20         }
21         if(Input.GetKeyUp(KeyCode.W))
22         {
23             _animator.SetBool("run", false);
24         }
25
26         AnimatorStateInfo state = _animator.GetCurrentAnimatorStateInfo(0);
27         //奔跑状态下才允许转弯
28         if(state.shortNameHash == Animator.StringToHash("Run"))
29         {
30             //指定人物转弯通过控制混合数的参数即可
31             float h = Input.GetAxis("Horizontal") * 130.0f;
32             //DirectionDampTime 指示了每秒可以到达的最大值
33             //deltaTime 表示当前帧的时间
34             _animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
35         }
36         else
37         {
38             //重置一下参数
39             _animator.SetFloat("Direction", 0);
40         }
41     }
42 }

为了让摄像机跟随人物,我们直接添加官方给出的这个脚本到摄像机上即可:

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class ThirdPersonCamera : MonoBehaviour
 5 {
 6     public float distanceAway;            // distance from the back of the craft
 7     public float distanceUp;            // distance above the craft
 8     public float smooth;                // how smooth the camera movement is
 9
10     private GameObject hovercraft;        // to store the hovercraft
11     private Vector3 targetPosition;        // the position the camera is trying to be in
12
13     Transform follow;
14
15     void Start(){
16         follow = GameObject.FindWithTag ("Player").transform;
17     }
18
19     void LateUpdate ()
20     {
21         // setting the target position to be the correct offset from the hovercraft
22         targetPosition = follow.position + Vector3.up * distanceUp - follow.forward * distanceAway;
23
24         // making a smooth transition between it‘s current position and the position it wants to be in
25         transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * smooth);
26
27         // make sure the camera is looking the right way!
28         transform.LookAt(follow);
29     }
30 }

记得将人物的Tag设置为Player,同时脚本也要设置一下:

动画方面的一点要求

每个混合树的动画有一些要注意的地方:

  1. 动画长度需要一致;
  2. 动画的起始姿势需要一致;

二维混合树

同1维混合树,不过二维混合树已经作为一个平面来处理,同时需要两个参数来进行控制。对于更复杂的动画融合可以使用该模式,这里就不深入学习了。

我们可以将两个1维混合树合并为一个2维混合树来控制。

多维混合树

多维混合树在Unity5时添加,其配置更加复杂,一般使用在脸部表情的动画融合上。

时间: 2024-10-20 20:35:32

Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)的相关文章

Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统

Mecanim简介 Mecanim动画系统是Unity3D4.0开始引入的一套全新的动画系统,主要提供了下面4个方面的功能: 针对人形角色提供一套特殊的工作流. 动画重定向的能力,可以非常方便的把动画从一个角色模型应用到其他角色模型之上. 提供可视化的Animation编辑器,可以方便的创建和预览动画片段. 提供可视化的Animator编辑器,可以方便的管理多个动画切换的状态. 工作流 模型的准备 Unity不能制作3D模型和进行骨骼绑定,这些需要在专业的建模软件中由美术进行制作,一般常用的建模

Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关

资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载. 注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBundle进行打包的. 我们一般使用FBX类型的模型及动画文件,而动画文件的储存一般有两种情况,一是所有的动画和模型都一起存放到一个文件中,还有一种情况是模型单独一个文件而动画单独一个文件.这里我们就两种情况都看一下. 使用的资源是Unity3D自带的以及从一本教材中取出的两种类型的动画资源,同时需要

Unity3D之Mecanim动画系统学习笔记(二):模型导入

我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose(及双臂张开)的模型. 骨骼绑定(Rigging) 在之前制作的模型上进行骨骼的绑定,我们需要注意的是骨骼数量不能少于15根,同时要遵循Unity3D的骨骼制作标准,如下: http://docs.unity3d.com/Manual/Preparingacharacterfromscratch.ht

Unity3D之Mecanim动画系统学习笔记(七):IK(反向动力学)动画

什么是IK? IK(Inverse Kinematics)即反向动力学,即可以使用场景中的各种物体来控制和影响角色身体部位的运动,一般来说骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学),而IK则倒过来,由骨骼子节点带动骨骼父节点,具体情况比如人物走路踩到了石头就需要由脚的子节点来带动全身骨骼做出踩到石头的响应. IK可以使人物和场景更加贴合,从而达到更加真实的游戏效果,如果大家玩过<波斯王子>或<刺客信条>系列,应该对主角的攀爬和飞檐走壁的能力印象深刻,这些都是应用了

Unity3D之Mecanim动画系统学习笔记(五):Animator Controller

简介 Animator Controller在Unity中是作为一种单独的配置文件存在的文件类型,其后缀为controller,Animator Controller包含了以下几种功能: 可以对多个动画进行整合: 使用状态机来实现动画的播放和切换: 可以实现动画融合和分层播放: 可以通过脚本来对动画播放进行深度控制: 下面我们通过一个图来直观的看看动画的组成结构: Animator组件用来控制人物动画的播放,其中需要的两个最核心的内容就是控制动画播放逻辑的Animator Controller以

Unity3D之Mecanim动画系统学习笔记(三):Animation View

动画组件之间的关系 我们先看一张图: 这里我们可以看到,我们在GameObject之上绑定的Animator组件是控制模型进行动画播放的. 而其属性Controller则对应一个Animator Controller文件,该文件可以在Animator窗口中打开,其是被设计为状态机形式的系统,多个状态之间的切换关系可以在该界面进行设置. Animator Controller中的每个状态则对应一个Animation Clip,每个Animation Clip是一个简单的动画单元,可以在Animat

Unity3D之Mecanim动画系统学习笔记(四):Animation State

动画的设置 我们先看看Animation Clip的一些设置: Loop time:动画是否循环播放. 下面出现了3个大致一样的选项: Root Transform Rotation:表示为播放动画的对象的旋转方面的信息. Root Transform Position(Y):表示为播放动画的对象的位置 y 轴方面的信息. Root Transform Position(XZ):表示为播放动画的对象的位置 XZ 平面方面的信息. 他们都有一致的选项,我们逐个的来看: Bake Into Pose

Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)

解决什么问题? 动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画.最好的例子就是Unity4.x自带的示例AngryBots了. Avatar Mask 下面我们就使用Avatar Mask来实现人物在奔跑中招手的效果. 我们先添加一个人物到场景,同时为其添加一个Animator Controller并设定好跳转条件,如下: 接下来我们添加下面的脚本来控制动画的播

Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画

控制人物动画播放 这里我重新弄了一个简单的场景和新的Animator Controller来作为示例. 下面先看看Animator Controller的配置: 人物在站立状态只能进入走路,走路只能进入奔跑或返回站立,奔跑只能进入跳跃或返回走路,跳跃则只能返回奔跑. 参数方面为两个参数: Float类型的moveSpeed: Trigger类型的Jump: 连线直接的转换条件为:moveSpeed大于0.1进入走路,走路moveSpeed大于0.9进入奔跑小于0.1返回站立,奔跑moveSpee