Unity 的動畫團隊一直很努力的準備讓 Unity 5.0 發表時具有令人印象深刻的功能。
下面為你介紹有關新動畫功能的簡要概述,希望可以對Unity 開發者們有所幫助!
狀態機行為(State Machine Behaviours)
狀態機行為(State Machine Behaviours)
在 Unity 5 中,你將能夠將StateMachineBehaviour 腳本加到行為狀態中,並在播放時收到以下回應:
• OnStateEnter
• OnStateUpdate
• OnStateExit
• OnStateMove
• OnStateIK
你可根據需求在行為狀態中加入多個 StateMachineBehaviour。例如要在狀態上加入 IK,或執行自訂邏輯,只需要將 StateMachineBehaviour 腳本拖到它上面。
基本上,遊戲中任何需要某種StateMachine 邏輯的物件(無論是否有動畫)均可使用這種方式。
• OnStateEnter
• OnStateUpdate
• OnStateExit
• OnStateMove
• OnStateIK
你可根據需求在行為狀態中加入多個 StateMachineBehaviour。例如要在狀態上加入 IK,或執行自訂邏輯,只需要將 StateMachineBehaviour 腳本拖到它上面。
基本上,遊戲中任何需要某種StateMachine 邏輯的物件(無論是否有動畫)均可使用這種方式。
此功能的一大好處是不會有大量類似下面的代碼:
狀態機轉換(State Machine Transitions)
狀態機變得越來越複雜,因此我們導入了“狀態機轉換”這個概念,能在 StateMachine邏輯上提供更高層次抽象的表示。
在 Unity 5 中,我們已經在StateMachine 中添加了“Entry”和“Exit”節點。這兩種節點都會在狀態機轉換中用到。
Entry:當轉換到 StateMachine 時,動畫系統會從進入節點分析條件並轉到目的地。
if(animator.GetCurrentAnimatorStateInfo(0).isName("Idle") ) DoStuff()(我打賭你的程式碼裡面應該有許多這樣的碼)現在只需用StateMachineBehaviour 即可!
狀態機轉換(State Machine Transitions)
狀態機變得越來越複雜,因此我們導入了“狀態機轉換”這個概念,能在 StateMachine邏輯上提供更高層次抽象的表示。
在 Unity 5 中,我們已經在StateMachine 中添加了“Entry”和“Exit”節點。這兩種節點都會在狀態機轉換中用到。
Entry:當轉換到 StateMachine 時,動畫系統會從進入節點分析條件並轉到目的地。
Exit: 轉到退出節點時,動畫系統會檢查正在進行的 StateMachine 轉換,並轉到適合目的地。
注意,您可混合轉換:State->State、State->StateMachine、StateMachine->StateMachine……
另外,我們還對動畫系統的 UI 進行了修改,因此你可以針對參數和層排序。
資源創建 API(Asset Creation API)
在 Unity 5 中,你可以用程式來建立像是(animation assets; StateMachines, States, Controllers, Layers, Blentrees等等的資源)。
有兩種API:高階 API由 Unity 來管理資源,低階級API由開發者手動管理資源並可連結外部參照。
兩種API都會有文件,後面我會有個API的小例子。
直接混合樹(Direct Blend Trees)
我們新增了一種新型BlendTree,可將參數直接傳到 BlendTree 子物件上。
如果你有使用BlendShape 動畫或附加動畫,這真的非常方便。
根動作創作(Root Motion Authoring)常規模式
Unity 5 也允許你為動畫製作動畫效果並將轉化成 root motion(即 Delta Animation)。只需要建立一個動畫,在最上層的物件做平移/旋轉,然後在 AnimationClip 按一下“Generate Root Motion Curve”(產生根動作曲線)即可!
注意,您可混合轉換:State->State、State->StateMachine、StateMachine->StateMachine……
另外,我們還對動畫系統的 UI 進行了修改,因此你可以針對參數和層排序。
資源創建 API(Asset Creation API)
在 Unity 5 中,你可以用程式來建立像是(animation assets; StateMachines, States, Controllers, Layers, Blentrees等等的資源)。
有兩種API:高階 API由 Unity 來管理資源,低階級API由開發者手動管理資源並可連結外部參照。
兩種API都會有文件,後面我會有個API的小例子。
直接混合樹(Direct Blend Trees)
我們新增了一種新型BlendTree,可將參數直接傳到 BlendTree 子物件上。
如果你有使用BlendShape 動畫或附加動畫,這真的非常方便。
根動作創作(Root Motion Authoring)常規模式
Unity 5 也允許你為動畫製作動畫效果並將轉化成 root motion(即 Delta Animation)。只需要建立一個動畫,在最上層的物件做平移/旋轉,然後在 AnimationClip 按一下“Generate Root Motion Curve”(產生根動作曲線)即可!
更多讓讓動畫製作更輕鬆的功能:
• 改進動畫預覽,鏡頭現在能像場景裡的鏡頭一樣平移和縮放。
• 即時存取像是名稱或是預設值等參數
• 小圖示可以顯示根位置、ik 位置等
• 改進的重新定位系統
• 運行效能優化
• 大量的臭蟲修復
我們希望開發者們也分享我們你的心得
Unity 動畫團隊敬上
以下是簡單的API範例程式
// Creates the controller var controller = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath ("Assets/Mecanim/StateMachineTransitions.controller"); // Add parameters controller.AddParameter(“TransitionNow”, UnityEditor.Animations.AnimatorControllerParameterType.Trigger); controller.AddParameter(“Reset”, UnityEditor.Animations.AnimatorControllerParameterType.Trigger); controller.AddParameter(“GotoB1″, UnityEditor.Animations.AnimatorControllerParameterType.Trigger); controller.AddParameter(“GotoC”, UnityEditor.Animations.AnimatorControllerParameterType.Trigger); // Add StateMachines var rootStateMachine = controller.layers[0].stateMachine; var stateMachineA = rootStateMachine.AddStateMachine(“smA”); var stateMachineB = rootStateMachine.AddStateMachine(“smB”); var stateMachineC = stateMachineB.AddStateMachine(“smC”); // Add States var stateA1 = stateMachineA.AddState(“stateA1″); var stateB1 = stateMachineB.AddState(“stateB1″); var stateB2 = stateMachineB.AddState(“stateB2″); stateMachineC.AddState(“stateC1″); var stateC2 = stateMachineC.AddState(“stateC2″); // don’t add an entry transition, should entry to state by default // Add Transitions var exitTransition = stateA1.AddExitTransition(); exitTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “TransitionNow”); exitTransition.duration = 0; var resetTransition = stateMachineA.AddAnyStateTransition(stateA1); resetTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “Reset”); resetTransition.duration = 0; var transitionB1 = stateMachineB.AddEntryTransition(stateB1); transitionB1.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “GotoB1″); stateMachineB.AddEntryTransition(stateB2); stateMachineC.defaultState = stateC2; var exitTransitionC2 = stateC2.AddExitTransition(); exitTransitionC2.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “TransitionNow”); exitTransitionC2.duration = 0; var stateMachineTransition = rootStateMachine.AddStateMachineTransition(stateMachineA, stateMachineC); stateMachineTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “GotoC”); rootStateMachine.AddStateMachineTransition(stateMachineA, stateMachineB);
沒有留言:
張貼留言