自定义编辑器功能

该代码示例展示了一个在Unity编辑器中的自定义功能,用于移除当前场景中所有物体上的MeshCollider组件。通过GetCurrentActiveSceneTypeObjs方法获取场景中的特定类型组件,然后遍历并销毁它们。
摘要由CSDN通过智能技术生成

自定义编辑器功能

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

/// <summary>
/// 自定义unity编辑器功能
/// </summary>
public class CutomEditorFunc : MonoBehaviour
{
#if UNITY_EDITOR
    /// <summary>
    /// 移除当前场景中所有的MeshCollider组件
    /// </summary>
    [ContextMenu("Func_RemoveAllMeshColliderOfCurrScene")]
    public void ReactiveObj()
    {
        List<MeshCollider> interactObjs = GetCurrentActiveSceneTypeObjs<MeshCollider>();
        foreach (var mc in interactObjs)
        {
            GameObject.DestroyImmediate(mc);
        }

        interactObjs.Clear();
        interactObjs = null;
    }


#endif

    /// <summary>
    /// 此方法用来得到某场景下所有物体,查出所有挂载T类型的脚本
    /// </summary>
    private static List<T> GetCurrentActiveSceneTypeObjs<T>(bool includeInactive = true)
    {
        List<T> objs = new List<T>();
        objs.Clear();
        GameObject[] rootGameObjects = getSceneRootGameObjects(GetCurrentActiveScene());
        for (int i = 0; i < rootGameObjects.Length; i++)
        {
            T[] objsTyps = rootGameObjects[i].transform.GetComponentsInChildren<T>(includeInactive);
            objs.AddRange(objsTyps);
        }
        objs.RemoveAll(x => x == null);
        return objs;
    }
    private static GameObject[] getSceneRootGameObjects(Scene scene)
    {
        return scene.GetRootGameObjects();
    }
    private static Scene GetCurrentActiveScene()
    {
        return SceneManager.GetActiveScene();
    }
}

public class Patient : MonoBehaviour
{
	public void Apply()
	{
	}
}

#if UNITY_EDITOR

[UnityEditor.CustomEditor(typeof(Patient))]
public class PatientEditor : UnityEditor.Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        Patient patient = (Patient)target;
        if (GUILayout.Button("Apply"))
        {
            patient.Apply();
        }
    }
}
#endif

public class PatientView : MonoBehaviour
    {
        public bool HairActive
        {
            get => hairActive;
            set
            {
                hairActive = value;
            }
        }
 	}
 	
#if UNITY_EDITOR
    [CustomEditor(typeof(PatientView))]
    public class PatientViewEditor : UnityEditor.Editor
    {
        private PatientView _patientView;

        public override void OnInspectorGUI()
        {
            _patientView = target as PatientView;
            if (_patientView == null) return;

            // 头发显示
            _patientView.HairActive = GUILayout.Toggle(_patientView.HairActive, "头发显示");
            base.OnInspectorGUI();
        }
    }
#endif

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值