Você está na página 1de 19

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

Programação para jogos 3D


UNIDADE 4 - NON-PLAYER CHARACTERS E ALGORITMOS
DE BUSCA

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/19
12/12/2023, 13:09 Programação para jogos 3D

Introdução
Caro(a) estudante, chegamos à parte final da nossa disciplina, e agora
está na hora de aplicarmos os conhecimentos construídos de forma mais
direta no desenvolvimento de jogos.
O aprendizado na área de jogos digitais, apesar de ter a teoria como
importante base, essencialmente, é bastante prático. De nada serve um
desenvolvedor — seja programador, artista, game designer —, dominar os
conceitos teóricos e não ter experiência prática, juntamente com a
construção de um portfólio. Ao longo da unidade, você deve construir
exemplos de forma autônoma com alguma engine. Durante a disciplina, a
maioria dos exemplos apresentados ocorrem através da Unity, mas os
conceitos trabalhados podem ser aplicados em qualquer tecnologia, assim,
você pode realizar implementações na engine que desejar, seja Unity, Unreal, Godot, Construct, Game Maker, entre outras.
Nesta unidade, focaremos na implementação de non-player characters (NPCs) e sua relação direta com algoritmos de busca, que
visam definir seu comportamento, seja como NPCs genéricos, aliados, inimigos, entre outros. Aplicaremos diferentes algoritmos e
técnicas para construir experiências imersivas e diferenciadas no contexto de jogos digitais, sempre relacionando as
implementações com algumas das tecnologias mais avançadas disponíveis na indústria de jogos e considerando as principais
plataformas de publicação e comercialização do âmbito do entretenimento digital.
Bons estudos!

4.1 NPCs
simples

Em geral, quando se pensa na qualidade de um personagem não controlável, é comum que surja a ideia de que quanto mais complexo esse
personagem for, melhor será a experiência do jogo. Isso não necessariamente é verdade. De fato, em alguns casos, é importante que uma
implementação com alta qualidade se apresente em um personagem não controlável (NPC), e é comum que essa implementação esteja
relacionada a algoritmos de busca (KYAW et al., 2013). Porém, a maioria dos personagens em jogos, inimigos, aliados ou personagens
neutros, apresentam o comportamento bastante simples. Viana et al. (2020, p. 87) afirmam que:

Importante ressaltar que no contexto dos jogos há dois tipos de personagens: os personagens jogáveis (PJ) e os personagens não jogáveis (NPCs). Ambos
são agentes no mundo aos quais estão inseridos. Devido ao seu caráter interativo, em geral, o PJ é o protagonista da história e quem promove as grandes
mudanças no mundo na qual está inserido.

Mesmo não sendo os agentes centrais das grandes mudanças que ocorrem no desenrolar de uma narrativa em um jogo, ao menos na
maioria dos casos, os NPCs têm papel crucial na construção da experiência, complementarmente ao colocado pelos autores Viana et al.
(2020) como personagens jogáveis.

Comportamento simples

É comum que inimigos em jogos de plataforma apenas patrulhem uma área caminhando
da esquerda para direita e da direta para a esquerda, ou até mesmo percorram um
caminho em direção ao personagem e se atirem em penhascos. Esse tipo de

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 2/19
12/12/2023, 13:09 Programação para jogos 3D
comportamento é bastante simples e usado com frequência.

Comportamento elaborado

Mesmo comportamentos um pouco mais elaborados, como um boss (chefe) que apresente
três ou quatro movimentos padrão com certa variabilidade, podem ser implementados em
uma máquina de estados simples.

Ao contrário desses exemplos, alguns NPCs mais complexos exigem técnicas aprimoradas de implementação e acabam por demandar um
custo computacional maior.

4.1.1 Implementação de NPCs com trajetórias limitadas


No contexto da engine Unity, o sistema de navegação é bastante utilizado para construir comportamentos simples. Esses comportamentos
podem delimitar um estado de patrulha ou simplesmente uma movimentação para um ponto específico do cenário.

Você sabia?
Existem diversas engines que fornecem possibilidades de implementação para facilitar o
desenvolvimento de um jogo. No caso da tecnologia Construct 3, existem comportamentos
predefinidos que podem facilitar a implementação de NPCs, como os comportamentos Sine
e Pathfinding. Para obter a Construct 3, utilizar os recursos e analisar ideias para
desenvolvimento de jogos 2D, acesse o seguinte endereço.
https://www.construct.net/ (https://www.construct.net/)

A figura “Movimentação para ponto específico do cenário” determina uma possível trajetória de NPC com certas limitações, mas que pode
atingir o objetivo pretendido no jogo.

Figura 1 - Movimentação para ponto específico do cenário


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: na imagem é apresentado o código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. É obtido o
componente de navegação do personagem e definido o local de deslocamento a partir de uma variável de posição com acesso público,
podendo ser alterado através do Inspector.

O script que utiliza o componente NavMeshAgent só funcionará se, naturalmente, o personagem possuir o componente NavMeshAgent e o
cenário apresentar uma malha de navegação definida.

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

Você quer ler?


O desenvolvimento de personagens, inclusive NPCs, pode ser parte da construção de
uma mídia que leve os jogadores à reflexão, além da diversão que é intimamente
ligada aos jogos. O artigo “Design de personagens voltado para reflexões sobre
diversidade e representatividade de gênero em games” apresenta algumas reflexões
acerca desse objetivo. O trabalho foi publicado e apresentado no SBGames, maior
evento acadêmico de jogos digitais do Brasil, e pode ser encontrado no link a seguir.
Acesse
(https://www.sbgames.org/sbgames2017/papers/ArtesDesignShort/175381.pdf)
Apesar de parecer simples, o script de movimentação específica pode ter uma aplicabilidade bastante útil: representar um NPC que auxilia o
personagem controlável em determinada tarefa ou ainda um inimigo que se expõe para ensinar o jogador a atacar, dentre diversos outros
exemplos e possibilidades.

4.1.2 Aplicação de NPCs simples


É comum que alguns personagens não controláveis apresentem comportamentos fixos e isso pode ser o objetivo do game designer ou level
designer ao projetar determinada parte do jogo, porém, é bastante comum que se queira apresentar variabilidade em movimentos e
comportamentos, mas de forma controlada.
A figura “Movimentação de NPC com variabilidade” apresenta a definição de movimento para um personagem através do sistema de
navegação da Unity e novamente é determinado um ponto alvo, porém, com um grau de variabilidade.

Figura 2 - Movimentação de NPC com variabilidade


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: na imagem é apresentado o código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. É obtido o
componente de navegação do personagem e definido o local de deslocamento a partir de uma variável de posição com acesso público,
porém, a partir dessa variável é somado ou subtraído um valor que pode variar entre –5 e 5 para a posição determinada nos eixos X e Z,
enquanto o eixo Y não é alterado.

Essa variabilidade pode escalar a aplicação para diversos NPCs, inclusive para os que forem direcionados ao mesmo local (ou próximo),
pois, com a variação, o comportamento tende a ser mais orgânico e menos fixo aos olhos do jogador. Com essa variação, uma mesma cena
visitada pelo jogador diversas vezes terá variações o suficiente para se tornar interessante por mais tempo. A figura “Definição de
variabilidade por variáveis” pode definir outras possibilidades de controle.

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

Figura 3 - Definição de variabilidade por variáveis


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: na imagem é apresentado o código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. É definido o
local de deslocamento a partir de uma variável de posição com acesso público, porém, a partir dessa variável é somado ou subtraído um
valor que pode mudar a partir de duas variáveis, que definirão o quanto podem variar os eixos X e Z.

É uma opção de game design tornar os comportamentos mais ou menos variados e orgânicos. Nem sempre é o ideal a ser adotado em um
jogo, mas essas variações tendem a colaborar com o reaproveitamento dos scripts.

Vamos Praticar!
Na implementação de um NPC, que faz parte do tutorial do jogo, ou seja, de um momento de
uma fase inicial em que o sucesso do jogador deve ser facilitado para que ele aprenda como
jogar, você foi designado para implementar um personagem NPC com comportamento limitado
e bastante simples. Escreva no mínimo dois parágrafos argumentando sobre o motivo de definir
trajetórias fixas e limitadas ser vantajoso no caso de um NPC em um contexto de tutorial dentro
de um jogo digital.

4.2 NPCs em
grupos

Quando personagens não controláveis precisam atuar em grupos, dependendo do contexto do jogo, isso pode afetar bastante a
complexidade da implementação.

Em um jogo que possua grupos de inimigos, por exemplo, esses grupos podem se deslocar para um ponto
Deslocamento
específico, que pode ser o ponto em que o jogador está.

Para que o deslocamento ocorra, precisam de algum critério para não colidir entre si e apresentar alguma
Colisão
variabilidade de movimento, ainda que o script e a programação de todos seja similar.

Por outro lado, a complexidade pode ser ainda maior: podem ser analisados quais inimigos estão em um mesmo grupo e como coordenar
ataques e ações a partir disso.

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

Você quer ver?


O desenvolvimento de um personagem não controlável (NPC) possui diversos
aspectos, principalmente relacionados a arte e design. O SBGames 2020, maior
evento acadêmico de jogos do Brasil, apresentou diversos trabalhos acerca desse
tema e pode ser visualizado no link.
Acesse (https://youtu.be/cL03piLtuYU)
A estruturação dos NPCs pode variar em diversos aspectos.

Alguns são mais focados em ataque, por exemplo.

 
Alguns são focados em defesa.

Alguns simplesmente acompanham o jogador para determinada função no jogo.

Há várias outras possibilidades, mas, independentemente do contexto, todos devem conseguir fazer leituras do ambiente e dos demais
agentes presentes na cena.

4.2.1 Implementação de NPCs com trajetórias complexas


Um dos pontos relevantes para determinar a trajetória de NPCs em grupos é referenciar quais serão os alvos para essa trajetória. No caso da
figura “Movimentação com o jogador como referência”, a variável alvo local utiliza os valores de posição do jogador, determinados pela
referência do player através das variáveis do tipo GameObject (SMITH; QUEIROZ, 2013) chamada playerRef.

Figura 4 - Movimentação com o jogador como referência


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: na imagem é apresentado o código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. Para
movimentar o personagem pelo sistema de navegação da Unity, é utilizada uma referência do tipo GameObject para obter informações do
jogador.

Para aplicar um mesmo comportamento em muitos personagens que tenham o jogador como referência, é desejável uma alteração na
posição através de um valor randômico, ou seja, com variabilidade definida por sorteio, como pode ser observado na figura “Movimentação
variada com o jogador como referência”.

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

Figura 5 - Movimentação variada com o jogador como referência


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: na imagem é apresentado o código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. Para
movimentar o personagem pelo sistema de navegação da Unity, é utilizada uma referência do tipo GameObject e são acrescidas, nas
posições X e Z, valores sorteados entre –20 e 20.

A complexidade pode ser ainda maior quando o personagem tiver diferentes pontos de referência. A partir daí diferentes abordagens podem
ser adotadas para construção do comportamento.

Você o conhece?
Christopher Kastensmidt é um norte-americano naturalizado brasileiro que atuou em diversos títulos de
jogos e como escritor de literatura fantástica. Christopher foi um dos precursores da indústria nacional.
Tendo atuado na Southlogic Studios, uma empresa de jogos digitais de Porto Alegre, fundada em 1996.
Christopher é o autor da série de livros A Bandeira do Elefante e da Arara, que pode ser visualizada no
link.
Acesse (https://www.eamb.org/brasil/)

A figura “Movimentação variada de diversos objetos como referência” apresenta diversos objetos como referência de movimento. Esses
objetos podem variar, sendo diversos personagens controláveis ou outros NPCs. A imagem foi dividida em duas partes.

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

Figura 6 - Movimentação variada de diversos objetos como referência (parte 1)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a primeira parte do código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. Para
movimentar o personagem através do sistema de navegação da Unity, é utilizada uma referência do tipo GameObject para obter informações
do jogador e um array de GameObjects para obter referências de outros personagens. De acordo com uma variável de estado, a referência
de alvo é modificada.

A seguir, é apresentada a segunda parte da imagem.

Figura 7 - Movimentação variada de diversos objetos como referência (parte 2)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a segunda parte do código de um script em C# que utiliza a biblioteca de inteligência artificial da Unity. Para
movimentar o personagem através do sistema de navegação da Unity, é utilizada uma referência do tipo GameObject para obter informações
do jogador e um array de GameObjects para obter referências de outros personagens. De acordo com uma variável de estado, a referência
de alvo é modificada.

Cada uma dessas aplicações pode ocorrer para construir a experiência de jogo projetada, e as referências adotadas não precisam
necessariamente ser outros personagens, podem ser objetos do cenário, por exemplo. No caso da Unity, a variável GameObject engloba
qualquer tipo de objeto, e isso também pode ser obtido em outras tecnologias, seguindo essa mesma lógica.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B4… 8/19
12/12/2023, 13:09 Programação para jogos 3D
4.2.2 Critérios de escolha de algoritmos
A aplicação de árvores binárias no contexto da Unity pode ocorrer com variações para diferentes tipos de aplicações em necessidades em
cada tipo de jogo. É fundamental que uma implementação seja realizada na linguagem C#.

Você sabia?
Para aplicar árvores binárias no contexto de jogos e da engine Unity, não é
necessário realizar a implementação desde o início. É possível utilizar
estruturas aplicadas. Um exemplo é o recurso Binary Trees, da Asset Store da
Unity. Esse recurso pode ser obtido no link a seguir.
https://assetstore.unity.com/packages/tools/integration/binary-trees-
21652#content
(https://assetstore.unity.com/packages/tools/integration/binary-trees-
21652)

No contexto da Unity, nem todas as classes necessitam herdar MonoBehaviour. A implementação da árvore pode ocorrer em uma ou mais
classes sem essa herança, como apresentado no exemplo “Árvore binária de busca em C#”, na imagem seguinte dividida em quatro partes.

Figura 8 - Árvore binária de busca em C# (parte 1)


Fonte: Adaptada de C# BINARY […], 2019.

#PraCegoVer: é apresentada a primeira parte do código em C# de árvore de busca binária com duas classes: uma representando o nodo e
outra com as operações usuais de uma árvore binária (AB).

A seguir, é apresentada a segunda parte da imagem.

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

Figura 9 - Árvore binária de busca em C# (parte 2)


Fonte: Adaptada de C# BINARY […], 2019.

#PraCegoVer: é apresentada a segunda parte do código em C# de árvore de busca binária com duas classes: uma representando o nodo e
outra com as operações usuais de uma árvore binária (AB).

Agora, veja a terceira parte da imagem.

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

Figura 10 - Árvore binária de busca em C# (parte 3)


Fonte: Adaptada de C# BINARY […], 2019.

#PraCegoVer: é apresentada a terceira parte do código em C# de árvore de busca binária com duas classes: uma representando o nodo e
outra com as operações usuais de uma árvore binária (AB).

A seguir, é apresentada a quarta parte da imagem.

Figura 11 - Árvore binária de busca em C# (parte 4)


Fonte: Adaptada de C# BINARY […], 2019.

#PraCegoVer: é apresentada a quarta parte do código em C# de árvore de busca binária com duas classes: uma representando o nodo e
outra com as operações usuais de uma árvore binária (AB).

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 11/19
12/12/2023, 13:09 Programação para jogos 3D
A partir da implementação da árvore, um objeto pode ser instanciado em uma classe que possua MonoBehaviour para ser utilizado
normalmente. Existem inúmeros recursos na Asset Store e até mesmo implementações nativas na Unity utilizando árvore binárias, mas
também há a possibilidade de o desenvolvedor precisar implementar a sua própria árvore.

Teste seus conhecimentos


(Atividade não pontuada)

4.3 NPCs
combativos

É comum encontrar personagens não controláveis (NPCs) em diferentes contextos e situações nos jogos digitais.

1
Comércio

Personagens que podem ser comerciantes com lojas em que é possível comprar e vender itens.

2
Ambiente

Personagens que apenas caminham com certo grau de aleatoriedade em alguma região e dão dicas ou conversam com o jogador sobre
assuntos sem utilidade prática, apenas para ambientar o jogo.

3
Batalha

Personagens combativos, que são aqueles inseridos no sistema de batalha do jogo, quando esse existir.

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

Para esses NPCs combativos, os algoritmos de busca e formas de implementação podem ter algumas particularidades.

4.3.1 Implementação de aliados


O gênero Role-playing game (RPG) é um dos que mais apresenta personagens não controláveis que atuam como aliados. Como esse tipo
de jogo apresenta em seu enredo uma grande quantidade de personagens, é comum a formação de grupos, de heróis ou vilões.
NPCs aliados usualmente se movimentam próximos ao jogador, analisando o ambiente, os inimigos presentes e o estado do jogador. Existem
inúmeras formas de analisar o estado do jogador. A figura “Verificação de estado do jogador” apresenta um exemplo.

Figura 12 - Verificação de estado do jogador


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: na imagem é apresentado o código de um script em C# que verifica uma variável de vida do jogador. Ao verificar que o valor
de vida está menor que 10, é alterado o valor de uma variável booleana chamada “emPerigo” para verdadeiro. Essa variável é pública,
podendo ser acessada por objetos externos.

Naturalmente, os scripts de NPCs serão diferentes do script do jogador, dado que esses códigos serão aplicados em agentes diferentes no
jogo. Os aliados, por sua vez, devem referenciar o jogador para ter acesso ao seu estado e, se for o caso, modificar seu comportamento,
conforme apresentado na imagem “Comportamento defensivo de NPC”, dividida em duas partes.

Figura 13 - Comportamento defensivo de NPC (parte 1)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a primeira parte do código de um script em C# que determina o movimento do personagem em relação ao
jogador. Caso perceba que o jogador está em perigo, determina sua posição próxima a ele. Caso não detecte perigo, patrulha em áreas mais
vastas.

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

A seguir, apresenta-se a segunda parte da imagem.

Figura 14 - Comportamento defensivo de NPC (parte 2)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a segunda parte do código de um script em C# que determina o movimento do personagem em relação ao
jogador. Caso perceba que o jogador está em perigo, determina sua posição próxima a ele. Caso não detecte perigo, patrulha em áreas mais
vastas.

Considerando que, apesar de apresentar um comportamento autônomo, os NPCs aliados devem se guiar pela necessidade do jogador, é
essencial que esses agentes consigam obter informações acerca do estado do personagem controlável. Da mesma forma, o personagem
controlável deve fornecer informações de seu estado através de variáveis ou métodos de acesso público.

Você quer ler?


Para reaproveitamento de comportamentos, é essencial que o programador domine
Programação Orientada a Objetos e conceito de Herança. Para visualizar o
funcionamento de herança em linguagem C#, o site Contém Bits elaborou uma
explicação sobre esse conceito que pode ser acessada no link.
Acesse (http://contembits.com.br/minicursos/poo/Heranca.aspx)
Os aliados ainda podem detectar inimigos e atacar.

Implementação

Nesse sentido, a implementação é bastante parecida com os próprios inimigos na delimitação de um comportamento agressivo.

Definições

Observa-se as definições de alvo, independentemente de esses alvos serem inimigos ou aliados dentro do jogo.

Nesse sentido, o programador pode projetar uma estratégia de reaproveitamento de códigos tanto para aliados quanto para inimigos.

4.3.2 Implementação de inimigos


Em jogos digitais, a parte essencial da implementação de um inimigo é a determinação do seu comportamento, que pode variar de um
movimento simples até a análise de ambiente de forma mais complexa.

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

Você quer ver?


A Discovery Brasil apresentou um programa sobre Inteligência Artificial que está
disponível gratuitamente no YouTube. Apesar de citar a aplicação em diferentes
categorias além de jogos, parte considerável dos conceitos apresentados têm
aplicação no contexto do entretenimento digital. É possível acessar o vídeo no link a
seguir.
Acesse (https://youtu.be/W95YlM5-iPk)
A figura “Comportamento de NPC ofensivo” aborda dois pontos importantes: a determinação de um alvo e o critério para de fato atacar. A
imagem foi dividida em duas partes.

Figura 15 - Comportamento de NPC ofensivo (parte 1)


Fonte: Elaborada pelo autor, 2021.

#PraCegoVer: é apresentada a primeira parte do código de um script em C# que determina o comportamento de um NPC inimigo. Após
determinar o alvo para ataque, o NPC verifica a distância para o alvo e o ataca quando essa distância for menor que 10.

Acompanhe a segunda parte da imagem a seguir.

Figura 16 - Comportamento de NPC ofensivo (parte 2)


Fonte: Elaborada pelo autor, 2021.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 15/19
12/12/2023, 13:09 Programação para jogos 3D
#PraCegoVer: é apresentada a segunda parte do código de um script em C# que determina o comportamento de um NPC inimigo. Após
determinar o alvo para ataque, o NPC verifica a distância para o alvo e o ataca quando essa distância for menor que 10.

Analisar os diferentes tipos de alvo é uma possiblidade para criar NPCs com comportamentos mais avançados. No exemplo da figura
“Comportamento de NPC ofensivo”, o inimigo analisa o status de estar em perigo de todos os agentes disponíveis na cena e, caso encontre
alguém enfraquecido, determinará esse personagem como alvo. Quanto mais variabilidades como essa e mais critérios de escolha, mais
complexa se torna a implementação, mas ao mesmo tempo apresenta maior potencial de criar uma experiência interessante e desafiadora ao
jogador.

Vamos Praticar!
Em um RPG em terceira pessoa, a sua tarefa como parte da equipe de desenvolvimento de um
jogo é implementar o comportamento de diferentes NPCs. Para isso, você está autorizado a usar
soluções de terceiros, mesmo que tenham custos, para agilizar o processo. Você pode escolher
uma solução em fóruns ou qualquer loja de recursos de game assets, inclusive a Asset Store da
Unity. Escreva ao menos dois parágrafos justificando as razões de a solução de terceiros que
você escolheu ser a mais indicada.

4.4 NPCs
avançados

A implementação de NPCs avançados pode adotar diversas estratégias. Podem ser utilizadas árvores de comportamento (MULLER;
BITTENCOURT, 2014), o algoritmo A* (OSÓRIO et al., 2007), máquinas de estado (RABIN, 2016), técnicas de pathfinding variadas (SILVA;
VILLELA, 2016), entre outros. Dado esse leque de opções, o desenvolvedor deve escolher a abordagem que tenha um melhor custo-
benefício para o seu projeto.

4.4.1 Critérios de decisão para NPCs avançados


Após dominar e conhecer diversas técnicas e tipos de algoritmos que podem ser aplicados para definir o comportamento de NPCs, cabe ao
desenvolvedor escolher a abordagem mais adequada. Não há uma resposta absoluta para qual será o melhor modelo.

Você quer ver?


Jogos digitais são mídias extremamente populares e têm sido utilizados em diversos
meios, não somente no entretenimento. Todas as técnicas de implementação de NPCs,
IA e qualquer outro recurso tecnológico podem ser aplicadas para desenvolver, por
exemplo, jogos com aplicabilidade no contexto educacional. No evento SBGames 2020
foram realizadas diversas avaliações de jogos educacionais que podem ser
acompanhadas no link.
Acesse (https://youtu.be/8_w9cfWiF80)
O desenvolvedor de jogos, antes de adotar uma estratégia de desenvolvimento, deve analisar o contexto.

No caso da implementação de um NPC, para definir qual técnica será utilizada, é feita a análise do jogo em
Análise do jogo
si e dos elementos de game design, como mecânicas e level design.

Além disso, é preciso analisar os recursos do projeto: tempo disponível para desenvolvimento, recursos,
Análise dos recursos
impacto de manutenção, entre outros.

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 16/19
12/12/2023, 13:09 Programação para jogos 3D
Em geral, essa decisão deve ser tomada pelo gestor do projeto, porém, o desenvolvedor deve colaborar para essa tomada de decisão.

4.4.2 Implicações em balanceamento de jogos


O balanceamento de jogos é essencialmente um assunto relacionado ao game design, porém, naturalmente acaba tendo interseções com
todas as áreas do projeto. Ao implementar NPCs, o desenvolvedor deve estar atento para estruturar os algoritmos de forma a fornecer os
recursos necessários para o balanceamento de jogos.
Quanto menos parametrizável for um comportamento de NPC, mais difícil será definir um balanceamento adequado.

Implementação do algoritmo A*

Um exemplo é a implementação do algoritmo A*: quando implementado de forma


adequada, esse algoritmo busca o caminho mais otimizado e eficiente para finalizar uma
tarefa, porém, pode não ser esse o objetivo a ser atingido no desenvolvimento.

Progressão

Em um momento inicial do jogo, é bastante comum que os NPCs não sejam muito
espertos. Nesse caso, o algoritmo poderia ser implementando sem obter soluções muito
otimizadas e, posteriormente, ir progredindo ao longo do avanço do jogo. Essa progressão,
porém, preferencialmente deve ser disponibilizada para uma edição visual por parte dos
game designers.

No caso da Unity, essa progressão poderia ser realizada por variáveis públicas e editadas visualmente para facilitar o processo.

Teste seus conhecimentos


(Atividade não pontuada)

Acompanhe o caso a seguir, em que adotar o posicionamento de aceitar diminuir a qualidade de algumas implementações pode ser crucial
ao projeto.

Caso
Implementar NPCs e agentes inteligentes é a função de Marcos, um desenvolvedor de jogos brasileiro que
atua na indústria de jogos há 8 anos. Marcos implementou agentes para um jogo até então inédito em sua
carreira: controlar uma torcida de futebol e enfrentar diversos conflitos dentro e fora do estádio. O jogo foi
desenvolvido para consoles de última geração com muitos recursos disponíveis para a implementação.
Marcos é apaixonado por IA e realizou uma implementação que o orgulhou bastante.
Os agentes no jogo de torcidas de futebol implementados por Marcos possuem comportamentos muito
variados. Marcos usou árvores, grafos e diversas outras estruturas para implementar técnicas de IA. Aplicou
máquinas de estados, algoritmos genéticos, diferentes técnicas de aprendizagem de máquinas e explorou
muito bem os recursos do console. O jogo foi lançado com sucesso e, sem dúvidas, o comportamento definido
pela IA foi um dos grandes responsáveis.
Passaram-se alguns meses desde o lançamento do jogo de torcidas e um novo desafio é lançado: criar uma
versão para consoles portáteis que não possuem capacidade de processamento similar aos consoles e, pelo
contrário, são muito inferiores, dado que o cliente quer que o lançamento ocorra na maior quantidade de
dispositivos possíveis.
Marcos em um primeiro momento fica bastante decepcionado, mas depois reflete e entende que é mais um
grande desafio em sua carreira e propõe-se a alterar a implementação. A estratégia de Marcos, apesar de
trabalhosa, é relativamente simples de entender: ao invés de todos ou quase todos os agentes terem
processamento e definição de trajetórias de forma autônoma e individual, ele define que a aplicação dos

https://student.ulife.com.br/ContentPlayer/Index?lc=uy4Ru0c1rbtg%2bZ6D%2fcLmFw%3d%3d&l=o0iDOtLh81rsO9ClfYRYHQ%3d%3d&cd=B… 17/19
12/12/2023, 13:09 Programação para jogos 3D
algoritmos com alto custo computacional ficará apenas em poucos agentes-chave, e a maioria dos demais
agentes apenas seguirá esses agentes-chave, tendo pouco custo para definições de seus caminhos. No final,
a qualidade de movimento diminuiu um pouco, mas não foi tão perceptível considerando que a experiência de
jogo nos dispositivos móveis é diferente da de consoles. Assim, o lançamento do jogo em versão mobile foi
também um sucesso.

Por fim, a atividade de implementar NPCs é multidisciplinar: envolve aspectos de arte, programação, game design e áudio. O profissional
deve estar atento a todos esses aspectos para um melhor desenvolvimento dos personagens não controláveis.

Conclusão
Concluímos a unidade e nela fomos capazes de aprofundar conhecimentos na
implementação de NPC, tanto implementações simples quanto desenvolvimento de
comportamentos mais complexos e que demandam maior tempo e curso de
desenvolvimento.
Nesta unidade, você teve a oportunidade de:

estudar conceitos de IA em jogos digitais, como realizar movimentações de NPCs em


diferentes cenários;

analisar possibilidades de implementações de NPCs aliados e inimigos, de forma a


criar comportamentos e relações com algoritmos de busca;

compreender a atuação de NPCs em grupos, suas implicações na definição de alvos e


critérios de ataque;

desenvolver critérios de escolha para a implementação de algoritmos para definir o


comportamento de NPCs, além de considerar seu impacto no âmbito geral do projeto,
inclusive no balanceamento de jogos.

Referências
C# BINARY Search Tree Implementation. C# Examples, [S. l.], 2 maio 2019. Disponível em:
http://csharpexamples.com/c-binary-search-tree-implementation/
(http://csharpexamples.com/c-binary-search-tree-implementation/). Acesso em: 5 jan.
2021.
DISCOVERY Brasil | Inteligência Artificial — IBM. [S. l.: s. n.], 2018. 1 vídeo (87 min). Publicado
pelo canal Discovery Brasil. Disponível em: https://youtu.be/W95YlM5-iPk
(https://youtu.be/W95YlM5-iPk). Acesso em: 5 jan. 2021.
KASTENSMIDT. C. A bandeira do elefante e da arara. 2021. Disponível em:
https://www.eamb.org/brasil/ (https://www.eamb.org/brasil/). Acesso em: 5 jan. 2021.
KYAW, A. et al. Unity 4. VIII Game AI Programming. United Kingdom: Packt Publishing, 2013.
MINICURSOS — Programação orientada a objetos. Herança. Contém Bits, [S. l.], [2020]. Disponível em:
http://contembits.com.br/minicursos/poo/Heranca.aspx (http://contembits.com.br/minicursos/poo/Heranca.aspx). Acesso em:
5 jan. 2021.
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:
https://www.sbgames.org/sbgames2014/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… 18/19
12/12/2023, 13:09 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.
REZENDE, A. C. et al. Design de personagens voltado para reflexões sobre diversidade e representatividade de gênero em games.
In: SBGAMES, 16., 2017, Curitiba. Anais […]. Curitiba, PR: Proceedings of SBGames, 2017. Disponível em:
https://www.sbgames.org/sbgames2017/papers/ArtesDesignShort/175381.pdf
(https://www.sbgames.org/sbgames2017/papers/ArtesDesignShort/175381.pdf). Acesso em: 5 jan. 2021.
SBGAMES | TS: Alfabetização e Letramento com Jogos & Jogos e Aprendizagem. [S. l. s. n.], 2020. 1 vídeo (77 min). Publicado pelo
canal SBGames. Disponível em: https://youtu.be/8_w9cfWiF80 (https://youtu.be/8_w9cfWiF80). Acesso em: 5 jan. 2021.
SBGAMES | TS: Arte e Design 3. [S. l. s. n.], 2020. 1 vídeo (66 min). Publicado pelo canal SBGames. Disponível em:
https://youtu.be/cL03piLtuYU (https://youtu.be/cL03piLtuYU). Acesso em: 5 jan. 2021.
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. Binary trees. Asset Store, [S. l.], [2021]. Disponível em: https://assetstore.unity.com/packages/tools/integration/binary-
trees-21652#content (https://assetstore.unity.com/packages/tools/integration/binary-trees-21652#content). Acesso em: 5 jan.
2021.
VIANA, P. R. C. et al. O espaço como personagem em games. In: SBGAMES, 19., 2020, Recife. Anais […]. Recife: Proceedings of
SBGames, 2020. Disponível em: https://www.sbgames.org/proceedings2020/ArtesDesignFull/209661.pdf
(https://www.sbgames.org/proceedings2020/ArtesDesignFull/209661.pdf). Acesso em: 27 dez. 2020.

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

Você também pode gostar