我想从我的资产束中加载和实例化资产,但是在统一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- 如何实例化或分配加载了资产捆绑的精灵?
答案 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;
}
}
}