Пишу фреймворк для более простой и удобной работы с Unity3d в стиле КОП ( компонентно ориентированный подход ) Подход изначально заложен в юнити ( GameObject -> компоненты ) и он очень хорошо зарекомендовал себя в разработке игр. ( Например тот же ECS подход основан на КОП парадигме )
Предупреждаю, это скелет системы без большинства важных примочек. Их постепенно буду добавлять.
Смысл в строгом разделении дата компонентов от поведений. Вместо классов сущностей мы описываем поведения которые опираясь на компоненты даты выдают нам новую сущность. Внутри фреймворка есть демка с актором который сам себя уничтожит если его здоровье упадет до 0. Здоровье можно в инспекторе поменять : )
Для начала в Edit=>ProjectSettings=>ScriptExecutionOrder ставит StarterKernel где-нибудь на -20000
StarterKernel - это компонент который загружает все процессы. Например апдейтов. Обязательно на сцене нужен объект [KERNEL] ( процесс апдейтов вешает туда компонент )
Все наши игровые сущности называются Actors
Например ActorHero. Для инициализации вместо Awake используем Setup и там мы добавляем все желаемые поведения и даты в актора. Даты уже созданы и добавляются в пул актора , а поведения мы создаем по их типу.
Для работы нам нужны дата классы.
Это обычные C# классы, делаем их серилизуемыми чтобы видеть в инспекторе юнити. Если у нас в дате могут оказаться ссылки на объекты во время игровой сессии то просто обнуляем все в методе Dispose.
Когда мы добавили всю дату приступаем к поведениям. Поведения наследуются от BehaviorBase
Так же используем метод Setup для инициализации. Например тут поведение смерти - из setup добавляем дату здоровья. В OnTick ( аналог Update ) - обрабатываем ее: смотрим если здоровье упало до нуля то убиваем сущность. DataHealth необязательно кешировать в поведении: можно напрямую в апдейте вызывать actor.Get<DataHealth>() - в отличии от юнитивского GetComponent это крайне дешевый вызов.
В OnDispose обнуляем переменные.
Вся игра строится из одного Update метода в ProcessingUpdate. Поэтому акторы и поведения должны наследоваться от интерфейсов:
ITick - для аналога Update
ITickFixed - для аналога UpdateFixed
ITickLate - для аналога UpdateLate
В нашем примере у героя есть поведение смерти который имеет апдейт - наследуем ActorHero и BehaviorDeath от ITick
Тут закладываю серию видео где буду шаг за шагом рассказывать о КОП.