Unity3D Editor 编辑器扩展——脚本查询

前言:

小熊来了!啊呜~

话说前几天心血来潮想把现有的工具整理一下,手欠啊(狠狠打一下,还真疼,55555555)
咱就说接手一个项目,发现四处挂载着脚本,你闹心不?
不不不,你不该闹心,真正让你闹心的是发现有的位置挂载脚本丢失了,再或者你根本不知道他这个脚本都挂在了哪些物体身上,痛苦不?
不行了,我得找个角落难受一会儿去…

当当当当~小熊特推出脚本查询工具!
先上图看看效果
在这里插入图片描述
在这里插入图片描述

功能实现

就说这功能香不香?
哎?谁打我,不就话多了点,皮了一下嘛~555555555555555555
好吧,上代码

// ========================================================
// 描 述:脚本查询
// 作 者:SW
// 创建时间:2023/03/07 00:011:07
// 版 本:v 1.0
// ========================================================

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

public class FindMissingScriptsRecursively : EditorWindow
{
    private int _toolbarid;
    private int _tip = 0;

    #region 查找丢失的脚本

    public Vector2 scrollViewPos = new Vector2(0, 0);
    private static int _goCount = 0, _componentsCount = 0, _missingCount = 0;
    private string _resStr = "";
    private Dictionary<GameObject, string> _missGoDic = new Dictionary<GameObject, string>();
    private bool _isClear = true;

    #endregion

    #region 脚本位置查询

    private MonoScript _scriptObj = null;
    List<Transform> _results = new List<Transform>();

    #endregion

    [MenuItem("SW/FindScripts")]
    public static void ShowWindow()
    {
        // var  window = GetWindow<FindMissingScriptsRecursively>();
        // window.Show();
        GetWindow(typeof(FindMissingScriptsRecursively));
    }

    public void OnGUI()
    {
        _toolbarid = GUILayout.Toolbar(_toolbarid, new[] { "寻找丢失的脚本", "脚本位置查询" });
        if (_toolbarid == 0)
        {
            EditorGUILayout.LabelField("当前选择了 " + _tip + " 个对象");
            if (GUILayout.Button("开始寻找丢失的脚本"))
            {
                FindInSelected();
            }

            if (!_isClear)
            {
                EditorGUILayout.HelpBox(_resStr, _missingCount > 0 ? MessageType.Warning : MessageType.Info);
            }


            scrollViewPos = EditorGUILayout.BeginScrollView(scrollViewPos, false, false, GUILayout.Height(300));
            foreach (var missGo in _missGoDic)
            {
                EditorGUILayout.ObjectField("脚本丢失物体:", missGo.Key, typeof(GameObject), false);
                EditorGUILayout.LabelField("描述:");
                EditorGUILayout.LabelField(missGo.Value, GUILayout.Height(30));
                EditorGUILayout.LabelField("");
            }

            EditorGUILayout.EndScrollView();

            if (GUILayout.Button("清除"))
            {
                _resStr = "";
                _missGoDic.Clear();
                _isClear = true;
            }
        }

        if (_toolbarid == 1)
        {
            EditorGUILayout.LabelField("当前选择了 " + _tip + " 个对象");
            _scriptObj = (MonoScript)EditorGUILayout.ObjectField("脚本类型:", _scriptObj, typeof(MonoScript), true);
            if (GUILayout.Button("Find"))
            {
                _results.Clear();
                FindScript();
            }

            if (_results.Count > 0)
            {
                scrollViewPos = EditorGUILayout.BeginScrollView(scrollViewPos, false, false, GUILayout.Height(200));
                foreach (var trs in _results)
                {
                    EditorGUILayout.ObjectField(trs, typeof(Transform), false);
                }

                EditorGUILayout.EndScrollView();
            }
            else
            {
                GUILayout.Label("无数据");
            }
        }
    }


    #region 查找丢失的脚本

    private void FindInSelected()
    {
        _isClear = false;
        _goCount = 0;
        _componentsCount = 0;
        _missingCount = 0;
        _missGoDic.Clear();
        foreach (var go in Selection.gameObjects)
        {
            FindInGO(go);
        }

        _resStr = string.Format("找到 {0} 个物体 , {1} 个组件 , 找到 {2} 个missing", _goCount, _componentsCount, _missingCount);
    }

    private void FindInGO(GameObject go)
    {
        _goCount++;
        var components = go.GetComponents<Component>();

        for (int i = 0; i < components.Length; i++)
        {
            _componentsCount++;
            if (components[i] == null)
            {
                _missingCount++;
                var s = go.name;
                var t = go.transform;
                while (t.parent != null)
                {
                    s = t.parent.name + "/" + s;
                    t = t.parent;
                }

                var res = "    关系位置:" + s + "\n    索引位置:" + i;
                _missGoDic.Add(go, res);
            }
        }

        foreach (Transform childT in go.transform)
        {
            FindInGO(childT.gameObject);
        }
    }

    #endregion


    #region 脚本位置查询

    private void FindScript()
    {
        foreach (var trs in Selection.gameObjects)
        {
            if (trs != null && _scriptObj != null)
            {
                var ssss = trs.GetComponentsInChildren(_scriptObj.GetClass());
                foreach (var component in ssss)
                {
                    _results.Add(component.transform);
                }
            }
        }
    }

    #endregion


    void OnSelectionChange()
    {
        _tip = Selection.gameObjects.Length;
    }
}

你问我这东西咋用?

你别动,让我想想拿个什么趁手的东西打你,毕竟直接上手的话,手疼啊,我又不傻~
在这里插入图片描述
呐~就酱紫的,把脚本找个Editor文件放进去,然后在编译器顶部菜单栏中会新增一个名叫“SW”的菜单,点开下拉就看到啦

如果有哪里不合适,小宝宝们提出来我马上修改,我保证不摔盘子不摔碗,拿着大锤认真聆听你们的建议~哎哎哎,还真有人上前

你们还想要什么编译器工具,描述说清楚写在评论区,我会优先制作哒!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity 3D运行时编辑器插件Runtime Editor 3.5.0是一款非常优秀的工具,它可以让开发者在游戏运行时对游戏进行修改和编辑,使游戏开发更加便捷和高效。该插件支持在Unity编辑器中实时编辑、预览和调试游戏,而且还有非常友好的界面,易于上手使用。此外,它也支持一系列常用操作,如:拖拽物体、创建物体、编辑材质、修改脚本、编辑动画等等。总之,使用这款插件可以充分发挥开发者的想象力和创造力,大大提升游戏开发的效率和质量。同时,它也是一款开放源代码的插件,在社区得到了广泛的应用和支持。唯一需要注意的是,在使用该插件时需要注意版本的适配性,不同版本的Unity可能会有一定的兼容性问题。总体来说,对于有一定开发经验的游戏开发者来说,Runtime Editor 3.5.0是一款非常实用的工具,可以让他们更加专注于游戏的创意和实现,而不是一些繁琐的操作。 ### 回答2: Unity 3D 运行时编辑器插件 Runtime Editor 3.5.0 是一个强大的工具,它为 Unity 3D 用户提供了更加灵活、高效的编辑体验。该插件可以让用户在运行游戏的过程中随时对场景进行编辑,添加、删除和调整物体、组件、材质等元素,以及实时预览游戏效果。 Runtime Editor 3.5.0 提供了许多实用的功能和工具,使得用户能够更快速、方便地完成场景的制作。其中一些重要的功能包括: 1. 选择工具:用户可以通过选择工具来选择物体、组件、材质等元素,并可以对其进行编辑和调整。 2. 创建工具:用户可以通过创建工具来创建新的物体、组件、材质等元素,并可以对其进行定制化的设置和编辑。 3. 面板工具:用户可以在编辑器面板中访问和编辑该插件提供的所有功能和工具,并可以根据需要自定义和布置面板。 4. 预设工具:用户可以通过预设工具来快速添加和调整场景中的预设,以及对其进行设置和编辑。 另外,该插件还包括了许多其他实用的功能和工具,如实时查看场景数据、调整游戏场景视角、导出场景数据等,大大提高了 Unity 3D 用户的工作效率和创作体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值