大家好,今天開發遊戲的時候做了Ragdoll相關的功能,于是寫寫心得。
如果要在單一物體重複使用Ragdoll布娃娃系統,那我們需要對物體設定兩個狀态,一個是正常狀态,受動畫系統控制,一個是布娃娃狀态,受布娃娃節點控制。(Unity開發環境2018.4 LTS)
預覽效果:

分為幾個部分:
首先是初始化,我們要周遊角色身體上的所有ragdoll并存儲。
public List<Rigidbody> RagdollRigidbodys = new List<Rigidbody>();
public List<Collider> RagdollColliders = new List<Collider>();
void InitRagdoll()
{
Rigidbody[] Rigidbodys = GetComponentsInChildren<Rigidbody>();
for (int i = 0; i < Rigidbodys.Length; i++)
{
if (Rigidbodys[i] == GetComponent<Rigidbody>())
{
//排除正常狀态的Rigidbody
continue;
}
//添加Rigidbody和Collider到List
RagdollRigidbodys.Add(Rigidbodys[i]);
Rigidbodys[i].isKinematic = true;
Collider RagdollCollider = Rigidbodys[i].gameObject.GetComponent<Collider>();
RagdollCollider.isTrigger = true;
RagdollColliders.Add(RagdollCollider);
}
}
當角色死亡或擊倒時,執行啟用布娃娃系統
void EnableRagdoll()
{
//開啟布娃娃狀态的所有Rigidbody和Collider
for (int i = 0; i < RagdollRigidbodys.Count; i++)
{
RagdollRigidbodys[i].isKinematic = false;
RagdollColliders[i].isTrigger = false;
}
//關閉正常狀态的Collider
GetComponent<Collider>().enabled = false;
//下一幀關閉正常狀态的動畫系統
StartCoroutine(SetAnimatorEnable(false));
}
當角色複活或站起來時,關閉布娃娃系統
void DisableRagdoll()
{
//關閉布娃娃狀态的所有Rigidbody和Collider
for (int i = 0; i < RagdollRigidbodys.Count; i++)
{
RagdollRigidbodys[i].isKinematic = true;
RagdollColliders[i].isTrigger = true;
}
//開啟正常狀态的Collider
GetComponent<Collider>().enabled = true;
//下一幀開啟正常狀态的動畫系統
StartCoroutine(SetAnimatorEnable(true));
}
延遲一幀執行開關動畫狀态
IEnumerator SetAnimatorEnable(bool Enable)
{
yield return new WaitForEndOfFrame();
Anim.enabled = Enable;
}
注:Anim是Animator
By 楊天睿TeraYang