回到
测试Unity版本为5.2.1
- 人形动画的接口都有标注
- 本列表不包含所有标注为过时的方法
- 目前该详解还有不少缺漏,有时间持续更新
2016/8/16更新CrossFadeInFixedTime接口描述
1.Vector3 angularVelocity { get; }
[人形动画]获得Avatar相对于最后一帧的角速率
2.bool applyRootMotion { get; set; }
是否打开根运动
3.Avatar avatar { get; set; }
[人形动画]人形动画Avatar,但是avatar结构里的字段非常少,应该是用于自定义类型转换。
官方说在运行时切换Avatar并不完全支持,需要保险起见
4.Vector3 bodyPosition { get; set; }
[人形动画]获得身体坐标,根据测试应该是平均值,比spine还低一些
5.Quaternion bodyRotation { get; set; }
[人形动画]获得身体旋转
6.AnimatorCullingMode cullingMode { get; set; }
默认是CullUpdateTransforms,会剔除一部分内容,包括一些消息还会触发
CullCompletely是不可见时完全禁用,AlwaysAnimate是完全不剔除
具体参考官方文档
7.Vector3 deltaPosition { get; }
对于有根位移的动画,相对于上一帧的位移本地空间坐标差。
具体参考这篇:
8.Quaternion deltaRotation { get; }
对于有根位移的动画,相对于上一帧的位移本地空间旋转坐标差。
具体参考这篇:
9.float feetPivotActive { get; set; }
资料很少,修改该值并没有影响到pivotPosition。
Blends pivot point between body center of mass and feet pivot. At 0%, the blending point is body center of mass. At 100%, the blending point is feet pivot.
混合身体质量中心与脚质量中心的轴心点。0%表示混合轴心点在身体的质量中心;100%表示混合轴心点在脚的轴心点;
10.bool fireEvents { get; set; }
官方新增的不明接口,包括官方文档也没有描述。
11.float gravityWeight { get; }
使用Animator的时候经常会发现动画没有重力,而gravityWeight就是这个问题的关键
默认重力权重设置为1,即可应用刚体的重力。如果刚体不打开重力,则没有重力
使用时在FBX动画片段的曲线中设置即可
重力权重越大即重力越大,重力权重范围对应时间轴上包含位移的范围
12.bool hasRootMotion { get; }
剪辑本身是否有根运动
13.bool hasTransformHierarchy { get; }
[人形动画]只对人形动画有效,当勾选优化游戏对象之后。返回值为Flase,否则为True
优化游戏对象具体参阅文档
大意就是把层级信息存到内置的数据结构里,不需要在运行时进行匹配了。从而提升性能
14.float humanScale { get; }
返回当前人形绑定Avatar的缩放,(如果绑定是generic,默认为1)
测了下似乎和FBX设置的缩放因子有关,缩放比例是根据Unity默认的Avatar
15.bool isHuman { get; }
是否是人形动画
16.bool isInitialized { get; }
检测动画是否初始化成功
当没有控制器时会提示Not initialized,此时调用isInitialized返回False,反之返回True
17.bool isMatchingTarget { get; }
[人形动画]当前是否正在匹配目标
关于匹配具体请看这篇
18.bool isOptimizable { get; }
始终返回为True,暂时没搞明白。官方文档链接
AnimatorUtility.OptimizeTransformHierarchy(gameObject, new string[0]);
将其优化后,并且Animator也出现优化后的提示,依旧打印True。。。实在无解
19.int layerCount { get; }
动画层数
20.bool layersAffectMassCenter { get; set; }
资料很少,暂时不清楚这个接口,官方的描述:
Additional layers affects the center of mass.
官方的链接:
21.float leftFeetBottomHeight { get; } 和 float rightFeetBottomHeight { get; }
[人形动画]获得左脚脚底高度和右脚脚底高度
测试代码:
左边的图是获得脚部IK坐标,并赋予给绿色Cube和红色Cube
右边的图是加上脚底距离高度,并设置坐标
22.bool linearVelocityBlending { get; set; }
没有太多资料,尝试设置为True,测试了一下变化不是很大
官方描述
When linearVelocityBlending is set to true, the root motion velocity and angular velocity will be blended linearly.
当linearVelocityBlending 设置为true,根运动速度和角速度将线性混合
23.bool logWarnings { get; set; }
新加入的接口,文档没有相关信息,应该是是否打印警告日志
24.int parameterCount { get; }
拥有的参数数量,用于参数遍历
25.AnimatorControllerParameter[] parameters { get; }
所有的参数数组
26.Vector3 pivotPosition { get; }
[人形动画]相对于两脚之间的中间点,非人形动画返回Vector3.zero
27.float pivotWeight { get; }
[人形动画]该轴心点是avatar的左右脚之间最稳定的轴心点。值为0时,左脚是最稳定的轴心点;值为1时,右脚是最稳定的轴心点
28.float playbackTime { get; set; }
动画回放时间,录制与回放具体请看这篇
29.AnimatorRecorderMode recorderMode { get; }
当前的录制模式,Offline,Playback,Record
回放或者录制,或者两种状态都不在。
录制与回放具体请看这篇
30.float recorderStartTime { get; set; }
录制开始时间,录制与回放具体请看这篇
31.float recorderStopTime { get; set; }
录制结束时间,录制与回放具体请看这篇
32.Vector3 rootPosition { get; set; }
返回根骨骼的世界坐标
33.Quaternion rootRotation { get; set; }
返回根骨骼的世界旋转
34.RuntimeAnimatorController runtimeAnimatorController { get; set; }
可以进行强类型转换,也可以直接取到原始动画剪辑,映像中还有一个Editor状态下可以转换的Controller,能改一些底层信息
35.float speed { get; set; }
动画的整体速度,影响其中的每一个动画剪辑
36.bool stabilizeFeet { get; set; }
过渡和混合时,脚自动稳定。
37.Vector3 targetPosition { get; }
返回由SetTarget(AvatarTarget targetIndex, float targetNormalizedTime))指定的目标的位置
关于SetTarget具体请看这篇
38.Quaternion targetRotation { get; }
返回由SetTarget(AvatarTarget targetIndex, float targetNormalizedTime))指定的目标的旋转角度。
关于SetTarget具体请看这篇
39.AnimatorUpdateMode updateMode { get; set; }
Normal Normal update of the animator.
标准更新。AnimatePhysics Updates the animator during the physic loop in order to have the animation system synchronized with the physics engine.在物理循环期间更新Animator为了使动画系统与物理引擎同步。UnscaledTime Animator updates independently of Time.timeScale.Time.timeScale外的Animator独立更新。
默认值是Normal
40.Vector3 velocity { get; }
返回根骨骼相对上一帧结果计算的速率,对于没有根骨骼的动画无效
41.static int StringToHash(string name)
注意这个是静态方法,通过字符串取得参数的hash值
42.void ApplyBuiltinRootMotion()
该方法顾名思义,会调用内建的根骨骼移动
也可以用在StateMachineBehaviour的OnStateMove里
比如下面这样,运行游戏后角色直接飞掉了
public class Test1 : MonoBehaviour{ public Animator animator; void OnAnimatorMove() { for (int i = 0; i < 100; i++) { animator.ApplyBuiltinRootMotion(); } }}
43.CrossFade(...)系列接口
和Animation的CrossFade差不多,混合过渡并且播放
第四个参数normalizedTime要说一下,是0-1的范围,表示目标动画剪辑从哪里开始播放
animator.CrossFade("Jump", 0.2f, 0, 0.5f);
可以看见,调用后从0.5开始播放
关于混合的细节,时长可以参考这篇文章:
44.CrossFadeInFixedTime(...)系列接口
混合并且按照实际时间进行。这里的实际时间是指Time.time的时间
具体细节可以参考这篇文章:
45.AnimatorTransitionInfo GetAnimatorTransitionInfo(int layerIndex)
获得当前动画的过渡信息,关于过渡可以看这篇
46.GetBehaviour<T>() 和 GetBehaviours<T>()
返回挂载在AnimatorController上的行为脚本StateMachineBehaviour
通常StateMachineBehaviour之间的交互会经常用到。
47.Transform GetBoneTransform(HumanBodyBones humanBoneId)
[人形动画]获取骨骼的Transform对象,参数是枚举形。
如果被临时删除了或者没有绑定这个关节,会返回空
Debug.Log("GetBoneTransform: " + animator.GetBoneTransform(HumanBodyBones.LeftFoot));//print GetBoneTransform: joint_FootLT (UnityEngine.Transform)
48.AnimatorClipInfo[] GetCurrentAnimatorClipInfo(int layerIndex);
获得当前层正在播放的剪辑数组,并且获取到的时间长度(clip.length)不受Animator速度影响。
如果想获取全部原始剪辑,可以用runtimeAnimatorController.animationClip
49.AnimatorStateInfo GetCurrentAnimatorStateInfo(int layerIndex);
获得当前所处的动画状态
返回的结构中.length是动画总长度,normalizedTime是归一化的动画当前时间
注意取到的length属性会受到Animator速度缩放影响
另外,取到的归一化时间normalizedTime在播放循环动画时,会无限增长
(如果要获取不受缩放影响的原始剪辑,可以用runtimeAnimatorController.animationClip或者GetCurrentAnimatorClipInfo,区别在于一个能取到全部,一个只能取到当前播放的)
50.bool HasState(int layerIndex, int stateID);
配合Animator.StringToHash可以直接转换成stateID
Debug.Log(animator.HasState(0, Animator.StringToHash("Idle")));//print True
51.bool IsInTransition(int layerIndex);
是否正处于过渡,很常用的一个接口
如果忽视了过渡的判断,就会有意想不到的bug
if(!animator.IsInTransition(0) && animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")){ //Do something.}
52.bool IsParameterControlledByCurve(...);
参数是否被曲线控制
Debug.Log("IsParameterControlledByCurve: " + animator.IsParameterControlledByCurve("Speed"));//print True
注意,参数一旦被曲线控制,就不要在代码里修改它,否则会有警告
53.MatchTarget(Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime, float targetNormalizedTime)
[人形动画]匹配目标,关于匹配具体请看这篇
54.Play(...)系列接口
没什么好说的,需要注意normalizedTime参数,区间在0-1之间,直接影响到目标动画剪辑从哪个时间点开始播放
55.void Rebind();
重新绑定动画器的所有动画的属性和网格数据。
有时根骨骼坐标会被锁定,重置坐标后,调用该方法即可解决。
56.void ResetTrigger(...);
重设该触发参数为False
如果是当前状态播放结束再跳转的话,会用到这个方法,在结束之前可以重置回False
57.void SetBoneLocalRotation(...);
[人形动画]设置某个骨骼的本地旋转
58.void Vector3 GetIKHintPosition(AvatarIKHint hint) & SetIKHintPosition(AvatarIKHint hint, Vector3 hintPosition)
[人形动画]获取/设置IK Hint位置,IK相关操作请参考这篇:
59.float GetIKHintPositionWeight(AvatarIKHint hint) & void SetIKHintPositionWeight(AvatarIKHint hint, float value)
[人形动画]获取/设置IK Hint位置权重,IK相关操作请参考这篇:
60.Vector3 GetIKPosition(AvatarIKGoal goal) & void SetIKPosition(AvatarIKGoal goal, Vector3 goalPosition)
[人形动画]获取/设置IK位置,IK相关操作请参考这篇:
61.float GetIKPositionWeight(AvatarIKGoal goal) & void SetIKPositionWeight(AvatarIKGoal goal, float value)
[人形动画]获取/设置和获取IK位置权重,IK相关操作请参考这篇:
62.Quaternion GetIKRotation(AvatarIKGoal goal) & void SetIKRotation(AvatarIKGoal goal, Quaternion goalRotation)
[人形动画]获取/设置IK旋转,IK相关操作请参考这篇:
63.float GetIKRotationWeight(AvatarIKGoal goal) & void SetIKRotationWeight(AvatarIKGoal goal, float value)
[人形动画]获取/设置IK旋转权重,IK相关操作请参考这篇:
64.void SetLayerWeight(int layerIndex, float weight)
设置层权重
65.void SetLookAtPosition(Vector3 lookAtPosition) 和 void SetLookAtWeight(...)
[人形动画]测试脚本:
animator.SetLookAtPosition(reference.position);animator.SetLookAtWeight(1f);
使用后玩家会看向reference的对象
IK相关操作请参考这篇:
66.void SetTarget(AvatarTarget targetIndex, float targetNormalizedTime)
[人形动画]在动画播放前得到播放后的坐标和旋转。
关于SetTarget具体请看这篇
67.void StartPlayback()
开始回放,录制与回放具体请看这篇
68.void StartRecording(int frameCount)
开始录制
注意参数中的frameCount是需要录制长度的帧数
如果参数小于1,则不会限制录制时间
录制与回放具体请看这篇
69.void StopPlayback()
停止回放,录制与回放具体请看这篇
70.void StopRecording()
停止录制,录制与回放具体请看这篇
71.void Update(float deltaTime)
Animator直接开放出了Update接口,如果你只是想更新动画信息而不前进播放动画,deltaTime参数可以设为0
在做下一个状态指向判断时,非常有效
72.GetSet各类型参数系列(SetFloat,SetBool等等)
最常用的接口
但需要注意下float类型数据,可以单独设置阻尼,具体看这篇
73.AnimatorClipInfo[] GetNextAnimatorClipInfo(int layerIndex)
返回下一个状态的剪辑信息,如果没有下一个状态返回该结构体的默认值
经过测试,修改过播放信息并不会立即执行,会在Animator刷新时更新该值,或者手动调用Animator的Update更新该值
74.AnimatorStateInfo GetNextAnimatorStateInfo(int layerIndex)
返回下一个状态的信息,如果没有下一个状态返回该结构体的默认值
经过测试,修改过播放信息并不会立即执行,会在Animator刷新时更新该值,或者手动调用Animator的Update更新该值