Você está na página 1de 22

12/12/2023, 13:08 Programação para jogos 3D

Programação para jogos 3D


UNIDADE 3 - ALGORITMOS DE BUSCA E CONSTRUÇÃO DE
TRAJETÓRIAS

Autoria: Felipe Oviedo Frosi - Revisão técnica: Deivith Gonçalves da Cunha

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 1/22
12/12/2023, 13:08 Programação para jogos 3D

Introdução
Caro(a) estudante, estamos avançando em nossos estudos e agora
daremos mais um importante passo para o seu aprimoramento como
desenvolvedor de jogos. Nesta unidade, direcionaremos nossos estudos
para algoritmos de busca, que, dentre outras aplicações, são comumente
utilizados para criar trajetórias em jogos digitais, especialmente para traçar
caminhos de movimentação para personagens.
Existem muitos jogos que aplicam algoritmos de busca. Talvez o exemplo
mais comum seja aquele utilizado para que personagens não controláveis
(NPCs) sigam outros personagens ou pontos específicos do cenário.
Nesse contexto, as possibilidades de variabilidade podem ser infinitas.
Podemos trazer exemplos simples como o Pokémon Pikachu seguindo o
personagem Ash na versão amarela de Pokémon (Gameboy), ou trajetórias mais complexas, como os aliados e os inimigos em
Assassin's Creed, que traçam trajetórias complexas para navegar pela cidade, ao mesmo tempo que apresentam uma série de
algoritmos complexos, desde para determinar a tensão e a ansiedade até a percepção de risco nas proximidades, e assim
determinar ações específicas. Todos esses exemplos têm relação com algoritmos de busca, seja em jogos mais simples, seja em
jogos complexos.
Como estudante e futuro desenvolvedor de jogos, você deve estar pronto para aplicar algoritmos de busca em diferentes contextos,
em projetos pequenos e de escopo reduzido ou em projetos complexos e com grandes equipes.
Bons estudos!

3.1 Visão geral sobre algoritmos de


busca

O uso de algoritmos de busca é um campo com vastas aplicações e pesquisas na área de Ciência de Computação, incluindo o contexto de
jogos digitais. Essencialmente, um algoritmo de busca tem por objetivo retornar uma solução para um problema após resolver determinado
número de soluções, buscando alternativas e eficiência.

Determinando a melhor jogada

No campo de jogos digitais, algoritmos de busca podem ser utilizados em diversos


contextos. Por exemplo, é possível em um jogo de tabuleiro, como xadrez ou damas,
buscar diversas alternativas para determinar a melhor jogada. Para varrer essa infinidade
de possibilidades, pode-se usar um algoritmo de busca.

Traçando trajetórias

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 2/22
12/12/2023, 13:08 Programação para jogos 3D

Um exemplo mais visível, relacionado mais diretamente ao aspecto visual e de


renderização do jogo, seria a utilização de algoritmos de busca para traçar trajetórias, algo
muito comum para definir, por exemplo, o caminho que um personagem deve percorrer até
chegar a um determinado ponto do cenário.

Um dos pontos de destaque na aplicação de algoritmos de busca no âmbito de jogos digitais é a relação que apresentam com as game
engines. Osório et al. (2007, p. 1) afirmam que:

Em jogos digitais, o uso de técnicas de Inteligência Artificial (I.A.) vem se fazendo cada vez mais necessário, e sendo até mesmo indispensável em certos
casos. Estas técnicas podem ser aplicadas em diferentes tipos de tarefas: resolução de problemas (puzzles, brain-teasers), planejamento de tarefas,
planejamento de trajetórias, controle de agentes autônomos (NPCs — Non-Player Characters), entre outras diversas aplicações. Para que possamos integrar
técnicas de I.A. em jogos digitais, se faz necessária a inclusão de um novo componente em um motor de jogo (engine), além dos já tradicionais componentes
destas Engines de Jogos: motor gráficos, de áudio, de rede, de física, de controle de dispositivos de E/S (interação). Este componente é o motor de
Inteligência Artificial — I.A.

Não é novidade que a inteligência artificial faz parte dos jogos para diversos tipos de aplicação em diferentes gêneros. Assim, o estudo de
diferentes algoritmos de busca e suas aplicações é essencial para o desenvolvimento de um jogo com complexidade tecnológica necessária
para construir uma experiência satisfatória.

3.1.1 Principais tipos de algoritmos de busca


Existem várias alternativas de aplicação de algoritmos de busca em jogos (KYAW et al., 2013). Nesta unidade, estudaremos algumas
possibilidades de aplicação. Um exemplo bastante utilizado é o algoritmo A* (A Star). O A* é baseado em grafos, uma estrutura dividida em
várias partes, sendo que algumas delas têm ligação com outras. Essas partes são denominadas nós, ou nodos, e representam um estado ou
posição. O A* tem por objetivo encontrar o caminho mais otimizado, ou caminho ótimo, entre dois nodos, decidindo sobre quais nós deve
percorrer até o destino final.

Você sabia?
A Unity possui em sua loja uma categoria exclusiva para inteligência
artificial, com recursos que podem ser aplicados diretamente na
engine. As soluções podem ser visualizadas no endereço a seguir.
https://assetstore.unity.com/tools/ai
(https://assetstore.unity.com/tools/ai)

Outro conceito relevante e comumente aplicado em engines, inclusive na Unity, é a aplicação de Máquinas de Estados Finitas (FSM).
Máquinas de Estados são estruturadas com base em comportamentos de elementos, com estados quantificáveis, ou seja, finitos. Um
exemplo comum de aplicação de FSM é o desenvolvimento do comportamento de inimigos. Veja a figura “Representação de Máquinas de
Estados Finitas dos fantasmas em PacMan”, que traz um exemplo de uso.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 3/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 1 - Representação de Máquinas de Estados Finitas dos fantasmas em PacMan


Fonte: Lima, 2012, p. 6.

#PraCegoVer: na imagem são apresentados 3 círculos com possíveis ações: “Dispersar”, “Caçar” e “Fugir”. Cada ação apresenta uma
condição para ser alterada, que é representada em setas que ligam os círculos. As ações são verificação do tempo de dispersão do
fantasma, tempo de caça, tempo do jogador com energia e se o jogador pegou a energia.

É possível delimitar que o inimigo fica em estado de alerta, depois em estado agressivo, estado de fuga, de desespero, entre outros. Cada
um desses estados, por sua vez, é alterado e desencadeado por um critério, como exemplificado a seguir.

Alerta — Fuga

O inimigo pode passar de um estado de alerta para fuga quando o seu nível de vida ou energia estiver muito baixo

Desespero

Pode passar para o estado de desespero quando estiver quase morrendo.

Autodestruição

E o nível de desespero pode desencadear ações específicas, como autodestruição.

Essa variação é projetada pelo game designer.

Você quer ler?


O livro Inteligência Artificial, de Ben Coppin, é uma alternativa interessante para
aprofundar o conhecimento nesse campo de estudo e vislumbrar aplicações na área de
jogos. O livro pode ser encontrado na biblioteca da Ânima.
Acesse (https://integrada.minhabiblioteca.com.br/books/978-85-216-2936-8)
De forma geral, o comportamento de inimigos e agentes diversos em jogos tem uma relação com game design, mas também com
programação. Esse exemplo evidencia, dentre tantos outros no desenvolvimento de jogos, a vasta interseção das áreas. É muito comum que
o game design tenha que conversar com as especificidades da programação e, no caso de algoritmos de busca para definições de

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 4/22
12/12/2023, 13:08 Programação para jogos 3D
inteligência artificial, é bastante usual essa relação.

3.1.2 Contextos de aplicação de algoritmos de busca


Apesar de os algoritmos de busca exigirem um conhecimento relativamente avançado em programação para serem implementados, várias
dessas soluções podem ser utilizadas, até mesmo de forma nativa, nas game engines.
A Unity possui um sistema de criação de caminhos chamado Navigation (SMITH; QUEIROZ, 2013). Com esse sistema, é possível criar uma
malha 3D em determinada área, que delimitará um espaço de navegação para o personagem, conforme exibido na área da figura “Malha de
navegação na engine Unity”.

Figura 2 - Malha de navegação na engine Unity


Fonte: Unity, 2021.

#PraCegoVer: na imagem são apresentados dois cilindros que representam personagens, situados em um cenário com duas partes
principais ligadas por uma escada. Além da escada, na parte direita existe o formato de uma porta, duas rampas e um cubo que representa
um obstáculo.

Essa malha de navegação pode ter aplicação em diversos tipos de jogos e contextos.

Um exemplo bastante comum é situar inimigos que patrulham uma área predeterminada e que, ao visualizar
o jogador, podem mudar de estado com a estruturação em Máquinas de Estados Finitas e iniciar um ataque.
Mudança de estado e
Nesse contexto, quando em estado de patrulha, um inimigo poderia seguir a malha de navegação e o
ataque
sistema Navigation para patrulhar. Por outro lado, quando estiver em estado de ataque, não usaria mais a
malha de navegação como referência, mas se utilizaria de outros critérios para atacar.

Outro exemplo bastante comum de aplicação são personagens que se deslocam em grupo. Nesse contexto,
Deslocamento em grupo os personagens podem utilizar a área de navegação como referência, porém, podem ter o personagem
controlável como referência a ser seguida.

Outra possibilidade ainda é que o NPC que caminha junto com o personagem controlável seja um tipo de
NPC como guia
guia, podendo se deslocar e apontar caminhos ao jogador, ou ainda revelar itens escondidos, entre outros.

As possibilidades são infinitas e dependem de como o jogo foi projetado. Além das questões conceituais de game design, analisar
tecnicamente a aplicabilidade de algoritmos de navegação e busca, nativos nas engines ou não, requer também uma avaliação técnica —
realizada pelo desenvolvedor — da capacidade da plataforma em que o jogo será publicado. Silva e Villela (2016, p. 73) apontam que:

Dispositivos móveis geralmente têm capacidade de processamento e memória limitadas. Ao desenvolver para este tipo de dispositivo, o desenvolvedor deve
estar ciente dessas limitações. Por outro lado, desenvolver um aplicativo que usa técnicas de IA pode exigir muita memória e processamento por máquina,
dependendo da questão a ser tratada. Portanto, para desenvolver um jogo usando tais técnicas é necessário estabelecer um equilíbrio entre as limitações do
dispositivo móvel, a complexidade da técnica a ser implementada e a satisfação do usuário. Ou seja, o jogo desenvolvido pode não exigir muito
processamento de IA para ser capaz de jogar contra o usuário, e deve também trazer algum entretenimento para o jogador.

Apesar das diversas possibilidades de aplicação, essencialmente o que é utilizado nesse contexto é um algoritmo de busca que tem por
objetivo traçar a melhor trajetória e percorrer caminhos. A maioria das engines possuem sistemas similares ao Navigation e, apesar de suas
particularidades de aplicação, conceitualmente são muito similares.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 5/22
12/12/2023, 13:08 Programação para jogos 3D

Vamos Praticar!
Você foi designado para implementar um personagem NPC, que auxilia o jogador dando
dicas para encontrar tesouros e caminhos secretos. O contexto do jogo é a aplicação em
consoles portáteis, ou seja, com limitações no poder de processamento. Escreva no
mínimo dois parágrafos argumentando sobre quais as práticas e recursos adotados para
definir as diretrizes de implementação do personagem.

3.2 Algoritmo AB em
jogos

Uma estrutura bastante usual em jogos são as árvores binárias (árvores AB). Essas estruturas não são lineares, ou seja, podem ter uma
estruturação em que os elementos sucessores de cada uma de suas partes levam a diferentes caminhos. Essa variabilidade é importante
para a estruturação de possibilidades mais complexas de análise, que podem ser aplicadas para resolver problemas dentro do contexto de
desenvolvimento de jogos.

Você quer ver?


Algoritmos de busca são aplicados em diversos jogos de tabuleiro, como xadrez,
damas, GO, entre outros. Nesse contexto, um evento histórico foi a partida entre o
jogador Garry Kasparov e a solução de inteligência artificial da IBM denominada Deep
Blue. O canal brasileiro Xadrez Brasil comenta a partida de Kasparov contra o Deep
Blue, e você pode assistir ao vídeo no link.
Acesse (https://youtu.be/tEC9umM_y5A)
Após a estruturação das árvores binárias (AB), é necessário determinar como percorrer essas estruturas, que podem seguir estratégias
distintas de caminhamento através de diferentes algoritmos.

3.2.1 Conceito de algoritmo AB


Considerando algoritmos aplicados no contexto de árvores binárias (AB), pode-se dividir o uso de algoritmos na construção das estruturas e
no seu caminhamento. Em geral, as engines apresentam soluções nativas ou de terceiros que disponibilizam aplicações de diversos
algoritmos que utilizam árvores binárias para os mais variados fins. Para você, estudante de desenvolvimento de jogos, é importante
compreender os conceitos por trás dessas soluções, inclusive por ser possível surgir a necessidade de implementar um algoritmo utilizando
árvore sem obter uma solução pronta. Nesse sentido, serão apresentados alguns algoritmos e códigos de aplicação de árvores em
linguagem C.
Árvores e estruturas de dados utilizam ponteiros em sua estruturação, mesmo que o programador não tenha que manipular essas estruturas
diretamente em linguagens de alto nível, em que muitas vezes o uso é mascarado. No caso de linguagem C, a figura “Exemplo de uso de
ponteiros” apresenta um exemplo de aplicação. Veremos esse código dividido em duas partes.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 6/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 3 - Exemplo de uso de ponteiros (parte 1)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a primeira parte de um código em linguagem C em que são definidas duas structs: prêmio e prêmios
sorteados. O programa sorteia as informações dos prêmios sorteados e dentro dos prêmios criados, que no exemplo são 100, quais serão os
3 sorteados.

Agora, veremos a continuação do código da imagem anterior.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 7/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 4 - Exemplo de uso de ponteiros (parte 2)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a segunda parte de um código em linguagem C em que são definidas duas structs: prêmio e prêmios
sorteados. O programa sorteia as informações dos prêmios sorteados e dentro dos prêmios criados, que no exemplo são 100, quais serão os
3 sorteados.

Esse exemplo não é tão simples de entender para quem não está habituado com linguagem C em ponteiros, mas é interessante observar o
que apresenta para compreender possíveis aplicações a partir do recurso utilizado.

1
Variáveis

Inicialmente, as structs apresentadas no código mostram as variáveis prêmio 1, 2 e 3, com um asterisco (*) entre o tipo e o nome.

2
Ponteiro

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 8/22
12/12/2023, 13:08 Programação para jogos 3D

Esse asterisco determina que a variável é um ponteiro, ou seja, ela não armazena um simples número, mas sim uma posição de memória.

3
Apontamento

Nesse código de exemplo, foram criados 100 prêmios, e dentre os 100, 3 receberão o apontamento da struct.

4
Mudança de apontamento

Se for o desejo do desenvolvedor, esses apontamentos podem mudar, e até mesmo 2 ou 3 desses podem apontar para o mesmo prêmio.

Esse conceito é aplicado em diversos casos no contexto de jogos.

Você o conhece?
Conheça Alberto Braga, um game designer brasileiro que já atuou em estúdios ao redor do mundo,
principalmente na Europa e Canadá. Assim como Alberto, é importante que todos os desenvolvedores de
jogos tenham seu portfólio organizado, e Alberto o deixa atualizado até hoje. Saiba mais sobre a sua
história no link (em inglês).
Acesse (http://www.albertobraga.com/)

A partir do domínio do uso de ponteiros, podem ser implementadas estruturas de dados com as árvores binárias. Uma árvore é uma estrutura
dividida em nodos ou nós, iniciando por um nodo raiz que terá sua continuidade através dos filhos desse nodo raiz, como apresentado na
figura “Árvore de estados (configurações) do tabuleiro no Jogo da Velha”.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 9/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 5 - Árvore de estados (configurações) do tabuleiro no Jogo da Velha


Fonte: Osório et al., 2007, p. 2.

#PraCegoVer: é apresentada a figura de uma árvore que representa as possíveis alternativas no jogo da velha, iniciando com o tabuleiro
vazio e passando para 9 possíveis estados, que são as 9 possíveis posições nas quais o “X” pode ser colocado. Após as 9 possíveis
posições, são apresentadas novas possibilidades de avanço das jogadas.

No exemplo do jogo da velha, o nodo raiz apresenta 9 filhos. Quando cada nodo pode ter no máximo 2 filhos, a estrutura é denominada
árvore binária, ou AB. A figura “Exemplo de estruturação de árvore binária” apresenta como essa estrutura pode ser constituída em linguagem
C.

Figura 6 - Exemplo de estruturação de árvore binária


Fonte: Elaborada pelo autor, 2021.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 10/22
12/12/2023, 13:08 Programação para jogos 3D
#PraCegoVer: é apresentado um código em linguagem C com uma struct apresentando 2 ponteiros que definem os dois nodos filhos, além
de uma variável char para representar a informação de cada nodo. Após a struct, são escritas funções para inserir os nodos e formar a
árvore.

O código apresentado como exemplo de estruturação de árvores constrói a estrutura pelo critério de verificação do valor: se o valor de um
novo nodo (ou folha, no contexto de árvores), for menor que o valor do nodo pai, a nova folha é situada na esquerda. Caso seja maior, é
situado na direita. Assim, a árvore cresce sempre com esses dois critérios, dado que cada nodo pode ter apenas dois filhos.

3.2.2 Aplicações de algoritmo AB


Um algoritmo de árvore binária pode ser aplicado em diversos contextos no desenvolvimento de jogos, porém, para que isso ocorra, é
necessário realizar não apenas a sua estruturação, mas também o seu caminhamento, ou seja, percorrer a árvore da forma mais adequada
possível.

Você sabia?
É comum em jogos a criação das estruturas chamadas “árvores de
comportamentos” ou “behavior trees”. A Asset Store da Unity apresenta uma
solução para o uso relativamente acessível desse recurso no link a seguir.
https://assetstore.unity.com/packages/tools/visual-scripting/behavior-
designer-behavior-trees-for-everyone-15277
(https://assetstore.unity.com/packages/tools/visual-scripting/behavior-
designer-behavior-trees-for-everyone-15277)

Para percorrer uma árvore, existem diversas estratégias e algoritmos. A figura “Formas de caminhamentos em árvores binárias” apresenta
três alternativas: caminhamento em pré-ordem, em ordem e em pós-ordem. Para melhor visualização, o código foi dividido em cinco partes.

Figura 7 - Formas de caminhamentos em árvores binárias (parte 1)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a primeira parte de um código em linguagem C com uma struct apresentando 2 ponteiros que definem os dois
nodos filhos, além de uma variável char para representar a informação de cada nodo. São apresentadas também funções de caminhamento
da árvore em 3 tipos: ordem, pré-ordem e pós-ordem, além de uma função de busca para verificar se determinada informação consta na

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 11/22
12/12/2023, 13:08 Programação para jogos 3D
árvore.

A seguir, temos a segunda parte do código.

Figura 8 - Formas de caminhamentos em árvores binárias (parte 2)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a segunda parte de um código em linguagem C com uma struct apresentando 2 ponteiros que definem os dois
nodos filhos, além de uma variável char para representar a informação de cada nodo. São apresentadas também funções de caminhamento
da árvore em 3 tipos: ordem, pré-ordem e pós-ordem, além de uma função de busca para verificar se determinada informação consta na
árvore.

A seguir, temos a terceira parte do código.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 12/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 9 - Formas de caminhamentos em árvores binárias (parte 3)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a terceira parte de um código em linguagem C com uma struct apresentando 2 ponteiros que definem os dois
nodos filhos, além de uma variável char para representar a informação de cada nodo. São apresentadas também funções de caminhamento
da árvore em 3 tipos: ordem, pré-ordem e pós-ordem, além de uma função de busca para verificar se determinada informação consta na
árvore.

A seguir, temos a quarta parte do código.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 13/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 10 - Formas de caminhamentos em árvores binárias (parte 4)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a quarta parte de um código em linguagem C com uma struct apresentando 2 ponteiros que definem os dois
nodos filhos, além de uma variável char para representar a informação de cada nodo. São apresentadas também funções de caminhamento
da árvore em 3 tipos: ordem, pré-ordem e pós-ordem, além de uma função de busca para verificar se determinada informação consta na
árvore.

A seguir, temos a quinta e última parte do código.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 14/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 11 - Formas de caminhamentos em árvores binárias (parte 5)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a quinta parte de um código em linguagem C com uma struct apresentando 2 ponteiros que definem os dois
nodos filhos, além de uma variável char para representar a informação de cada nodo. São apresentadas também funções de caminhamento
da árvore em 3 tipos: ordem, pré-ordem e pós-ordem, além de uma função de busca para verificar se determinada informação consta na
árvore.

As três funções apresentadas, apesar de varrerem a estrutura, realizam a operação com diferentes critérios.

A busca em pré-ordem segue estes passos.


1) Visita à raiz.
Pré-ordem
2) Percorre a subárvore da esquerda.
3) Percorre a subárvore da direita.

O caminhamento em ordem possui uma variação em relação ao primeiro.


1) Percorre a subárvore da esquerda.
Ordem
2) Visita à raiz.
3) Percorre a subárvore da direita.

Por fim, o caminhamento em pós-ordem é estruturado da seguinte forma.


1) Percorre a subárvore da esquerda.
Pós-ordem
2) Percorre a subárvore da direita.
3) Visita à raiz.

O desenvolvedor deve adotar uma ou mais estratégias, dependendo do objetivo da árvore dentro da programação do jogo.

Teste seus conhecimentos


(Atividade não pontuada)

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 15/22
12/12/2023, 13:08 Programação para jogos 3D

3.3 Finite State Machine


(FSM)

Em alguns casos, o uso de recursos para aplicação de inteligência artificial apresenta um elevado custo computacional. No caso de jogos
que possuem recursos gráficos avançados, isso pode ser bastante crítico, pois levará a uma necessidade de processamento simultâneo de
vários recursos, como renderização complexa e IA complexa. Nesse sentido, as Máquinas de Estados Finitas (FSM) podem ser uma
alternativa para chegar ao resultado pretendido na implementação sem um alto custo computacional.

3.3.1 Conceito de FSM


Assim como a maioria dos algoritmos dentro do contexto de Ciência da Computação, as FSMs possuem uma tradução matemática e, na
verdade, foram concebidas antes como modelo matemático do que como algo aplicado em programação. É muito comum que no
desenvolvimento de jogos esses modelos matemáticos sejam abstraídos em aplicações mais diretamente relacionadas ao jogo, por exemplo:
projetar Máquinas de Estados de acordo com os comportamentos predefinidos de um inimigo.
Um exemplo clássico é um inimigo ou chefe (boss) em jogos de nave do gênero space-shooter. Em geral, o inimigo terá 2 ou 3 estados.

1) Atirar periodicamente com um ataque padrão.

 
2) Avançar contra o jogador para provocar uma colisão.

3) Utilizar um ataque diferenciado, como um tiro ou bomba.

Esse padrão se repete em inúmeros jogos, e não somente em títulos do gênero space-shooter. Ainda é comum que um último estado seja o
inimigo entrar em estado crítico, em geral quando está quase morrendo, em que fica mais agressivo e com ataques diferenciados. Assim, são
observados dois fatores relevantes: a definição de estados bem definidos, que delimitarão as ações do personagem em cada momento, e a
análise de variáveis e eventos que serão os critérios para mudança de estados.

Você quer ler?


Pesquisadores buscam aprimorar o uso de Máquinas de Estados e outros recursos de
IA no contexto do desenvolvimento de jogos. Sobre o assunto, leia o trabalho “UD3 —
Unity Decision Tree Integrator: uma extensão de árvores de decisão para Unity”.
Acesse
(https://www.sbgames.org/sbgames2014/papers/computing/short/20_allcomputin
gshortpages.pdf)
As engines adotaram formas de gerenciar Máquinas de Estados até mesmo de forma nativa. A Unreal possui um sistema de edição de
eventos e programação visual chamado Blueprint em que é possível programar comportamentos e eventos de jogo em sistemas muito
parecidos com a estruturação de Máquinas de Estados Finitas. De fato, uma parte relevante de qualquer jogo é definida em estados finitos e
possui eventos que mudam esses estados, assim, a adoção desse modo de programar e desenvolver jogos é praticamente um padrão em
qualquer projeto de jogo, ao menos em parte dele.

3.3.2 FSM no contexto de jogos


A Unity possui um sistema de programação visual chamado Play Maker, que essencialmente funciona com Máquinas de Estados.

Você sabia?
O sistema Play Maker pode ser encontrado na Asset Store no
link a seguir.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 16/22
12/12/2023, 13:08 Programação para jogos 3D
https://assetstore.unity.com/packages/tools/visual-
scripting/playmaker-368
(https://assetstore.unity.com/packages/tools/visual-
scripting/playmaker-368)

Esse sistema não atende todas as necessidades para desenvolver um jogo, mas pode atender uma parte considerável delas, acelerando o
desenvolvimento para quem não possui conhecimentos avançados em programação.

Você quer ver?


O Play Maker é um sistema de programação visual que pode ser utilizado sem
conhecimentos avançados em programação. Assista a um tutorial em português sobre
esse sistema.
Acesse (https://youtu.be/mpdNMU0H5AY)
Todas as ações visuais do Play Maker possuem códigos que podem ser editados. É preciso avaliar se utilizar recursos visuais é a melhor
abordagem para o projeto. Para programadores experientes, é possível que o desenvolvimento visual seja menos produtivo que programar
através de códigos.

Vamos Praticar!
Você está desenvolvendo um jogo e, apesar de ter certo conhecimento em programação, precisa
contar com dois colegas de trabalho que não possuem conhecimentos avançados em programação.
Pelo escopo do projeto, você acredita que não precisará programar com scripts C# na engine Unity
e que uma ferramenta visual chamada Play Maker poderá ser o suficiente. Escreva, em ao menos
dois parágrafos, a razão de, para esse projeto, ser mais coerente usar o Play Maker e, ainda,
quando a ferramenta visual pode não ser o suficiente, exigindo o desenvolvimento de scripts com
códigos.

3.4 Algoritmo
A*

O chamado algoritmo A* (A Star) é bastante utilizado no contexto de desenvolvimento de jogos para traçar trajetórias, algo que está
diretamente ligado ao comportamento de NPCs, por exemplo. Rabin (2015) afirma que o primeiro passo na busca por caminhos consiste em
analisar o ambiente em que o personagem está inserido para, em seguida, determinar a área de busca. É um processo relativamente similar
ao que acontece quando se utiliza um Nav Mesh na Unity.

3.4.1 Conceito de A*
Para uma adequada utilização do algoritmo A*, é preciso definir o custo estimado de um caminho e o custo do caminho percorrido. Osório et
al. (2007, p. 4-5) afirmam que:

A ideia inicial do A* é a composição de dois custos a fim de compor a heurística aplicada na restrição do espaço de busca (direcionamento da busca),
compondo uma função f(x) = g(x) + h(x). A primeira parte da função, g(x), é custo propriamente dito do caminho percorrido, ou seja, é quanto custa para o
agente se mover para o nó em questão. […] Este custo pode estar representando qualquer propriedade consumida pelo agente, como por exemplo: tempo,
equipamentos, distância, combustível gasto, etc. […] A heurística base do A* é a soma do custo de caminho (já percorrido), com o custo estimado do caminho
(que ainda falta percorrer), dando como resultado um custo total estimado para alcançar o nó em questão.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 17/22
12/12/2023, 13:08 Programação para jogos 3D
Assim, o A* busca encontrar o caminho ótimo ou menos custoso, realizando essas estimativas numéricas. Em alguns casos específicos, o
desenvolvedor pode propositalmente aplicar o A* para não encontrar o caminho mais otimizado. Essa decisão não é a mais usual, mas no
contexto de jogos digitais pode ocorrer.

Você quer ver?


Engines 2D como Construct 3 e Game Maker possuem soluções de IA que atendem a
necessidade de diversos tipos de jogos em sua implementação. Assista ao tutorial a
seguir, que apresenta como desenvolver inimigos em um jogo de plataforma 2D em
modo patrulha na engine Construct 3.
Acesse (https://youtu.be/5JVg4B1kk24)
Se pensarmos em um sistema de navegação GPS, é comum imaginar que sempre se buscará o caminho ótimo, e, provavelmente, um
sistema de GPS dentro de um jogo também seguirá esse padrão. Porém, essa regra pode ser quebrada ao se considerar diretrizes no game
design, como o exemplo seguinte.

Trajetórias

A partir da aplicação do A*, digamos que um sistema de GPS calcula 5 trajetórias com
diferentes custos.

Nível normal

Talvez o jogo em nível normal sorteie a trajetória de um inimigo dentre os 3 maiores custos.

Nível difícil

E o jogo em nível difícil sorteie entre os 2 outros caminhos, que são mais próximos ao
“caminho ótimo”.

Assim, é notável que em jogos não se busca sempre a melhor ou ótima solução, mas aquela que construirá a experiência desejada, que
pode nem sempre ser a mais eficiente contra o jogador, mas será aquela que divertirá mais.

3.4.2 Aplicação de A* em jogos digitais


A Unity possui uma ferramenta auxiliar que pode ser obtida na Asset Store chamada A* Pathfinding Project Pro.

Você quer ver?


Assista a uma apresentação da ferramenta A* Pathfinding Project Pro no link.
Acesse (https://youtu.be/hmx1sx6ezQA)
Apesar de você ter estudado conceitos de árvores binárias, A* e Máquinas de Estados, muitas vezes é possível obter soluções prontas que
apliquem esses conceitos em ferramentas compatíveis com as engines mais usadas, como é o caso do exibido na figura “Aplicação de A* na
engine Unity”. Esse código foi dividido em três partes, como veremos a seguir.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 18/22
12/12/2023, 13:08 Programação para jogos 3D

Figura 12 - Aplicação de A* na engine Unity (parte 1)


Fonte: Adaptada de A* Pathfinding Project, 2021.

#PraCegoVer: é apresentada a primeira parte de um código em linguagem C# no contexto da Unity, no qual é definido um ponto a ser
perseguido pelo personagem em que o script será aplicado. Adicionalmente, há uma função chamada OnPathComplete que é chamada
quando o caminho for percorrido.

A seguir, veremos a próxima parte do código.

Figura 13 - Aplicação de A* na engine Unity (parte 2)


Fonte: Adaptada de A* Pathfinding Project, 2021.

#PraCegoVer: é apresentada a segunda parte de um código em linguagem C# no contexto da Unity, no qual é definido um ponto a ser
perseguido pelo personagem em que o script será aplicado. Adicionalmente, há uma função chamada OnPathComplete que é chamada
quando o caminho for percorrido.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 19/22
12/12/2023, 13:08 Programação para jogos 3D
A seguir, veremos a última parte do código.

Figura 14 - Aplicação de A* na engine Unity (parte 3)


Fonte: Adaptada de A* Pathfinding Project, 2021.

#PraCegoVer: é apresentada a terceira parte de um código em linguagem C# no contexto da Unity, no qual é definido um ponto a ser
perseguido pelo personagem em que o script será aplicado. Adicionalmente, há uma função chamada OnPathComplete que é chamada
quando o caminho for percorrido.

Acompanhe o caso a seguir, que mostra que adotar as corretas estratégias para a implementação de IA pode fazer a diferença para a
viabilidade de um projeto.

Caso
A maioria dos jogos digitais são desenvolvidos em plataformas usuais como PC, consoles (PlayStation, Xbox,
Wii), consoles portáteis ou dispositivos móveis na categoria de smartphones. Em determinado momento, Júlio
se depara com uma situação inusitada: desenvolver um jogo com a temática de um shopping em que há um
arcade, com várias máquinas de jogos populares. O grande desafio é que o desenvolvimento deve ocorrer em
um hardware próprio, no qual Júlio nunca trabalhou.
Júlio recebe o hardware: é uma variação do Arduíno, importada e com pouca memória disponível, apesar de
ter um poder de processamento gráfico relativamente bom, sendo suficiente para executar um jogo com
gráficos não muito avançados. A determinação do cliente é clara: é preciso ter um diferencial na inteligência
artificial, preferencialmente com algo avançado como algoritmos genéticos!
O cliente não possui conhecimentos técnicos para avaliar a melhor abordagem para o caso, então Júlio chega
à conclusão de que somente um protótipo pode salvar o projeto.
Então, Júlio prepara em 2 dias um demo com cubos e sem nenhuma textura. Em uma parte, aplica algoritmos
genéticos extremamente custosos que deixam o jogo lento. Depois, apresenta uma dinâmica com Máquinas
de Estados simples e que parecem ser bastante divertidas.
O cliente, que parecia irredutível, defende a nova solução adotando FSM.
Em alguns momentos, é preciso mostrar com interação. Nesse sentido, quanto antes existir um protótipo,
melhor.

Mesmo em soluções de terceiros, a aplicabilidade do A* irá variar de jogo para jogo. Afinal, após definir uma trajetória, completá-la ou ter de
modificá-la ao longo de sua execução, são particularidades de cada jogo e contexto.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 20/22
12/12/2023, 13:08 Programação para jogos 3D

Teste seus conhecimentos


(Atividade não pontuada)

Conclusão
Concluímos a unidade e nela fomos capazes de aprofundar
conhecimentos em motores de jogos e construir exemplos de aplicação
focados na engine Unity.
Nesta unidade, você teve a oportunidade de:

estudar conceitos de IA em jogos digitais e as vantagens e


desvantagens de aplicá-los em diferentes contextos;

compreender o uso de algoritmos em árvores binárias (AB) para sua


estruturação e caminhamento, assim como possíveis aplicações em
jogos;

estruturar máquinas de estados finitas para definir comportamentos e


seus critérios de transição;

visualizar aplicações do algoritmo de A* no desenvolvimento de jogos.

Referências
A* PATHFINDING PROJECT. Example AstarAI.cs 4.1.16, [S. l.], 2021. Disponível em:
https://arongranberg.com/astar/documentation/4_1_16_7f164ebc/astaraics.html
(https://arongranberg.com/astar/documentation/4_1_16_7f164ebc/astaraics.html). Acesso
em: 5 jan. 2021.
A* Pathfinding Project Pro. [S. l. s. n.], 2015. 1 vídeo (2 min). Publicado pelo canal Aron G.
Disponível em: https://youtu.be/hmx1sx6ezQA (https://youtu.be/hmx1sx6ezQA). Acesso
em: 5 jan. 2021.
AI para inimigos em Plataformas — Construct 2 e Construct 3 — Cloud5. [S. l. s. n.], 2019. 1
vídeo (11 min). Publicado pelo canal desKompliKa Cursos. Disponível em: https://youtu.be/5JVg4B1kk24
(https://youtu.be/5JVg4B1kk24). Acesso em: 5 jan. 2021.
BRAGA. A. Showcase. Alberto Braga, [S. l.], [202-?]. Disponível em: http://www.albertobraga.com/
(http://www.albertobraga.com/). Acesso em: 5 jan. 2021.
COPPIM, B. Inteligência artificial. Rio de Janeiro, LTC, 2013.
KYAW, A. et al. Unity 4. VIII Game AI Programming. United Kingdom: Packt Publishing, 2013.
LIMA, E. S. de Inteligência artificial: aula 26 — Máquinas de estados finitos. Edirlei Lima, Lisboa, 2012. Disponível em:
https://edirlei.com/aulas/ia_2012_1/IA_Aula_26_Maquinas_de_Estados_Finitos.pdf
(https://edirlei.com/aulas/ia_2012_1/IA_Aula_26_Maquinas_de_Estados_Finitos.pdf). Acesso em: 9 dez. 2020.
MULLER, A., BITTENCOURT, J. UD3 — Unity decision tree integrator: uma extensão de árvores de decisão para Unity. In:
SBGames, 13., 2014, Porto Alegre. Anais […]. Porto Alegre: Proceedings of SBGames, 2014. Disponível em: h
(https://www.sbgames.org/sbgames2014/papers/computing/short/20_allcomputingshortpages.pdf)ttps://www.sbgames.org/s
bgames2014/papers/computing/short/20_allcomputingshortpages.pdf
(https://www.sbgames.org/sbgames2014/papers/computing/short/20_allcomputingshortpages.pdf). Acesso em: 15 dez. 2020.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 21/22
12/12/2023, 13:08 Programação para jogos 3D
OSÓRIO, F. et al. Inteligência Artificial para Jogos: agentes especiais com permissão para matar… e raciocinar!. Proceedings of
SBGames, São Leopoldo, RS, 2007. Disponível em: http://osorio.wait4.org/publications/Osorio-et-al-SBGames07-Tutorial.pdf
(http://osorio.wait4.org/publications/Osorio-et-al-SBGames07-Tutorial.pdf). Acesso em: 15 dez. 2020.
RABIN, S. (ed.). Game AI pro 2: collected wisdom of game AI professionals. Boca Raton, USA: CRC Press, 2015.
SILVA, P.; VILLELA, S. Applying pathfinding techniques on the development of an Android game. In: SBGames, 15., 2016, São Paulo.
Anais […]. São Paulo: Proceedings of SBGames, 2016. Disponível em:
http://www.sbgames.org/sbgames2016/downloads/anais/157460.pdf
(http://www.sbgames.org/sbgames2016/downloads/anais/157460.pdf). Acesso em 17 dez. 2020.
SMITH, M.; QUEIROZ, C. Unity 4.VIII Cookbook. United Kingdom: Packt Publishing, 2013.
UNITY Playmaker tutorial 01. [S. l. s. n.], 2016. 1 vídeo (8 min). Publicado pelo canal Blender Nitidus. Disponível em:
https://youtu.be/mpdNMU0H5AY (https://youtu.be/mpdNMU0H5AY). Acesso em: 5 jan. 2021.
UNITY. Behavior Designer — Behavior Trees for Everyone. Asset Store, [2021]. Disponível em:
https://assetstore.unity.com/packages/tools/visual-scripting/behavior-designer-behavior-trees-for-everyone-15277
(https://assetstore.unity.com/packages/tools/visual-scripting/behavior-designer-behavior-trees-for-everyone-15277). Acesso
em: 5 jan. 2021.
UNITY. Navigation and pathfinding. Unity User Manual 2019.4 LTS, [S. l.], 2021. Disponível em:
https://docs.unity3d.com/Manual/Navigation.html (https://docs.unity3d.com/Manual/Navigation.html). Acesso em: 5 jan. 2021.
UNITY. Playmaker. Asset Store, [S. l.], [2021]. Disponível em: https://assetstore.unity.com/packages/tools/visual-
scripting/playmaker-368 (https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368). Acesso em: 5 jan. 2021.
UNITY. Tools/AI. Asset Store, [S. l.], [2021]. Disponível em: https://assetstore.unity.com/tools/ai
(https://assetstore.unity.com/tools/ai). Acesso em: 5 jan. 2021.
VOCÊS pediram Kasparov x Deep Blue (1996) — Partida 01/06. [S. l. s. n.], 2018. 1 vídeo (16 min). Publicado pelo canal Xadrez
Brasil. Disponível em: https://youtu.be/tEC9umM_y5A (https://youtu.be/tEC9umM_y5A). Acesso em: 5 jan. 2021.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 22/22

Você também pode gostar