2014-12-16 3 views
1

У меня проблема с комплектом активов из единства. У меня есть пакет с несколькими активами в нем с тем же именем, но с другим расширением, например bonus.png bonus.prefab.единство propertybundle loadasset тип

Когда я пытаюсь внедрить префаб, получивший бонус, функция assetBundle.LoadAssets («бонус») не возвращает мне такой игровой объект, как он обычно делает. Это происходит, только если у меня есть несколько активов с тем же именем.

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 (геймобжекты)), а затем использовать для цикла, я могу найти свой актив и instanciante его правильно. но это всего лишь грязный способ сделать это.

ответ

1

Вы должны иметь возможность загружать активы разных типов с тем же именем.

Какую версию Unity вы используете?

Ваш код выглядит корректно (за исключением типовой формы, называемой LoadAssetAsync?), И мы не знаем наверняка, что он не может ввести инструкцию if()?

Следующая работал для меня на Unity 4.5.5f1

  1. Добавлено ExportAssetBundles.cs контекстное меню сценария к моему Unity строить из Unity Docs

  2. создал что-то экспортировать

    • найдено JPG перетащил его и назвал его «marble.jpg»
    • создал куб, названный им «marb le "и перетащил его в проект для создания сборника
    • создал материал, названный им« мрамор », добавил jpg и перетащил его на куб, нажав применить.
  3. Hilighted все 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. Ран единства и проверил я вижу объект игры правильно.

1

Он работал, когда я был на уровне 4.6, но теперь я использую бета-версию 5.0.17. И нет, это не опечатка, это действительно laodassetasync, у меня есть, я также пробовал с loadasset только с тем же результатом. Сейчас я использую

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

и он работает, но мне не нравится этот способ сделать это.

+0

Правильно, не знал, что вы были в Unity 5. Я раньше этого метода LoadAssetAsync() не видел. Звучит как ошибка Unity 5, тогда вы будете записывать ошибку: http://issuetracker.unity3d.com/ – peterept

1

Имея такой же вопрос с 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); 
} 
Смежные вопросы