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

控制人物动画播放

这里我重新弄了一个简单的场景和新的Animator Controller来作为示例。

下面先看看Animator Controller的配置:

人物在站立状态只能进入走路,走路只能进入奔跑或返回站立,奔跑只能进入跳跃或返回走路,跳跃则只能返回奔跑。

参数方面为两个参数:

  • Float类型的moveSpeed;
  • Trigger类型的Jump;

连线直接的转换条件为:moveSpeed大于0.1进入走路,走路moveSpeed大于0.9进入奔跑小于0.1返回站立,奔跑moveSpeed小于0.9返回走路,Jump被触发则进入跳跃;

为人物添加Animator组件并绑定上面的Animator Controller文件,同时绑定下面的脚本:

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class TestAnim : MonoBehaviour
 5 {
 6     //将名称转换为哈希值可以提高索引的速度
 7     private int moveSpeed = Animator.StringToHash("moveSpeed");
 8     private int jump = Animator.StringToHash("Jump");
 9     private int runState = Animator.StringToHash("Base Layer.Run");
10
11     private Animator _animator;
12
13     void Start()
14     {
15         _animator = this.GetComponent<Animator>();
16     }
17
18     void Update()
19     {
20         float speed = Input.GetAxis("Vertical");
21         _animator.SetFloat(moveSpeed, speed);
22
23         //获取动画的当前状态
24         AnimatorStateInfo info = _animator.GetCurrentAnimatorStateInfo(0);
25         //跳跃除了要按下空格键外, 还需要处于奔跑状态才行, 否则按下空格键时就会标记 Jump, 一进入奔跑就马上跳跃
26         if(Input.GetKeyDown(KeyCode.Space) && info.fullPathHash == runState)
27         {
28             _animator.SetTrigger(jump);
29         }
30     }
31 }

State Machine Behavior

在Unity5.0中,我们可以给Animator Controller中的每个State添加脚本了,类似于专门用于GameObject的MonoBehavior,State可以添加State Machine Behavior,我们打开任意的Animator Controller,就可以在Inspector窗口发现添加脚本的按钮:

除了State外,我们还可以在层上添加,层可以看做包含了整个State的一个大State:

我们可以添加一个脚本看看,下面是我添加了注释的State Machine Behavior脚本的标准形式:

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class StateScript : StateMachineBehaviour
 5 {
 6     // OnStateEnter is called before OnStateEnter is called on any state inside this state machine
 7     override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
 8     {
 9         //进入当前状态时会被调用
10     }
11
12     // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
13     override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
14     {
15         //进入当前状态的每帧会被调用
16     }
17
18     // OnStateExit is called before OnStateExit is called on any state inside this state machine
19     override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
20     {
21         //退出当前状态时会被调用
22     }
23
24     // OnStateMove is called before OnStateMove is called on any state inside this state machine
25     override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
26     {
27     }
28
29     // OnStateIK is called before OnStateIK is called on any state inside this state machine
30     override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
31     {
32     }
33
34     // OnStateMachineEnter is called when entering a statemachine via its Entry Node
35     override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
36     {
37     }
38
39     // OnStateMachineExit is called when exiting a statemachine via its Exit Node
40     override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
41     {
42     }
43 }

通过使用State Machine Behaviour我们可以更加方便的在特定的时间点触发一些我们需要的事件,但是需要注意的是,我们一般给State Machine Behaviour赋值一些场景的对象不是直接在Inspector面板里拖拽而是通过Animator的GetBehavior方法获取到指定的State Machine Behaviour的实例后通过脚本进行赋值的。

时间: 2025-01-04 09:46:08

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

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

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

Unity3D之Legacy动画系统学习笔记

Unity3D的Mecanim动画系统是非常强大的,而且作为Unity推荐的动画系统,其未来会完全代替老的一套动画系统,即Legacy动画系统.目前的情况是Mecanim与Legacy两套动画系统同时共存,但是并不是说Legacy动画系统就没有任何价值了,作为Unity4.0以前使用的动画系统,我认为还是很有必要去了解和学习的,所以就有了这篇笔记. Legacy动画系统 http://docs.unity3d.com/Manual/Animations.html 我们可以使用Unity自带的资源

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动画系统学习笔记(九):Blend Tree(混合树)

认识Blend Tree 我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下: 那么我们看下新创建的Blend Tree和State有什么区别: 唯一的区别就是Montion指向的类型变成了Blend Tree类型,那么一个Blend Tree其实也就是一个状态,和状态不同的地方就是一个状态只能设定一个动画,而一个Blend Tree则可以设定为多个动画的混合. 混合树是Mecanim动画系统中比较复杂的一个内容,且其分为多个维度,

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并设定好跳转条件,如下: 接下来我们添加下面的脚本来控制动画的播