求教unity spine 插件使用Animator 控制spine动画

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

我要回帖

更多关于 unity spine 插件 的文章

 

随机推荐