示例所用版本:Unity2017
一、在Assets Store下载场景和模型资源
二、制作一个简单场景,并把人物模型(Max)拖到场景中
必须要是带骨骼的人物模型才能制作布娃娃。
打开布娃娃设置面板(GameObject->3D Object-> Ragdoll...),并把人物模型(MAX)对应骨骼拖到布娃娃面板中,然后点Create按钮。
Pelvis(骨盆)、 Hips(臀部)、 Knee(膝)、 Foot(脚)、 Arm(臂)、 Elbow(肘)、 Spine(脊柱)、 Head(头)
点Create按钮-(布娃娃创建成功后,会在人物关节上自动挂上Collider、Rigidbody、Character Joint组件。)
发现头部的碰撞器太大了,调小点。
人物模型身上的Animation会影响布娃娃效果,所以需要把组件的勾选去掉
运行测试
把人物所有关节上的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;
}
}
}