IK還是一個很神奇和實用的東西啊,起碼可以用代碼來控制人物骨骼位置還是很爽的。因為不是動畫師~
這篇可能跟Animator沒啥關系了哈,都是代碼層的。
看了一官方的案例,老的,有些問題,自己修改了一下,達到了效果。

官方建議把所有的IK操作放在OnAnimatorIK中進行。
如果我們要進行IK操作,先要綁定IK位置。IK能控制的官方都給了enum

然后我們要設置權重Weight,范圍為0~1,這里都設成1
1 avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1.0f); 2 avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f); 3 avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f); 4 avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f); 5 avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f); 6 avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f); 7 avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f); 8 avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f); 9 avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f);
如果我們把LeftFoot的權重設為0,則會出現以下情況

在官方給的腳本中IK的綁定並沒有在OnAnimatorIK中,而放到了Update中,然后就出現了綁定失敗的問題。
所以我把他們都放到了OnAnimatorIK中。就可以了。
關於IK的操作~,給的少。
1 //設置右手IK位置 2 avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position); 3 //設置右手IK旋轉 4 avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation); 5 //獲取右手IK位置 6 rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand); 7 //獲取右手IK旋轉 8 rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand);
上完整代碼~ (ikActive)沒開啟時球跟隨人,開啟時人跟隨球。
1 using UnityEngine; 2 using System.Collections; 3 4 public class MyIK : MonoBehaviour { 5 6 public Transform bodyObj = null; 7 public Transform leftFootObj = null; 8 public Transform rightFootObj = null; 9 public Transform leftHandObj = null; 10 public Transform rightHandObj = null; 11 public Transform lookAtObj = null; 12 private Animator avatar; 13 public bool ikActive = false; 14 15 void Start() 16 { 17 avatar = GetComponent<Animator>(); 18 } 19 20 void OnAnimatorIK(int layerIndex) 21 { 22 if (avatar == null) return; 23 24 if (ikActive) 25 { 26 avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0.0f); 27 avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f); 28 avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f); 29 avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f); 30 avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f); 31 avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f); 32 avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f); 33 avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f); 34 avatar.SetLookAtWeight(1.0f, 0.3f, 1.0f, 0.5f); 35 36 if (bodyObj != null) 37 { 38 avatar.bodyPosition = bodyObj.position; 39 avatar.bodyRotation = bodyObj.rotation; 40 } 41 42 if (leftHandObj != null) 43 { 44 avatar.SetIKPosition(AvatarIKGoal.LeftHand, leftHandObj.position); 45 avatar.SetIKRotation(AvatarIKGoal.LeftHand, leftHandObj.rotation); 46 } 47 if (rightFootObj != null) 48 { 49 avatar.SetIKPosition(AvatarIKGoal.RightFoot, rightFootObj.position); 50 avatar.SetIKRotation(AvatarIKGoal.RightFoot, rightFootObj.rotation); 51 } 52 if (leftFootObj != null) 53 { 54 avatar.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position); 55 avatar.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation); 56 } 57 if (rightHandObj != null) 58 { 59 avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position); 60 avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation); 61 } 62 63 if (lookAtObj != null) 64 avatar.SetLookAtPosition(lookAtObj.position); 65 } 66 else 67 { 68 if (bodyObj != null) 69 { 70 bodyObj.position = avatar.bodyPosition; 71 bodyObj.rotation = avatar.bodyRotation; 72 } 73 74 if (leftFootObj != null) 75 { 76 leftFootObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftFoot); 77 leftFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftFoot); 78 } 79 80 if (rightFootObj != null) 81 { 82 rightFootObj.position = avatar.GetIKPosition(AvatarIKGoal.RightFoot); 83 rightFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightFoot); 84 } 85 86 if (leftHandObj != null) 87 { 88 leftHandObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftHand); 89 leftHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftHand); 90 } 91 92 if (rightHandObj != null) 93 { 94 rightHandObj.position = avatar.GetIKPosition(AvatarIKGoal.RightHand); 95 rightHandObj.rotation = avatar.GetIKRotation(AvatarIKGoal.RightHand); 96 } 97 98 if (lookAtObj != null) 99 { 100 lookAtObj.position = avatar.bodyPosition + avatar.bodyRotation * new Vector3(0, 0.5f, 1); 101 } 102 avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0); 103 avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 0); 104 avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 0); 105 avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0); 106 avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 0); 107 avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 0); 108 avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 0); 109 avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 0); 110 avatar.SetLookAtWeight(0.0f); 111 } 112 } 113 114 }
附一個彩蛋,IK有意思~~呵呵~ o(* ̄▽ ̄*)ブ

