Unity 资源包加载资源类型

本文关键字:资源 类型 加载 包加载 Unity | 更新日期: 2023-09-27 18:34:21

我对 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循环,我可以找到我的资产并正确地实例化它。 但这只是一种肮脏的方式。

Unity 资源包加载资源类型

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

您使用的是哪个版本的 Unity?

你上面的代码看起来是正确的(除了叫它LoadAssetAsync的拼写错误?(,我们不确定它是否无法输入if((语句?

以下内容在Unity 4.5.5f1上对我有用

  1. 从 Unity 文档向我的 Unity 构建添加了导出资源包.cs上下文菜单脚本

  2. 创建了要导出的内容

    • 找到一个JPG拖了进去,给它起名叫"弹珠.jpg">
    • 创建了一个多维数据集,将其命名为"大理石",并将其拖到项目中以创建预制件
    • 创建了一个材质,将其命名为"大理石",添加 JPG 并将其拖动到立方体上,然后按应用。
  3. 突出显示所有 3 个资源包并使用"从选择构建资源 - 跟踪选择"导出资源包并将其保存到"c:''temp''marble.unity3d">

  4. 添加了一个脚本以在启动时加载该资源包(类似于您的脚本(:

    using UnityEngine;
    using System.Collections;
    public class BundleTest : MonoBehaviour {
      void Start () {
        StartCoroutine(StartCo());  
      }
      IEnumerator StartCo() {
        string url = "file://c:''temp''marble.unity3d";
        WWW www = new WWW(url);
        yield return www;
        AssetBundle bundle = www.assetBundle;
        AssetBundleRequest request = bundle.LoadAsync ("marble", typeof(GameObject));
        yield return request;
        Debug.Log ("loaded asset: " + request.asset.ToString());
        GameObject prefab = request.asset as GameObject;
        GameObject go = (GameObject)Instantiate(prefab);
        bundle.Unload(false);
        www.Dispose();
      }
    }
    
  5. 运行 Unity 并验证我是否正确看到了游戏对象。

当我使用 unity 4.6 时,它曾经有效,但现在我使用的是 beta 5.0.17。不,这不是错字,它真的是我有的老资产异步,我也尝试过加载资产,结果相同。现在我正在使用

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

它正在起作用,但我真的不喜欢这种方式。

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

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

  • Prefabs/Box.prefab
  • Prefabs/Box2.prefab
  • Models/Box.fbx
  • Materials/Box.mat
  • Textures/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);
}