Unity Ragdoll系统
Ragdoll
Ragdoll又被称为布娃娃系统,在游戏中常被用来模拟逼真的死亡效果
Ragdoll创建
- 将你的人物模型放入 Hierarchy 面板中
- 在5.6的版本中Ragdoll被放在了 GameObject 的3D Object 中 点击打开
你需要为Ragdoll绑定所有的骨骼节点
设置完成在场景中添加一个地面,点击播放按钮就可以看到效果了
实际应用
在游戏中用来模拟死亡的效果,有两种实现方法
一
其一是将Ragdoll绑定在带有动画的模型上,在其”死亡”时,关闭Animator组件,转化到Ragdoll模式
很不幸的是,动画变得十分鬼畜,移除动画组件后虽然效果尚可,但是动画的播放成了硬伤
接下来试试把模型下的所有绑定了 Ragdoll 的关节的刚体属性设置为 IsKinematic(即不受物理因素影响)
Bingo! 成果显著,使用这种方法应用死亡效果,需要遍历模型下所有的刚体属性并把 IsKinematic 设置为 false
话不多说上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| using UnityEngine; public class control : MonoBehaviour { //人物的模型 public GameObject theModel; //管理人物的父物体即绑定了动画组件的物体 public GameObject cc; public Rigidbody r; void Update () { if (Input.GetKeyDown(KeyCode.Z)) { //关闭动画 cc.GetComponent<Animator>().enabled = false; theModel.GetComponent<Rigidbody>().isKinematic = false; //以当前的Transform组件为入口 setKinematic(gameObject.transform); } } //遍历所有子节点 void setKinematic(Transform Father) { foreach (Transform child in Father) { r = child.gameObject.GetComponent<Rigidbody>(); if (r != null) { r.isKinematic = false; } //以当前节点为父节点向下遍历 setKinematic(child); } } }
|
二
其二使用官方教程中的一种方法,准备一个播放动画模型的预制体,为这个预制体添加Ragdoll在角色死亡时用这个预制体来进行替换,不说了上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| using UnityEngine; public class test : MonoBehaviour { public GameObject theCopy; // Use this for initialization void Start () { } void Update () { if (Input.GetKeyDown(KeyCode.Z)) { //销毁原来的模型 Destroy(gameObject); //在原地生成布娃娃 GameObject g = Instantiate(theCopy, transform.position, transform.rotation); CopyTransformsRecurse(transform,g.transform); } } //从原来的模型将所有的位置及旋转信息复制到预制体上 void CopyTransformsRecurse(Transform src, Transform dst) { dst.position = src.position; dst.rotation = src.rotation; foreach (Transform child in dst) { // Match the transform with the same name Transform curSrc = src.Find(child.name); if (curSrc) CopyTransformsRecurse(curSrc, child); } } }
|
总结
如果你需要在角色倒地后站立起来继续游戏,你不妨试试第一种方法,如果你单纯的想模拟死亡效果可以用第二种方法,因为第二种方法要消除原来的物体所以不能模拟前面的情景,今天到此为止我要吃饭了(>-<)