我如何加载不知道资产名称的资产捆绑包?

时间:2019-12-04 21:39:25

标签: unity3d instantiation assetbundle

我想从我的资产束中加载和实例化资产,但是在统一5. +中,我可以使用以下代码来做到这一点: 注意:我的资产捆绑包内部有一项资产,例如:

AssetBundle myLoadedAssetBundle;
public string path;

void Start()
{
    LoadAssetBundle(path);
}

void LoadAssetBundle(string bundleUrl)
{
    myLoadedAssetBundle = AssetBundle.LoadFromFile(bundleUrl);
    Debug.Log(myLoadedAssetBundle == null ? "Faild To Load" : "Succesfully Loaded!");
    Debug.Log(myLoadedAssetBundle.mainAsset.name);

    Instantiate(myLoadedAssetBundle.mainAsset);

}

}

实际上甚至我使用

Debug.Log(myLoadedAssetBundle.mainAsset.name);

记录我资产捆绑包的主要资产的名称!

但是在5岁以后团结一致,他们说mainasset已过时。

我的问题是:

1- 如何加载不知道资产名称的资产捆绑包?

2- 如何实例化或分配加载了资产捆绑的精灵?

3 个答案:

答案 0 :(得分:3)

根据AssetBundle文档,现在可以调用GetAllAssetNames()以将捆绑包中所有资产名称的列表作为字符串数组返回。您可以通过带有这些资产名称的for循环从捆绑软件中加载资产。

或者,如果您保证每个捆绑包中只有1个资产,则可以简单地从索引0处抓取字符串(不推荐)。

另外,您可以通过使用LoadAllAssets()来加载资产而无需知道名称,它会返回特定类型的数组(在您的情况下,您将指定Sprite)。

答案 1 :(得分:0)

您可以尝试执行以下操作:(注意-您需要知道每个资产的目录路径,在这里,我将做一些示例)

private List<GameObject> assetBundle = new List<GameObject>();
private GameObject asset1 = Resources.Load("Weapon1") as GameObject;
private GameObject asset2 = Resources.Load("Weapon2") as GameObject;  
private GameObject asset3 = Resources.Load("Weapon3") as GameObject; 

private void Start()
{
assetBundle.Add(asset1);
assetBundle.Add(asset2);
assetBundle.Add(asset3);
}

现在,您可以随时按元素从列表中访问它们。但是,我不确定100%是否可以将Resources.Load()用于您要尝试执行的操作。我大约是65%-70%,所以我回答了。希望对您有帮助!

答案 2 :(得分:0)

这是我的解决办法,

IEnumerator LoadBundleFromDir(string bundleUrl)
{
    //which type of asset i want load
    GameObject model;
    AssetBundleCreateRequest bundleRequest = AssetBundle.LoadFromFileAsync(bundleUrl);
    yield return bundleRequest;
    AssetBundle localeAssetBundle = bundleRequest.assetBundle;

    Object[] allBundles = localeAssetBundle.LoadAllAssets();
    foreach (Object item in allBundles)
    {
        if (item.GetType() == typeof(GameObject))
        {
            AssetBundleRequest assetRequest = localeAssetBundle.LoadAssetAsync<GameObject>(item.name);
            yield return assetRequest;
            model = assetRequest.asset as GameObject;
            localeAssetBundle.Unload(false);
            break;
        }
    }
}