我对unity的资产捆绑包有问题。我有一个捆绑包,其中有多个资源,具有相同的名称,但扩展名不同,如bonus.png bonus.prefab。
当我尝试实例化一个名为bonus的预置时,assetBundle.LoadAssets("bonus")函数不会像往常那样返回一个游戏对象。似乎只有当我有多个具有相同名称的资源时,才会发生这种情况。
AssetBundleRequest request = assetBundle.LoadAssetAsync(m_ObjectsToPool[i].m_Name, typeof(GameObject));
yield return request;
GameObject prefab = request.asset as GameObject;
if (prefab != null)
{
PoolManager.Instance.AddLoadedPrefabToPool(prefab, m_ObjectsToPool[i].m_Name, null, m_ObjectsToPool[i].m_Amount);
}但是如果我调用loadallassets(typeof(GameObject)),然后使用for循环,我就可以找到我的资产并正确地实例化它。但这只是一种肮脏的做法。
发布于 2014-12-17 21:13:32
您应该能够加载具有相同名称的不同类型的资源。
您使用的Unity版本是什么?
您上面的代码看起来是正确的(除了称为LoadAssetAsync?的拼写错误?),我们不能确定它是否没有输入if()语句?
下面的代码适用于Unity 4.5.5f1
来自Unity Docs
- found a JPG dragged it in and named it "marble.jpg"
- created a cube, named it "marble" and dragged it into project to create a prefab
- created a material, named it "marble", added the jpg and dragged it onto the cube, pressed apply.
使用UnityEngine;使用System.Collections;公共类BundleTest : MonoBehaviour { void Start () { StartCoroutine( StartCo() );} IEnumerator StartCo(){ string url =“AssetBundle www WWW = new WWW(url);yield www;typeof(www.assetBundle);AssetBundleRequest request = bundle.LoadAsync ("marble",typeof(GameObject));Start request;Debug.Log (“已加载资产:”+ request.asset.ToString());GameObject prefab = request.asset as GameObject;GameObject go = (GameObject)Instantiate(prefab);bundle.Unload(false);www.Dispose();}}
发布于 2014-12-17 21:43:12
当我在unity 4.6上时,它可以工作,但我现在使用的是beta 5.0.17。不,这不是一个拼写错误,它真的是laodassetasync我有,我也尝试了加载资产,只有相同的结果。现在我正在使用
var allAssets = assetBundle.LoadAllAssets(typeof(GameObject));
for (int i = 0; i < m_ObjectsToPool.Count; i++)
{
bool found = false;
for (int j = 0; j < allAssets.Length; j++)
{
if (allAssets[j].name == m_ObjectsToPool[i].m_Name)
{
PoolManager.Instance.AddLoadedPrefabToPool((GameObject)allAssets[j], m_ObjectsToPool[i].m_Name, null, m_ObjectsToPool[i].m_Amount);
found = true;
break;
}
}
if (!found)
{
Debug.Log(string.Format("{0} object could not be found in assetbundle", m_ObjectsToPool[i].m_Name));
}
}它是有效的,但我真的不喜欢这种方式。
发布于 2015-08-01 17:39:07
在Unity 5.1中也有同样的问题,我找到了这个解决方案:除了通过基本名称引用资产(没有目录,没有路径的扩展部分)之外,你还可以使用完整的相对路径(包括文件扩展名,相对于项目根)。
假设我已经从目录Assets/Bundle创建了包,它包含以下文件:
Prefabs/Box.prefabPrefabs/Box2.prefabModels/Box.fbxMaterials/Box.matTextures/Box.png所以在我们的例子中加载预制件失败的文档方法是
// May return nulll
bundle.LoadAsset<GameObject>("Box")在我们的案例中,这是一种没有文档记录的正确工作方式
bundle.LoadAsset<GameObject>("assets/bundle/prefabs/box.prefab")如果您不确定应该为LoadAsset使用的正确资产名称,可以使用以下代码列出bundle中的所有资产名称
string[] assets = bundle.GetAllAssetNames();
foreach (string asset in assets)
{
Debug.Log(asset);
}https://stackoverflow.com/questions/27511686
复制相似问题