# MatEditor(Покраска)



Все классы находятся в своем пространстве имен MatEditor. Использование пространства MatEditor.Editors крайне не рекомендуется.

Как юзать программистам:

1. На сцену нужно добавить синглтон MaterialSelector
2. В папке проекта нужно создать контейнер данных -> Create->Installers->Material
3. В синглтон MaterialSelector, в поле data установить ссылку на созданный контейнер в предыдущем шаге. Так же установите значение Selected Index на 0 (рекомендуется)
4. На все объекты, в которых должны меняться материалы, нужно повесить компонент MaterialSetter. После добавления, он автоматически регистрируется в системе\* Прим. \* - регистрация не происходит в рантайме при добавлении компонента. По хорошему в рантайме регистрации вообще не должно быть.

_P.S. В стартерпаке первый 3 пункта уже сделаны._

Основная настройка готова, список всех материалов и зарегистрированных объектов можно посмотреть в MatEditor'е. Для это на панели инструментов выберите Editors->Materials Editor. Откроется окно, в котором вас попросят выбрать контейнер данных. Выберите его. В следующем окне будут отображены поддерживаемые объекты, их материалы и паттерны. Здесь вы можете менять материалы у объектов, менять кол-во материалов и добавлять/удалять новые паттерны Не забудьте сохранить изменения после редактирования.

**Компоненты:**\
Основной компонент, с которым будет взаимодействие из вне - это MaterialSelector. Он обладает основным набором свойств и методов для управления.

**Из них:**\
static int MaterialSelector.SelectedIndex -> индекс выбранного паттерна. Только для чтения static string MaterialSelector.SelectedPattern -> название выбранного паттерна. Только для чтения static void ChangeGlobalIndex(int index, bool asyncChange) -> изменяет номер индекса паттерна, где: int index -> номер нового индекса, bool asyncChange -> нужно ли изменить материалы асинхронно. Если выбран неподдерживаемый индекс, будет выбрашено исключение ArgumentOutOfRangeException. При удачном вызове, срабатывает ивент Action OnSelectedIndexChangeHandler. event Action OnSelectedIndexChangeHandler -> вызывается при смене индекса через ChangeGlobalIndex. Вызов произойдет вне зависимости от параметра bool asyncChange в том же кадре. Сигнатура должна принимать параметр типа int, где он является значением нового индекса.

**Поля в инспекторе:**\
Pattern: \[name] -> название выбранного паттерна int Selected index -> индекс выбранного паттерна MaterialInstallerData Data -> контейнер данных материалов bool Enabled -> активен ли компонент MaterialSetter\[] All Setters -> все закешированные сеттеры. Обычно не нуждается в редактировании напрямую Кнопка Rehash -> обновляет все закешированные сеттеры, загружая их материалы в контейнер материалов в соотвествующий паттерн Кнопка Load \[pattern\_name] in Scene -> делает наоборот, обновляет закешированные сеттеры, меняя на них материалы по установленному паттерну

Второй компонент, это MaterialSetter. Основную работу он проделывает в момент добавления компонента на объект в редакторе. Этот компонент требует наличия на объекте любого другого компонента, унаследованного от класса Renderer. Так же этот компонент не должен добавляться из кода во время рантайма через AddComponent. Если это требуется, то кешируйте этот компонент в префабах.

**Свойства:**\
string MaterialSetter.Lable -> полное имя объекта void MaterialSetter.ApplyAllMaterials() -> устанавливает на прикрепленный рендерер все материалы, соотвествующие выбранному паттерну. Автоматически вызывается при смене паттерна.

**Поля в инспекторе:**\
int index -> является ссылкой на блок данных в контейнере материалов. Крайне не рекомендуется его менять, если это не требуется. Менять его нужно в том случае, если у вас на сцене планируется использование несколько копий одного объекта (по хорошему лучше сделать так, чтобы имена их совпадали. Полные имена). Если вам кажется, что он сбился, нажмите на кнопку ToHash enum Initialize Mode -> режим инициализации материалов. Компонент изначально сам инициализирует материалы. Есть 3 значения, это Awake -> означает, что смена материалов будет произведена в методе Awake, Start -> инициализация будет произведена в методе Start и Script -> означает что компоненту нужна внешняя инициализация. Кнопка ToHash -> регистрирует или обновляет в контейнере данные по списку материалов. По сути нужна редко. Кнопка Load Materials -> загружает в рендерер материалы из контейнера. "Превью меню"

**Это больше для арта. Как красить:**

1. Если покраска по новому паттерну, то сам паттерн нужно создать в редакторе. Для этого нужно открыть Editors->Materials Editor. В линиюю будут выстроены названия паттернов, начиная с Default. Нажимая на "+", появится окно, где попросят ввести имя нового паттерна. Имена не должны повторяться или быть пустыми.
2. После создания нового паттерна, возвращаеся на сцену и красим все объекты как обычно.
3. После покраски, находим объект MaterialSelector (рекомендуется использовать приписку \[ART] чтоб не искать), меняем там Selected Index на нужный (номер можно посмотреть в том же MatEditor) и жмем кнопку Rehash. Готово.
4. Не обязательно но крайне желательно: зайти обратно в MatEditor и проверить паттерн
