### Что делает `[InitializeOnLoad]` `[InitializeOnLoad]` — это атрибут из пространства имён **`UnityEditor`**, который говорит Unity Editor: > «Как только закончится перезагрузка домена (script reload) или откроется проект, немедленно вызови статический конструктор (`static ClassName()`) всех классов, помеченных этим атрибутом, даже если к классу ещё никто не обращался». ([docs.unity3d.com](https://docs.unity3d.com/2020.1/Documentation/Manual/RunningEditorCodeOnLaunch.html?utm_source=chatgpt.com "Running Editor Script Code on Launch")) --- #### Как это работает |Шаг|Что делает Unity| |---|---| |1|Компилирует скрипты → перезагружает C#-домен.| |2|Находит все типы с `[InitializeOnLoad]`.| |3|**Сразу** вызывает их статические конструкторы.| _Без атрибута_ статический конструктор сработал бы только при первом использовании класса, то есть значительно позже (или вовсе никогда, если класс не использовался). --- #### Где применяют - **Регистрация колбэков**: `EditorApplication.update`, `AssemblyReloadEvents.afterAssemblyReload`, собственные IPC-серверы (как в Вашем примере) и т. д. - **Автоматическая инициализация Editor-расширений**: добавление элементов меню, хоткеев, пользовательских настроек. --- #### Ограничения и производительность |Пункт|Детали| |---|---| |Только в Editor|В Player-сборке атрибут игнорируется.| |Ранний вызов|Конструктор выполняется **до** завершения импорта ассетов; загрузка `AssetDatabase.LoadAssetAtPath` может вернуть `null`. Если нужны ассеты — перенесите код в `EditorApplication.delayCall` или `AssetPostprocessor`. ([docs.unity3d.com](https://docs.unity3d.com/ScriptReference/InitializeOnLoadAttribute.html?utm_source=chatgpt.com "InitializeOnLoadAttribute - Scripting API - Unity - Manual"))| |Стоимость|Конструктор вызывается при **каждом** перезагруженном домене (компиляция, Enter Play Mode при включённом Domain Reload). Держите код максимально лёгким: без тяжёлых вычислений, без блокирующих операций на основном потоке, без лишних аллокаций.| --- #### Сравнение с `[InitializeOnLoadMethod]` |Атрибут|Применяется к|Требования|Когда вызывается| |---|---|---|---| |`InitializeOnLoad`|**класс**|Должен быть статический конструктор|Немедленно после reload| |`InitializeOnLoadMethod`|**статический метод**|Метод должен быть `static void` без параметров|То же самое| --- #### Мини-пример ```csharp #if UNITY_EDITOR using UnityEditor; [InitializeOnLoad] public static class StartupLogger { // статический конструктор сработает сразу после reload static StartupLogger() { EditorApplication.delayCall += () => { // Покажется, когда все ассеты уже доступны Debug.Log("Editor перезагружен и готов к работе"); }; } } #endif ``` --- ### Вывод `[InitializeOnLoad]` — удобный способ «поднять» любое Editor-поведение сразу после компиляции или запуска Unity, не дожидаясь, пока класс кто-то использует. Главное — держать такой код коротким, не трогать ассеты до их импорта и помнить, что в финальной игре он работать не будет.