Unity的3d遊戲開發中,常常遇到須要將模型的某一部分(好比武器),單獨作碰撞處理的狀況。ide
導入模型後,給武器部分添加MeshCollider,MeshCollider的Mesh一般包含在模型裏,如圖:函數
勾選MeshCollider的Convex以及Inflate mesh後,在場景中能看到生成的綠色網格碰撞器。測試
可是運行後,會發現這個Collider並不隨着模型動畫一塊兒運動。動畫
不知道是否是問題過小白的緣由,網上不多有相關問題的討論,很多相關的問題都沒有答案。spa
最終在csdn上翻到一篇文章,解決了問題。.net
參考連接:unity SkinnedMesh 播放動畫時與MeshCollider不一樣步問題解決方案3d
緣由是包圍盒沒有更新,而且形變更畫對應的MeshCollider更新的話,代價太大。因此unity雖然提供了機制,可是不提倡使用。code
核心方法是SkinnedMeshRenderer中有一個函數:BakeMesh,在update中調用該方法便可。blog
在Update調用以下代碼:遊戲
/// <summary> /// 動態更新Mesh /// </summary> private void UpdateMesh () { // weapon mesh Mesh weaponColliderMesh = new Mesh(); weaponMeshRender.BakeMesh(weaponColliderMesh); weaponMeshCollider.sharedMesh = null; weaponMeshCollider.sharedMesh = weaponColliderMesh; }
運行後效果以下:
基本達到想要的效果。
剩餘的問題:
一、經過上圖能看到,武器與Collider並不是徹底契合。緣由未知。
二、在Update中頻繁更新Mesh可能會形成消耗太大。能想到的辦法是
a)每隔幾幀更新一次;
b)用簡單的幾何碰撞器(如BoxCollider)替代網格碰撞器(未測試)
若是你有關於此問題的更好的解決辦法,請不吝指點。