1. 程式人生 > >Unity編譯器之快捷新增碰撞器,和移除碰撞器(運用遞迴)

Unity編譯器之快捷新增碰撞器,和移除碰撞器(運用遞迴)

在實際做專案中,有時候經常需要對地形的碰撞體進行編輯,比如很多不需要加碰撞體的物件卻帶著碰撞體,如果手動去移除,工作量又是很大(經常子物體又是套著子物體,十分複雜),有時候又需要新增碰撞體,本人就移除碰撞體這件事件花了很長時間,不勝其煩,網上的資料也不是太多,也不全。所以在這給大家貼出流程與程式碼。可以使開發更加方便。

 

  • 新建一個名為Editor的資料夾,在這個資料夾下新建一個指令碼EditorTest
  • 開啟指令碼,引入using UnityEditor;

 

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;


public class EditorTest : MonoBehaviour
{
    [MenuItem("AddRemoveCompentEditor/RemoveCompent")]
    public static void RemoveCompent()
    {
        GameObject[] goArray = GameObject.FindGameObjectsWithTag("Test");
        foreach (var item in goArray)
        {
            RemoveTest(item);
        }
        Debug.Log("移除成功");
    }
    [MenuItem("AddRemoveCompentEditor/AddCompent")]
    public static void AddCompent()
    {
        GameObject[] goArray = GameObject.FindGameObjectsWithTag("Test");
        foreach (var item in goArray)
        {
            AddTest(item);
        }
        Debug.Log("新增成功");
    }

    static void RemoveTest(GameObject go)
    {
        if (go.GetComponent<Collider>() != null)
        {
            foreach (var item in go.GetComponents<Collider>())
            {
                DestroyImmediate(item);
            }
        }

        for (int i = 0; i < go.transform.childCount; i++)
        {
            RemoveTest(go.transform.GetChild(i).gameObject);
        }
    }
    static void AddTest(GameObject go)
    {
        if (go.GetComponent<Collider>() == null)
        {
            go.AddComponent<BoxCollider>();
        }

        for (int i = 0; i < go.transform.childCount; i++)
        {
            AddTest(go.transform.GetChild(i).gameObject);
        }
    }
}