Unity-Animator深刻系列---API詳解

回到 Animator深刻系列總目錄html

 

測試Unity版本爲5.2.1數組

  • 人形動畫的接口都有標註
  • 本列表不包含全部標註爲過期的方法
  • 目前該詳解還有很多缺漏,有時間持續更新

 

2016/8/16更新CrossFadeInFixedTime接口描述數據結構

 


 

1.Vector3 angularVelocity { get; }app

[人形動畫]得到Avatar相對於最後一幀的角速率oop

 

2.bool applyRootMotion { get; set; }性能

是否打開根運動測試

 

3.Avatar avatar { get; set; }優化

[人形動畫]人形動畫Avatar,可是avatar結構裏的字段很是少,應該是用於自定義類型轉換。動畫

官方說在運行時切換Avatar並不徹底支持,須要保險起見LINKui

 

4.Vector3 bodyPosition { get; set; }

[人形動畫]得到身體座標,根據測試應該是平均值,比spine還低一些

 

5.Quaternion bodyRotation { get; set; }

[人形動畫]得到身體旋轉

 

6.AnimatorCullingMode cullingMode { get; set; }

默認是CullUpdateTransforms,會剔除一部份內容,包括一些消息還會觸發

CullCompletely是不可見時徹底禁用,AlwaysAnimate是徹底不剔除

具體參考官方文檔LINK

 

7.Vector3 deltaPosition { get; }

對於有根位移的動畫,相對於上一幀的位移本地空間座標差。

具體參考這篇:LINK

 

8.Quaternion deltaRotation { get; }

對於有根位移的動畫,相對於上一幀的位移本地空間旋轉座標差。

具體參考這篇:LINK

 

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

優化遊戲對象具體參閱文檔LINK

大意就是把層級信息存到內置的數據結構裏,不須要在運行時進行匹配了。從而提高性能

 

 

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; }

[人形動畫]當前是否正在匹配目標

關於匹配具體請看這篇LINK

 

18.bool isOptimizable { get; }

始終返回爲True,暫時沒搞明白。官方文檔連接LINK

AnimatorUtility.OptimizeTransformHierarchy(gameObject, new string[0]);

將其優化後,而且Animator也出現優化後的提示,依舊打印True。。。實在無解

 

19.int layerCount { get; }

動畫層數

 

20.bool layersAffectMassCenter { get; set; }

資料不多,暫時不清楚這個接口,官方的描述:

Additional layers affects the center of mass.

官方的連接:LINK

 

21.float leftFeetBottomHeight { get; } 和 float rightFeetBottomHeight { get; }

[人形動畫]得到左腳腳底高度和右腳腳底高度

測試代碼:

View Code

 

左邊的圖是得到腳部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; }

動畫回放時間,錄製與回放具體請看這篇LINK

 

29.AnimatorRecorderMode recorderMode { get; }

當前的錄製模式,Offline,Playback,Record

回放或者錄製,或者兩種狀態都不在。

錄製與回放具體請看這篇LINK

 

30.float recorderStartTime { get; set; }

錄製開始時間,錄製與回放具體請看這篇LINK

 

31.float recorderStopTime { get; set; }

錄製結束時間,錄製與回放具體請看這篇LINK

 

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具體請看這篇LINK

 

38.Quaternion targetRotation { get; }

返回由SetTarget(AvatarTarget targetIndex, float targetNormalizedTime))指定的目標的旋轉角度。

關於SetTarget具體請看這篇LINK

 

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開始播放

關於混合的細節,時長能夠參考這篇文章:LINK

 

44.CrossFadeInFixedTime(...)系列接口

混合而且按照實際時間進行。這裏的實際時間是指Time.time的時間

具體細節能夠參考這篇文章:LINK

 

45.AnimatorTransitionInfo GetAnimatorTransitionInfo(int layerIndex)

得到當前動畫的過渡信息,關於過渡能夠看這篇LINK

 

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)

[人形動畫]匹配目標,關於匹配具體請看這篇LINK

 

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相關操做請參考這篇:LINK

 

59.float GetIKHintPositionWeight(AvatarIKHint hint)   &   void SetIKHintPositionWeight(AvatarIKHint hint, float value)

[人形動畫]獲取/設置IK Hint位置權重,IK相關操做請參考這篇:LINK

 

60.Vector3 GetIKPosition(AvatarIKGoal goal)   &    void SetIKPosition(AvatarIKGoal goal, Vector3 goalPosition)

[人形動畫]獲取/設置IK位置,IK相關操做請參考這篇:LINK

 

61.float GetIKPositionWeight(AvatarIKGoal goal)     &    void SetIKPositionWeight(AvatarIKGoal goal, float value)

[人形動畫]獲取/設置和獲取IK位置權重,IK相關操做請參考這篇:LINK

 

62.Quaternion GetIKRotation(AvatarIKGoal goal)    &   void SetIKRotation(AvatarIKGoal goal, Quaternion goalRotation)

[人形動畫]獲取/設置IK旋轉,IK相關操做請參考這篇:LINK

 

63.float GetIKRotationWeight(AvatarIKGoal goal)  &  void SetIKRotationWeight(AvatarIKGoal goal, float value)

[人形動畫]獲取/設置IK旋轉權重,IK相關操做請參考這篇:LINK

 

64.void SetLayerWeight(int layerIndex, float weight)

設置層權重

 

65.void SetLookAtPosition(Vector3 lookAtPosition) 和 void SetLookAtWeight(...)

[人形動畫]測試腳本:

animator.SetLookAtPosition(reference.position);
animator.SetLookAtWeight(1f);

使用後玩家會看向reference的對象

IK相關操做請參考這篇:LINK

 

66.void SetTarget(AvatarTarget targetIndex, float targetNormalizedTime)

[人形動畫]在動畫播放前獲得播放後的座標和旋轉。

關於SetTarget具體請看這篇LINK

 

67.void StartPlayback()

開始回放,錄製與回放具體請看這篇LINK

 

68.void StartRecording(int frameCount)

開始錄製

注意參數中的frameCount是須要錄製長度的幀數

若是參數小於1,則不會限制錄製時間

錄製與回放具體請看這篇LINK

 

69.void StopPlayback()

中止回放,錄製與回放具體請看這篇LINK

 

70.void StopRecording()

中止錄製,錄製與回放具體請看這篇LINK

 

71.void Update(float deltaTime)

Animator直接開放出了Update接口,若是你只是想更新動畫信息而不前進播放動畫,deltaTime參數能夠設爲0

在作下一個狀態指向判斷時,很是有效

 

72.GetSet各種型參數系列(SetFloat,SetBool等等)

最經常使用的接口

但須要注意下float類型數據,能夠單獨設置阻尼,具體看這篇LINK

 

73.AnimatorClipInfo[] GetNextAnimatorClipInfo(int layerIndex)

返回下一個狀態的剪輯信息,若是沒有下一個狀態返回該結構體的默認值

通過測試,修改過播放信息並不會當即執行,會在Animator刷新時更新該值,或者手動調用Animator的Update更新該值

 

74.AnimatorStateInfo GetNextAnimatorStateInfo(int layerIndex)

返回下一個狀態的信息,若是沒有下一個狀態返回該結構體的默認值

通過測試,修改過播放信息並不會當即執行,會在Animator刷新時更新該值,或者手動調用Animator的Update更新該值

相關文章
相關標籤/搜索