当前位置: 首页 > news >正文

Unity3D Editor 编辑器扩展实战 Project窗口全文件夹折叠

Unity3D Editor 编辑器扩展实战 Project窗口全文件夹折叠

https://blog.csdn.net/u012632851/article/details/80841606

总起:

在使用Project窗口时,总在不停地找资源和找代码过程中,将Project中的文件夹展开,导致窗口的混乱,虽然在按住Alt的情况下点击三角能够全部折叠一组的文件夹,但是这样做也比较麻烦。

 

所以有没有办法按下一个快捷键将所有文件夹全部折叠呢?

 

今天就为大家带来本人最新研究的一种对Editor的扩展(仅在2017版本中试验过,因为用到了反射技术所以不保证其他版本通用)。

 
折叠脚本:

新建Editor文件夹,再在其中新建一个脚本:

    using System.Collections;
    using System.Linq;
    using System.Reflection;
    using UnityEditor;
     
    // CollapseFolders.cs
    public static class CollapseFolders
    {
        [MenuItem("Assets/折叠所有文件夹 &c", false, 30)]
        public static void SetProjectBrowserFoldersCollapsed()
        {
            var assembly = Assembly.GetAssembly(typeof(Editor));
            var type = assembly.GetType("UnityEditor.ProjectBrowser");
     
            if (type == null)
                return;
     
            var browserField = type.GetField("s_LastInteractedProjectBrowser", BindingFlags.Public | BindingFlags.Static);
            var browser = browserField.GetValue(null);
     
            if (browser == null)
                return;
     
            // 确定窗口模式是否是单列
            var modeField = type.GetField("m_ViewMode", BindingFlags.NonPublic | BindingFlags.Instance);
            bool isOne = (int) modeField.GetValue(browser) == 0;
     
            // 获取文件夹树
            var treeField = type.GetField(isOne ? "m_AssetTree" : "m_FolderTree", BindingFlags.NonPublic | BindingFlags.Instance);
            var tree = treeField.GetValue(browser);
     
            var dataProperty = treeField.FieldType.GetProperty("data", BindingFlags.Instance | BindingFlags.Public);
            var data = dataProperty.GetValue(tree, null);
     
            var getRowsMethod = dataProperty.PropertyType.GetMethod("GetRows", BindingFlags.Instance | BindingFlags.Public);
            var setExpandedMethods = dataProperty.PropertyType.GetMethods(BindingFlags.Instance | BindingFlags.Public).ToList().FindAll(method => method.Name == "SetExpanded");
            var setExpandedMethod = setExpandedMethods[0];
     
            var rows = (IEnumerable) getRowsMethod.Invoke(data, null);
            bool first = true;
            // 遍历当前的行将其折叠
            foreach (var obj in rows)
            {
                if (first && !isOne)
                {
                    var itemType = obj.GetType();
                    var nameField = itemType.GetField("m_DisplayName", BindingFlags.Instance | BindingFlags.NonPublic);
                    if (nameField != null)
                    {
                        string name = (string) nameField.GetValue(obj);
                        if (name == "Assets")
                        {
                            first = false;
                            setExpandedMethod.Invoke(data, new object[]{obj, true});
                            continue;
                        }
                    }
                }
                setExpandedMethod.Invoke(data, new object[] {obj, false});
            }
            AssetDatabase.Refresh();
        }
    }

思路就是通过反射出当前的Project窗口对应的类,取到其中每个条目对应的元素,然后将其折叠,最后刷新一下AssetDatabase就OK。
————————————————
版权声明:本文为CSDN博主「暗光之痕」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012632851/article/details/80841606

 

 

 

相关文章:

  • 【转】Unity3d:读取FBX中的动画
  • AssetBundle.LoadFromStreamAsync比LoadFromFile有明显缺点么?
  • CountTrailingZeros - PBRT
  • layerlab - FourierBSDF
  • Unity之Vector3.Slerp
  • Planck's law
  • Eclipse-插件
  • unity webrequest 最大并发数量1000
  • 全局光照:光线追踪、路径追踪与GI技术进化编年史
  • DY_M的Unity学习日记 1 ——AnimationClip的读取与代码生成
  • C#反射执行方法返回List,怎么获取List
  • C#通过反射获取相应的字段和值
  • pbrt-perspective-we(Weight emit)
  • pbrt gamma
  • Unity Android 宏定义是 UNITY_ANDROID 不是 UNITY_Android
  • 2017前端实习生面试总结
  • Apache Pulsar 2.1 重磅发布
  • CSS魔法堂:Absolute Positioning就这个样
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • export和import的用法总结
  • Gradle 5.0 正式版发布
  • Hibernate【inverse和cascade属性】知识要点
  • Javascript基础之Array数组API
  • java多线程
  • Laravel 实践之路: 数据库迁移与数据填充
  • laravel5.5 视图共享数据
  • Linux gpio口使用方法
  • Odoo domain写法及运用
  • 半理解系列--Promise的进化史
  • 大主子表关联的性能优化方法
  • 聚类分析——Kmeans
  • 使用parted解决大于2T的磁盘分区
  • 一个JAVA程序员成长之路分享
  • 再次简单明了总结flex布局,一看就懂...
  • 智能合约Solidity教程-事件和日志(一)
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (¥1011)-(一千零一拾一元整)输出
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (3)STL算法之搜索
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (JS基础)String 类型
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (蓝桥杯每日一题)love
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)Google的Objective-C编码规范
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)项目管理杂谈-我所期望的新人
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net mvc总结