Sto iniziando a implementare l'IA dei giocatori e dei nemici in un gioco, ma sono confuso su come implementarlo al meglio in un'architettura di gioco basata su componenti.
Supponiamo che io abbia un personaggio giocatore seguente che può essere fermo, che corre e che fa oscillare una spada. Un giocatore può transitare nello stato della spada dell'oscillazione sia dallo stato stazionario che da quello corrente, ma poi l'oscillazione deve essere completata prima che il giocatore possa riprendere a stare in piedi o correre. Durante lo swing, il giocatore non può camminare.
A mio avviso, ho due approcci di implementazione:
- Crea un singolo componente AI contenente tutta la logica del giocatore (disaccoppiato dal componente reale o incorporato come componente PlayerAIC). Posso facilmente applicare le restrizioni statali senza creare accoppiamenti tra i singoli componenti che compongono l'entità giocatore. Tuttavia, il componente AI non può essere suddiviso. Se ho, ad esempio, un nemico che può solo stare in piedi e camminare o solo camminare e occasionalmente dondolare una spada, devo creare nuovi componenti AI.
- Suddividere il comportamento in componenti, ognuno identificando uno stato specifico. Quindi ottengo un StandComponent, WalkComponent e SwingComponent. Per applicare le regole di transizione, devo accoppiare ciascun componente. SwingComponent deve disabilitare StandComponent e WalkComponent per la durata dello swing. Quando ho un nemico che sta solo in giro, facendo oscillare una spada di tanto in tanto, devo assicurarmi che SwingComponent disabiliti WalkComponent solo se è presente. Sebbene ciò consenta di migliorare i componenti di mix-and-matching, può portare a un incubo di manutenibilità poiché ogni volta che viene aggiunta una dipendenza, i componenti esistenti devono essere aggiornati per giocare bene con i nuovi requisiti posti dalla dipendenza sul personaggio.
La situazione ideale sarebbe che un progettista potesse costruire nuovi nemici / giocatori trascinando i componenti in un contenitore, senza dover toccare una singola linea di motore o codice di script. Anche se non sono sicuro che la codifica degli script possa essere evitata, voglio mantenerla il più semplice possibile.
Riassumendo: dovrei raggruppare tutta la logica AI in un componente o suddividere ogni stato logico in componenti separati per creare più facilmente varianti di entità?
modifica : sospetto che ci sia un po 'di confusione su ciò che intendevo con la prima e la seconda situazione. Ho provato a spiegarlo nel diagramma seguente.
Nota la relazione tra i singoli stati e l'entità. Nella prima situazione, un componente AI viene pre-costruito prima di essere inserito nell'entità. Un designer può selezionare solo da una serie distinta di componenti AIC resi disponibili dal programmatore. La seconda situazione ha i diversi stati allo stesso livello di altri componenti. Un designer può ora creare un'entità con AI unica senza interferenze di un programmatore.
La domanda è: queste sono le uniche due opzioni per strutturare l'IA in un'entità basata su componenti e, in caso affermativo, cosa darebbe la massima flessibilità?