首页 > 解决方案 > 为什么我们需要在 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 ?
    }
}

标签: c#unity3d

解决方案


安装预制件确实与 AssetBundle 无关。使用Resources.LoadAPI 时也是如此。在回答这个问题之前,您需要了解什么是预制件。

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

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

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


推荐阅读