Как я могу загружать изображения в Unity с диска в другом потоке?

#multithreading #textures #unity-ui

Вопрос:

Я хотел бы загрузить кучу текстур из файлов .png и .jpg с моего диска и показать их с помощью RawImage на моем UnityUI. Но загрузка только одной из нужных мне текстур занимает слишком много времени. Поэтому я хотел передать его на аутсорсинг другому потоку. Я пытался это сделать, и здесь вы можете увидеть, как:

 foreach(MediaData data in neueMedien)
        {
            GameObject bild = GameObject.Find(data.lastKnownPath   " neu ");
            Texture2D tex = new Texture2D(2, 2);
            tex = await Task.Run(() =>
                {
                    return TimeCalculator.gibTexture(data.lastKnownPath);
                });
            bild.GetComponent<RawImage>().texture = tex;
        }
 

И это метод «gibTexture», который вызывается в другом потоке:

 public static Texture2D gibTexture(string path)
    {
        if (File.Exists(path))
        {
            byte[] fileData = File.ReadAllBytes(path);
            Texture2D tex = new Texture2D(2, 2);
            tex.LoadImage(fileData);
            return tex;
        }
        else return null;
    }
 

Я использовал этот способ для загрузки текстур ранее, и он работает в основном потоке. Но я открыт для новых способов загрузки текстуры.
Теперь, если я попробую код выше, я получу следующее исключение:

Исключение UnityException: SupportsTextureFormatNative может быть вызван только из основного потока.

И далее в исключении он выделил строку «Texture2D tex = новый Texture2D(2, 2);» из «gibTexture» выше. Таким образом, мой способ загрузки текстуры невозможен в другом потоке, я прав? И если(я прав), как я могу это исправить?

О, и кстати: я попытался загрузить текстуру через UnityWebRequest и получил аналогичное исключение, в котором говорится, что я не могу вызывать методы UnityWebRequest ни в одном потоке, кроме основного потока.

Спасибо вам за вашу помощь 😀