Синтаксис:
Используется csharp
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
На сцене, конечно, объекты всякие, лайтмапы. Скриптов нет, шэйдеры стандартные. Юнити, как положено, создаёт manifest-файл с описанием того, что лежит в бандле и, собственно, сам файл с бандлем. Потом я пробую загрузить сцену из бандла совсем в другом проекте, и происходит странное. Как правило загрузка сцены происходит нормально, но иногда в редакторе выскакивает вот такая ошибка
Синтаксис:
Используется csharp
ms_IDToPointer->find (obj->GetInstanceID ()) == ms_IDToPointer->end ()
При этом загруженная сцена в результате оказывается пустой. Если сбилдить проект, то тоже как правило загрузка сцены из бандла происходит корректно, но иногда сцена грузится и отображается так, как будто шэйдеры непонятны или с ошибкой (малинового цвета все объекты). Если заново перегрузить сцену, то может все нормально показать, а может и снова с ошибкой.
Собственно в этом основная проблема - иногда непредсказуемым образом сцена из бандла грузится с ошибкой. Я вот бился-бился, не получается понять из-за чего это происходит. Начинал с пустой сцены. Грузит ее без проблем. Потом добавлял несколько объектов - тоже нормально. И вот так вот понемногу добавляя объекты, экспортируя бандл и загружая его по многу раз, в какой-то момент первый раз загрузка происходит с ошибкой. Удаляю последние добавленные в сцену объекты, пересобираю бандл - он тоже грузится с ошибкой.
В общем вопрос такой - встречался ли кто-нибудь с такой проблемой? Что вообще не то делается? Да, загрузку сцены делаю таким кодом:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;
public class MiddleSceneController : MonoBehaviour {
AssetBundleManifest assetManifest;
WWW www;
string path;
string manifestName;
string bundleName;
string sceneNameToLoad;
public Image imageProgress;
public Text loadDataText;
void Start ()
{
StartCoroutine(LoadSceneWithManifest());
}
IEnumerator LoadSceneWithManifest()
{
path = GlobalStaticData.path;
manifestName = GlobalStaticData.manifestName;
bundleName = GlobalStaticData.bundleName;
sceneNameToLoad = GlobalStaticData.sceneNameToLoad;
loadDataText.text = "Load from " + path + manifestName;
using (www = new WWW(path + manifestName))
{
yield return www;
if (!string.IsNullOrEmpty(http://www.error))
{
Debug.Log(http://www.error);
yield break;
}
assetManifest = (AssetBundleManifest)www.assetBundle.LoadAsset("AssetBundleManifest");
http://www.assetBundle.Unload(false);
}
using (www = http://WWW.LoadFromCacheOrDownload(path + bundleName, assetManifest.GetAssetBundleHash(bundleName)))
{
while (!www.isDone)
{
yield return http://www.isDone;
imageProgress.fillAmount = http://www.progress / 2f;
}
string[] scenePath = http://www.assetBundle.GetAllScenePaths();
if (scenePath.Length > 0)
{
sceneNameToLoad = scenePath[0];
StartCoroutine(LoadSceneAssync());
}
yield return null;
http://www.assetBundle.Unload(false);
}
}
IEnumerator LoadSceneAssync()
{
AsyncOperation async = SceneManager.LoadSceneAsync(System.IO.Path.GetFileNameWithoutExtension(sceneNameToLoad));
while (!async.isDone)
{
yield return async.isDone;
imageProgress.fillAmount = 0.5f + async.progress / 2f;
}
yield return async;
}
}
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;
public class MiddleSceneController : MonoBehaviour {
AssetBundleManifest assetManifest;
WWW www;
string path;
string manifestName;
string bundleName;
string sceneNameToLoad;
public Image imageProgress;
public Text loadDataText;
void Start ()
{
StartCoroutine(LoadSceneWithManifest());
}
IEnumerator LoadSceneWithManifest()
{
path = GlobalStaticData.path;
manifestName = GlobalStaticData.manifestName;
bundleName = GlobalStaticData.bundleName;
sceneNameToLoad = GlobalStaticData.sceneNameToLoad;
loadDataText.text = "Load from " + path + manifestName;
using (www = new WWW(path + manifestName))
{
yield return www;
if (!string.IsNullOrEmpty(http://www.error))
{
Debug.Log(http://www.error);
yield break;
}
assetManifest = (AssetBundleManifest)www.assetBundle.LoadAsset("AssetBundleManifest");
http://www.assetBundle.Unload(false);
}
using (www = http://WWW.LoadFromCacheOrDownload(path + bundleName, assetManifest.GetAssetBundleHash(bundleName)))
{
while (!www.isDone)
{
yield return http://www.isDone;
imageProgress.fillAmount = http://www.progress / 2f;
}
string[] scenePath = http://www.assetBundle.GetAllScenePaths();
if (scenePath.Length > 0)
{
sceneNameToLoad = scenePath[0];
StartCoroutine(LoadSceneAssync());
}
yield return null;
http://www.assetBundle.Unload(false);
}
}
IEnumerator LoadSceneAssync()
{
AsyncOperation async = SceneManager.LoadSceneAsync(System.IO.Path.GetFileNameWithoutExtension(sceneNameToLoad));
while (!async.isDone)
{
yield return async.isDone;
imageProgress.fillAmount = 0.5f + async.progress / 2f;
}
yield return async;
}
}
Может способ загрузки неправильный? На всякий случай, вот ссылка на архив проекта: https://cloud.mail.ru/public/MkBf/FUBhcxF1B
Там в папке WindowsBundle лежит как раз сохраненный бандл. В самом же проекте по нажатию на кнопку "Load scene" происходит загрузка этого бандла и сцены из него. Там еще есть поля всякие, чтобы задавать данные, но их надо менять, только если сам бандл поменяется. Другие имена у него будут или лежать в другом месте станет. Там же есть и уже сбилденный проект.