【问题标题】:Accessing script component right after instantiation实例化后立即访问脚本组件
【发布时间】:2019-01-24 04:03:18
【问题描述】:

我有一个在 Unity 中创建 UI 按钮的脚本。它创建预制件的实例,其中还包含自定义脚本组件。我想实例化一个新副本并立即访问新创建对象脚本的值成员/字段:

turretButtons.Add(Instantiate(buttonProto, gameObject.transform));
turretButtons[turretButtons.Count - 1].image.sprite = turretIcon;
turretButtons[turretButtons.Count - 1].GetComponent<DetailsWindowController>().turretDefinition = turretDef;

第一行创建新实例,第二行更改图标,两者都完美运行。然而,在第三个中,我尝试访问 DetailsWindowController 脚本/类的 turretDefinition 公共成员抛出“NullReferenceException:对象引用未设置为对象的实例”。我错过了什么?

【问题讨论】:

  • 能把turretButtons和buttonProto的类型包括一下吗
  • 是的,我知道这是基本的,但是您能否附上检查员屏幕截图来显示这些设置是如何设置的?特别是 buttonProto 预制件确实附加了一个 DetailsWindowController?
  • 您缺少参考。这就是错误消息告诉您的内容。通常,您不应该在不检查 Null 引用的情况下将 GetComponent() 与成员访问联系起来。
  • 你确定DetailsWindowController 在同一个游戏对象上,而不是在层次结构中更深吗?你可以试试GetComponentInChildren&lt;DetailsWindowController&gt;(true)。顺便说一句,做var newButton = Instantiate ... 并使用newButton 而不是turretButtons[turret buttons.Count-1] 并在完成设置值后将其添加到列表中会更聪明;)
  • @ryeMoss 必须是 Button buttonProtoList&lt;Button&gt; turretButtons 否则第一行和第二行已经抛出编译器错误。

标签: c# object unity3d


【解决方案1】:

您要查找的组件可能未附加到与 Button 组件所附加的完全相同的 GameObject

您应该使用GetComponentInChildren 以便始终在按钮的层次结构中向下递归查找组件。另请注意true 参数,该参数是在残疾儿童身上查找组件所必需的。这在按钮被禁用的情况下可能很有用。

var newButton = Instantiate(buttonProto, gameObject.transform);

newButton.image.sprite = turretIcon;
newButton.GetComponentInChildren<DetailsWindowController>(true).turretDefinition = turretDef;

turretButtons.Add(newButton);

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2013-07-19
    • 2021-12-29
    • 2016-03-31
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多