正如其名,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组件