Giới thiệu những tính năng mới về Animation trong Unity5
Trong phiên bản Unity 5 có rất nhiều sửa đổi lớn và các tính năng mới giúp cải thiện chất lượng của engine .Dưới đây tôi sẽ giới thiệu những tính năng mới về phần Animaion trong Unity 5. **State Machine Behaviours ** Trong Unity 5 bạn sẽ có thể add các script kế thừa từ lớp StateMachineBehaviou ...
Trong phiên bản Unity 5 có rất nhiều sửa đổi lớn và các tính năng mới giúp cải thiện chất lượng của engine .Dưới đây tôi sẽ giới thiệu những tính năng mới về phần Animaion trong Unity 5.
**State Machine Behaviours **
Trong Unity 5 bạn sẽ có thể add các script kế thừa từ lớp StateMachineBehaviour vào trong các stage của bạn và nhận lại các callbacks trong khi các stage đang chạy :
- OnStateEnter : được gọi khi quá trình chuyển đổi trạng thái bắt đầu và stage machine bắt đầu đánh giá trạng thái này (hiểu nôm na hàm này được gọi khi bắt đầu một stage)
- OnStateUpdate : được gọi lại trên mỗi frame update giữa OnStateEnter và OnStateExit
- OnStateExit : được gọi khi kết thúc một quá trình chuyển đổi và Stage machine kết thúc đánh giá trạng thái này .
- OnStateMove : gọi ngay sau Animator.OnAnimatorMove() , code xử lý và ảnh hưởng tới chuyển động gốc nên được thực hiện ở đây .
- OnStateIK : gọi ngay sau Animator.OnAnimatorIK() . Code thiết lập animation IK (inverse kinematics) nên thực hiện ở đây .
Bạn có thể thêm nhiều StateMachineBehaviours vào stage của bạn nếu bạn muốn .Vì vậy để thêm IK vào stage hoặc để tuỳ chỉnh một số thứ về logic bạn chỉ cần kéo các script StateMachineBehaviours vào nó .
Như dưới đây ta có thể thêm hai script MoveScript và RotationScript vào stage rotation.
Về cơ bản , bất cứ điều gì đòi hỏi một stage machine logic trong game của bạn có họăc không có animation đều có thể sử dụng được StateMachineBehaviours.
Một điều tuyệt vời là bạn sẽ không cần phải sử dụng rất nhiều đoạn code như thế này nữa :
if(animator.GetCurrentAnimatorStateInfo(0).isName("Idle") ) DoStuff();
Thay vào đó bạn chỉ cần sử dụng StateMachineBehaviours.
**State Machine Transitions **
State Machines được phát triển nhiều hơn và phức tạp hơn vì vậy Unity giới thiệu các khái niệm về State Machine Transitions để cung cấp một mức độ trừu tượng cao hơn của StateMachine logic .
Trong unity 5 có thêm vào hai node Entry và Exit vào StateMachines .
Entry : khi bạn chuyển đổi sang một StateMachine , hệ thống animation sẽ đánh giá Entry node và các nhánh để chuyển đến điểm đến mà điều kiện của nó đáp ứng .
Exit : khi đi đến node Exit , hệ thống animation sẽ nhìn vào quá trình chuyển đổi StateMachine và nhánh để đi tới điểm đích một cách đúng đắn.
Chú ý là bạn có thể trộn các quá trình chuyển đổi : State->State, State->StateMachine, StateMachine->StateMachine…
Asset Creation API
Trong unity 5 bạn có thể tạo ra các animation assets như : StateMachines, States, Controllers, Layers, Blentrees, ... bằng cách sử dụng các script trong Editor .
Có hai API , một loại cao cấp được quản lý bởi Unity và một loại cấp thấp hơn bạn phải quản lý bằng tay , và có thể thực hiện tham chiếu bên ngoài .
Cả hai API này đều có document . Dưới đây là một ví dụ về cách sử dụng 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);
Direct Blend Trees
Trong unity 5 có một loại BlendTree mới cho phép bạn ánh xạ một tham số animator tới trọng số của BlendTree con trực tiếp .
Điều này thật sự hữu dụng khi bạn làm việc với BlendShape animation hoặc additive animations.
Root Motion Authoring
Unity 5 cho phép bạn tạo ra các đối tượng animate và chuyển đổi animator của chúng thành root motion . Đơn giản bạn chỉ cần tạo ra một animation (dịch chuyển hoặc xoay) trên một đối tượng sau đó click vào Generate Root Motion Curve trong AnimationClip inspector!
Ngoài ra còn những thay đổi tiện ích khác giúp việc dùng animation trong unity tiện lợi hơn rất nhiều :
- Cải thiện animation previewer của camera , bây giờ camera có thể Plan, Orbit, Scale giống như trong scene viewer .
- Truy cập các thông số trong quá trình chạy (tên, giá trị mặc định , ...)
- Gizmo trong scene view cho vị trí root , vị trí IK
- Cải thiện công cụ ngắm mục tiêu.
- Tối ưu hoá thời gian chạy
- Trong phiên bản này có rất nhiều bug được sửa .
**Nhận xét **
Theo tôi điểm lớn nhất của lần sửa đổi này là chúng ta có thể sử dụng các script trong chính animation tức là chúng ta có thể viết code xử lý trong quá trình animation thực hiện . Điều này là rất khó thực hiện trong các phiên bản unity cũ .