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); 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值