Функция которая выполняется если класс наследуется от определенного интерфейса C#
У меня есть интерфейс IWeapon. Я хочу что бы все классы которые реализуют IWeapon добавлялись в выпадающий список. Я могу пополнить этот список одной строчкой кода, но в какую функцию ее написать чтобы после сохранения файла(пересборки всего проекта) выполнять эту строчку. Пересматривать все классы в проекте не вариант, так как классов будет становится все больше и это будет замедлять пересборку проекта.
Ответы (1 шт):
Не нужно создавать 200 классов если у вас будет 200 видов оружия. Класс нужно создавать только на тип вооружения, например стрелковое, гранаты и т.д. Всё остальное должно регулироваться параметрами из данных, а не быть захардкожено. То есть чтобы добавить новый пистолет в игру, нужно создать для него файл с данными, а не переписывать код и не пересобирать проект. Избавляйтесь от хардкода. По формату для хранилища попробуйте сериализацию в JSON. Для Unity есть мощная библиотека JSON.NET, которая умеет сериализовать в том числе типы объектов (Type Name Handling). То есть все свои IWeapon[] можно записать в файл одной строчкой кода, и так же одной строчкой кода прочитать.
Следовательно и получать список классов не придется, ну если вы конечно не захотите создать редактор пушек, где придется для создания новой пушки цеплять исполняющий ее скрипт.
Грубо говоря, у вас не должно быть разных классов, где код одинаковый, а отличаются только данные.
А игроку надо локализованные названия показывать, а не внутренние названия классов.
А что касается вопроса, то можно использовать рефлексию.
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type type in types.Where(t => typeof(IWeapon).IsAssignableFrom(t))
{
Debug.Log(type.Name);
}