XGundam05 发表于 2021-4-14 08:28

Unity2018.4.16 布娃娃系统 RagDoll

xzhuan原创稿件,转载请注明出处!

一些游戏中的角色死亡时,死亡的肢体动作十分逼真,受重力和物理模拟。Unity3D物理引擎中的Ragdoll系统,可以用来创建这种效果


如何给模型添加布娃娃系统


官方文档:https://docs.unity3d.com/Manual/wizard-RagdollWizard.html
布娃娃系统只能用在具有Rigging(骨骼)的模型上,添加方法是:GameObject—>3D Object—>Ragdoll


把需要附加Ragdoll的模型拖到Hierarchy视图中,接下来就很简单也很麻烦了,需要把模型骨骼对应的游戏体拖到Ragdoll面板一一对应,建立好引用,一个都不要错,会导致刚体和碰撞体附加到错误的游戏体上。感觉不准切可以提前看下骨骼界面:

全部拖好以后,根据需求修改一下质量(TotalMass)和力(Strength),点击create就OK了,可以看到模型中拖到Ragdoll面板的游戏体添加了如图下组件:

布娃娃系统是以Create Ragdoll窗口中的骨骼映射信息为基础,以各关节为单位,添加Capsule Collider和Rigidbody组件,关节与关节之间以Character Joint组件连接。若产生的Collider不符合要求,可在骨骼结构中调整radius的大小。

怎样控制布娃娃系统


布娃娃系统的核心是由物理引擎实现的,所以在角色死亡或需要时,通过勾选和取消关节添加的Rigidbody组件的Is Kinematic选项来激活和关闭布娃娃系统。 因此我们可以通过获取模型的某个节点的Rigidbody组件来控制特定的运动。要注意的是在打开布娃娃系统时,模型最好不要播放动画。同时,不要在场景中大量使用布娃娃系统,毕竟是用物理引擎实现的比较耗性能。
C#代码如下
using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 布娃娃管理器/// </summary>public class RagdollMgr : MonoBehaviour{    public List<Rigidbody> rigidbodys = new List<Rigidbody>();    public List<Collider> colliders = new List<Collider>();    static public RagdollMgr instance = null;    void Awake()    {      instance = this;    }    void Start()    {      Rigidbody[] _rigidbodys = GetComponentsInChildren<Rigidbody>();      for (int i = 0; i < _rigidbodys.Length; i++)      {            //排除玩家身上的Rigidbody组件            if (_rigidbodys == Player.instance.mRigidbody)                continue;            rigidbodys.Add(_rigidbodys);            _rigidbodys.isKinematic = true;            _rigidbodys.mass = 0;            Collider _collider = _rigidbodys.gameObject.GetComponent<Collider>();            _collider.isTrigger = true;            colliders.Add(_collider);      }    }    /// <summary>    /// 开启 布娃娃系统    /// </summary>    public void EnableRagdoll()    {      for (int i = 0; i < rigidbodys.Count; i++)      {            rigidbodys.constraints = RigidbodyConstraints.None;            rigidbodys.useGravity = true;            rigidbodys.isKinematic = false;            colliders.isTrigger = false;      }      //设置 玩家身上的isKinematic选项      Player.instance.mRigidbody.isKinematic = true;      StartCoroutine(CloseAnimator());    }    IEnumerator CloseAnimator()    {      yield return new WaitForEndOfFrame();      //注意: 开启布娃娃系统 一定要将Animator enabled设为false,不然 布娃娃系统不生效      Player.instance.mAnimator.enabled = false;    }    /// <summary>    /// 关闭 布娃娃系统    /// </summary>    public void DisableRagdoll()    {      for (int i = 0; i < rigidbodys.Count; i++)      {            rigidbodys.constraints = RigidbodyConstraints.FreezeAll;            rigidbodys.useGravity = false;            rigidbodys.isKinematic = true;            colliders.isTrigger = true;      }      //还原 玩家身上的设置      Player.instance.mRigidbody.isKinematic = false;      Player.instance.mAnimator.enabled = true;    }}注意事项:


1.播放布娃娃的时候要把Animator勾掉,不然不生效
2.部位穿插拉伸,要把部位Character Joint组件上面的Enable Projection勾上
3.激活布娃娃弹得很高,就是刚体的速度,把rigidbody的速度置为0
4.如果布娃娃动作僵硬,肯定用错骨骼来绑定布娃娃导致的
5.布娃娃穿透场景碰撞的问题,其实这个由于速度太快引起的,可以设置rigidbody的碰撞检测模式collisionDetectionMode
6.受力不要全部部位都给力,一般都是给一个部位就够了,不然各种力作用引起怪异表现
7.关于倒地之后抖动问题,这个只能加个检测,如果所有刚体速度小于某个数则关闭刚体功能
8.布娃娃系统的碰撞 可能会影响触发OnCollisionEnter、OnCollisionStay、OnCollisionExit等函数,建议使用ParentConstraint约束,外置碰撞检测等处理
页: [1]
查看完整版本: Unity2018.4.16 布娃娃系统 RagDoll