我目前正在将一个Scripts列表存储在一个数组中,我试图将每个脚本添加到另一个对象中。我只是按名称搜索脚本但是在我更新到unity 5之后我不停地收到警告告诉我不要这样做,因为它会减慢一切。
目前我的代码看起来像这样:
GameObject unit1;
Knight knight; // name of code
Pawn pawn;
CodeName = new Units [3] {knight, knight, pawn}
unit1.AddComponent(CodeName[0]);
这给了我错误"无法转换' Knight'表达式输入`System.Type'"。
它显然是在对象类型之后,但我无法弄清楚如何传递信息。
答案 0 :(得分:1)
我不确定你为什么要在一个对象中存储类,因为你并不是真的必须这样做。只要Class是公共的,您总是调用AddComponent而不使用数组来存储它们。
类已经从CLR存储,只有在实例化时才会使用。这意味着如果不使用它,它将不需要实例化。在Mono(Unity3d)中,您存储在数组中的所有内容都需要首先实例化或者至少具有null值,但这对Unity3D来说并不重要。它会向你发出一个警告:它很慢,因为你将一个组件添加到" GameObject"不是C#理解的对象。该组件已在RunTime上已知,但您仍然试图将脚本从数组中拉出来 - 在C#中这是一个很大的SIN。为什么要将类存储在可以直接访问它的位置,具体取决于它的访问修饰符。
在你的代码中,你制作一个指针或引用骑士类和Pawn Class< - 你不需要。
然后将它们存储在数组中。 (你必须有充分的理由)如果你真的需要这样做,请进一步解释。
但你需要做的就是这个。
unit1.AddComponent<Knight>();
// In case you didn't notice it is <> which represents Generic, it can be any type.
所以你真的可以做到
unit1.AddComponent<Codename[0]>();
// But take my word for it, it is slow.
因为您正在这样做。
为每个要添加组件的对象实例化3个类。 将它们存储到GameObject中,其中包含阵列的脚本。 从阵列中拉出它们并检查Type是否为Equal类型。 将它们添加到GameObject。 通过调用脚本构造函数重新实例化它们。
如果这是国际象棋游戏。想象一下你的运行时会做多少次 你可以做的地方。
- 添加组件并初始化。
希望这有帮助。