c# - 如何使用 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
顺便说一句,哪一个是正确的?谷歌显示了两种方式,所以我不确定......
解决方案
您不需要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
不为空,您可以看到它是什么类型的资产。也许您正在加载音频剪辑而不是您正在寻找的预制件。
推荐阅读
- sql-server - 我如何在sql中加入4个表
- sql - 在vb中将字符串是或否转换为布尔值
- javascript - 如何使用 Cheerio 解析具有多个元素的表列?
- json - Splunk spath 与普通搜索性能
- r - Quanteda 的 corpus_reshape 函数:如何在缩写后不断句(如“eg”)
- jmeter - Jmeter APDEX 报告值不匹配
- .net-core - 从 Visual Studio 代码 (omnisharp) 分析中排除 EF Core 迁移
- typescript - 使用 TypeScript 的 Jest 测试无法识别导入别名
- arduino - Arduino LCD 显示汉堡故障结束
- vue.js - 如何在另一个数据变量vuejs中使用数据变量