经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Unity Ragdoll 实现死亡效果 心得+坑点总结
来源:cnblogs  作者:zhxmdefj  时间:2019/4/28 8:46:18  对本文有异议

效果展示

正如其名,Ragdoll可以让人物模型实现像布娃娃一样物理效果

创建Ragdoll

在场景中新建 3D Object → Ragdoll...

接下来是一个初见复杂的绑定界面,这里我做了简单翻译

我们需要将模型对应的关节部位一一拉进这个表

创建完成后,可以发现模型中的每个所选部位中多了一个Rigibody,一个Collider和一个Character Joint组件,在Joint面板里可以调节转动限制等

这里要注意的一个坑点是,root节点是没有Character Joint的,当你找不到root节点时,没有Character Joint但是添加了Box Collider和Rigibody的就是root节点

root节点应在这个位置,不熟悉朋友有可能将盆骨附近Pelvis 与 胸部附近Middle Spine的两个Collider互换位置,或者重叠,这将导致整个人物的抽搐,蒙皮拉伸

调整四肢Collider大小位置,如下:

通过代码控制

这时候我们需要:

  1. 让角色存活(isDead = false)时:每个部位的Rigibody的isKinematic一直为true,每个部位的Collider的isTrigger也为true
  2. 角色死亡(isDead = true)时:每个部位的Rigibody的isKinematic变为false,每个部位的Collider的isTrigger也变为false,同时,必须将角色的Animation组件去除

就可以实现这样的效果

代码

我的做法是使用GetComponentsInChildren函数获得所有刚体,再通过每个刚体获取这个部位上的Collider,用两个List将他们存储起来。就可以方便的设置isKinematic和isTrigger

同时在死亡的下一帧用协程关闭动画组件,(如果想让角色复活,Anmiaton组件的enable属性设置为true即可)

完整代码如下:

  1. public List<Rigidbody> ragdollRigidbodys = new List<Rigidbody>();
  2. public List<Collider> ragdollColliders = new List<Collider>();
  3. void InitRagdoll() {
  4. Rigidbody[] _rigidbodys = GetComponentsInChildren<Rigidbody>();
  5. for (int i = 0; i < _rigidbodys.Length; i++) {
  6. if (_rigidbodys[i] == rigidbody)
  7. continue;
  8. ragdollRigidbodys.Add(_rigidbodys[i]);
  9. _rigidbodys[i].isKinematic = true;
  10. Collider _collider = _rigidbodys[i].gameObject.GetComponent<Collider>();
  11. _collider.isTrigger = true;
  12. ragdollColliders.Add(_collider);
  13. }
  14. }
  15. void EnableRagdoll() {
  16. for (int i = 0; i < ragdollRigidbodys.Count; i++) {
  17. ragdollRigidbodys[i].isKinematic = false;
  18. ragdollColliders[i].isTrigger = false;
  19. }
  20. Collider collidercontroller = rigidbody.gameObject.GetComponent<Collider>();
  21. collidercontroller.enabled = false;
  22. rigidbody.isKinematic = true;
  23. StartCoroutine(CloseAnimator());
  24. }
  25. IEnumerator CloseAnimator() {
  26. yield return new WaitForEndOfFrame();
  27. animator.enabled = false;
  28. this.enabled = false;
  29. }

最终效果就是这样了,死亡之后的布娃娃状态真的很有意思

坑点总结

第一帧蒙皮拉伸,撕裂

Play之后的第一帧(先点暂停再Play可查看第一帧)可能出现角色关节撕裂,Play之后角色乱动

解决方案:

  • 检查pelvis和middle spine是否混淆,root节点设置错误(root节点是有刚体,有碰撞器没有Character Joint

  • 检查两个部位的collider是否产生重叠

死亡后蒙皮拉伸,撕裂

解决方案:

可以尝试勾选Character Joint组建的Enable Projection选项

死亡后布娃娃不生效

解决方案

检查是否有关Animator组件

原文链接:http://www.cnblogs.com/zhxmdefj/p/10764043.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号