Mecanim vs. Animancer:两系统的相对应的功能比较
Table of Contents
请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com
Mecanim和Animancer是完全不同的系统,因此无法在它们之间直接转换,但本页解释了 Animator Controller的一些主要功能在Animancer中是有对应实现的。
animation controller 动画控制器
关于Animancer中的Animator Controllers有两个主要选项:
如Animator Controllers页面所述,与 Animancer 一起播放它们。 如本页所述,将它们替换为Animancer 功能。 这些示例演示了如何在没有 Animator Controller 的情况下播放动画。 Animator Controller 中所有内容(状态、过渡等)上的Generate Transition上下文菜单功能允许您将一些细节提取到Transition Assets中。这包括过渡持续时间、速度、退出时间和混合树中混合器状态的配置,但它不包括任何诸如参数或过渡条件之类的逻辑,因为这些事情在使用动画师时完全在脚本中处理。 动画剪辑 任何AnimationClip可以在 Animator 控制器 (Humanoid或Generic) 中播放的东西也可以在 Animancer 中播放。获取动画页面列出了获取和创建动画的最常用方法。
状态
Animancer 不需要你预先定义状态,你只要给它AnimationClip你想玩的任何东西。 您可以使用过渡来预定义细节,Speed例如AnimationClip. 当你第一次播放动画或转场时,Animancer 会AnimancerState为它创建一个允许你控制所有细节的,比如它的Speed和Time. 每当您在同一个角色上播放相同的动画或过渡时,它都会返回该状态。 过渡
Animancer 的转换与 Animator 控制器中的转换工作非常不同:
它们允许您在 Inspector 中设置 和 等详细信息Fade Duration。Start Time 它们没有定义任何条件或逻辑来确定转换何时发生。转换基本上只是您可以在命令中使用的一堆附加数据Play,因此选择何时调用Play完全取决于您的脚本。 MeleeAttack如果设置了触发器并且StateTime大于0.16和小于,则上图中的条件将使转换发生1,在脚本中如下所示:
[SerializeField] private AnimancerComponent _Animancer; [SerializeField] private ClipTransition _MeleeAttack;
void MeleeAttack() { var normalizedTime = _Animancer.States.Current.NormalizedTime; if (normalizedTime > 0.16f && normalizedTime < 1) _Animancer.Play(_MeleeAttack); } 脚本无需设置触发参数,只需MeleeAttack在您要攻击时调用该方法即可。如果您希望它在玩家按下攻击按钮后继续尝试攻击一小段时间,您可以使用Input Buffer。 不需要脚本获取当前状态时间来设置StateTime每帧的参数以便转换条件可以检查它,脚本可以直接在其检查中使用当前状态时间。 参数
由于所有控制逻辑都由您的脚本处理,Animancer 没有直接等效于参数。因此,如果您想在基于 的动画之间进行选择int,您只需int在脚本中放置一个字段,然后设置它并像任何其他变量一样检查其值。
如果您的动画中有一条要在脚本中访问的自定义曲线,则可以使用Animated Property。
混合树
Animancer 可以在Controller States中播放 Blend Trees 。它还具有混合器状态,它们具有相同的目的,但在实现上存在显着差异,如混合树与混合器部分所述。
子状态机
子状态机通常在动画控制器中用于简单地对状态进行可视化分组,以保持它们的组织性,而不是作为实际的逻辑结构。在这种情况下,它们在Animancer 中是不必要的,因为您已经可以随心所欲地安排动画参考。使用 Unity 的[Header]属性或[Serializable]类型对组织很有用。
如果您确实想要在其中包含其他状态的状态,Animancer 的有限状态机系统允许您将状态机放在任何地方,因此您可以简单地为状态类提供自己的状态机。
图层
Animancer 的图层是在运行时使用脚本创建的,而不是在 Animator 控制器中预定义,但除此之外它们大致相同。
状态机行为
Animancer 的动画系统与StateMachineBehaviours 完全不同,因为它不应该管理您的逻辑,但它的有限状态机系统允许您将状态定义为单独的脚本,这些脚本可用于实现您使用StateMachineBehaviour.
逆运动学
在 Animancer 中打开Inverse Kinematics是不同的,但之后一切基本相同。不幸的是,由于 Playables API 的限制,Unity 只会OnAnimatorIK在layerIndex参数设置为0.
延迟更新 任何LateUpdate在应用动画之后但在渲染帧之前使用方法来修改事物的系统都将与Animancer完全相同。
动画 API 如果需要,该AnimancerComponent.Animator属性允许您直接访问Animator组件,但是它的许多成员不能与 Animacer 一起使用(在大多数情况下,它们根本不相关)。
以下成员正常工作:
runtimeAnimatorController- 用于播放Native Animator Controllers,在这种情况下,所有Animator成员都正常工作于 Animator Controller(但不适用于通过 Animancer 播放的任何单独的动画)。 根运动:angularVelocity, ApplyBuiltinRootMotion, applyRootMotion, bodyPosition, bodyRotation, deltaPosition, deltaRotation, gravityWeight, hasRootMotion, isHuman, pivotPosition, rootPosition, rootRotation,velocity avatar, humanScale,isOptimizable cullingMode,updateMode fireEvents 骨骼变换:GetBoneTransform, hasTransformHierarchy,SetBoneLocalRotation 逆运动学:GetIKHintPosition, GetIKHintPositionWeight, GetIKPosition, GetIKPositionWeight, GetIKRotation, GetIKRotationWeight, leftFeetBottomHeight, pivotPosition, pivotWeight, rightFeetBottomHeight, SetIKHintPosition, SetIKHintPositionWeight, SetIKPosition, SetIKPositionWeight, SetIKRotation, SetIKRotationWeight, SetLookAtPosition, SetLookAtWeight, SetTarget, targetPosition,targetRotation isInitialized hasBoundPlayables,playableGraph Rebind StringToHash- 有效,但没有任何作用,因为Animancer 不依赖哈希码。 以下成员不直接工作:
动画师成员 详细信息/替代方案 CrossFade, CrossFadeInFixedTime, Play,PlayInFixedTime 使用AnimancerComponent.Play. 请参阅播放动画。 GetAnimatorTransitionInfo, GetBehaviour, GetBehaviours, GetCurrentAnimatorClipInfo, GetCurrentAnimatorClipInfoCount, GetCurrentAnimatorStateInfo, GetNextAnimatorClipInfo, GetNextAnimatorClipInfo, GetNextAnimatorClipInfoCount, GetNextAnimatorStateInfo, HasState,IsInTransition AnimancerComponent.States允许您访问已使用Key注册的任何州的详细信息。还返回它开始的动画的状态。Play GetBool, GetFloat, GetInteger, GetParameter, IsParameterControlledByCurve, parameters, parameterCount, ResetTrigger, SetBool, SetFloat, SetInteger,SetTrigger 如参数部分所述,Animancer 不使用它们。 GetLayerIndex, GetLayerName, GetLayerWeight, layerCount, layersAffectMassCenter,SetLayerWeight AnimancerComponent.Layers让您可以访问所有图层的详细信息。 keepAnimatorControllerStateOnDisable 改为使用AnimancerComponent.ActionOnDisable。 linearVelocityBlending 无论如何都不能正常工作,但是混合器通常可以通过在将任何非运动状态(例如Idle或Attack)与运动状态(例如Walk或Run )混合时禁用Synchronization来实现线性混合。 speed 改为使用AnimancerPlayable.Speed。虽然您通常只想使用AnimancerNode.Speed. Update 使用AnimancerComponent.Evaluate. MatchTarget, InterruptMatchTarget,isMatchingTarget 没有直接的等价物。使用曲线控制反向运动学可能会有所帮助。 尚不清楚以下成员是否工作:(请发送电子邮件至 animancer@kybernetik.com.au,如果您可以确认这些成员实际上应该做什么,以便他们可以接受测试):
feetPivotActive logWarnings 动画录制:playbackTime, recorderMode, recorderStartTime, recorderStopTime, StartRecording, StartRecording, StopPlayback,StopRecording 可能有效,但未经测试。