Unity Button预制以Null形式进入

时间:2018-10-10 07:26:48

标签: visual-studio unity3d button

我整天都遇到问题,我的按钮预制件为null。当我从在代码中使用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

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

更新:

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

我认为我不能将评论标记为答案,但仍然想给您信誉,您可以将评论发布为答案还是违反这里的规则?

1 个答案:

答案 0 :(得分:0)

您的问题是这一行:

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

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

您想要的是:

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

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

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