Я начинаю внедрять ИИ игрока и врага в игру, но меня смущает, как лучше всего реализовать это в игровой архитектуре на основе компонентов.
Скажем, у меня есть следующий персонаж игрока, который может стоять, бегать и размахивать мечом. Игрок может перейти в состояние размахивающего меча как из стационарного, так и из бегового состояния, но затем размах должен быть завершен, прежде чем игрок сможет возобновить стояние или бег вокруг. Во время свинга игрок не может ходить.
На мой взгляд, у меня есть два подхода к реализации:
- Создайте один AI-компонент, содержащий всю логику игрока (либо отделенную от реального компонента, либо встроенную как PlayerAIComponent). Я могу легко, как применить ограничения состояния без создания связи между отдельными компонентами, составляющими объект игрока. Однако AI-компонент не может быть разбит. Если у меня есть, например, враг, который может только стоять и ходить или только ходить и время от времени размахивать мечом, я должен создать новые AI-компоненты.
- Разбейте поведение на компоненты, каждый из которых идентифицирует определенное состояние. Затем я получаю StandComponent, WalkComponent и SwingComponent. Чтобы обеспечить соблюдение правил перехода, я должен соединить каждый компонент. SwingComponent должен отключить StandComponent и WalkComponent на время колебания. Когда у меня есть враг, который только стоит, время от времени размахивая мечом, я должен убедиться, что SwingComponent отключает WalkComponent, только если он присутствует. Хотя это позволяет лучше смешивать и сопоставлять компоненты, это может привести к кошмару удобства сопровождения, так как каждый раз, когда добавляется зависимость, существующие компоненты должны обновляться, чтобы соответствовать новым требованиям, предъявляемым к персонажу в зависимости.
Идеальной ситуацией может быть то, что дизайнер может создавать новых врагов / игроков, перетаскивая компоненты в контейнер, не затрагивая ни одной строки кода движка или скрипта. Хотя я не уверен, что можно избежать написания сценариев, я хочу сделать его как можно более простым.
Подводя итоги: следует ли мне разбить всю логику ИИ на один компонент или разбить каждое логическое состояние на отдельные компоненты, чтобы легче создавать варианты сущностей?
редактировать : я подозреваю, что есть некоторая путаница о том, что я имел в виду с первой и второй ситуацией. Я попытался объяснить это на диаграмме ниже.
Обратите внимание на отношения между отдельными состояниями и объектом. В первой ситуации компонент ИИ предварительно создается перед тем, как помещаться в сущность. Дизайнер может выбирать только из отдельного набора компонентов AIC, предоставляемых программистом. Вторая ситуация имеет различные состояния на том же уровне, что и другие компоненты. Дизайнер теперь может создавать сущности с уникальным ИИ без вмешательства программиста.
Вопрос в том, являются ли это единственными двумя вариантами структурирования ИИ в компонентной сущности, и если да, то что даст максимальную гибкость?