微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在 CreateAssetMenu 中设置子文件夹的排序顺序吗?

如何解决我可以在 CreateAssetMenu 中设置子文件夹的排序顺序吗?

是否可以在将 CreateAssetMenu 用于可编写脚本的对象时设置文件夹的顺序?

例如,如果我有这些类

[CreateAssetMenu(menuName = "My Objects/First Thing",order = 1)]
public class FirstThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = "My Objects/Second Thing",order = 2)]
public class SecondThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = "My Objects/Third Thing",order = 3)]
public class ThirdThing : ScriptableObject
{
}

然后当我在“项目”窗口中右键单击并选择“创建”时,上下文菜单会按此顺序显示我的菜单选项

Create -> My Objects -> First Thing
          |-----------> Second Thing
          |-----------> Third Thing

但是,一旦我开始将菜单选项组织到子文件夹中,我就找不到控制子文件夹顺序的方法。例如,如果我现在有这个

[CreateAssetMenu(menuName = "My Objects/Things/First Thing",order = 1)]
public class FirstThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = "My Objects/Things/Second Thing",order = 2)]
public class SecondThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = "My Objects/Things/Third Thing",order = 3)]
public class ThirdThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = "My Objects/Widgets/First Widget",order = 1)]
public class FirstWidget: ScriptableObject
{
}

[CreateAssetMenu(menuName = "My Objects/Widgets/Second Widget",order = 2)]
public class SecondWidget: ScriptableObject
{
}

现在创建上下文菜单如下所示

Create -> My Objects -> Things --> First Thing
          |             |--------> Second Thing
          |             |--------> Third Thing
          |-----------> Widgets -> First Widget
                        |--------> Second Widget

有没有办法控制 ThingsWidgets 文件夹的顺序,类似于我如何控制 First ThingSecond Thing文件夹中的顺序父文件夹?

解决方法

this post 中,您可以发现:

自定义子菜单组本身的排序优先级(相对于菜单项)有点棘手。子菜单组将按自定义菜单项首次创建时的优先级排序。

或者换句话说:子文件夹按其中第一个元素的 Sorting Details 值排序。

由于您的两个子文件夹都以 order 开头,因此它们按字母顺序排序作为后备。

因此,为了将 1 菜单置于 Things 文件夹下,只需确保元素具有绝对更高的值,例如

Widgets

也许它甚至足以在 [CreateAssetMenu(menuName = "My Objects/Things/First Thing",order = 11)] public class FirstThing : ScriptableObject { } [CreateAssetMenu(menuName = "My Objects/Things/Second Thing",order = 12)] public class SecondThing : ScriptableObject { } [CreateAssetMenu(menuName = "My Objects/Things/Third Thing",order = 13)] public class ThirdThing : ScriptableObject { } [CreateAssetMenu(menuName = "My Objects/Widgets/First Widget",order = 1)] public class FirstWidget: ScriptableObject { } [CreateAssetMenu(menuName = "My Objects/Widgets/Second Widget",order = 2)] public class SecondWidget: ScriptableObject { } 项上改为 2,3,4 ;)

这应该导致

Things

另外注意

如果您的项目的优先级为 Create -> My Objects -> Widgets -> First Widget | |--------> Second Widget | |-----------> Things --> First Thing |--------> Second Thing |--------> Third Thing 或高于前一个项目,Unity 将在您的项目之前创建一个分隔符

小心:

顺便说一句,如果您更改菜单项的现有排序优先级,您可能看不到它反映在菜单中。我认为 Unity 正在缓存该值,因此要使其更新,您可以重新启动编辑器,或者先从属性中删除优先级,然后进行编译,然后添加新的优先级。


小提示:为了使维护更容易,我通常会有一个带有一些常量的中心类,并做例如

11

然后做

public static class Constants
{
    public static string MENU = "My Objects/";
    public static string MENU_THINGS = MENU + "Things/";
    public static string MENU_WIDGETS = MENU + "Widgets/";

    public static int ORDER_WIDGETS = 0;
    public static int ORDER_THINGS = 10;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。