You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity优化多选Toggle逻辑:实现智能筛选资产文件名方案

优化Unity Toggle筛选资产文件的冗余代码方案

问题解答

1. 用Toggle标签作为匹配关键字

通过自定义结构体将Toggle的显示标签(即目标扩展名)与勾选状态绑定,让Toggle的标签直接作为文件名匹配的关键字,彻底摆脱硬写字符串的冗余。

2. 适配多Toggle的通用方法

核心逻辑是先收集所有被勾选的扩展名,再对资产列表做统一过滤:仅保留扩展名不在勾选集合中的文件。这个逻辑不依赖Toggle的数量,新增Toggle只需在扩展名列表中添加项,无需修改筛选代码。

优化后的完整代码

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

class ShowAssetIds : EditorWindow
{
    [MenuItem("Assets/Test")]
    static void ShowWindow()
    {
        ShowAssetIds window = (ShowAssetIds)GetWindow(typeof(ShowAssetIds));
        window.Show();
    }

    // 结构体绑定扩展名与Toggle状态
    private struct ExtensionToggle
    {
        public string Extension;
        public bool IsEnabled;

        public ExtensionToggle(string extension, bool isEnabled)
        {
            Extension = extension;
            IsEnabled = isEnabled;
        }
    }

    // 扩展名Toggle列表,新增扩展名直接加项即可
    private List<ExtensionToggle> extensionToggles = new List<ExtensionToggle>
    {
        new ExtensionToggle("tga", false),
        new ExtensionToggle("png", false),
        new ExtensionToggle("tif", false),
        new ExtensionToggle("exr", false)
    };

    private List<string> assetList = new List<string> { "xxx.tga", "bbb.png", "ccc.tif", "qqq.exr" };

    private void OnGUI()
    {
        if (GUILayout.Button("筛选资产"))
        {
            // 收集所有被勾选的扩展名
            var checkedExtensions = extensionToggles
                .Where(t => t.IsEnabled)
                .Select(t => t.Extension)
                .ToList();

            // 过滤资产:排除所有含勾选扩展名的文件
            var filteredAssets = assetList
                .Where(asset => !checkedExtensions.Any(ext => asset.EndsWith($".{ext}", System.StringComparison.OrdinalIgnoreCase)))
                .ToList();

            // 输出结果
            foreach (var asset in filteredAssets)
            {
                Debug.Log(asset);
            }
        }

        // 批量绘制Toggle,新增项无需修改此处
        for (int i = 0; i < extensionToggles.Count; i++)
        {
            var current = extensionToggles[i];
            current.IsEnabled = EditorGUILayout.ToggleLeft(current.Extension.ToUpper(), current.IsEnabled);
            extensionToggles[i] = current;
        }
    }
}

优化说明

  • 结构化状态管理:ExtensionToggle将扩展名与勾选状态打包,新增扩展名只需在初始化列表中添加一行,无需修改GUI或筛选逻辑。
  • 通用筛选逻辑:借助LINQ快速收集勾选的扩展名,通过Any方法统一判断文件是否属于被排除类型,支持任意数量的Toggle。
  • 鲁棒性提升:使用EndsWith结合大小写忽略匹配,避免因文件名大小写差异导致的筛选错误。
  • 代码复用性:GUI绘制通过遍历列表实现,新增Toggle无需重复编写Toggle绘制代码。

内容的提问来源于stack exchange,提问作者Hammeee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:50:26