unity一键给所有模型添加MeshCollider

当第一人称在场景里漫游时应避免穿模问题,这就需要给第一人称和周边环境模型都添加碰撞器。当场景很大,且形状不规则时,一个个给周边模型手动添加碰撞器很慢且不精准,以下方式能实现一键给场景内所有模型添加精准碰撞MeshCollider。

1.新建脚本AddMeshCollider.cs,代码如下


//EditorWindow类无法打包,注意添加这个判断
#if UNITY_EDITOR

    using UnityEngine;
    using UnityEditor;

    public class AddMeshCollider : EditorWindow
    {
        [MenuItem("Tools/添加移除碰撞体")]

        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[i] as MeshRenderer;

                //保存场景修改,或者执行完手动Ctrl+s保存
                Undo.RecordObject(t, t.gameObject.name);

                MeshCollider meshCollider = t.gameObject.GetComponent<MeshCollider>();
                if (meshCollider != null)
                {
                    DestroyImmediate(meshCollider);
                }

                //刷新场景
                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[i] as MeshRenderer;

                //保存场景修改,或者执行完手动Ctrl+s保存
                Undo.RecordObject(t, t.gameObject.name);

                MeshCollider meshCollider = t.gameObject.GetComponent<MeshCollider>();
                if (meshCollider == null)
                {
                    t.gameObject.AddComponent<MeshCollider>();
                }

                //刷新场景
                EditorUtility.SetDirty(t);
            
                
            }
            Debug.Log("Add Succed");
        }
    }

#endif

2.脚本保存后(不用挂载),导航栏出现Tools选项

点击Tools,出现“添加移除碰撞体”按钮,

点击“添加移除碰撞体”按钮,出现“添加碰撞体”“移除碰撞体”选择面版,根据需求操作。

3.点击“添加碰撞器”按钮

可看到输出“Add Succed”,场景里的物体已经全部都挂载了MeshCollider。

4.注意点

1.MeshCollider十分消耗性能。

2.此操作只会改变当前场景物体,每个场景都要操作一次。

3.此操作会给场景内所有带MeshRrnderer的物体都挂载MeshCollider组件,不需要MeshCollider组件的需要手动删除。或者将不需要/需要挂载MeshCollider的物体通过tag或者其他方法分类,在脚本里添加判断。

猜你喜欢

转载自blog.csdn.net/qq_2633600317/article/details/133669838