首页 > 解决方案 > 如何使用 Resources.Load 从预制实例化 GameObject?

问题描述

当我尝试通过以下方式实例化 GameObject 时出现NullReferenceException错误:

Side1_Slots.sGameObject[i] = Instantiate(Resources.Load<GameObject>(Side1_Slots.SlotAlliedPrefab), 
            Side1_Slots.SlotPosition[i], Quaternion.identity, UIContainer.transform);

使用此重载方法进行实例化:

Instantiate(GameObject Original, Vector3 position, Quaternion rotation, Transform parent);

在哪里:

Side1_Slots.SlotAlliedPrefab = "Prefabs/Battle/SlotAlliedPrefab";

我尝试了以下项目文件夹结构:

// Leads to NullReferenceException error
Resources/Prefabs/Battle/SlotAlliedPrefab

和:

//Leads to "Object you want to instantiate is null"
Prefabs/Battle/SlotAlliedPrefab

顺便说一句,哪一个是正确的?谷歌显示了两种方式,所以我不确定......

标签: c#unity3d

解决方案


您不需要Resources在资源路径中。Prefabs/Battle/SlotAlliedPrefab应该做这项工作,只要它是资产的正确路径。首先,仔细检查您的路径。然后,使用非泛型Resources.Load()加载资源,然后检查其类型(最好使用调试器,如果您还没有使用 VSTS)。您可能在该路径上没有正确的资产类型。如果Resources.Load()返回 null,则可能是路径错误,可能是拼写错误。


编辑:您必须将资产存储在 Resources 文件夹中。但是您传递的路径Resources.Load将相对于最近的资源文件夹的根目录。例如,如果您在以下位置拥有资产:

Assets\MyGame\Models\Resources\Category1\SomeModel

您将像这样加载它:

Resources.Load("Category1\SomeModel")

这意味着如果您在不同的 Resources 文件夹中有具有相同名称的不同资源,则可能会出现未定义的行为。这仅适用于 Resources 文件夹中的资产,因为它们在构建和打包期间的处理方式不同。

关于非泛型Load,我的意思是你应该这样做:

var myResource = Resources.Load("SomePath");
var myGameObject = myResource as GameObject;

这样,您可以单步执行您的代码并查看其中的内容myResource。这是为了确保您通过正确的路径。如果myResource不为空,您可以看到它是什么类型的资产。也许您正在加载音频剪辑而不是您正在寻找的预制件。


推荐阅读