Unity5 Mecanim 新状态机

来源:互联网 发布:数据库总结报告 编辑:程序博客网 时间:2024/04/28 15:23

Unity5 Mecanim 系統介紹

Unity5 Mecanim 系統介紹
請注意: 本文沒有Mecanim的完整教學, 只教新功能

StateMachineBehaviour:

Unity5的Mecanim主要帶來了邏輯編輯方式的改變
導入了StateMachineBehaviour 讓我們Animator的邏輯撰寫上, 變得比過去更為明確一些
Inspector畫面, 點選了狀態機或LayerInspector畫面, 點選了狀態



就如上面两张图, 我们可以看到新增了Add Behaviour的按钮, 点下去后他会把所有继承自
StateMachineBehaviour的Script都列出来, 整个概念就跟已经用习惯了的把MonoBehaviour挂到GameObject身上一样


StateMachineBehaviour是一个抽象类别
上面定义了七个函式让我们选择性作override来赋予程式逻辑
OnStateEnter
OnStateExit
OnStateIK
OnStateMove
OnStateUpdate
OnStateMachineEnter
OnStateMachineExit


以下一个一个简单描述一下使用时机


首先, 说明一下作用域的概念
就像MonoBehaviour一样, 挂在哪个GameObject身上
你用gameobject取来的就是哪个GameObject


所以, 你将StateMachineBehaviour挂在哪个
State 或者 Layer, 或者 StateMachine上
那麽上面七个函式的触发条件就会受到影响


例如:
你把Script挂在Idle这个State身上
那麽, 程式只会在运作到Idle这个State的时候
才会去执行


如果你把Script挂在Layer身上
那麽整个Layer所有的State变化都会通知道你这个Script


如果挂的是一个Sub StateMachine
那麽就只有在状态运行到这个StateMachine裡面的State的时候
你的这个Script才会收到通知


了解这个之后, 再接下来了解七个函式的作用时机


OnStateEnter
在Animator的状态切到当前这个状态的时候
会呼叫一次这个函式而如果你是将Script挂在状态机身上(Layer也可以, Layer其实也是状态机)
那麽无论程式进入哪个State, 函式都会被触发一次
这时候你可以简单用stateInfo.IsName去进行辨识


OnStateExit
跟OnStateEnter差不多的东西, 时机变成要离开这个State的时候才会触发一样, Script挂在Layer或StateMachine身上时
裡面所有的State离开时都会通知你


OnStateUpdate
这个函式会在每个frame都通知一次, 其他细节跟前两个差不多


OnStateMove
这个函式会在OnAnimatorMove之前执行, 其他条件跟前三个差不多
请特别注意, 如果你的Animator有要使用Apply Root Motion功能来进行位移
那麽就请不要override这个函式, 否则Unity会放弃帮你进行位移


关于这部分, 可以参考Unity官方的说明文章进行更进一步的了解
下面简单转贴说明的句子 OnStateMove is called before OnAnimatorMove would be called in MonoBehaviours for every frame the state is playing. When OnStateMove is called, it will stop OnAnimatorMove from being called in MonoBehaviours.简单说就是两个function互斥


OnStateIK
这个函式也很特别, 他的触发State必须有在进行IK pass才会呼叫
而一般State预设都没有IK pass, 所以并不会被呼叫到


OnStateMachineEnter
只有进入这个StateMachine或者Layer的时候会呼叫


OnStateMachineExit
只有离开这个StateMachine或者Layer的时候会呼叫




Entry State & Exit State


首先我们拿4.6和5.0的AnimatorController预设内容来做个比较


4.6 Mecanim default
5.0 Mecanim default经过比较可以清楚看到, 5.0新增了两个预设状态, Entry和Exit


Entry State:
首先我们将Layer视为一个状态机, 而这个State则可以视为整个状态机的起始点


Exit State:
Exit则可以视为状态机的结束点
比较需要知道的是
当状态机来到Exit后, 会立即重新回到Entry
重新开始新一轮的状态机工作, 而非关闭状态机


还有就是, 虽然Exit会立刻衔接到Entry
但是Parameters里头的值是不会重置的
设计时须注意到这一点


Direct BlendTree:
BlendTree新增了Direct这个种类, 功能是
让每个动画都能受单一一个float控制, 来进行动画混合
这个唯一的float他的数字会是介于0~1之间的浮点数
同一个float可以同时控制数个动画进行混合是没问题的
使用的条件有点麻烦, 练习材料不太好准备
这裡给出官方的示范做为参考


其他变更:
1. Layers介面微调, 并且加入搜寻功能
2. Parameters面板从左下角搬上来跟Layers介面放在一起, 并且加入搜寻功能
3. 新的Layers&Parameters混合面板增加了显示开关(Parameters旁的眼睛)
4. Transition的Inspector介面也做了调整, 用法没多大改变
(个人还是觉得4.6的Exit Time设计比5.0的has Exit Time好)
5. 各State和StateMachine以及Layer的Inspector加了Add Behaviour钮
6. 新版的BlendTree画面居然不能用Alt + 滑鼠左键移动了
目前没找到移动方法, 个人认为是bug

0 0
原创粉丝点击