Editor-显示隐藏管理工具

该工具主要用来快捷的控制场景中多个物体的显示与隐藏。效果如下:
首先在Hierarchy视图框中右键创建“显示隐藏管理”

2978185-d24d96b2ec9408b3.png

22.png

接着添加管理对象组,将场景中物体拖入指定位置,勾选或者取消它是否显示
效果如下:


YJ9`NQ_DQ)5Y4VLC4QTU0I8.png

点击执行按钮,就可以快速的切换物体到相应的状态(显示还是隐藏)

具体实现代码如下:

using System.Collections.Generic;
using UnityEngine;
[DisallowMultipleComponent]
public class ShowHideControl:MonoBehaviour
{
    private static ShowHideControl _instance = null;
    public static ShowHideControl Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = (new GameObject("显示隐藏管理")).AddComponent<ShowHideControl>();
            }
            return _instance;
        }
    }
    private void Awake()
    {
        _instance = this;
    }
    public List<GameObjectGroup> _list = new List<GameObjectGroup>();
    [System.Serializable]
    public class GameObjectGroup
    {
        public string _desc = "描述";
        public List<GameObjectInformation> _list = new List<GameObjectInformation>();
        [System.Serializable]
        public class GameObjectInformation
        {
            public GameObject _obj;
            public bool _show = true;
        }
    }
    /// <summary>
    /// 执行
    /// </summary>
    /// <param name="desc">描述</param>
    /// <param name="b">正执行还是反执行</param>
    public void Do(string desc, bool b = true)
    {
        for (int i = 0; i < _list.Count; i++)
        {
            if (_list[i]._desc == desc)
            {
                for (int j = 0; j < _list[i]._list.Count; j++)
                {
                    if (b)
                    {
                        _list[i]._list[j]._obj.SetActive(_list[i]._list[j]._show);
                    }
                    else
                    {
                        _list[i]._list[j]._obj.SetActive(!_list[i]._list[j]._show);
                    }
                }
                break;
            }
        }
    }
}

using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
[CustomEditor(typeof(ShowHideControl))]
public class ShowHideControlEditor : Editor
{
    private ShowHideControl _showHide;
    private ShowHideControl.GameObjectGroup _gameObjectGroup;
    private int _deleteGameObjectGroupIndex = -1;//删除组索引
    private int _choseAreaIndex = -1;
    private int _deleteGameObjectIndex = -1;//对象索引
    private bool _isArea = false;//是否在指定的拖拽区域内
    private ShowHideControl.GameObjectGroup.GameObjectInformation _gameObjectInformation;
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        _showHide = target as ShowHideControl;
        if (GUILayout.Button("添加管理"))
        {
            _showHide._list.Add(new ShowHideControl.GameObjectGroup());
        }
        GUILayout.Space(30);
        _deleteGameObjectGroupIndex = -1;
        _isArea = false;
        for (int i = 0; i < _showHide._list.Count; i++)
        {
            EditorGUILayout.BeginHorizontal();
            _gameObjectGroup = _showHide._list[i];
            _gameObjectGroup._desc = EditorGUILayout.TextField(_gameObjectGroup._desc);
            if (GUILayout.Button("正执行"))
            {
                for (int j = 0; j < _gameObjectGroup._list.Count; j++)
                {
                    _gameObjectGroup._list[j]._obj.SetActive(_gameObjectGroup._list[j]._show);
                }
            }
            if (GUILayout.Button("反执行"))
            {
                for (int j = 0; j < _gameObjectGroup._list.Count; j++)
                {
                    _gameObjectGroup._list[j]._obj.SetActive(!_gameObjectGroup._list[j]._show);
                }
            }
            if (GUILayout.Button("删除"))
            {
                if (EditorUtility.DisplayDialog("警告", "你确定要删除该组对象吗?", "确定", "取消"))
                {
                    _deleteGameObjectGroupIndex = i;
                }
            }
            EditorGUILayout.EndHorizontal();
            var dragArea = GUILayoutUtility.GetRect(0f, 50f, GUILayout.ExpandWidth(true));
            GUI.Box(dragArea, new GUIContent("拖动对象到此区域"));
            if (dragArea.Contains(Event.current.mousePosition))
            {
                _isArea = true;
                _choseAreaIndex = i;
            }
            else if(Event.current.type == EventType.Repaint&&_isArea==false)
            {
                _choseAreaIndex = -1;
            }
            _deleteGameObjectIndex = -1;
            for (int k = 0; k < _gameObjectGroup._list.Count; k++)
            {
                EditorGUILayout.BeginHorizontal();
                _gameObjectGroup._list[k]._obj = (GameObject)EditorGUILayout.ObjectField(_gameObjectGroup._list[k]._obj, typeof(GameObject), true);
                _gameObjectGroup._list[k]._show = EditorGUILayout.Toggle(_gameObjectGroup._list[k]._show);
                if (GUILayout.Button("删除"))
                {
                    _deleteGameObjectIndex = k;
                }
                EditorGUILayout.EndHorizontal();
            }
            if (_deleteGameObjectIndex != -1) _gameObjectGroup._list.RemoveAt(_deleteGameObjectIndex);
            GUILayout.Space(50);
        }
        if (Event.current.type == EventType.DragExited && _choseAreaIndex != -1)
        {
            _gameObjectGroup = _showHide._list[_choseAreaIndex];
            DragAndDrop.AcceptDrag();
            if (DragAndDrop.objectReferences.Length != 0)
            {
                for (int j = 0; j < DragAndDrop.objectReferences.Length; j++)
                {
                    if (DragAndDrop.objectReferences[j].GetType() == typeof(GameObject))
                    {
                        if (IsExistGameObject((GameObject)DragAndDrop.objectReferences[j]) == false)
                        {
                            _gameObjectInformation = new ShowHideControl.GameObjectGroup.GameObjectInformation();
                            _gameObjectInformation._obj = (GameObject)DragAndDrop.objectReferences[j];
                            _gameObjectGroup._list.Add(_gameObjectInformation);
                        }
                        else
                        {
                            Debug.LogError("列表已存在该对象");
                        }
                    }
                }
            }
        }
        if (_deleteGameObjectGroupIndex != -1) _showHide._list.RemoveAt(_deleteGameObjectGroupIndex);
        GUILayout.Space(1000);
        serializedObject.ApplyModifiedProperties();
        EditorUtility.SetDirty(_showHide);
        if (GUI.changed) EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
    }
    /// <summary>
    /// 是否已经存在该对象
    /// </summary>
    /// <param name="obj"></param>
    public bool IsExistGameObject(GameObject obj)
    {
        for (int i = 0; i < _gameObjectGroup._list.Count; i++)
        {
            if (obj == _gameObjectGroup._list[i]._obj) return true;
        }
        return false;
    }
    [MenuItem("GameObject/自定义/创建显示隐藏管理", false, MenuItemConfig.显示隐藏管理)]
    private static void CreateSoundControlObject()
    {
        GameObject gameObject = new GameObject("显示隐藏管理");
        gameObject.AddComponent<ShowHideControl>();
        EditorUtility.FocusProjectWindow();
        Selection.activeObject = gameObject;
        EditorGUIUtility.PingObject(Selection.activeObject);
        Undo.RegisterCreatedObjectUndo(gameObject, "Create GameObject");
        EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
    }
}

使用代码控制

ShowHideControl.Instance.Do("描述");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容