Нужно перестать пользоваться монобехами без повода и писать обычные C#
классы. Дробить ответственности на маленькие класы дело хорошее, но из этого еще нужно выстраивать архитектуру. Класса Player
в таких играх существовать не должно, поскольку он не отличается от остальных акторов сцены, фигня, которая бегает, атакует и может сдохнуть.
Этот фасад безусловно нужен, но должен он быть модульным. И это не фасад вовсе, это UnitModel
которая, как обладатель интерфейса IDamagable
должен получать урон и будучи юнитом обрабатывать его через здровье, а какая нибудь бочка не имеет здоровья, разбивается просто по факту нанесения урона. Наличие инвентаря есть у HeroUnitModel
, который наследник. У каждого юнита есть скин и коллайдер по логике часть его, а не модели, поскольку зависит от габаритов визуала. Помимо здоровья, маны, стамины и скина может содержать еще много опций, типа фракции player
, enemy
, neutral
...
Косаемо других модулей, это просто набор самостоятельных функций типа движения, атаки, выбор таргета, у скина тоже может быть свои модули с особыми функциями. Модули могут быть просто монобехами висящими на дочерних объектах и их может быть разный набор, например у турели нет модуля хотьбы. Моделе ваще пофиг, на то что делают модули, у неё просто их массив, поскольку они все наследники UnitModul
и всё, работают они автономно, реагируя на то что происходит с моделью.
Контроллеры вообще должны быть вне модели, им должно быть пофиг каким юнитом управлять, что PlayerController
, что EnemyAIController
, какой SetTargetUnit()
задашь, тем и управляют. Камера и вся визуализаця UI
, как тот-же таргет так-же часть PlayerController
и некоим образом не галавняк модели. Любая нормальная рпг написана так, что ты можешь поменять скин персонажа игрока на любой в игре и она работает, более того, можно указать любого юнита как цель управления и играть хоть скелетом первого уровня, хоть боссом, все в руках разработчика, поскольку архитектура гибкая, нет цемента.
РПГ вообще хорошо писать сложно, нужно много навыка.