如何在预制件中保留对UI元素的引用,并在运行时实例化

时间:2016-03-18 23:22:19

标签: unity3d

我有一个预制件,其脚本组件为MonoBehaviour。该脚本有3个公共字段作为文本;在保存游戏对象并将其从场景中删除之前,在检查器中分配。

现在,如果我有一个UI元素,如面板,这可以正常工作。预制件在运行时实例化时,仍然会分配面板上的每个文本字段(在预制件中定义)。

遗憾的是,这对我制作的另一个预制件无效;这不是UI元素。在我的例子中,它是一个meshgameobject,上面有各种组件(navmesh代理,胶囊对撞机,刚体,动画师等)

我认为这是因为在UI面板中,元素已经在游戏对象层次结构中,而当引用在不同的游戏对象上时; Unity不会跟踪它们。

这意味着我必须总是在运行时通过代码添加我希望在每个预制件上引用的元素,如果它们不是游戏对象本身的一部分?在这种情况下,我只是避免将我的引用公开,因为在这种情况下我不会使用检查器(这种类型的每个游戏对象都在运行时实例化)。

只是检查是否有其他解决方案可以解决这个问题。

2 个答案:

答案 0 :(得分:0)

使用List为每个生成的对象保存参考。 让我们假设您要添加的对象来存储引用,称为meshgameobject

示例

List<meshgameobject> meshGOB;

开始功能

内进行初始化
void Start(){
 meshGOB = new List <meshgameobject>();
}

然后创建并使用list.add()在运行时添加引用,如

meshGOB.Add((meshgameobject)Instantiate(prefab, Pos, Quaternion.Identity);

meshgameobject tempGOB= (meshgameobject)Instantiate(prefab, Pos, Quaternion.Identity);

//使用meshgameobject

执行某些操作
tempGOB.someAction......

然后添加对列表

的引用
meshGOB.Add(tempGOB);

答案 1 :(得分:0)

不要制作引用场景中其他游戏对象但不在perfabI本身层次结构中的perfab。 AFAIK,Unity无法跟踪此类引用。 即使Unity支持这种预制,你也不能在其他场景中使用这种预制件,因为具体参考,所以制作这样的perfab没有多大意义。如果你因为场景和游戏对象是由不同的人维护而必须使它成为一个pefab,你可以使用Find()在运行时填充引用。