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

Unity 笔记:在EditorWindow中绘制 Sorting Layer

在Unity开发过程中,可能会对旧资源进行批量修改,一个个手动修改费人费事,所以催生出了一堆批量工具。

分享一下在此过程中绘制 Sorting Layer 面板的代码脚本。

示意图:

在 EditorGUI 和 EditorGUILayer 中内置了 SortingLayerField 方法,但在外部使用比较麻烦,所以直接获取所有的 SortingLayer 名字,之后在GUI中进行绘制。

在绘制时有两种弹出方式,EditorGUILayout.Popup() 和  EditorGUILayout.DropdownButton(),在使用 EditorGUILayout.DropdownButton() 时需要动态创建 GenericMenu 选项菜单。

GenericMenu的具体用法可以翻阅官方文档。

完整代码:

using UnityEditor;
using UnityEngine;

public class SortingLayerEditor : EditorWindow
{ 
    private int _selectIndex = 0;
    private string[] _sortingLayerNames;
    private string _currentLog1, _currentLog2;

    [MenuItem("Tools/SortingLayerEditor")]
    private static void ShowWindow()
    {
        GetWindow<SortingLayerEditor>("SortingLayerEditor");
    }

    private void OnEnable()
    {
        // 初始化 SortingLayerNames
        // 如果需要实时获取 SortingLayerNames,请将下列代码放到OnGUI中
        _sortingLayerNames = new string[SortingLayer.layers.Length];
        for (var i = 0; i < SortingLayer.layers.Length; i++)
        {
            _sortingLayerNames[i] = SortingLayer.layers[i].name;
        }
    }

    private void OnGUI()
    {
        // 绘制 SortingLayerNames
        
        // 方式一
        GUILayout.Label("方式一:");
        EditorGUI.BeginChangeCheck();
        _selectIndex = EditorGUILayout.Popup(new GUIContent("SortingLayer","SortingLayer < 0.0 >"), _selectIndex, _sortingLayerNames);
        if (EditorGUI.EndChangeCheck())
        {
            var layerName = _sortingLayerNames[_selectIndex];
            _currentLog1 = $"方式一 selectIndex: {_selectIndex}, SortingLayerName: {layerName}, ID:{SortingLayer.NameToID(layerName)}";
            Debug.Log(_currentLog1);
        }
        
        GUILayout.Space(4);
        
        // 方式二
        GUILayout.Label("方式二:");
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField(new GUIContent("SortingLayer","SortingLayer < 0.0 >"),GUILayout.Width(148));
        if (EditorGUILayout.DropdownButton(new GUIContent(_sortingLayerNames[_selectIndex]), FocusType.Passive))
        {
            // 动态添加菜单项
            var menu = new GenericMenu();
            for (var i = 0; i < _sortingLayerNames.Length; i++)
            {
                var index = i;
                // 参数说明
                // 1. 菜单项的显示内容
                // 2. 是否选中
                // 3. 选中事件
                // 4. 选中事件参数
                menu.AddItem(new GUIContent(_sortingLayerNames[index]),_selectIndex == index,OnMenuSelected, index);
            }
        
            menu.ShowAsContext();
        }
        EditorGUILayout.EndHorizontal();
        
        GUILayout.Space(10);
        GUILayout.Label(_currentLog1);
        GUILayout.Label(_currentLog2);
    }

    /// <summary>
    /// 菜单项的选中事件 
    /// </summary>
    /// <param name="obj">选中事件参数</param>
    private void OnMenuSelected(object obj)
    {
        _selectIndex = (int)obj;
        var layerName = _sortingLayerNames[_selectIndex];
        _currentLog2 = $"方式二 selectIndex: {_selectIndex}, SortingLayerName: {layerName}, ID:{SortingLayer.NameToID(layerName)}";
        Debug.Log(_currentLog2);
    }
}

http://www.dtcms.com/a/69052.html

相关文章:

  • el-table树形表格合并相同的值
  • 3ds Max 导入到 After Effects 还原摄像机要注意事项--deepseek
  • 【AI 加持下的 Python 编程实战 2_02】第一章:利用 GitHub Copilot 叩开 AI 辅助编程的大门
  • Python实现计算地图多个点的中心位置(详细功能实现及环境搭建)
  • C语言(25)
  • Python中的简单爬虫
  • JS—垃圾回收机制:5分钟掌握Java和JavaScript垃圾回收机制
  • 华为云在智能制造的创新技术
  • 第三百七十五节 JavaFX教程 - JavaFX表视图
  • axis=0 和 axis=1的区分设置matplotlib正常显示中文和负号
  • Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
  • Redisson 实现分布式锁源码浅析
  • Linux文件IO——缓冲区磁盘上的文件管理
  • 微信小程序刷题逻辑实现:技术揭秘与实践分享
  • 电子电子架构 --- 车载ECU信息安全
  • 68.Harmonyos NEXT 图片预览组件应用实践(一):相册与社交场景
  • 从零开始探索C++游戏开发:性能、控制与无限可能
  • Unity中解锁图片像素点,动态闭合轨迹检测
  • 实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)
  • C语言从入门到精通
  • 征程 6 基于 Linux 和 Node-Locked License 配置 DSP 开发环境
  • 【WEB APIs】DOM-事件基础
  • 【服务器知识】Nginx路由匹配规则说明
  • 详解SQL数据更新功能
  • C# 集合
  • 建筑管理(2): 施工承包模式,工程监理,质量监督
  • 最完美的WPF无边框设计!
  • Java 大视界 -- Java 大数据分布式计算中的资源调度与优化策略(131)
  • Java 代理模式:从静态代理到动态代理
  • DeepSeek:为教培小程序赋能,引领行业变革新潮流