天天看點

Unity 角色控制器重複使用Ragdoll布娃娃系統,動畫控制和布娃娃狀态切換

大家好,今天開發遊戲的時候做了Ragdoll相關的功能,于是寫寫心得。

如果要在單一物體重複使用Ragdoll布娃娃系統,那我們需要對物體設定兩個狀态,一個是正常狀态,受動畫系統控制,一個是布娃娃狀态,受布娃娃節點控制。(Unity開發環境2018.4 LTS)

預覽效果:

Unity 角色控制器重複使用Ragdoll布娃娃系統,動畫控制和布娃娃狀态切換

分為幾個部分:

首先是初始化,我們要周遊角色身體上的所有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