问题描述
是否可以在将 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
有没有办法控制 Things
和 Widgets
文件夹的顺序,类似于我如何控制 First Thing
、Second 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;
}