【问题标题】:How to keep references to UI elements in a prefab, instantiated at runtime如何在运行时实例化预制件中保留对 UI 元素的引用
【发布时间】:2016-07-05 21:15:45
【问题描述】:

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

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

遗憾的是,这不适用于我制作的另一个预制件;这不是 UI 元素。在我的例子中,它是一个网格游戏对象,上面有各种组件(导航网格代理、胶囊对撞机、刚体、动画师等)

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

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

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

【问题讨论】:

  • 您始终可以使用FindObjectWithName找到您的 UI 元素
  • 是的,但这违背了公开字段并使用编辑器添加引用的目的。在我看来,当您创建预制件时,在编辑器中所做的一切都会持续存在;相反,它在大多数情况下都不起作用。

标签: unity3d


【解决方案1】:

使用List为每个生成的对象保存reference。 假设您要添加以存储 referenceobject 名为 meshgameobject

示例

List<meshgameobject> meshGOB;

Start函数内部初始化

void Start(){
 meshGOB = new List <meshgameobject>();
}

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

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

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

//用meshgameobject做一些事情

tempGOB.someAction......

然后添加对列表

的引用
meshGOB.Add(tempGOB);

【讨论】:

  • 谢谢;我确实对不使用公共属性的其他对象使用了列表(因为我不在编辑器中使用它们);所以我想我也会为这个特殊情况做同样的事情。吸取的教训:)
【解决方案2】:

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

【讨论】:

  • “没有意义”是一个相对概念,基于用法。如果您需要一个游戏对象而不是访问同一场景中的另一个游戏对象;这完全有道理。假设程序员会知道正在做的事情的局限性;就像这样的事实,除非你在同一个场景中还有另一个带有引用的游戏对象,否则这样的预制件将无法工作......这纯粹是逻辑。但我发现这样做会让人感到困惑;我只是期待 Unity 人员提供有关该主题的一些文档 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多