我目前正在使用Unity3D引擎帮助开发一款游戏。我们需要使用Curve Editor
来描述给定法术的伤害等级。在Unity3D引擎的c#汇编中已经有一个具有所需功能的曲线编辑器类,但它是不可访问的。我试图通过反射实例化该类型的对象。然而,我遇到了一个问题。该类的构造函数需要几个参数,其中1个恰好是另一个不可访问类的数组。问题来了。我能够通过反射构造一个对象,但不是该类型的对象数组。下面是构造函数:
public CurveEditor(Rect rect, CurveWrapper[] curves, bool minimalGUI){...}
我能够用Reflection
构建CurveWrapper
对象,但不是整个数组。我试图创建Object[]
数组,并把一些CurveWrapper
对象在里面,但当我通过反射将这个数组传递给构造函数时,我得到无效参数异常。
我猜你是在找Array.CreateInstance
。
Type type = ...; // However you get to CurveWrapper
IList array = Array.CreateInstance(type, 2);
array[0] = Activator.CreateInstance(type);
array[1] = Activator.CreateInstance(type);
我不得不说,如果CurveEditor
是不可访问的,我不会试图得到它非常反射。即使它现在可以工作,我认为Unity3D人员以后对它做出不兼容的改变也是完全合理的。使用非公共api会导致代码非常脆弱。
如果你在Unity3D中为某些东西编写编辑器,那么大多数,如果不是全部,你需要的是EditorGUI
助手的一部分,如EditorGUI.CurveField
,它将在检查器中为你呈现曲线编辑器(如果你正在为正确类型的对象使用编辑器类)。