关于Ragdoll的制作方式FPS游戏中的敌人受到攻击后阵亡后,通常有两种动作,一种是设置敌人的Death动画进行播放,另一种则是将敌人换成ragdoll模式。以效果来看,ragdoll会得到比较真实的反馈现象,在敌人倒地后,玩家仍可以继续攻击来发泄一下情绪,所以这种方式也普遍的运用在众多的FPS游戏里面。
现在,我们就来看看如何在场景中设置敌人的ragdoll,如图,在场景里面设置了一个攻击用的机器士兵,士兵已经具备了攻击与待命的一些动作,同时也写入了AI进行搜索玩家的功能。
首先将机器士兵做出一个Prefab,然后打开一个新的场景,使用Plane创建一个地板,这个地板的用途主要是测试士兵与地面的碰撞效果。
将制作好的士兵Prefab拖曳到地板上,注意士兵的底部与地板要保持一定的距离,这样在测试ragdoll与地板的碰撞时才不会发生无法预期的错误。
由于士兵后面的动作全部交由ragdoll来控制,所以必须将原来的动画设置取消,直接使用Remove Component将士兵上面的Animation组件移除。
选择Game Object > Create Other > Ragdoll, 这个名称就是我们常听到的布偶娃娃功能,顾名思义就像是角色身上捆绑了控制线,然后可任人摆布一样。
在Create Ragdoll的面板的左边面显示出骨架的名称,右边则是士兵模型需要对应的Game Object, 这表示我们必须使用手动的方式进行每一个骨架的指定,有一点需特别注意,模型必须以T字姿态站立,才能确保ragdoll的动作不会出现任何的错误。
在Hierarchy面板里面将士兵模型的中心点 roothandle拖曳到Root的栏位,指定完成后,面板下方会提示未完成的骨架部分。
接着进行左脚的三个结构指定,分别将模型的upleg L,lowLeg L,heel L指定到对应的栏位,以此类推,依序将右脚的三个物拖曳到Right Hips,Right Knee,Right Foot的栏位。
如图所示,通过六个骨架的拖曳,我们就完成了士兵腿部的指定工作,从名称上不难理解ragdoll是依序从腿部到手部架构,再往上指定左右手臂与头部。
指定完成所有的骨架后,将Total Mass设定到一个比较低的数值,这样可以让ragdoll在作用时的反应更为明显些。
完成后按下Create,士兵模型上面就会出现ragdoll的控制器,这些控制器的功能与Mesh Collider的作用是相同的,按下Play进行测试,士兵会从原本的站立状态直接倒地,就像是受到攻击后所呈现出来的效果。
现在有一个问题是,士兵动作已经ok,但是上的武器并没有掉落,原因是武器没有受到rigid body的作用,所以变成停留在空中的一个现象。
选择武器模型,在上面增加 Rigidbody与Box Collider,然后将Box Collider的绿色框调整到与武器的大小一致或是略微大些即可,再进行Play测试,武器就会跟着士兵一起向下掉落。
将设置好的ragdoll士兵做成一个Prefab,如图,Robot是攻击用的士兵,Robot-Ragdoll则是被攻击后倒地的士兵,我们用了两个不同的名称来区分模型的设置状态。
现在我们来看看ragdoll在脚本内的设置情况:
function Detonate () {
// 摧毁原来的物体
Destroy(gameObject);
// 播放士兵阵亡的音效
if (dieSound)
AudioSource.PlayClipAtPoint(dieSound, transform.position);
// 替换士兵阵亡的模型
if (deadReplacement) {
var dead : Transform = Instantiate(deadReplacement, transform.position, transform.rotation);
// 在士兵原来的位置进行复制
CopyTransformsRecurse(transform, dead);
}
}
将Robot-Ragdoll拖曳到脚本里面的Dead Replacement后,就完成了士兵整体的动作设定,接下来进行测试,看看士兵是否会根据我们的设置产生ragdoll的作用。
按下Play,现在我们开始攻击士兵。
在我方强大的火力下,士兵受到一定的伤害后被击倒在地。
现在,我们就来看看如何在场景中设置敌人的ragdoll,如图,在场景里面设置了一个攻击用的机器士兵,士兵已经具备了攻击与待命的一些动作,同时也写入了AI进行搜索玩家的功能。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140947ls6jtt5j57o5zotu.jpg)
首先将机器士兵做出一个Prefab,然后打开一个新的场景,使用Plane创建一个地板,这个地板的用途主要是测试士兵与地面的碰撞效果。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140947oj311dl11ovtv3vf.jpg)
将制作好的士兵Prefab拖曳到地板上,注意士兵的底部与地板要保持一定的距离,这样在测试ragdoll与地板的碰撞时才不会发生无法预期的错误。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140947n752v8r8klm5l7w2.jpg)
由于士兵后面的动作全部交由ragdoll来控制,所以必须将原来的动画设置取消,直接使用Remove Component将士兵上面的Animation组件移除。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140947og7wgvyqhppgbmpt.jpg)
选择Game Object > Create Other > Ragdoll, 这个名称就是我们常听到的布偶娃娃功能,顾名思义就像是角色身上捆绑了控制线,然后可任人摆布一样。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140947ek0dql70f0c60zlr.jpg)
在Create Ragdoll的面板的左边面显示出骨架的名称,右边则是士兵模型需要对应的Game Object, 这表示我们必须使用手动的方式进行每一个骨架的指定,有一点需特别注意,模型必须以T字姿态站立,才能确保ragdoll的动作不会出现任何的错误。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140947tk6r7t65kbzw3qd3.jpg)
在Hierarchy面板里面将士兵模型的中心点 roothandle拖曳到Root的栏位,指定完成后,面板下方会提示未完成的骨架部分。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140948r8drfbqddd83zr95.jpg)
接着进行左脚的三个结构指定,分别将模型的upleg L,lowLeg L,heel L指定到对应的栏位,以此类推,依序将右脚的三个物拖曳到Right Hips,Right Knee,Right Foot的栏位。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140948xjkyhh0zs6shrsj6.jpg)
如图所示,通过六个骨架的拖曳,我们就完成了士兵腿部的指定工作,从名称上不难理解ragdoll是依序从腿部到手部架构,再往上指定左右手臂与头部。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140948cgo0xpuzou6bzqz6.jpg)
指定完成所有的骨架后,将Total Mass设定到一个比较低的数值,这样可以让ragdoll在作用时的反应更为明显些。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140948lvzqvi872ij2iymh.jpg)
完成后按下Create,士兵模型上面就会出现ragdoll的控制器,这些控制器的功能与Mesh Collider的作用是相同的,按下Play进行测试,士兵会从原本的站立状态直接倒地,就像是受到攻击后所呈现出来的效果。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140949jcw1r95bg7t2v7vp.jpg)
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140949kidnzia0bp5irea0.jpg)
现在有一个问题是,士兵动作已经ok,但是上的武器并没有掉落,原因是武器没有受到rigid body的作用,所以变成停留在空中的一个现象。
选择武器模型,在上面增加 Rigidbody与Box Collider,然后将Box Collider的绿色框调整到与武器的大小一致或是略微大些即可,再进行Play测试,武器就会跟着士兵一起向下掉落。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140949ivjls0vslggv5f5v.jpg)
将设置好的ragdoll士兵做成一个Prefab,如图,Robot是攻击用的士兵,Robot-Ragdoll则是被攻击后倒地的士兵,我们用了两个不同的名称来区分模型的设置状态。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140949jr4gfic9iqgidcil.jpg)
现在我们来看看ragdoll在脚本内的设置情况:
function Detonate () {
// 摧毁原来的物体
Destroy(gameObject);
// 播放士兵阵亡的音效
if (dieSound)
AudioSource.PlayClipAtPoint(dieSound, transform.position);
// 替换士兵阵亡的模型
if (deadReplacement) {
var dead : Transform = Instantiate(deadReplacement, transform.position, transform.rotation);
// 在士兵原来的位置进行复制
CopyTransformsRecurse(transform, dead);
}
}
将Robot-Ragdoll拖曳到脚本里面的Dead Replacement后,就完成了士兵整体的动作设定,接下来进行测试,看看士兵是否会根据我们的设置产生ragdoll的作用。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140949tsyk0vvss9gxyllv.jpg)
按下Play,现在我们开始攻击士兵。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140950cmdmzotmgz89mrra.jpg)
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140950h453jijpapppcln3.jpg)
在我方强大的火力下,士兵受到一定的伤害后被击倒在地。
![](http://www.unitymanual.com/data/attachment/forum/201309/22/140950rf72w3c7r77jr2zx.jpg)
从这个案例的操作,我们知道如何设置Ragdoll的绑定,并且了解在一下里面的实际用途,在后面的教程中,我们将会推出更多关于FPS游戏的相关设置内容,也希望更多的朋友能进入FPS的开发行列!
转载自:http://www.unitymanual.com/thread-4524-1-1.html