解決Unity中模型部件的MeshCollider不隨動畫一起運動的問題


Unity的3d游戲開發中,經常遇到需要將模型的某一部分(比如武器),單獨做碰撞處理的情況。

導入模型后,給武器部分添加MeshCollider,MeshCollider的Mesh通常包含在模型里,如圖:

勾選MeshCollider的Convex以及Inflate mesh后,在場景中能看到生成的綠色網格碰撞器。

 但是運行后,會發現這個Collider並不隨着模型動畫一起運動。

 

 不知道是不是問題太小白的原因,網上很少有相關問題的討論,不少相關的問題都沒有答案。

最終在csdn上翻到一篇文章,解決了問題。

參考鏈接:unity SkinnedMesh 播放動畫時與MeshCollider不同步問題解決方案

 原因是包圍盒沒有更新,並且形變動畫對應的MeshCollider更新的話,代價太大。所以unity雖然提供了機制,但是不提倡使用。

核心方法是SkinnedMeshRenderer中有一個函數:BakeMesh,在update中調用該方法即可。

在Update調用如下代碼:

    /// <summary>
    /// 動態更新Mesh
    /// </summary>
    private void UpdateMesh ()
    {
        // weapon mesh
        Mesh weaponColliderMesh = new Mesh();
        weaponMeshRender.BakeMesh(weaponColliderMesh);

        weaponMeshCollider.sharedMesh = null;
        weaponMeshCollider.sharedMesh = weaponColliderMesh;
    }

運行后效果如下:

基本達到想要的效果。

 剩余的問題:

1、通過上圖能看到,武器與Collider並非完全契合。原因未知。

2、在Update中頻繁更新Mesh可能會造成消耗太大。能想到的辦法是

  a)每隔幾幀更新一次;

  b)用簡單的幾何碰撞器(如BoxCollider)替代網格碰撞器(未測試)

 如果你有關於此問題的更好的解決辦法,請不吝指點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM