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

3

我希望从我的资源包中加载和实例化资产,但在Unity 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);

记录我的assetbundle的主资源名称!

但是在Unity 5+之后,他们说mainasset已经过时了。

我的问题是:

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

2- 如何实例化或分配从资产包中加载的sprite?

3个回答

4
根据AssetBundle文档,现在可以调用GetAllAssetNames()以字符串数组的形式返回捆绑包中所有资产名称的列表。您可以通过使用这些资产名称的for循环从捆绑包中加载资产。
或者,如果您保证每个捆绑包只有一个资产,则可以简单地获取索引为0的字符串(不建议)。
此外,您可以使用LoadAllAssets()加载资产而无需知道名称,它将返回特定类型的数组(在您的情况下,您需要指定Sprite)。

谢谢,但是过去我尝试过:myLoadedAssetBundle.LoadAsset(myLoadedAssetBundle.GetAllAssetNames()[0]),但是没有成功! - Rooz
你确认GetAllAssetNames()[0]包含非空值了吗?考虑使用LoadAllAssets()并检查是否收到一个gameObjects数组。@Rooz - Erik Overflow

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%的把握,所以我回答了。希望能有所帮助!


3
Resources.Load 已经被弃用,推荐使用 Asset Bundles。请注意保持原意并简化语言,不提供解释或其他信息。 - Draco18s no longer trusts SE
我之前不知道这个。感谢提供信息!@Draco18s - AntonioTorro

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接