制作一个Ragdoll风格人物控制器

Ragdoll系统在现代游戏中已经非常常见,而ragdoll式的人物控制器在近几年也颇受欢迎,人类一败涂地中就有这样让角色看起来软乎乎的角色控制器。

最近在做的游戏也想做成这种软乎乎的风格,于是开始了尝试。

使用的素材是unity免费公开的角色unity chan,免费角色配免费动作和完整的碰撞体是完美的测试素材。在场景中添加一个ragdoll,绑定unitychan的骨骼,准备工作就完成了。

刚设置完

但是仅仅这样unity酱是站不起来的,ragdoll状态下的角色没有控制只是瘫倒在地而已。所以要添加configurable joints ,将Angular X Drive和Angular YZ Drive的Spring和Damper属性调大,我填了1000和300,这个属性可以帮助角色直立。

Configurable Joint可以强行让unity酱站立

可以看出Unitychan直接站立后就如被气球吊起一般,无法正常站立,排查后发现是因为角色的小腿只有capsule形状的collider,接触地面的面积不够,给角色脚上增加了box Collider后问题解决。

改变了接触面积
一个bug,最后通过减小configurable joints 的angular drive的damper解决

角色动画控制方面需要点小技巧,因为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

Share this:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注