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

标签 c# unity3d

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

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

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

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

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

但是,当我玩游戏时,一个敌人死了,没有生成任何东西,我得到了这个错误:

ArgumentException: The Object you want to instantiate is null.

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

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

最佳答案

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

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

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

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

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

关于c# - 通过脚本在变量中存储对预制件的引用(不是由编辑器/检查员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918113/

相关文章:

c# - 正确的 Resource.Load 路径是什么?

ios - 为shader添加bloom(发光)效果(Unity游戏引擎)

c# - 通过代码隐藏将 silverlight 加载到 aspx 页面

c# - 查看/编辑 MP3 文件的 ID3 数据

C# COM DLL 阻止 VBA 应用程序退出

java - Unity AndroidJavaClass.CallStatic<Enum> on Android 插件。这可能吗?

c# - 无法更改附加到游戏对象的脚本上的公共(public)变量。播放时恢复值

c# - 字符串和字符串有什么区别?

c# - Verify() 和 Setup()...VerifyAll() 之间的最小起订量区别

c# - winmd 找不到 Newtonsoft.Json.dll 文件