Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
2015-09-22 18:07
686 查看
控制人物动画播放
这里我重新弄了一个简单的场景和新的Animator Controller来作为示例。下面先看看Animator Controller的配置:
人物在站立状态只能进入走路,走路只能进入奔跑或返回站立,奔跑只能进入跳跃或返回走路,跳跃则只能返回奔跑。
参数方面为两个参数:
Float类型的moveSpeed;
Trigger类型的Jump;
连线直接的转换条件为:moveSpeed大于0.1进入走路,走路moveSpeed大于0.9进入奔跑小于0.1返回站立,奔跑moveSpeed小于0.9返回走路,Jump被触发则进入跳跃;
为人物添加Animator组件并绑定上面的Animator Controller文件,同时绑定下面的脚本:
using UnityEngine; using System.Collections; public class TestAnim : MonoBehaviour { //将名称转换为哈希值可以提高索引的速度 private int moveSpeed = Animator.StringToHash("moveSpeed"); private int jump = Animator.StringToHash("Jump"); private int runState = Animator.StringToHash("Base Layer.Run"); private Animator _animator; void Start() { _animator = this.GetComponent<Animator>(); } void Update() { float speed = Input.GetAxis("Vertical"); _animator.SetFloat(moveSpeed, speed); //获取动画的当前状态 AnimatorStateInfo info = _animator.GetCurrentAnimatorStateInfo(0); //跳跃除了要按下空格键外, 还需要处于奔跑状态才行, 否则按下空格键时就会标记 Jump, 一进入奔跑就马上跳跃 if(Input.GetKeyDown(KeyCode.Space) && info.fullPathHash == runState) { _animator.SetTrigger(jump); } } }
State Machine Behavior
在Unity5.0中,我们可以给Animator Controller中的每个State添加脚本了,类似于专门用于GameObject的MonoBehavior,State可以添加State Machine Behavior,我们打开任意的Animator Controller,就可以在Inspector窗口发现添加脚本的按钮:除了State外,我们还可以在层上添加,层可以看做包含了整个State的一个大State:
我们可以添加一个脚本看看,下面是我添加了注释的State Machine Behavior脚本的标准形式:
using UnityEngine; using System.Collections; public class StateScript : StateMachineBehaviour { // OnStateEnter is called before OnStateEnter is called on any state inside this state machine override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //进入当前状态时会被调用 } // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //进入当前状态的每帧会被调用 } // OnStateExit is called before OnStateExit is called on any state inside this state machine override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { //退出当前状态时会被调用 } // OnStateMove is called before OnStateMove is called on any state inside this state machine override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { } // OnStateIK is called before OnStateIK is called on any state inside this state machine override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { } // OnStateMachineEnter is called when entering a statemachine via its Entry Node override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash) { } // OnStateMachineExit is called when exiting a statemachine via its Exit Node override public void OnStateMachineExit(Animator animator, int stateMachinePathHash) { } }
通过使用State Machine Behaviour我们可以更加方便的在特定的时间点触发一些我们需要的事件,但是需要注意的是,我们一般给State Machine Behaviour赋值一些场景的对象不是直接在Inspector面板里拖拽而是通过Animator的GetBehavior方法获取到指定的State Machine Behaviour的实例后通过脚本进行赋值的。
相关文章推荐
- Unity中做放大镜 效果
- 蛮牛精选七款Unity插件
- Unity3D中鼠标旋转物体
- Unity3D中鼠标拖拽物体
- unity简单的单机登陆机制
- unity3D如何改变材质球上面的Shader
- unity3D磁力球的效果实现
- Unity3D学习笔记(六)音乐和音效
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3d Terrain splat 9 is null 解决方法
- Unity3d
- unity3d 学习笔记(五) 湖泊与瀑布
- Unity项目优化--开发项目的小经验
- Unity3D研究院之Unity3D回馈IOS高级界面消息(十)
- Unity3D研究院之与Android相互传递消息(十九)
- unity3dGUI教程
- Unity3D之Mecanim动画系统学习笔记(四):Animation State
- 三维气象要素场--Unity3d篇
- C# WinForm程序中使用Unity3D控件
- Unity图片变灰的方式