首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >unity unity捆绑加载资产类型

unity unity捆绑加载资产类型
EN

Stack Overflow用户
提问于 2014-12-17 02:40:37
回答 3查看 7K关注 0票数 1

我对unity的资产捆绑包有问题。我有一个捆绑包,其中有多个资源,具有相同的名称,但扩展名不同,如bonus.png bonus.prefab。

当我尝试实例化一个名为bonus的预置时,assetBundle.LoadAssets("bonus")函数不会像往常那样返回一个游戏对象。似乎只有当我有多个具有相同名称的资源时,才会发生这种情况。

代码语言:javascript
运行
复制
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循环,我就可以找到我的资产并正确地实例化它。但这只是一种肮脏的做法。

EN

回答 3

Stack Overflow用户

发布于 2014-12-17 21:13:32

您应该能够加载具有相同名称的不同类型的资源。

您使用的Unity版本是什么?

您上面的代码看起来是正确的(除了称为LoadAssetAsync?的拼写错误?),我们不能确定它是否没有输入if()语句?

下面的代码适用于Unity 4.5.5f1

来自Unity Docs

  • Created的
  1. 将ExportAssetBundles.cs上下文菜单脚本添加到我的Unity build中,以导出

代码语言:javascript
运行
复制
- 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.

  1. 高亮显示了所有3个资源,并使用"Build Assets From Selection - Track Selection“将其导出,并将其保存到"c:\temp\marble.unity3d"
  2. Added脚本中,以便在启动时加载该资源包(与您的相似):

使用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();}}

  • 运行Unity并验证我是否正确地看到了游戏对象。
票数 1
EN

Stack Overflow用户

发布于 2014-12-17 21:43:12

当我在unity 4.6上时,它可以工作,但我现在使用的是beta 5.0.17。不,这不是一个拼写错误,它真的是laodassetasync我有,我也尝试了加载资产,只有相同的结果。现在我正在使用

代码语言:javascript
运行
复制
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));
        }
    }

它是有效的,但我真的不喜欢这种方式。

票数 1
EN

Stack Overflow用户

发布于 2015-08-01 17:39:07

在Unity 5.1中也有同样的问题,我找到了这个解决方案:除了通过基本名称引用资产(没有目录,没有路径的扩展部分)之外,你还可以使用完整的相对路径(包括文件扩展名,相对于项目根)。

假设我已经从目录Assets/Bundle创建了包,它包含以下文件:

  • Prefabs/Box.prefab
  • Prefabs/Box2.prefab
  • Models/Box.fbx
  • Materials/Box.mat
  • Textures/Box.png

所以在我们的例子中加载预制件失败的文档方法是

代码语言:javascript
运行
复制
// May return nulll
bundle.LoadAsset<GameObject>("Box")

在我们的案例中,这是一种没有文档记录的正确工作方式

代码语言:javascript
运行
复制
bundle.LoadAsset<GameObject>("assets/bundle/prefabs/box.prefab")

如果您不确定应该为LoadAsset使用的正确资产名称,可以使用以下代码列出bundle中的所有资产名称

代码语言:javascript
运行
复制
string[] assets = bundle.GetAllAssetNames();
foreach (string asset in assets)
{
    Debug.Log(asset);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27511686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档