2014年7月3日 星期四

Unity 5.0 中酷炫的新動畫功能

Unity 5.0 中酷炫的新動畫功能

作者:Unity - Pierre Paul Giroux



Unity 的動畫團隊一直很努力的準備讓 Unity 5.0 發表時具有令人印象深刻的功能。
下面為你介紹有關新動畫功能的簡要概述,希望可以對Unity 開發者們有所幫助!


狀態機行為(State Machine Behaviours)
在 Unity 5 中,你將能夠將StateMachineBehaviour 腳本加到行為狀態中,並在播放時收到以下回應:

• OnStateEnter
• OnStateUpdate
• OnStateExit
• OnStateMove
• OnStateIK

你可根據需求在行為狀態中加入多個 StateMachineBehaviour。例如要在狀態上加入 IK,或執行自訂邏輯,只需要將 StateMachineBehaviour 腳本拖到它上面。

基本上,遊戲中任何需要某種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”(產生根動作曲線)即可!

更多讓讓動畫製作更輕鬆的功能:

• 改進動畫預覽,鏡頭現在能像場景裡的鏡頭一樣平移和縮放。

• 即時存取像是名稱或是預設值等參數

• 小圖示可以顯示根位置、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);

沒有留言:

張貼留言

著作人