如何制作像GUILayoutOption这样的Option类?

时间:2017-04-17 06:58:00

标签: c# unity3d

我想知道如何创建一个类似于GUILayoutOption类的类,它会将一大堆GUILayout的静态字段作为参数。

我在Unity Docs中找不到答案,我想知道是否有人之前已经制作了这样的结构。

我正在尝试做这样的事情:

public void SomeMethod( params MyClassOption[] options )

并将其称为例如:SomeMethod(MyClass.AnimationClip(aniClipRef), MyClass.AnimationDuration(duration), MyClass.StopAllOtherAnimations);

看起来像一个很好的,干净的方式用几十个潜在的可选参数包装代码,但我不知道如何定义它。有人可以写一个简约的例子或解释它是如何工作的吗?

1 个答案:

答案 0 :(得分:1)

您不会在文档或任何教程中找到类似这些内容的内容。如果您对如何实现某些内容感到好奇,请使用反编译器,例如 .NET Reflector ,您将看到每个类的实现方式。

以下是如何执行此操作的极简主义示例。 请勿使用此。这只是为了显示完全 Unity是如何完成的。它使用param关键字并执行装箱,两者都分配内存。

示例:

MyClass.Button("Submit Button", MyClass.MinWidth(10), MyClass.MaxWidth(20),
             MyClass.MinHeight(10), MyClass.MaxHeight(10));

MyClassOption班级:

public class MyClassOption
{
    public Type type;
    public object value;

    public MyClassOption(Type type, object value)
    {
        this.type = type;
        this.value = value;
    }

    public enum Type
    {
        minWidth,
        maxWidth,
        minHeight,
        maxHeight,
    }
}

MyClass班级:

public class MyClass
{
    public static bool Button(string text, params MyClassOption[] options)
    {
        return showButton(text, options);
    }

    private static bool showButton(string text, MyClassOption[] options)
    {
        //Not IMPLEMENTED
        //DISPLAY BUTTON THEN CHECK IF IT IS CLICKED?
        return false;
    }

    public static MyClassOption MaxHeight(float maxHeight)
    {
        return new MyClassOption(MyClassOption.Type.maxHeight, maxHeight);
    }

    public static MyClassOption MaxWidth(float maxWidth)
    {
        return new MyClassOption(MyClassOption.Type.maxWidth, maxWidth);
    }

    public static MyClassOption MinHeight(float minHeight)
    {
        return new MyClassOption(MyClassOption.Type.minHeight, minHeight);
    }

    public static MyClassOption MinWidth(float minWidth)
    {
        return new MyClassOption(MyClassOption.Type.minWidth, minWidth);
    }
}

基本上,您可以在enum课程的MyClassOption中添加自定义选项,然后添加一个用于访问enumMyClass的功能。该函数将返回新的MyClassOption对象。

每次将一个选项添加到一个函数或执行到我认为不值得的程度时,会发生太多的内存分配。它在普通的C#应用​​程序中很好,但在游戏应用程序中却不会因 GC 而导致打嗝。

修改

可以采取哪些措施来改善这一点:

1 。将MyClassOption课程更改为struct

2 。在MyClassOption类构造函数object value参数上,将其更改为c#generics。 T[] value

现在,唯一的问题是param关键字,它是唯一分配内存的东西。它应该适用于某些应用程序,但这对编辑器插件非常有用。