【问题标题】:Unity Button Prefab Coming in as NullUnity Button Prefab 以 Null 形式出现
【发布时间】:2018-10-10 07:26:48
【问题描述】:

我整天都遇到一个问题,我的按钮预制件为空。当我从在代码中使用 GameObject 更改为 Button 时,问题就出现了。我必须这样做才能让我的听众正确应用。我正在尝试从文件创建保存游戏的列表,并且需要能够区分按钮并选择将侦听器应用于每个按钮以返回整数。具体错误是“您要实例化的对象为空”。 这是我的代码

void Populate()
{
    Button newObj = Instantiate(NewSave, transform) as Button; // Create GameObject instance

    newObj.name = "NewSave";
    startList();
}
public void startList()
{
    Button newObj;
    int i = 0;

    clearList();
    foreach (PlayerType nextPlayer in GameManager.instance.saveStorage.returnSaves())
    {
        i++;
        // Create new instances of our prefab until we've created as many as is in list
        newObj = (Button)Instantiate(OldSaves, transform);

        //increment slot names
        Debug.Log(i);
        newObj.name = "Slot " + i.ToString();
        newObj.onClick.AddListener(() => ButtonClicked(i));
        saveList.Add(i);
    }


}

如果您发现特定按钮创建的结构问题,请不要竖起大拇指,我已经根据网上的各种建议将这部分代码撕裂了好几次。

基本上我有 2 个按钮预制件,一个用于新的保存按钮,另一个用于单独的保存槽。它将侦听器传递给保存/加载函数,并在将其发送到文件或从文件发送之前确定将其保存到哪个插槽。问题出在按钮的第一次创建上,在我实现侦听器设置并不得不切换到使用按钮之前,它工作正常。

我确保按钮是通过检查器连接的,并相信这与我的预制件本身有关,因为当我将预制件初始化移动到它所遵循的另一行时。这是我的设置的一些屏幕截图。

Inspector Objects

Button Prefab

感谢任何可以帮助我缩小问题范围的帮助,我经历过的大多数线程都是简单的修复,比如他们忘记在检查器中连接它,或者有人在同一个对象上有多个脚本。我希望这只是另一个愚蠢的错误,新的眼睛会很快看到。明天下班后,我会根据需要发布其他信息或屏幕截图。

更新:

我解决了这个问题。当我发现我的检查员参考之一未设置时,我尝试了这些建议并输入了问题所在。我假设通过更改原始填充保存它会相应地设置引用,但是有两个位置我必须更改它,因为我已经在对象上设置了脚本。 populatesave 我之前没有抓住它,因为我的保存层次结构有 5 个项目,每个项目都有多个组件,所以当我通过检查器附加它时,我只是去了我的脚本的主副本。它只是在我的脚本之间跳转并找到谁调用了我碰巧点击了实际保存我的 populateSave 脚本的那个。我将把第二个标记为答案,因为是你让我找出是什么叫它让我弄清楚这一点。非常感谢,它甚至解释了为什么保存也没有正确循环,当我创建它时,出于某种原因我将保存次数设置为 23 哈哈。

我不认为我可以将评论标记为答案,但仍然想给你点赞,你能把你的评论作为答案发表还是违反这里的规则?

【问题讨论】:

  • 看看this question的答案。您还可以编辑您的问题以包含NewSaveOldSaves 的字段类型吗?
  • 这些按钮当前是否在您的场景中?还是您在场景开始时创建它们?你能告诉我们你是如何调用第一种方法的吗?这不是问题,但是,由于您正在实例化一个按钮,因此您不需要使用 as button 仅供参考。

标签: visual-studio unity3d button


【解决方案1】:

你的问题是这一行:

Button newObj = Instantiate(NewSave, transform) as Button;

实例化(通常)返回一个游戏对象。这是与 Button 不同的类型。当您使用“as”时,它会尝试将其转换为正确的类型。如果不能,则返回 null。

你想要的是:

Button newObj = (Instantiate(NewSave, transform) as GameObject).GetComponent<Button>();

我还建议更改该按钮的变量名称。

请记住,Button 是一个组件,它与游戏对象不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 2021-03-18
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多