当我尝试通过以下方式实例化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会同时显示两种方式,所以我不确定...
答案 0 :(得分:1)
您在资源路径中不需要Resources
。 Prefabs/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
不为空,则可以看到资产的类型。也许您正在加载音频剪辑,而不是所需的预制件。