正如其名,Ragdoll可讓人物模型實現像布娃娃同樣物理效果c#
在場景中新建 3D Object → Ragdoll...ide
接下來是一個初見覆雜的綁定界面,這裏我作了簡單翻譯函數
咱們須要將模型對應的關節部位一一拉進這個表動畫
建立完成後,能夠發現模型中的每一個所選部位中多了一個Rigibody,一個Collider和一個Character Joint組件,在Joint面板裏能夠調節轉動限制等this
這裏要注意的一個坑點是,root節點是沒有Character Joint的,當你找不到root節點時,沒有Character Joint可是添加了Box Collider和Rigibody的就是root節點翻譯
root節點應在這個位置,不熟悉朋友有可能將盆骨附近Pelvis 與 胸部附近Middle Spine的兩個Collider互換位置,或者重疊,這將致使整我的物的抽搐,蒙皮拉伸3d
調整四肢Collider大小位置,以下:code
若是我須要的效果是:協程
個人作法是使用GetComponentsInChildren函數得到全部剛體,再經過每一個剛體獲取這個部位上的Collider,用兩個List將他們存儲起來。就能夠方便的設置isKinematic和isTriggerblog
同時在死亡的下一幀用協程關閉動畫組件,(若是想讓角色復活,Anmiaton組件的enable屬性設置爲true便可)
完整代碼以下:
public List<Rigidbody> ragdollRigidbodys = new List<Rigidbody>(); public List<Collider> ragdollColliders = new List<Collider>(); void InitRagdoll() { Rigidbody[] _rigidbodys = GetComponentsInChildren<Rigidbody>(); for (int i = 0; i < _rigidbodys.Length; i++) { if (_rigidbodys[i] == rigidbody) continue; ragdollRigidbodys.Add(_rigidbodys[i]); _rigidbodys[i].isKinematic = true; Collider _collider = _rigidbodys[i].gameObject.GetComponent<Collider>(); _collider.isTrigger = true; ragdollColliders.Add(_collider); } } void EnableRagdoll() { for (int i = 0; i < ragdollRigidbodys.Count; i++) { ragdollRigidbodys[i].isKinematic = false; ragdollColliders[i].isTrigger = false; } Collider collidercontroller = rigidbody.gameObject.GetComponent<Collider>(); collidercontroller.enabled = false; rigidbody.isKinematic = true; StartCoroutine(CloseAnimator()); } IEnumerator CloseAnimator() { yield return new WaitForEndOfFrame(); animator.enabled = false; this.enabled = false; }
最終效果就是這樣了,死亡以後的布娃娃狀態真的頗有意思
Play以後的第一幀(先點暫停再Play可查看第一幀)可能出現角色關節撕裂,Play以後角色亂動
解決方案:
檢查pelvis和middle spine是否混淆,root節點設置錯誤(root節點是有剛體,有碰撞器沒有Character Joint)
檢查兩個部位的collider是否產生重疊
解決方案:
能夠嘗試勾選Character Joint組建的Enable Projection選項
解決方案:
檢查是否有關Animator組件