Unity 动画团队一直在努力工作、同心协力,使 Unity 5.0 具有令人印象深刻的功能集。敬请期待新动画功能,下面是有关新动画功能的简要概述,希望可以对Unity 的用户们有所帮助!
状态机行为
在 Unity 5 中,您能够将StateMachineBehaviour 脚本添加到状态中,并在播放状态时收到以下回调:
OnStateEnter
OnStateUpdate
OnStateExit
OnStateMove
OnStateIK
您可根据需要在“状态”中添加多个 StateMachineBehaviour。要在“状态”上添加 IK,或要执行自定义逻辑,仅需将 StateMachineBehaviour 脚本拖到它上面。
基本上,游戏中任何需要某种StateMachine 逻辑的对象(无论是否有动画)均可使用这种方式
此功能的另一大好处是不需有大量的如下代码:
if(animator.GetCurrentAnimatorStateInfo(0).isName(“Idle”))
DoStuff()
(我确定您的代码中有许多这样的代码),
只需用StateMachineBehaviour 即可!
状态机转换
状态机变得越来越复杂,因此我们引入了“状态机转换”这一概念,从而在 StateMachine 逻辑之上提供更高层次的抽象表示。
在 Unity 5 中,我们已在StateMachine 中添加了“进入”和“退出”节点。这两种节点都会在状态机转换中用到。
进入: 当您转换到 StateMachine 时,动画系统将评估“进入”节点并转到其条件满足的目的地。
退出: 转到“退出”节点时,动画系统将查看正在进行的 StateMachine 转换,并转到合适的目的地。
注意,您可混合转换:State->State、State->StateMachine、StateMachine->StateMachine……
另外,我们还对工具 UI 进行了修改,因此,您现在可对您的参数和层重新排序。
资源创建 API
在 Unity 5 中,您可使用编辑器中的脚本创建动画资源(StateMachine、状态、控制器、图层、Blentree 等)。
有两种 API:一种是高级 API,由 Unity 来管理资源;一种是低级API,由您手动管理资源并可执行外部引用。
对两种 API 都有记录,我已在本博文结尾提供了一个使用 API 的小例子。
直接混合树
我们已添加了一种新型BlendTree,您可将动画器参数直接映射到 BlendTree 子级的权重上。
如果您正使用BlendShape 动画或附加动画,这真的非常方便。
根动作创作(常规模式下)
Unity 5 还使您可为动画制作动画效果并将它们的动画器转化成根动作(即 Delta Animation)。仅需在对象的最顶层转换上创建动画(平移/旋转),然后在 AnimationClip 检查器中单击“Generate Root Motion Curve”(生成根动作曲线)!
更多功能,让动画制作更轻松:
改进的动画预览器相机。 该相机现在能像场景查看器一样摇镜头、沿轨道运行和缩放。
对参数(名称、默认值等)的运行时访问
根位置、ik 位置等的场景视图中的gizmo
改进的重新定位目标引擎
运行时优化
大量的漏洞修复
Asset Creation API sample Code
// 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);