布娃娃系统

作者:追风剑情 发布于:2017-7-15 23:23 分类:Unity3d

示例所用版本:Unity2017

一、在Assets Store下载场景和模型资源

11111.png

22222.png

33333.png

二、制作一个简单场景,并把人物模型(Max)拖到场景中

88888.png

必须要是带骨骼的人物模型才能制作布娃娃。

打开布娃娃设置面板(GameObject->3D Object-> Ragdoll...),并把人物模型(MAX)对应骨骼拖到布娃娃面板中,然后点Create按钮。

44444.png

Pelvis(骨盆)、 Hips(臀部)、 Knee(膝)、 Foot(脚)、 Arm(臂)、 Elbow(肘)、 Spine(脊柱)、 Head(头)

点Create按钮-(布娃娃创建成功后,会在人物关节上自动挂上Collider、Rigidbody、Character Joint组件。)

55555555.png

发现头部的碰撞器太大了,调小点。

66666.png

人物模型身上的Animation会影响布娃娃效果,所以需要把组件的勾选去掉

99999.png

运行测试

gaollg0.GIF

把人物所有关节上的Rigidbody组件的isKinematic属性设为false可禁用布娃娃功能。


using UnityEngine;
/// <summary>
/// 布娃娃系统测试脚本
/// </summary>
public class Test : MonoBehaviour
{
    private void Update()
    {
        //按空格键激活布娃娃系统
        if (Input.GetKeyDown(KeyCode.Space)) 
        {
            ActiveRagdoll(true);
        }
    }

    // 激活布娃娃系统
    public void ActiveRagdoll(bool active)
    {
        Animator animator = GetComponentInChildren<Animator>();
        if (animator != null)
            animator.enabled = !active;

        NavMeshAgent agent = GetComponentInChildren<NavMeshAgent>();
        if (agent != null)
            agent.enabled = !active;

        Rigidbody[] rigidbodys = GetComponentsInChildren<Rigidbody>();
        if (rigidbodys == null || rigidbodys.Length == 0)
            return;
        foreach (Rigidbody rb in rigidbodys)
        {
            //消除Animator对Rigidbody的影响
            rb.velocity = Vector3.zero;
            rb.angularVelocity = Vector3.zero;
            //Animator执行时,isKinematic需要设置为true
            rb.isKinematic = !active;
            //Animator执行时,useGravity需要设置为false
            rb.useGravity = active;
            //开启碰撞
            Collider co = rb.GetComponent<Collider>();
            if (co != null)
                co.enabled = active;
        }
    }
}


标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号