Как избавиться от большого количества компонентов на игровом объекте игрок?

Рейтинг: 1Ответов: 1Опубликовано: 25.08.2023

У меня на сцене есть объект игрок и на нем куча компонентов (здоровье, инвентарь, контроллер, колайдер и тд). И мне допустим необходимо узнать количество здоровья или направление движения. Для этого, мне придётся брать объект и через getcomponent брать необходимый компонент. Как лучше от этого избавиться? Я думал о создании класса плеерФасад и в нем хранить все ссылки на компоненты и имя игрока, но это не подходит, потому что при создании новых компонентов для игрока мне придётся изменять скрипт плеер, а так же все равно не решает проблему хранения огромного количества монобехов на сцене.

Ответы

▲ 3Принят

Нужно перестать пользоваться монобехами без повода и писать обычные C# классы. Дробить ответственности на маленькие класы дело хорошее, но из этого еще нужно выстраивать архитектуру. Класса Player в таких играх существовать не должно, поскольку он не отличается от остальных акторов сцены, фигня, которая бегает, атакует и может сдохнуть.

Этот фасад безусловно нужен, но должен он быть модульным. И это не фасад вовсе, это UnitModel которая, как обладатель интерфейса IDamagable должен получать урон и будучи юнитом обрабатывать его через здровье, а какая нибудь бочка не имеет здоровья, разбивается просто по факту нанесения урона. Наличие инвентаря есть у HeroUnitModel, который наследник. У каждого юнита есть скин и коллайдер по логике часть его, а не модели, поскольку зависит от габаритов визуала. Помимо здоровья, маны, стамины и скина может содержать еще много опций, типа фракции player, enemy, neutral...

Косаемо других модулей, это просто набор самостоятельных функций типа движения, атаки, выбор таргета, у скина тоже может быть свои модули с особыми функциями. Модули могут быть просто монобехами висящими на дочерних объектах и их может быть разный набор, например у турели нет модуля хотьбы. Моделе ваще пофиг, на то что делают модули, у неё просто их массив, поскольку они все наследники UnitModul и всё, работают они автономно, реагируя на то что происходит с моделью.

Контроллеры вообще должны быть вне модели, им должно быть пофиг каким юнитом управлять, что PlayerController, что EnemyAIController, какой SetTargetUnit() задашь, тем и управляют. Камера и вся визуализаця UI, как тот-же таргет так-же часть PlayerController и некоим образом не галавняк модели. Любая нормальная рпг написана так, что ты можешь поменять скин персонажа игрока на любой в игре и она работает, более того, можно указать любого юнита как цель управления и играть хоть скелетом первого уровня, хоть боссом, все в руках разработчика, поскольку архитектура гибкая, нет цемента.

РПГ вообще хорошо писать сложно, нужно много навыка.