Ragdoll系统在现代游戏中已经非常常见,而ragdoll式的人物控制器在近几年也颇受欢迎,人类一败涂地中就有这样让角色看起来软乎乎的角色控制器。
最近在做的游戏也想做成这种软乎乎的风格,于是开始了尝试。
使用的素材是unity免费公开的角色unity chan,免费角色配免费动作和完整的碰撞体是完美的测试素材。在场景中添加一个ragdoll,绑定unitychan的骨骼,准备工作就完成了。
但是仅仅这样unity酱是站不起来的,ragdoll状态下的角色没有控制只是瘫倒在地而已。所以要添加configurable joints ,将Angular X Drive和Angular YZ Drive的Spring和Damper属性调大,我填了1000和300,这个属性可以帮助角色直立。
可以看出Unitychan直接站立后就如被气球吊起一般,无法正常站立,排查后发现是因为角色的小腿只有capsule形状的collider,接触地面的面积不够,给角色脚上增加了box Collider后问题解决。
角色动画控制方面需要点小技巧,因为ragdoll不能直接套用animator,所以要用一个标准的角色模型作为参考,将animator放置于没有设置rigidbody的模型上,使用我写的targetJoint.cs连接ragdoll角色的骨骼与动画控制角色的骨骼,因为人的关节活动受限,所以只模拟rotation就能够很好的同步动作。
public class TargetJoint : MonoBehaviour { public float strength = 10; public Transform targetTransform; private void FixedUpdate() { Rigidbody body=GetComponent<Rigidbody>(); float lerpValue = Time.fixedDeltaTime * strength; //Vector3 targetPosition = Vector3.Lerp(body.position, targetTransform.position, lerpValue); //body.MovePosition(targetPosition); Quaternion targetRotation = Quaternion.Lerp(body.rotation, targetTransform.rotation, lerpValue); body.MoveRotation(targetRotation); } }
参考资料:
//youtu.be/u661TmGPbok Making a ragdoll game in unity | my unity journey
//youtu.be/MElbAwhMvTc Fixed, Spring, Hinge, Character & Configurable Joint explained – Unity Tutorial
//youtu.be/sjRE4qW_giU how to Balance Active Ragdoll Unity 3d in 1 line of code tutorial