Unity VR-приложение - не может импортировать файлы - PullRequest
0 голосов
/ 13 сентября 2018

Сейчас я разрабатываю VR-приложение для моего Oculus Go. В этом приложении мне нужно импортировать файлы, такие как изображения, видео, аудио во время выполнения. Моя проблема сейчас заключается в том, что импорт этих файлов работает в единстве, но не работает на моем Oculus Go.

В моем проекте я использую сборный файл браузера из хранилища активов. этот файловый браузер может быть открыт во время выполнения моего приложения, но когда я хочу открыть файл, например изображение, он становится серым. изображение должно быть загружено в RawImage-Object.

Filebrowser во время выполнения

Объект RawImage становится серым

Unity-работает

Я не понимаю, почему это происходит. Я должен сказать, что я новичок в единстве и был бы признателен за любую помощь! Вот код image-load-script.

public class FileManager : MonoBehaviour {

public RawImage image;

public void OpenExplorer()
{
    SimpleFileBrowser.FileBrowser.SetFilters(true, ".txt", ".jpg", ".png", ".mp4");
    SimpleFileBrowser.FileBrowser.ShowLoadDialog( (path) => { UpdateImage(path); }, null, false, null, "Select File", "Select");
}

void UpdateImage(string pfad)
{
    if (pfad != null)
    {
        WWW www = new WWW(pfad);
        image.texture = www.texture;
        var texWidth = www.texture.width;
        var texHeight = www.texture.height;

        if (texWidth > texHeight)
        {
            GetComponent<RectTransform>().sizeDelta = new Vector2(1920/2, 1080/2);
        }
        if (texWidth < texHeight)
        {
            GetComponent<RectTransform>().sizeDelta = new Vector2(1080/2, 1920/2);
        }
    }

}

1 Ответ

0 голосов
/ 13 сентября 2018

Моя проблема сейчас заключается в том, что импорт этих файлов работает в единство, но не работает на моем Oculus Go.

Большая часть глючного кода работает в редакторе, но вы обнаружите проблему с кодом при развертывании или сборке проекта.

Ваша проблема в функции UpdateImage:

WWW www = new WWW(pfad);
image.texture = www.texture;
...

Вы должны уступить или дождаться завершения запроса WWW перед загрузкой изображения. Запрос асинхронный. Без этого вы будете пытаться получить доступ к неполному изображению, что приведет к повреждению или серому изображению в зависимости от платформы.

Внести следующие изменения:

1 . Измените UpdateImage на функцию сопрограммы (void до IEnumerator), затем выдайте запрос WWW с yield return www;, прежде чем получить доступ к текстуре из нее:

2 . Вызовите функцию UpdateImage как функцию сопрограммы с помощью StartCoroutine:

Заменить:

SimpleFileBrowser.FileBrowser.ShowLoadDialog( (path) => { UpdateImage(path); }, null, false, null, "Select File", "Select");

с

SimpleFileBrowser.FileBrowser.ShowLoadDialog( (path) => { StartCoroutine(UpdateImage(path)); }, null, false, null, "Select File", "Select");

3 . Проверьте наличие ошибок, прежде чем получить доступ к текстуре. По завершении запроса WWW может произойти ошибка. Проверьте это перед использованием возвращенной текстуры или элемента.

Окончательный код должен выглядеть следующим образом:

public RawImage image;

public void OpenExplorer()
{
    SimpleFileBrowser.FileBrowser.SetFilters(true, ".txt", ".jpg", ".png", ".mp4");
    SimpleFileBrowser.FileBrowser.ShowLoadDialog((path) => { StartCoroutine(UpdateImage(path)); }, null, false, null, "Select File", "Select");
}

IEnumerator UpdateImage(string pfad)
{
    if (pfad != null)
    {
        WWW www = new WWW(pfad);
        //WAIT UNTIL REQUEST IS DONE!
        yield return www;

        //Check for error
        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
        }
        else
        {
            image.texture = www.texture;
            var texWidth = www.texture.width;
            var texHeight = www.texture.height;

            if (texWidth > texHeight)
            {
                GetComponent<RectTransform>().sizeDelta = new Vector2(1920 / 2, 1080 / 2);
            }
            if (texWidth < texHeight)
            {
                GetComponent<RectTransform>().sizeDelta = new Vector2(1080 / 2, 1920 / 2);
            }
        }
    }
}
...