作者:Unity - Pierre Paul Giroux
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);