通过脚本(不是通过编辑器/检查器)在变量中存储对预制件的引用



我正在尝试实例化敌人死亡时出现的硬币预制件。

为了最初获取对预制件的引用,我使用其标签检索了它:

private GameObject coinSpawn;
Start(){
    coinSpawn = GameObject.FindGameObjectWithTag("xxx");
} 

现在,当敌人死亡时,我按如下方式调用Instantiate()

Instantiate(coinSpawn, transform.position, Quaternion.identity);

但是,当我玩游戏时,一个敌人死了,什么都没有生成,我得到了这个错误:

参数异常:要实例化的对象为空。

我不明白我做错了什么 - 我确认我已经正确标记了我要实例化的预制件。

还有一件事是我想在不制作Resources文件夹的情况下执行此操作。这可能吗?

不幸的是,GameObject.FindGameObjectWithTag() 只检索当前场景中已存在的具有给定标签的活动游戏对象。听起来您正在尝试使用此方法检索对 Assets 文件夹中预制件对象的引用,这是它无法做到的。因此,该方法返回 null 并将其分配给 coinSpawn ,导致稍后尝试使用 coinSpawn 时出错。

您可能需要 Resources.Load() 方法,您可以为其提供 Assets 文件夹中对象的路径。只需使用它代替GameObject.FindGameObjectWithTag()

private GameObject coinSpawn;
Start(){
    coinSpawn = Resources.Load("path_to_prefab") as GameObject;
}

是的 - 您必须使用预制件的名称而不是其标签来识别它,但我认为这不会造成任何问题。(如果是这样,请相应地更新您的问题并附上解释。

希望这有帮助!如果您有任何问题,请告诉我。