### Что делает `[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, не дожидаясь, пока класс кто-то использует. Главное — держать такой код коротким, не трогать ассеты до их импорта и помнить, что в финальной игре он работать не будет.