Unity 统一添加和移除Mesh Collider
一般建模师导出的模型中无法添加碰撞体,但我们的场景中又需要检测碰撞,这时可以使用代码统一添加。//EditorWindow类无法打包,主意添加这个判断#if UNITY_EDITORusing UnityEngine;using UnityEditor;public class AddMeshCollider : EditorWindow{ public static void Open() { EditorWindow.GetWindow(typeof(AddMeshCollider)); } void OnGUI() { if (GUILayout.Button("添加碰撞体")) { Add(); } if (GUILayout.Button("移除碰撞体")) { Remove(); } } public static void Remove() { //寻找Hierarchy面板下所有的MeshRenderer var tArray = Resources.FindObjectsOfTypeAll(typeof(MeshRenderer)); for (int i = 0; i < tArray.Length; I++) { MeshRenderer t = tArray as MeshRenderer; //这个很重要,博主发现如果没有这个代码,unity是不会察觉到编辑器有改动的,自然设置完后直接切换场景改变是不被保存 //的如果不加这个代码在做完更改后 自己随便手动修改下场景里物体的状态 在保存就好了 Undo.RecordObject(t, t.gameObject.name); MeshCollider meshCollider = t.gameObject.GetComponent<MeshCollider>(); if (meshCollider != null) { DestroyImmediate(meshCollider); } //相当于让他刷新下 不然unity显示界面还不知道自己的东西被换掉了还会呆呆的显示之前的东西 EditorUtility.SetDirty(t); } Debug.Log("remove Succed"); } public static void Add() { //寻找Hierarchy面板下所有的MeshRenderer var tArray = Resources.FindObjectsOfTypeAll(typeof(MeshRenderer)); for (int i = 0; i < tArray.Length; I++) { MeshRenderer t = tArray as MeshRenderer; //这个很重要,博主发现如果没有这个代码,unity是不会察觉到编辑器有改动的,自然设置完后直接切换场景改变是不被保存 //的如果不加这个代码在做完更改后 自己随便手动修改下场景里物体的状态 在保存就好了 Undo.RecordObject(t, t.gameObject.name); MeshCollider meshCollider = t.gameObject.GetComponent<MeshCollider>(); if (meshCollider == null) { t.gameObject.AddComponent<MeshCollider>(); } //相当于让他刷新下 不然unity显示界面还不知道自己的东西被换掉了还会呆呆的显示之前的东西 EditorUtility.SetDirty(t); } Debug.Log("Add Succed"); }}#endif
将脚本拖到Assets中。然后点击Tools->添加移除碰撞体,在点击【添加碰撞体】,这时候我们就会发现凡是拥有Mesh Render的物体都有MeshCollider了。如下图:
image.png
image.png
参考:https://blog.csdn.net/weixin_44733991/article/details/122131282
页:
[1]