我想知道如何创建一个类似于GUILayoutOption类的类,它会将一大堆GUILayout的静态字段作为参数。
我在Unity Docs中找不到答案,我想知道是否有人之前已经制作了这样的结构。
我正在尝试做这样的事情:
public void SomeMethod( params MyClassOption[] options )
并将其称为例如:SomeMethod(MyClass.AnimationClip(aniClipRef), MyClass.AnimationDuration(duration), MyClass.StopAllOtherAnimations);
看起来像一个很好的,干净的方式用几十个潜在的可选参数包装代码,但我不知道如何定义它。有人可以写一个简约的例子或解释它是如何工作的吗?
答案 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
中添加自定义选项,然后添加一个用于访问enum
中MyClass
的功能。该函数将返回新的MyClassOption
对象。
每次将一个选项添加到一个函数或执行到我认为不值得的程度时,会发生太多的内存分配。它在普通的C#应用程序中很好,但在游戏应用程序中却不会因 GC 而导致打嗝。
修改强>
可以采取哪些措施来改善这一点:
1 。将MyClassOption
课程更改为struct
。
2 。在MyClassOption
类构造函数object value
参数上,将其更改为c#generics。 T[] value
。
现在,唯一的问题是param
关键字,它是唯一分配内存的东西。它应该适用于某些应用程序,但这对编辑器插件非常有用。