【译】闪亮的Unity5新动画特性

发表于2016-03-15
评论1 1.4k浏览
  动画团队一直在努力工作齐心协力在Unity5.0的时候带来一些列让人印象深刻的功能。这里对这些新的动画功能做一个快速概述,敬请期待!

一、状态机的行为
  在Unity5中,你可以给你的状态加上StateMachineBehaviour脚本,而且当这些状态被触发的时候,这个脚本可以收到回调:
 · OnStateEnter
 · OnStateUpdate
 · OnStateExit
 · OnStateMove
 · OnStateIK
  你可以在你的状态里面加很多StateMachineBehaviours。比如说添加人体动力学,或者做一些特殊逻辑,只需简单拖动StateMachineBehaviour脚本到这个状态上就好了。基本上,只要你的游戏需要某种状态机的逻辑,无论有没有动画,都可以使用它。


  关于这个功能的另外一个好处是你可以重用
if(animator.GetCurrentAnimatorStateInfo(0).isName("Idle"))
    DoStuff()
  (我敢确定这样的代码在你的工程里有很多),
  你可以用StateMachineBehaviours来代替它们!

二、状态机跳转
  状态机正在变得越来越复杂,所以我们引入状态机跳转来给状态机逻辑提供更高一层次的抽象。
  进入:当你在状态机发生一次跳转的时候,动画系统会评估入口节点然后评估能到达哪些点。
  退出:退出节点的时候,动画系统也会寻找可以满足的跳转条件去往合适的目标状态。
  现在你可以混用跳转:State->State,State->StateMachine, StateMachine->StateMachine等等


  更重要的是,我们还将重映射UI到我们的工具,所以你可以重新修订参数和层。

三、资源创建API
  在Unity里你可以创建动画资源:StateMachines,、States,、 Controllers、 Layers、 Blentrees!
  有两种API,高层API是资源由Unity进行管理,而底层API,你要手动管理资源。
  两种API都有文档,我将在文章的结尾放小一段示例代码。

四、直接混合树
  我们现在加了一种新的混合树允许你把动画器参数直接映射到混合树的权重。


  如果你正在用BlendShape动画或者additive动画,这将非常方便。

五、根运动创作(一般模式下)
  Unity5还允许你把动画对象的动画器转换成根运动。简单创建一个动画,然后平移/旋转,选中根节点,然后在AnimationClip 的inspector 窗口点击Generate Root Motion Curve。更多让你生活更加容易的功能:
 · 动画预览相机的提升。相机现在可以移动、旋转和放缩
 · 运行时接触参数(名字,默认值)
 · 场景中的Gizmo帮定位远点,ik点等等
 · 改善重定位引擎
 · 运行时优化
 · 大量的bug修复
  让我们知道你如何看待这些变化
  动画团队资源创建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);
  原文地址:http://blogs.unity3d.com/2014/06/26/shiny-new-animation-features-in-unity-5-0/
  原文作者未做版权声明,视为共享知识产权进入公共领域,自动获得授权

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引