unity3d 统一-如何使多选择切换工作智能?

u2nhd7ah  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(138)

我尝试实现的是,我有一个资产名称和多个切换的列表,切换表示资产文件的扩展名,如果选中了切换,则在列表中查找不包含此扩展名的资产名称。
下面是我的代码,它确实工作了,但是看起来很愚蠢,因为如果我再添加一个toggle,我就必须再添加一个if...else...而且我使用的方法似乎只是运行了很多重复的代码,有没有其他方法,比如枚举、结构或其他方法,我可以使用来使代码更智能?
我面临一些更具体问题:
1.如何使用切换的标签作为匹配资产名称的键?
1.如何使一个方法适用于所有情况,如果我有更多的切换,因为它可能有三个或更多的关键字值,我必须匹配。

如果TGA点击-〉bbb.png、ccc.tif、qqq.exr
如果TGA和PNG点击-〉ccc.tif,qqq.exr

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

bool tga = false;
bool png = false;
List<string> temp = new List<string> { "xxx.tga", "bbb.png", "ccc.tif", "qqq.exr" };
private void OnGUI()
{
    if(GUILayout.Button("MatchString"))
    {
        if(tga & png)
        {
            foreach(var v in temp)
            {
                if(!v.Contains("tga") && !v.Contains("png"))
                {
                    Debug.Log(v);
                }
            }
        }
        else
        {
            if(tga)
            {
                foreach (var v in temp)
                {
                    if (!v.Contains("tga"))
                    {
                        Debug.Log(v);
                    }
                }
            }
            else
            {
                foreach (var v in temp)
                {
                    if (!v.Contains("png"))
                    {
                        Debug.Log(v);
                    }
                }
            }
        }
    }
    tga = EditorGUILayout.ToggleLeft("TGA", tga);
    png = EditorGUILayout.ToggleLeft("PNG", png);
}
}
fdbelqdn

fdbelqdn1#

使此代码更易于扩展的一种方法是创建一个要查找的扩展名列表。
分别检查每个标志,如果为true,则添加与该标志相关的扩展名。
然后使用一些Linq或嵌套循环来查找所有匹配项。

using System.Linq;
...

private void OnGUI()
{
    var extensionList = new List<string>();

    if (tga)
    {
        extensionList.Add(".tga");
    }
    if (png)
    {
        extensionList.Add(".png");
    }
    if (jpg)
    {
        extensionList.Add(".jpg");
        extensionList.Add(".jpeg");
    }

    var matches = fileNames
        .Where(fileName => !extensionList
            .Contains(System.IO.Path.GetExtension(fileName))
        );

    foreach (var fileName in matches)
    {
        Debug.Log(fileName);
    }
}

相关问题