Resources.LoadAll не всегда возвращает один и тот же результат - PullRequest
0 голосов
/ 08 октября 2018

При запуске моего приложения я отправляю массив Texture2D методу.

namespace MyNamespace
{
    public class App : MonoBehaviour
    {
        public static App Instance { get; private set; }
        public Manager Manager = new Manager();

        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        static void OnRuntimeMethodLoad()
        {
            if (Instance == null)
            {
                Instance = new GameObject(nameof(App)).AddComponent<App>();
                Instance.Manager.TexturesConsumer(Resources.LoadAll("Textures/Ingredients/", typeof(Texture2D)));
            }
            DontDestroyOnLoad(Instance);
        }
    }
}

TexturesConsumer извлекает текстуры из указанного каталога и сохраняет их в ObservableCollection.Попутно он изменяет каждое texture.name для большей ясности в иерархии имен объектов.

public void TexturesConsumer(UnityEngine.Object[] textures)
{
    var txturList = new List<Texture2D>();
    string[] sp;
    string[] sp2;
    foreach (var txtur in Array.FindAll(textures, _ => IsValidImageFileName(_.name)))
    {
        txtur.name = txtur.name.Substring(IngredientTexturePrefix.Length, txtur.name.Length - IngredientTexturePrefix.Length - 2);
        sp = (txtur.name).Split(FSep);
        foreach (var compo in Enum.GetNames(typeof(Compos)))
            if (AvailableCompositions.Contains((Compos)Enum.Parse(typeof(Compos), compo)))
                foreach (var candid in Array.FindAll(textures, _ => _.name == IngredientTexturePrefix + sp[0] + FSep + sp[1] + FSep + "t" + FSep + compo.ToString()))
                {
                    sp2 = candid.name.Split(FSep);
                    candid.name = sp2[1] + FSep + sp2[2];
                    txturList.Add((Texture2D)candid);
                }
        if (txturList.Any())
            ListUIi.Add(new IngredientUI((Category)Enum.Parse(typeof(Category), sp[0]), int.Parse(sp[1]), (Texture2D)txtur, txturList));
        txturList.Clear();
    }
}

При первом выполнении все в порядке, имя каждой текстуры Resources.LoadAll соответствует имениpng файлИ поэтому TexturesConsumer выполняет свою работу должным образом.

Но при втором выполнении Resources.LoadAll возвращает текстуры "уже" переименованы!
Как будто файлы png были переименованы во время первого запуска!

При третьем выполнении все снова становится нормальным, и я восстанавливаю текстуры, как при первом выполнении.

Четвертое выполнение, уже переименованные текстуры: (

И так далее ...

Edit-add :
Я забыл упомянуть, что каталог Resources / Textures / Ingredients является символической ссылкой.
Это объясняет только одну часть проблемы.

Кто остается реальным.

Чтобы убедить себя, просто добавьте этот скрипт в новый проект и запустите его несколько раз (нажмите Play).

using System;
using System.Collections.Generic;
using UnityEngine;

namespace MyNamespace
{
    public class App : MonoBehaviour
    {
        public static App Instance { get; private set; }
        private List<Texture2D> Listt = new List<Texture2D>();

        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        static void OnRuntimeMethodLoad()
        {
            if (Instance == null)
            {
                Instance = new GameObject(nameof(App)).AddComponent<App>();
                Instance.TexturesConsumer(Resources.LoadAll("Textures/", typeof(Texture2D)));
            }
            DontDestroyOnLoad(Instance);
        }
        public void TexturesConsumer(UnityEngine.Object[] textures)
        {
            var outString = "";
            foreach (var txtur in textures)
            {
                txtur.name = txtur.name.Substring(0, txtur.name.Length - 1);
                Instance.Listt.Add((Texture2D)txtur);
                outString += txtur.name + "\n";
            }
            Debug.LogFormat(outString);
        }
    }
}

После определенного количестваПри выполнении (в зависимости от размера кратчайшего имени файла каталога) проблема будет возникать в консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...