Unity3D进阶(六)

Unity Ragdoll系统


welcome

Ragdoll

Ragdoll又被称为布娃娃系统,在游戏中常被用来模拟逼真的死亡效果

Ragdoll创建

  1. 将你的人物模型放入 Hierarchy 面板中
  2. 在5.6的版本中Ragdoll被放在了 GameObject 的3D Object 中 点击打开

你需要为Ragdoll绑定所有的骨骼节点


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);
}
}
}

总结

如果你需要在角色倒地后站立起来继续游戏,你不妨试试第一种方法,如果你单纯的想模拟死亡效果可以用第二种方法,因为第二种方法要消除原来的物体所以不能模拟前面的情景,今天到此为止我要吃饭了(>-<)

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Ragdoll
    1. 1.1. Ragdoll创建
    2. 1.2. 实际应用
      1. 1.2.1.
      2. 1.2.2.
  2. 2. 总结