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)替代網格碰撞器(未測試)
如果你有關於此問題的更好的解決辦法,請不吝指點。
