Редактор Unity — [InitializeOnLoadMethod] Выполняется несколько раз в фоновом режиме.C#

Место общения программистов C#
Ответить
Anonymous
 Редактор Unity — [InitializeOnLoadMethod] Выполняется несколько раз в фоновом режиме.

Сообщение Anonymous »

У меня возникла странная проблема в скрипте редактора Unity. Я создал приведенный ниже код в качестве минимального примера для воспроизведения проблемы и объяснения того, что происходит.
Я использую Unity версии 2023.2.9f1
< h2>Объяснение сценария
У меня есть статический метод, который выполняется при перезагрузке домена Unity благодаря [InitializeOnLoadMethod]. Он создаст файл в папке StreamingAssets. Пока все хорошо: когда я открываю Unity, я вижу, что журналы печатаются, и в папке StreamingAssets создается файл. То же самое, если я отредактирую скрипт, это приведет к перезагрузке домена и созданию нового файла.
Проблема
У меня была довольно серьезная проблема. трудно каждый раз найти способ воспроизвести проблему, но следующий шаг, похоже, работает:
  • Создать новую сцену
    < li>Осмотрите сцену в окнах инспектора.
При выполнении этого шага консоль Unity не отображает никаких новых журналов, но метод SyncWriteFile() снова выполняется дважды, поскольку я вижу, что создаются два новых файла. Но я думаю, что это происходит без явного запуска перезагрузки домена в основном потоке, иначе консоль единства должна распечатать новые журналы. Это большая проблема в моем основном проекте.
Я думаю, что это связано с AssetImportWorker, потому что, просматривая AssetImportWorkerX.log, сначала я вижу 2 журнала (AssetImportWorker0.log, AssetImportWorker1). .log), и они содержат сообщение журнала двух новых созданных файлов.
Код и журналы

Код: Выделить всё

public static class TEST
{
[InitializeOnLoadMethod]
private static void Init()
{
Debug.Log($"{DateTime.Now.Ticks} : INIT Start");

AssemblyReloadEvents.afterAssemblyReload += AssemblyReloadEvents_afterAssemblyReload;
SyncWriteFile();

Debug.Log($"{DateTime.Now.Ticks} : INIT End");
}

private static void AssemblyReloadEvents_afterAssemblyReload()
{
Debug.Log($"{DateTime.Now.Ticks} : Assembly Reload");
}

private static void SyncWriteFile()
{
string path = Path.Combine(Application.streamingAssetsPath, $"test_{DateTime.Now.Ticks}");
Debug.Log($"{DateTime.Now.Ticks} : Creating file {path}");
File.Create(path);
}
}
Изображение



Подробнее здесь: https://stackoverflow.com/questions/791 ... background
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»