如何使用Resources.Load从预制实例化GameObject?

时间:2019-01-12 20:01:04

标签: c# unity3d

当我尝试通过以下方式实例化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

哪个是正确的? Google会同时显示两种方式,所以我不确定...

1 个答案:

答案 0 :(得分:1)

您在资源路径中不需要ResourcesPrefabs/Battle/SlotAlliedPrefab应该做的工作,只要它是资产的正确路径。首先,仔细检查您的路径。然后,使用非通用的Resources.Load()加载资源,然后检查其类型(最好使用调试器,如果尚未使用,则使用VSTS)。您在该路径上可能没有正确的资产类型。如果Resources.Load()返回null,则说明您输入的路径可能错误,也许是错字。


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

Assets\MyGame\Models\Resources\Category1\SomeModel

您将像这样加载它:

Resources.Load("Category1\SomeModel")

这意味着,如果在不同的“资源”文件夹中有相同名称的不同资源,则可能会出现不确定的行为。这仅适用于Resources文件夹中的资产,因为在构建和打包期间会对其进行不同处理。

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

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

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