Estou começando a implementar a IA do jogador e do inimigo em um jogo, mas estou confuso sobre como melhor implementá-lo em uma arquitetura de jogo baseada em componentes.
Digamos que eu tenha um personagem seguinte que possa ser parado, correndo e agitando uma espada. Um jogador pode transitar para o estado da espada oscilante a partir do estado estacionário e em execução, mas o balanço deve ser concluído antes que o jogador possa retomar de pé ou correr. Durante o balanço, o jogador não pode andar por aí.
A meu ver, tenho duas abordagens de implementação:
- Crie um único componente AI que contenha toda a lógica do player (desacoplada do componente real ou incorporada como um PlayerAIComponent). Eu posso facilmente aplicar as restrições de estado sem criar acoplamentos entre componentes individuais que compõem a entidade do jogador. No entanto, o componente AI não pode ser dividido. Se eu tenho, por exemplo, um inimigo que só pode ficar de pé e andar por aí ou apenas andar por aí e ocasionalmente balançar uma espada, tenho que criar novos componentes de IA.
- Divida o comportamento em componentes, cada um identificando um estado específico. Eu recebo um StandComponent, WalkComponent e SwingComponent. Para impor as regras de transição, tenho que acoplar cada componente. O SwingComponent deve desativar o StandComponent e o WalkComponent pela duração do swing. Quando tenho um inimigo que apenas fica por perto, balançando uma espada ocasionalmente, tenho que garantir que o SwingComponent desative o WalkComponent apenas se ele estiver presente. Embora isso permita melhores componentes de combinação e combinação, pode levar a um pesadelo de manutenção, à medida que uma dependência é adicionada, os componentes existentes devem ser atualizados para se adequar bem aos novos requisitos que a dependência impõe ao personagem.
A situação ideal seria que um designer possa construir novos inimigos / jogadores arrastando componentes para um contêiner, sem precisar tocar em uma única linha de mecanismo ou código de script. Embora não tenha certeza de que a codificação de script possa ser evitada, quero mantê-la o mais simples possível.
Resumindo: devo colocar toda a lógica da IA em um componente ou dividir cada estado lógico em componentes separados para criar variantes de entidade mais facilmente?
editar : Eu suspeito que há alguma confusão sobre o que eu quis dizer com a primeira e a segunda situação. Eu tentei explicar isso no diagrama abaixo.
Observe o relacionamento entre os estados individuais e a entidade. Na primeira situação, um componente de IA é pré-construído antes de ser colocado na entidade. Um designer pode selecionar apenas um conjunto distinto de componentes AIC disponibilizados pelo programador. A segunda situação tem os diferentes estados no mesmo nível que outros componentes. Um designer agora pode criar uma entidade com IA exclusiva sem a interferência de um programador.
A questão é: essas são as duas únicas opções para estruturar a IA em uma entidade baseada em componentes e, se sim, o que daria a máxima flexibilidade?