c# - 为什么我们需要在 Unity AssetBundle 中的 LoadAsset 之后实例化加载的资源?
问题描述
在 AssetBundle 使用手册中,https ://docs.unity3d.com/Manual/AssetBundles-Native.html
我可以看到,当使用LoadAsset
加载一个游戏对象时,为什么我们需要做额外的步骤Instantiate
呢?这将创建另一个预制件副本,我很困惑为什么我们不prefab
直接使用加载的游戏对象?
public class LoadFromFileExample extends MonoBehaviour {
function Start() {
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
if (myLoadedAssetBundle == null) {
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset.<GameObject>("MyObject");
Instantiate(prefab); // why do not use prefab directly ?
}
}
解决方案
安装预制件确实与 AssetBundle 无关。使用Resources.Load
API 时也是如此。在回答这个问题之前,您需要了解什么是预制件。
预制件是公正的GameObjects
,Components
放在一起,可以重复使用。使用它是为了如果您想要相同类型的对象,您不必每次都手动创建它们。您只需实例化已经创建和保存的预制件。当您想在多个场景之间共享资源时,这一点非常重要。
加载预制件时,它只存储在内存中等待使用或实例化。它在场景或层次结构选项卡中不可见。加载函数没有理由也应该实例化预制件,因为加载时您可能不需要它。通常在加载游戏时加载预制件,然后在需要时在运行时实例化适当的预制件。
最后,实例化一个预制件,创建一个副本并将其放入场景中。任何操作都应该在加载预制件的实例化对象上完成。
推荐阅读
- javascript - 更新 workCloud 数据 - amcharts
- python - 具有来自拟合生成器的多个参数的 Keras 自定义损失函数
- javascript - 为什么 Mozilla 认为条件捕获块是非标准的?
- ios - SWIFT 5 - 嵌套结构的显示、变异和匹配
- node.js - 我该如何解决此错误:找不到模块:您尝试导入位于项目 src/ 目录之外的 ../../../view/file_upload
- docker - Docker Microsoft 包哈希和不匹配
- angular - 如何根据环境替换 Angular 8.3+ 中的 index.html?
- c# - 如何获取父节点子节点的子节点值
- php - 使用 PHP 和 WSDL 下载数据不起作用,但在 SoapUI 中它可以工作
- presto - 尝试在画面中连接 presto