Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在CreateAssetMenu中设置子文件夹的排序顺序吗?_C#_Unity3d_Unity Editor - Fatal编程技术网

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

C# 我可以在CreateAssetMenu中设置子文件夹的排序顺序吗?,c#,unity3d,unity-editor,C#,Unity3d,Unity Editor,在为可编写脚本的对象使用CreateAssetMenu时,是否可以设置文件夹的顺序 例如,如果我有这些类 [CreateAssetMenu(menuName = "My Objects/First Thing", order = 1)] public class FirstThing : ScriptableObject { } [CreateAssetMenu(menuName = "My Objects/Second Thing", order =

在为可编写脚本的对象使用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
是否有一种方法可以控制物品和小部件文件夹的顺序,类似于我如何控制其父文件夹中第一件事、第二件事等的顺序?

从中,可以在下面的“排序详细信息”下的Unity菜单中传播有关排序顺序的一些详细信息,您可以发现:

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

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

由于您的两个子文件夹都以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的东西项目

这将导致

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

如果您的物品优先级大于或等于11,Unity将在您的物品前创建一个分隔符

小心点:

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

小贴士:为了使维护更容易,我通常会有一个带有常数的中心类,并执行一些操作,例如

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;
}
然后呢

[CreateAssetMenu(menuName = Constants.MENU_THINGS + "First Thing", order = Constants.ORDER_THINGS + 1)]
public class FirstThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_THINGS + "Second Thing", order = Constants.ORDER_THINGS + 2)]
public class SecondThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_THINGS + "Third Thing", order = Constants.ORDER_THINGS + 3)]
public class ThirdThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_WIDGETS + "First Widget", order = Constants.ORDER_WIDGETS + 1)]
public class FirstWidget: ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_WIDGETS + "Second Widget", order = Constants.ORDER_WIDGETS + 2)]
public class SecondWidget: ScriptableObject
{
}
从下面“排序详细信息”下Unity菜单中有关排序顺序的一些详细信息中,您可以发现:

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

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

由于您的两个子文件夹都以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的东西项目

这将导致

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

如果您的物品优先级大于或等于11,Unity将在您的物品前创建一个分隔符

小心点:

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

小贴士:为了使维护更容易,我通常会有一个带有常数的中心类,并执行一些操作,例如

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;
}
然后呢

[CreateAssetMenu(menuName = Constants.MENU_THINGS + "First Thing", order = Constants.ORDER_THINGS + 1)]
public class FirstThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_THINGS + "Second Thing", order = Constants.ORDER_THINGS + 2)]
public class SecondThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_THINGS + "Third Thing", order = Constants.ORDER_THINGS + 3)]
public class ThirdThing : ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_WIDGETS + "First Widget", order = Constants.ORDER_WIDGETS + 1)]
public class FirstWidget: ScriptableObject
{
}

[CreateAssetMenu(menuName = Constants.MENU_WIDGETS + "Second Widget", order = Constants.ORDER_WIDGETS + 2)]
public class SecondWidget: ScriptableObject
{
}

谢谢你找到那篇文章,它很好地解释了Unity在做什么。我想没有完美的解决方案可以使订单易于维护和更新,但遵循这些准则,我可以实现我想要的。谢谢你的帮助。是的,不幸的是,要想得到想要的东西真的很难。。尤其是维持这些秩序真是一件痛苦的事。。e、 g.如果以后添加元素或其他菜单,则可能需要再次更改值^^。。专业小提示:我在一个普通类的某个地方使用了一些常量来维护这样的顺序值,只需做一些简单的事情,例如常量.order\u THINGS+1,Comstants.order\u THINGS+2等等。感谢您找到这篇文章,它在解释Unity的功能方面做得非常好。我想没有完美的解决方案可以使订单易于维护和更新,但遵循这些准则,我可以实现我想要的。谢谢你的帮助。是的,不幸的是,要想得到想要的东西真的很难。。尤其是维持这些秩序真是一件痛苦的事。。e、 g.如果以后添加元素或其他菜单,则可能需要再次更改值^^。。小提示:我在一个普通类中的某个地方使用了一些常量来维护这样的顺序值,只需做一些简单的事情,例如常量.order\u THINGS+1,常量.order\u THINGS+2等等