Добавлен , опубликован

Разработка редакторов - это просто!

Содержание:
Порой, работая с объектами у нас возникает справедливое желание дополнить игровой класс какой-то служебной информацией, нужной для редактора. Однако нельзя нагружать сами игровые классы - мы же не хотим, чтобы это все пошло в игровой билд, верно?
Потому ниже я приведу вам несколько примеров, как это можно сделать.

Из редактора

Избежать всех этих неприятностей помогут самые обычные, нативные хеш-таблицы, реализуемые через классы Hashtable и Dictionary. Единственный минус от их использования только один - у нас нет адекватной стандартной возможности проконтролировать, существует/удален из игры какой-то объект, в результате чего иногда хеш-таблицам свойственно "распухать" при работе с большим количеством данных.

Через директиву

Так же есть другие способы повлиять на содержимое игровых объектов.
Тут мы можем вспомнить директиву #if UNITY_EDITOR, Используется она прямо в игровых скриптах, в формате
#if UNITY_EDITOR
// Ваш код
#else
//Код в другом случае
#endif
Где директива #else не является обязательной. С помощью этих директив вы можете встроить в игровые классы любые данные, начиная от алгоритмов, заканчивая полями - на этапе формирования билда, все они будут отсечены.
Единственным минусом директивы я могу назвать то, что для игровых библиотек становится неочевидным что некоторые данные нельзя трогать из "сборки игры". Иными словами это нарушает инкапсуляцию.
Чтобы инкапсуляция оставалась в норме можно, однако, написать специальный класс для редактора, который вычислит "особые" приватные поля через рефлектор, и дальше будет их таким образом подтягивать.

Совет от автора

Так же расскажу вам о той практике, которую применяю самолично.
Смысл её состоим в том, что для объектов вы создаете обычное несереализуемое поле, аля
public object editorTag;
В которое закидываете любую временную информацию по своему усмотрению. Это удобно, практично, и не вызывает лишних вопросов.