Behavior Tree na Godot 4: árvore de comportamento para IA

Aprenda behavior tree (árvore de comportamento) na Godot 4 com GDScript tipado: nós, SUCCESS, FAILURE, RUNNING e um inimigo que patrulha, persegue e ataca.
Quando a IA do seu inimigo vira um bloco de if/else aninhado ou uma máquina de estados com transições demais para caber na cabeça, é hora de olhar para outra ferramenta. A behavior tree (árvore de comportamento) é a estrutura que estúdios usam para IA complexa justamente porque ela organiza decisões em galhos independentes que você combina como peças de Lego. Neste post você vai entender o que é uma árvore de comportamento, quando ela ganha da FSM e vai montar, com GDScript tipado na Godot 4, um inimigo que patrulha, detecta o jogador, persegue e ataca.
O que é uma behavior tree
Uma behavior tree é uma árvore que a IA percorre de cima para baixo, da esquerda para a direita, uma vez por frame (ou por intervalo fixo). Esse percurso se chama tick. Cada nó visitado executa um pedacinho de lógica e devolve um resultado. O nó pai lê esse resultado e decide o que fazer com o próximo filho.
A grande sacada é que todo nó fala a mesma língua: ele sempre devolve um destes três valores.
SUCCESS: a tarefa terminou com êxito.FAILURE: a tarefa não deu certo (o alvo sumiu, o caminho está bloqueado).RUNNING: a tarefa ainda está acontecendo e precisa de mais frames (andar até um ponto, tocar uma animação).
Esse contrato de três estados é o que torna a árvore modular. Como todo nó devolve a mesma coisa, você pode encaixar qualquer nó dentro de qualquer outro sem quebrar nada. Uma FSM não tem isso: cada estado precisa saber para quais outros estados ele pode ir, e o número de transições cresce rápido.
Os tipos de nó
Uma árvore de comportamento tem três famílias de nós.
Composites (nós compostos)
São os nós que têm filhos e controlam a ordem da execução. Os dois mais usados são:
- Sequence (sequência): roda os filhos em ordem. Se um filho devolve
SUCCESS, passa para o próximo. Se um filho devolveFAILURE, a sequência inteira falha na hora. Só devolveSUCCESSse todos os filhos passarem. Pense nele como um "E" lógico: faça isto E aquilo E aquilo outro. - Selector (seletor, às vezes chamado Fallback): roda os filhos em ordem até um dar
SUCCESS. Se um filho falha, tenta o próximo. Só devolveFAILUREse todos falharem. É o "OU" lógico: tente isto OU aquilo OU aquilo outro.
Decorators (decoradores)
Têm um único filho e modificam o resultado dele. Um decorador Inverter troca SUCCESS por FAILURE. Um Repeater repete o filho N vezes. Um Cooldown só deixa o filho rodar depois de um tempo. Neste tutorial vamos manter o foco nos composites e nas folhas, mas o mecanismo é o mesmo: recebe o resultado do filho e devolve um resultado ajustado.
Leaf nodes (folhas)
São as pontas da árvore, onde o trabalho de verdade acontece. Existem dois tipos:
- Condition (condição): checa algo e devolve
SUCCESSouFAILURE, sem alterar o mundo. Exemplo: "o jogador está no alcance de visão?". - Action (ação): faz algo com o inimigo e devolve os três estados. Exemplo: "persiga o jogador" devolve
RUNNINGenquanto anda eSUCCESSquando chega.
Behavior tree contra FSM: quando cada uma ganha
A máquina de estados finitos é ótima e você não deve abandoná-la. Se o seu inimigo tem três ou quatro estados com transições óbvias, a FSM é mais simples de ler e de escrever. Se você ainda não montou uma, vale começar pela máquina de estados FSM na Godot, porque muito do raciocínio se transfere.
O problema da FSM aparece com a escala. Com N estados, você pode ter até N vezes (N menos um) transições para gerenciar. Adicionar um comportamento novo obriga a revisar as transições de vários estados existentes. É o famoso "prato de espaguete" de setas.
A árvore de comportamento resolve isso trocando transições por composição. Você não liga estado A ao estado B: você coloca comportamentos em galhos e deixa a prioridade emergir da ordem dos filhos de um Selector. Um comportamento novo é um galho novo, encaixado onde a prioridade dele faz sentido, sem tocar no resto.
A regra prática: jogo pequeno ou inimigo simples, use FSM. IA com muitos comportamentos aninhados, prioridades e reuso, migre para behavior tree. Não monte uma árvore para um slime que só anda de um lado para o outro.
Perguntas frequentes
O que é uma behavior tree na Godot?
É uma estrutura em árvore que organiza a IA em nós compostos, decoradores e folhas. A cada frame a raiz é percorrida e cada nó devolve SUCCESS, FAILURE ou RUNNING, deixando o comportamento modular e fácil de estender.
Behavior tree ou máquina de estados: qual usar?
FSM basta para poucos estados com transições claras. A behavior tree ganha quando a IA tem muitos comportamentos aninhados e prioridades, porque evita a explosão de transições da FSM e reaproveita nós.
O que significam SUCCESS, FAILURE e RUNNING?
São os três valores que todo nó devolve no tick. SUCCESS diz que a tarefa terminou bem, FAILURE que falhou e RUNNING que ainda está em andamento e deve continuar no próximo frame.
Preciso de um plugin para usar behavior tree na Godot 4?
Não. Dá para escrever uma base mínima em GDScript com poucas classes, como neste tutorial. Plugins como o LimboAI ajudam em projetos grandes, mas atrapalham quem quer entender o conceito primeiro.


