找回密码
 立即注册
查看: 537|回复: 0

Unity2018.4.16 布娃娃系统 RagDoll

[复制链接]
发表于 2021-4-14 08:28 | 显示全部楼层 |阅读模式
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约束,外置碰撞检测等处理

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-26 02:45 , Processed in 0.089672 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表