árvore de comportamento godot
Uma implementação GDScript de uma árvore de comportamento para IA de jogos, baseada em nós Godot nativos e usando o editor de árvore de cena integrado.
VERSÃO C# -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
INSTALAÇÃO
- Copie a pasta 'addons' para o diretório principal do seu projeto.
- Habilite o plugin nas configurações do projeto, ENTÃO REINICIE o Godot, caso contrário ele não reconhecerá as novas classes (isso é um bug do motor).
- Opcionalmente, você também pode arrastar a pasta bt_example para o diretório principal do seu projeto.
- Para ver o exemplo funcionando, execute a cena agent.tscn. A cena ex_behavior_tree.tscn é um exemplo de como a árvore é construída.
INSTRUÇÕES:
- Clique no ícone de criação de nó. Você deverá ver novos nós disponíveis (se não, reinicie Godot). Você deve usar um BehaviourTree como nó raiz, que deve ter apenas um único filho. Esse filho pode ser qualquer um dos nós da categoria BTNode, todos herdados da classe BTNode.
- Após criar uma árvore de comportamento, você deve especificar quem é o proprietário da IA (o Agente) e qual Blackboard está sendo usado. Os quadros negros podem ser colocados em qualquer lugar (desde que estejam fora da árvore) e até mesmo compartilhados entre diferentes árvores. O sistema é flexível o suficiente para permitir que você decida como e quando atualizar os dados do quadro-negro. Por exemplo, você pode criar um Node simples com um script que lide com a atualização do quadro-negro, por exemplo. com retornos de chamada de sinal ou mesmo em process(). Ou você pode fazer isso de qualquer outro lugar, até mesmo de dentro da árvore, apenas certifique-se de projetar as coisas de uma forma que você possa manter e acompanhar.
- Uma Árvore de Comportamento flui executando cada um de seus filhos, que retornam algum tipo de estado de sucesso ou falha. Somente as ramificações seguintes a um nó bem-sucedido serão executadas. Um BTNode deve retornar sucesso ou falha e pode suspender a execução apenas com uma chamada yield(), após a qual permanecerá em estado de execução até que a execução seja concluída. Quando um BTNode está em estado de execução, a árvore suspenderá progressivamente a execução (com a única exceção sendo BTParallel ) até que todos os filhos concluam a execução. Isso é para fins de otimização.
- O fluxo da árvore é definido pelos chamados nós compostos: BTSequence, BTSelector, BTRandomSelector, BTRandomSequence, BTParallel, todos herdados de BTComposite. Uma sequência será bem-sucedida se todos os filhos forem bem-sucedidos, mas falhará se um dos filhos falhar. O seletor é o oposto lógico, ele terá sucesso se um dos filhos for bem-sucedido e falhará se todos os filhos falharem. Um paralelo executará todos os filhos e sempre terá sucesso independentemente, SEM esperar que os filhos concluam a execução. O nó composto base executa todos os filhos e sempre tem êxito, mas também aguarda a conclusão da execução.
- As ações do seu comportamento de IA são realizadas em nós BTLeaf. Adicione um BTLeaf e faça 'estender script'. Agora você pode definir seu próprio comportamento neste script substituindo o método _ tick() . Suas ações irão aqui. Certifique-se de ler os comentários no script base para conhecer as práticas recomendadas. Lembre-se também de que BTLeaf não deveria ter filhos.
- BTDecorator é usado para personalizar a execução de um nó filho. Eles só podem ter UM filho.
- BTCondicional é o tipo mais comum de decorador. Adicione um BTConditional e estenda o script e, em seguida, substitua o método _pre_tick() para definir as condições sob as quais o filho será executado. Certifique-se de ler o comentário porque há um exemplo útil lá.
- BTGuards são decoradores que podem ser usados para bloquear ramificações temporariamente. Opcionalmente, você pode atribuir um desbloqueador, que substituirá o tempo de bloqueio especificado. Também existe a opção de atribuir um cacifo. Os BTGuards podem tornar o seu comportamento muito rico e reativo, bem como otimizado, pois evitam ramificações e repetições desnecessárias.
- Outros decoradores permitem fazer um loop na execução, reverter o resultado do tick e assim por diante. Há muito que você pode fazer personalizando a execução por meio de decoradores.
- A boa prática é usar os nós fornecidos e seguir o padrão de design da árvore de comportamento. Mas como esta é uma implementação puramente baseada em código, sem qualquer editor visual, você tem muito controle sobre o design e, portanto, uma margem de erro. Estes são apenas scripts úteis que seguem algumas "boas práticas", mas não estão vinculados a elas, a não ser por algumas regras básicas. Cabe a você decidir como projetar sua árvore de comportamento, mas tenha em mente que se você usá-la incorretamente, não se beneficiará do poder do padrão da árvore de comportamento. (por exemplo, você pode até usar o BTNode base para tudo e estendê-lo sempre, embora seja uma bagunça)
- Você poderia ter uma enorme árvore de comportamento, mas a melhor prática é seguir a filosofia de componentes de Godot e fazer várias árvores de comportamento menores para cada componente da sua cena. Por exemplo, uma árvore para o seu controlador de movimento, uma árvore para o seu controlador de arma, uma árvore para o seu componente pathfinder, etc. Uma árvore de comportamento pode ter apenas um quadro-negro, mas o mesmo quadro-negro pode ser usado por muitas árvores, então este é particularmente útil se você quiser ter várias árvores sem fazer vários quadros negros. Pessoalmente, a razão pela qual tenho o quadro negro como um componente desacoplado é porque queria fazer esquadrões de inimigos compartilhando os mesmos dados, mas se comportando de forma independente, então este é um caso de uso para isso. Além disso, normalmente tenho vários componentes em meus atores e quero usar o mesmo banco de dados para árvores diferentes.