为什么需要在Unity AssetBundle中的LoadAsset之后实例化已加载的资产?

时间:2018-10-21 07:25:31

标签: c# unity3d

在AssetBundle使用手册中,https://docs.unity3d.com/Manual/AssetBundles-Native.html

我可以看到,当使用LoadAsset加载GameObject时,为什么我们需要执行额外的步骤Instantiate呢?这将创建另一个预制件副本,我感到困惑,为什么我们不直接使用加载的prefab GameObject?

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 ?
    }
}

1 个答案:

答案 0 :(得分:1)

恢复预制件确实与AssetBundle无关。使用Resources.Load API时也是如此。您需要先了解什么是预制件才能回答这个问题。

预制件只是GameObjectsComponents放在一起并可以可重复使用。使用它是为了如果您想要相同类型的对象,则不必每次都一次又一次地手动创建它们。您只需实例化已创建并保存的预制件。当您要在多个场景之间共享资源时,这真的很重要。

在加载预制件时,它仅存储在等待使用或实例化的内存中。在场景或“层次结构”选项卡中不可见。没有理由加载函数也应该实例化预制件,因为在加载时可能不需要它。通常,预制件是在加载游戏时加载的,然后在需要时在运行时实例化适当的预制件。

最后,实例化一个预制件,创建一个副本并将其放置在场景中。应该对已加载的预制对象实例化任何操作。