Сцена из бандла загружается с ошибкой

Ошибки и баги Unity3D

Сцена из бандла загружается с ошибкой

Сообщение Shekn 22 дек 2016, 21:54

Версия Юнити 5.3.7. Я делаю так: создаю Asset bundle, содержащий только сцену. Вот такой командой, вызванной в редакторе:

Синтаксис:
Используется 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;

    }
}
 


Может способ загрузки неправильный? На всякий случай, вот ссылка на архив проекта: https://cloud.mail.ru/public/MkBf/FUBhcxF1B

Там в папке WindowsBundle лежит как раз сохраненный бандл. В самом же проекте по нажатию на кнопку "Load scene" происходит загрузка этого бандла и сцены из него. Там еще есть поля всякие, чтобы задавать данные, но их надо менять, только если сам бандл поменяется. Другие имена у него будут или лежать в другом месте станет. Там же есть и уже сбилденный проект.
https://tugcga.github.io/
Аватара пользователя
Shekn
UNIт
 
Сообщения: 95
Зарегистрирован: 05 фев 2016, 14:20

Re: Сцена из бандла загружается с ошибкой

Сообщение jetyb 12 янв 2017, 11:54

Возможно бандл ссылается на не содержащиеся в билде, но содержащиеся в проекте шейдеры.
Попробуйте включить в билд необходимые шейдеры через Edit -> ProjectSettings -> Graphics.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Сцена из бандла загружается с ошибкой

Сообщение Shekn 13 янв 2017, 21:04

Спасибо, но такая мысль самая первая и была. И шэйдеры добавлял в билд, и вообще использовал только стандартный на всех объектах. Поведение то же самое.
https://tugcga.github.io/
Аватара пользователя
Shekn
UNIт
 
Сообщения: 95
Зарегистрирован: 05 фев 2016, 14:20


Вернуться в Глюки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2