Buscar

unidade 4

Prévia do material em texto

09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 1/66
DESENVOLVIMENTO DE JOGOSDESENVOLVIMENTO DE JOGOS
PARA WEBPARA WEB
DESENVOLVIMENTO DEDESENVOLVIMENTO DE
JOGOS PARA WEB:JOGOS PARA WEB:
FINALIZANDO E POLINDOFINALIZANDO E POLINDO
Autor: Diego Escobar
R e v i s o r : D e i v i t h C u n h a
I N I C I A R
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 2/66
introduçãoIntrodução
Os dispositivos mobile são um dos maiores mercados quando falamos de
desenvolvimento de jogos. Entre todas as plataformas, os jogos para mobile são o
mercado mais lucrativo. Entretanto, nem tudo é fácil neste mercado. Para desenvolver
um software para esta plataforma, devemos sempre nos lembrar que, ao contrário dos
computadores de mesa, os PCs e os smartphones têm processamento e memória muito
limitados quando fazemos esta comparação. De todas as plataformas, são as que mais
precisamos contar os bits e fazer de tudo para economizar, ao máximo, o espaço e a
memória de processamento.
Utilizando a Unity, temos uma vantagem: podemos modular todo o projeto e fazer estes
módulos �carem mais leves. Em outras palavras, podemos fazer o produto �nal �car
mais fácil de ser executado em uma plataforma onde precisamos nos atentar com o
desperdício de memória.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 3/66
Animar o personagem principal é uma parte muito importante e essencial para um jogo,
a�nal ele é quem nos levará pela aventura.
O avatar nós já temos, ele vem em partes. Dessa forma, �ca mais simples de serem
animados. Para isso, devemos abrir a tela de animação. A Figura 4.1 mostra o caminho:
Window> Anima�on> Anima�on que leva a uma nova aba. Esta nova aba “Anima�on”
�cará solta na tela da Unity. Podemos arrastá-la para baixo e deixar ao lado da pasta
projetos.
Personagem:Personagem:
Animação 2DAnimação 2D
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 4/66
Vamos então criar uma nova animação para o personagem. Selecione o personagem na
aba “Hierarchy”. Depois, selecione a aba “Anima�on” e veremos que existe um botão
chamado “create” ao lado direito da tela. A �gura 4.2 mostra um exemplo:
Clicando no botão “create”, uma nova tela se abrirá. Nela, devemos escolher o caminho
da pasta onde vamos salvar a animação que estamos criando.
Figura 4.1 - Print Animation Caminho 
Fonte: Elaborada pelo autor.
Figura 4.2 - Print Animation aba 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 5/66
Para isso, podemos criar uma nova pasta e dar o nome de “Pasta_Player”. Dentro dela,
guardaremos as animações que criaremos para o personagem. Daremos o nome desta
primeira animação de “Idle”, que, em português, signi�ca ocioso. Esta será a animação do
personagem parado, esperando que o jogador lhe dê algum comando, atacar, andar, ou
pular. Porém, é claro que, para isso, precisamos ainda criar todas estas outras
animações.
Para fazer a animação, é bem simples. Veja, na Figura 4.3, onde temos a aba “Anima�on”
pronta, como darmos início à criação de uma animação. Entretanto, antes de começar
este processo, vamos conhecer os controles da aba:
Preview: Este campo é ativado no momento que acionamos o play. Caso já
exista uma animação, ela será pré-visualização. O personagem �cará em
posição quando o play não estiver acionado, e se moverá quando acionado.
Record: Este botão é icônico. Ele é muito conhecido, mas, para quem não o
conhece, ele ativa a gravação. Nesse caso, a gravação da animação do
personagem.
Go to Beginning: Ele volta para o início do tempo de animação.
Go to Previous: Volta para o keyframe anterior ao atual.
Play: Executa a animação.
Go to Next: Vai para o próximo keyframe.
Go to End:  Vai para o último keyframe.
Timer: Mostrador numérico que informa onde o ponteiro da animação está.
Nome da Animação: O campo abaixo do “Preview” é onde está mostrando o
nome da animação e é onde podemos clicar para criar uma nova animação.
Samples: É um mostrador numérico que informa a distância entre os
keyframes. Podemos desacelerar ou acelerar a animação alterando este
número.
Add keyframe: Clicando nele, poderá adicionar um novo keyframe de um ou
mais objetos selecionados que compõem o player, como podemos ver na
Figura 4.4. Cada keyframe é responsável por indicar em qual ponto da
animação será a posição, escala e rotação de determinados objetos, ou seja, é
um ponto presente na linha do tempo (Timeline) da animação. Sua função é
armazenar informações sobre o posicionamento de objetos que compõem a
animação. Perceba que, de um keyframe para o outro, existe uma lacuna de
movimento, onde um keyframe está em uma posição, escala e ou rotação de
uma forma, e o próximo está com posição, escala e ou rotação com outros
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 6/66
valores. É aqui que a Unity faz sua mágica, não precisamos montar a animação
quadro a quadro, pois esta lacuna será preenchida pela Unity.
Add event: Este evento está relacionado com os Scripts atrelados ao player.
Podemos adicionar um método a ele e, no momento que for acionado o
método, será acionado.
As keyframes são os pequenos losangos que vão aparecer na linha do tempo da
animação assim que iniciarmos a troca de posição das partes do corpo na Scene:
Podemos ver, na Figura 4.3, o processo de se criar uma animação. Precisamos acionar o
botão de gravar, o “Record” e mover a barra de tempo além do zero, para que, quando as
partes do corpo do personagem forem movimentadas, este movimento tenha um
intervalo de tempo do início do até o �nal.
Este intervalo pode ser aumentado após a conclusão da animação. Para isso, clique no
keyframe desejado e arraste-o para frente ou para trás, dentro do intervalo de tempo
que pode ser visto acima dos keyframes.
Lembre-se de garantir que o personagem está encostado no chão, ou seja, que o limite
do componente collider do pé do personagem está em aparente contato com o collider
dos tiles abaixo de seus pés. Para garantir isso, após mover o personagem, segure a tecla
Figura 4.3 - Print Animation Início 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 7/66
“Shift” do teclado e clique no objeto player e no objeto grid, assim ambos mostrarão
seus colliders e poderá veri�car isso.
Atenção, ao selecionar mais de um objeto, não os movimente dessa forma, pois assim
moverá os dois objetos ao mesmo tempo.
Podemos ver na Figura 4.4 a animação de ataque. Devemos selecionar o objeto que
gostaríamos de mover, rotacionar e movê-lo para onde desejamos. A Unity fará o resto,
se achar que, de um keyframe para o outro, caberia mais um keyframe para fazer com que
a animação �que mais suave. Pode simplesmente clicar entre os keyframes que
desejamos re�nar e, com o botão “Record” ligado, podemos clicar no botão “Add
keyframe”, e este novo keyframe será adicionado à linha de tempo da animação no local
que foi selecionado anteriormente.
Uma dica: em quase todos os movimentos que serão executados em “loop”, podemos
fazer a animação para frente e, então, uma a uma �leira de keyframes pode selecioná-la e
usar o (Ctrl + C) e (Ctrl + V) para vir fazendo o movimento inverso da ação.
Por exemplo, a animação de andar. Podemos mover a perna do personagem da esquerda
para a direita e, em sequência, fazer o movimento inverso com a outra perna e depois
colocar esta animação em “loop”. Pronto! A animação de andar estará concluída.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 8/66
Esta parte da animação é uma coisa muitopessoal, mas faça testes e veja qual a melhor
sequência de posições que lhe agrada mais. Vá criando as animações desejadas, mas, ao
mesmo tempo, crie as que comentamos anteriormente, pois vamos usá-las mais à
frente.
Para fazer uma animação ser executada em “loop”, precisamos acionar esta opção
diretamente no arquivo da animação; portanto, vá até a pasta que escolheu para
guardar a animação no momento em que ela foi criada. Ao selecionar o arquivo da
animação, veja na aba “Inspector” quais informações sobre o arquivo apareceram. Uma
das primeiras informações que estarão dispostas no “Inspector” será um campo que
pode ser selecionado chamado “loop”. Marque este campo para as animações que
deseja que �quem com o funcionamento em   “loop”, ou seja, as que desejamos que
�quem repetindo enquanto estamos segurando o botão do teclado ou na tela do celular.
Animações como atacar ou pular não queremos que �quem em  “loop”, pois queremos
que elas sejam executadas uma vez a cada disparo da animação. Por exemplo, imagine
que apertou o botão para o personagem pular de uma plataforma para outra. Ao clicar o
botão, o personagem faz algum tipo de movimento, digamos que ascendente, como se
estivesse pegando impulso e, no �m deste movimento, dá um soco no ar. Caso o “loop”
esteja marcado, até que a animação seja �nalizada por algum motivo, o personagem
�cará repetindo todo este movimento, mesmo que ainda esteja no ar.
Bom após �nalizar todas as animações, devemos explicar para a Unity de alguma forma,
em qual ordem ou sequência essas animações devem ser executadas.
Para que possamos �nalizar o processo de animação, precisamos ajustar mais uma parte
deste procedimento, como o ciclo de animação na aba “Animator”, que pode ser
encontrada neste caminho   Window> Anima�on> Animator. A Figura 4.5 traz um
exemplo de como deve �car a sequência de ações a serem animadas:
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 9/66
Veja que a sequência da animação está montada e age como um sistema redundante,
onde partimos do estado(State) verde “Entry”, que é a execução do jogo. O primeiro
estado de animação é o estado em amarelo “Idle”. Em volta, os outros possíveis estados,
como: andar, pular, cair e atacar, tudo isso �ca no “Base Layer”, que é a camada criada de
forma padrão quando criamos a animação.
Perceba que, ao selecionar o personagem e abrir esta aba, todas as animações que
forem criadas através do uso de um determinado objeto, são incluídas na “Base Layer”.
Porém, caso tenha alguma que deseja adicionar, pode  incluir uma nova animação.
Para fazê-las funcionar da maneira que desejamos, precisamos criar alguns parâmetros,
mas antes vamos aprender como esta aba funciona.
Veja que do lado esquerdo da tela exibida na Figura 4.5, abaixo do nome da aba, temos o
“Parameters”, onde podemos criar quatro tipos de variáveis que podemos usar para
controlar quando determinada animação deve ser executada. No sinal de (+), ao clicar,
os tipos de variáveis apareceram na seguinte sequência: �oat, int, bool e trigger; já
sabemos o que cada uma delas faz, mas vamos entender melhor seu funcionamento
especí�co a seguir:
Float: Podemos escolher um determinado valor de número �oat(real) e, ao
atingir determinado valor ou não atingir, executamos a animação.
Figura 4.5 - Print Animator 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 10/66
Int: Podemos escolher um determinado valor de número int(inteiro) e, ao
atingir determinado valor ou não atingir, executamos a animação.
Bool: Aqui só podemos ter os valores de verdadeiro ou falso e da mesma
forma executar a animação.
Trigger: Este valor informa que a animação será disparada.
Bom, quando escolhemos que tipo de parâmetro criar, podemos dar um nome ao mesmo
e, caso deseje deletar um deles, basta clicar com o botão direito do mouse sobre seu
nome e escolher delete.
Perceba que, na Figura 4.5, todos os parâmetros são do tipo booleano. Podemos ver
que, depois dos nomes dos parâmetros, tem uma caixa que permite deixar o parâmetro
marcado. Nesse caso, marcado é verdadeiro, e desmarcado é falso.
Com o estado(Idle) selecionado, podemos ver suas con�gurações na aba “Inspector”,
além das transições(Transitions). O que está demonstrado na Figura 4.6 é o padrão na
criação de um estado:
Em sequência, podemos ver na Figura 4.7, na aba “Inspector”, as opções de con�guração
de uma transição(Transition) que leva à animação do estado(Idle) para o estado(Jump).
As transições são a parte que faz a máquina de estados se comunicar, ou seja, faz um
estado passar para outro.
Figura 4.6 - Print Animator Inspector do Estado 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 11/66
A Figura 4.7 mostra uma maneira básica de con�guração de como parametrizar a
passagem de um estado para o outro. Vendo as con�gurações que aparecem na aba
“Inspector”, podemos ver que existem algumas boas parametrizações que podemos
fazer para tentar garantir que a animação a ser executada é a animação que desejamos.
Podemos usar a transição de maneira “solo”, ou mutar todos os outros estados da
máquina. Podemos marcar o campo “Has Exit Time” e decidir um tempo mínimo para
acabar a animação até que ela possa ser trocada. Quando marcamos este campo,
habilitamos o campo dentro da área de con�gurações(Settings).
Vejamos os campos de con�gurações a seguir:
Exit Time: Só temos acesso quando o campo “Has Exit Time” está marcado.
Então, podemos marcar o tempo de saída do estado. Em um exemplo, podemos
colocar o número 0.5. Isso vai signi�car que, quando a animação estiver em
50%, na contagem do primeiro frame, este valor seja verdadeiro. Neste ponto,
a animação terá seu tempo de saída alcançado, sendo assim será �nalizada.
Fixed Dura�on: Mantendo este campo marcado, teremos um tempo de
duração para a execução do estado interpretada em segundos. Caso contrário,
a execução será marcada com um valor estipulado pela Unity, que é
basicamente o tempo de processamento do estado.
Transi�on Dura�on: É o valor que será usado para informar a duração da
transição.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 12/66
Transi�on Offset: É usado para posicionar a transição dentro de seu próprio
tempo. Por exemplo, podemos informar o valor de 0.5 e ver que a transação
terá início na marca de 50% da animação.
Interrup�on Source: Aqui podemos informar se desejamos permitir algum
tipo de interrupção por outro estado. Podemos dizer que, caso determinados
parâmetros sejam atendidos, o estado atual é interrompido.
Ordered Interrup�on: Determina quando este estado pode ser interrompido
por outro estado, não importando sua ordem. Este campo só �ca acessível
quando o campo “Interrup�on Source” estiver marcado.
O próximo item que aparece é um mostrador que representa a transição que está
selecionada e, por �m, podemos adicionar condições (Conditions) para esta transição
funcionar, ou seja, podemos usar os parâmetros que criamos para informar, através do
código, se o parâmetro é verdadeiro ou falso, habilitando assim a determinada
transação a ser comprida. Nesse caso, poder sair do estado(Idle) e executar o estado
(Jump).
Veja que no exemplo da Figura 4.7, temos apenas uma condição e a mesma se refere ao
parâmetro “IsJumping” que é verdadeiro. Dessa forma, pode ser feita a transição entre o
estado(Idle) e o estado(Jump). Perceba também a necessidade de adicionar novos
parâmetros, através do sinal(+) e retirar um parâmetro selecionado clicando no sinal(-).
Assim, podemos exigir que mais condições sejam consideradas antes de permitir que a
animação seja executada.
Após a criação das animações será necessário ajustar as transições entre as animações,
como vemos na Figura 4.7.
Selecioneo estado de onde deseja que a transição seja originada. Clique com o botão
direito do mouse este estado. Uma caixa de opções surgirá, com a opção fazer
transição(Make Transition). Escolha esta opção.
Deve-se notar três coisas: caso clique com o botão direito um estado que não foi
anteriormente selecionado, outras caixa de opções surgirá. Ela é usada para criar novos
estados. A segunda é, para identi�car se o estado está selecionado, veja se o mesmo está
com a borda azul. A terceira é a seta que direciona de onde a transição deve partir. Ela
sempre aponta contra o estado selecionado.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 13/66
Veja aqui o exemplo de como �caram as con�gurações de transição entre os estados da
máquina de estados da animação. Vamos falar dos campos que forem alterados, e os
campos que não serão alterados �carão como o modelo padrão que a Unity gera com a
criação da transição.
Exemplo de Transições:
Idle > walk: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.1. Por �m, adicione uma
condição(Conditions), “IsWalkling” = true.
walk > Idle: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.1. Por �m, adicione uma
condição(Conditions),  “IsWalkling” = false e “Idle_Sword” = true.
Idle > jump: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.1. Por �m, adicione uma
condição(Conditions), “IsJumping” = true.
jump > Idle: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.05. Por �m, adicione uma
condição(Conditions), “IsJumping” = false, “IsWalkling” = false, “Idle_Sword” =
true.
Idle > A�ack: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.05. Por �m, adicione uma
condição(Conditions), “IsA�acking” = true, “IsWalkling” = false, “IsOnGround”
= true,  “IsFalling” = false.
A�ack > Idle: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0. Por �m, adicione uma
condição(Conditions), “IsA�acking” = false, “IsWalkling” = false, “IsJumping” =
false, “IsFalling” = false.
Idle > fall:   Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0. Por �m, adicione uma
condição(Conditions), “IsFalling” = true, “IsJumping” = false, “IsOnGround” =
false.
fall > Idle: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0. Por �m, adicione uma
condição(Conditions), “IsWalkling” = false, “IsFalling” = false.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 14/66
Até, aqui temos as transições do estado “Idle” para os estados “walk”, “jump”, “A�ack”,
“fall”, e as transações de retorno destes estados para o estado “Idle”. Vejamos agora as
transições entre os estados  “walk”, “jump”, “Attack”, “fall”.
walk > jump: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.1. Por �m, adicione uma
condição(Conditions),“IsJumping” = true.
jump > walk: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0.05. Por �m, adicione uma
condição(Conditions), “IsJumping” = false,  “IsWalkling” = true.
walk > fall: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0. Por �m, adicione uma
condição(Conditions), “IsJumping” = false, “IsFalling” = true, “IsOnGround” =
false.
fall > walk: Desmarque o campo “Has Exit Time”, marque o campo “Fixed
Dura�on” e “Transi�on Dura�on” = 0. Por �m, adicione uma
condição(Conditions),“IsFalling” = false, “IsWalking” = true.
As transições entre “A�ack”, “fall” e “walk” são apenas exemplos. Não vamos utilizá-las
neste projeto.
Personagem: Ataque
Antes de passarmos ao código, vamos criar o sistema de ataque do player. Para isso,
devemos adicionar um novo objeto vazio como “child” do objeto “Player”. Dê o nome
deste objeto de “ATK”. Ele será usado para determinar o ponto de interação do ataque
com o inimigo que estiver no mesmo ponto. Isso evitará que ataquemos um inimigo que
esteja fora do alcance do player.
Este código já foi criado anteriormente. É o “Script” “PlayerMove”. Ele é usado para
mover o personagem. Nesse novo código, podemos ver algumas alterações que são
relacionadas à atuação do código junto aos parâmetros são usados para validar as
transições da máquina de estados que controlam as animações. Assim, temos as
questões do ataque do player.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 15/66
Substitua seu código antigo por esse novo código e veja as diferenças que ele causará
em seu jogo. Atente-se às novas necessidades que surgirão na aba “Inspector”.
Essas necessidades são as variáveis: “Dano”, “ATK_Timer”, “ATK Pos”, “Tipo Inimigo”,
“Range ATK”.
Vamos falar do código e ver o que tem de diferente que ainda não foi abordado:
[DefaultExecu�onOrder(-100)]: Cria uma ordem de execução no processo
criado dentro da classe onde este código se encontra.
private Animator Anim: Objeto usado para inserir valores nas variáveis que
criamos dentro da Unity na aba “Animator”. Dessa forma, podemos alterar de
verdadeiro ou falso os parâmetros que fazem as mudanças de animação
funcionarem.
public float dano = 10: Variável usada para determinar a quantidade de dano
que o player vai inferir ao inimigo.
public float ATK_Timer = 0.5f: Variável usada para determinar intervalo de
tempo entre os ataques do player, ou seja, o player não poderá realizar o
próximo ataque antes que este tempo passe.
public Transform ATKPos: Esta variável receberá na aba “Inspector” o novo
objeto vazio que criamos anteriormente o objeto “ATK”.
public LayerMask �poInimigos: Máscara criada para determinar a quem o
player poderá atacar. A “LayerMask” exibirá uma lista na aba “Inspector” para
que possamos selecionar a “Layer” do inimigo.
public float rangeATK: Esta variável será usada para determinar o alcance da
área do ataque do player, ou seja, todo inimigo que estiver dentro desta área
receberá dano do ataque do player.
Anim = GetComponent<Animator>(): Inicia a variável “Anim”, através da
indicação do componente “Animator” que está atrelado ao player.
rig2D = GetComponent<Rigidbody2D>(): Inicia a variável “rig2D”, através da
indicação do componente “Rigidbody2D” que está atrelado ao player.
private void OnDrawGizmosSelected(): Este método vai gerenciar a criação
do campo onde o player poderá inferir o dano de seu golpe em um inimigo. O
Gizmo é usado para criar um adereço visual no momento da depuração ou
con�guração. O mesmo é exibido de Scene.
Gizmos.color = Color.red: Informamos nesta linha a cor que queremos que a
área do ataque tenha, lembrando que esta área só será vista na aba “Scene”.      
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 16/66
 
Gizmos.DrawWireSphere(ATKPos.posi�on, rangeATK): Para criar a esfera na
tela, precisamos de dois valores, a primeira é a posição onde ela �cará na tela.
A outra é o raio da esfera. Estes valores são informados pelas variáveis
“ATKPos” = posição e “rangeATK” = raio.
if (Anim.GetBool("IsAtacking")) { moveHorizontal = 0; }: Veja nesta linha de
código que criamos uma condição via código para que o personagem possa se
mover dentro do jogo. Nesse caso, queremos que o personagem se mova
somente quando não estiver atacando, ou seja, somente parado o personagem
pode atacar. Caso o mesmo esteja em movimento, o ataque irá prevalecer ao
movimento, e o personagem para de andar para atacar e também, quando
estiver atacando, ele, antes de poder andar, o ataque precisa ser �nalizado.
Collider2D[] inimigos = Physics2D.OverlapCircleAll(ATKPos.posi�on,
rangeATK, �poInimigos): Cria uma lista de colliders com o nome inimigo. Esta
lista é preenchidacom todos os inimigos que causarem uma sobreposição de
seus colliders a área de ataque do player. Para criar essas ocorrências de
sobreposição, precisamos de três valores, “ATKPos” = posição da área de
ataque, “rangeATK” = o valor que de�ne o tamanho da área e “�poInimigos” =
a máscara que de�ne que tipo de objeto pode ser atacado.  
Debug.Log("inimigos.Length " + inimigos[i].name): Este código é usado para
que possamos veri�car. Enquanto o jogo está rodando, a sobreposição
ocorrendo, no momento que algum inimigo estiver dentro do campo, quando o
jogador pressionar o botão de ataque, esta linha vai mostrar no console as
informações correspondentes ao inimigo que estiver dentro do alcance.
Lembre-se de que as informações geradas pelo “Debug” são informações que
serão geradas para análise do funcionamento do jogo e não serão exibidas no
jogo em si.
inimigos[i].GetComponent<Inimigo>().setVida(dano): Este é o código usado
para usar o método setVida que está dentro do Script “Inimigo”. Veja que, para
usar este método, precisamos informar um valor. Este valor é a variável do
dano que criamos dentro do Script do player.
if (collision.tag == "Plataforma"): Gerencia se o player está no chão, ou seja, se
o collider do player está colidindo com o tile que o player deve �car sobre,
quando não está pulando.
if ((moveSpeed != 0) && !Anim.GetBool("IsJumping") &&
!Anim.GetBool("IsFalling") && Anim.GetBool("IsOnGround")): Este “If” é
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 17/66
usado para analisar se existe um valor de movimento diferente de zero; se o
pulo é falso; se caindo, é falso; e se a colisão com o chão é verdadeira. Caso
tudo isso seja atendido, a animação que faz o player andar pode ser executada.
else if (moveSpeed == 0 && !Anim.GetBool("IsJumping") &&
!Anim.GetBool("IsFalling") && Anim.GetBool("IsOnGround")): Este “else If”
exige que a variável “moveSpeed” seja igual a zero; que o pulo seja falso; que
caindo seja falso; e que a colisão com o chão seja verdadeira. Caso tudo isso
seja atendido, o player não está andando e está parado. Sendo assim, pode ser
executada a animação do “Idle”.
Vemos na Figura 4.7 que os nomes dos parâmetros que aparecem na mesma, são os
mesmos que aparecem no código. Sendo assim, podemos ver que, para o acesso a esses
parâmetros, precisamos garantir a paridade dos indicadores que, nesse caso, são os
nomes, ou seja, os mesmos nomes usados para identi�car os parâmetros dentro da Unity
devem ser usados no código.
Veja na Figura 4.8 um exemplo do posicionamento da área de ataque do player, e tenha
uma ideia do tamanho que ela deve ter, lembre-se que isso será de�nido segundo o seu
game design.
Verá mais à frente que a distância de ataque do inimigo deve ser compatível ao tamanho
da área de ataque do player, mas, novamente, isso é in�uenciado pelo seu game design.
Muitas vezes, fazemos um game design e não �ca muito bom ao ser implementado. Esse
tipo de detalhe pode ser melhor percebido no momento em que o jogo está sendo
programado.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 18/66
Comece criando a animação de caminhar, pular, atacar e continue com as outras. Caso
não queira usar uma das mencionadas, será necessário comentar ou remover algumas
das linhas que trazem a utilização desses parâmetros. Um exemplo seria este código,
“Anim.SetBool("IsJumping", false)”.
Perceba que esta parte é um pouco complexa, pois caso as parametrizações �quem
erradas, o funcionamento de troca entre as  animações �cará confuso, e o personagem
não terá um bom resultado entre suas animações.
O melhor que temos a fazer é modelar essas mudanças de animação de forma que o
código no C# e as transições dentro do “Animator” �quem em harmonia. Para isso, o
ideal é fazer uma transição por vez, testar o resultado e passar para a próxima transição.
A cada nova transição, o ideal é que teste as outras para garantir que uma não está
interferindo na outra.
Os parâmetros que são usados dentro da aba “Animator” e as transações devem estar
bem claras. Muitas vezes, criar vários parâmetros para de�nir a troca entre as
animações acaba causando muita confusão. Em muitos casos, o problema pode estar em
seu código.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 19/66
praticarVamos Praticar
Para fazer uma animação, precisamos gravar os movimentos de um determinado personagem
ou objeto. Para isso, a Unity disponibiliza um sistema que auxilia o desenvolvedor e facilita este
processo. No �nal, temos um arquivo que agrupa todas as mudanças que a animação precisa
para ser executada. Nesse sentido, assinale a alternativa que apresente o nome da aba usada
para fazer a animação de um GameObject na Unity.
a) KeyFrame.
b) Animator.
c) Canvas.
d) TimeLine.
e) Animation.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 20/66
Como já aprendemos a montar o personagem e a animá-lo, podemos repetir este
mesmo processo para criar e animar qualquer outra forma que deseje dentro do jogo. O
inimigo é uma delas.
Na pasta: “Assets/Tasty_Characters - Castle Pack/Assets/textures/PackCastle01.png”,
podemos achar a imagem que contém os pedaços de soldados. Podemos escolher qual
desses soldados será nosso inimigo, ou mesmo criar vários inimigos com base nesses
soldados. Lembre-se de criar uma nova “Layer” e “Tag” para o objeto “Inimigo”.
Só lembrando que “Layer” é a camada onde o objeto �cará na ordem do render.
Podemos imaginar essa ordem usando uma pilha de pratos. Os pratos mais altos na pilha
serão os últimos a serem renderizados, pois eles serão renderizados por cima dos
outros.  
A “Tag” é simplesmente o identi�cador, o nome do objeto.
Uma destas imagens será usada para criar nosso rei que dentro em breve entrará no
jogo.
Veja na Figura 4.9 o resultado que esperamos para um possível inimigo: 
Construindo eConstruindo e
Parametrizando oParametrizando o
InimigoInimigo
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 21/66
Podemos ver na Figura 4.9 que o personagem está usando 3 colliders, e o inimigo apenas
dois. O collider que está no pé do personagem é um trigger. Este collider é usado para
acionar os triggers, como o da porta e vários outros como o de pulo.
Veja na Figura 4.10 que os colliders do player e do inimigo, que são usados para colidirem
com o chão, colidem-se entre eles e criam este problema que vemos na Figura 4.10. Será
necessário fazer esta colisão entre eles acabar. 
Figura 4.9 - Print Inimigo 
Fonte: Elaborada pelo autor.
Figura 4.10 - Print Problema collider 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 22/66
Para corrigir este problema, existe uma solução simples, mas, dessa forma, abriremos
mão da colisão entre o personagem e o inimigo, ou seja, eles vão passar um dentro do
outro, uma coisa muito comum em vários outros jogos 2D. Como neste jogo isso não é
necessário, podemos usar esta solução que fará o collider do player passar direto pelo
collider do inimigo. Para isso, devemos seguir este caminho: Edit> Project Se�ngs>
Physiscs 2D, chegar até a tela de con�gurações da física do jogo. A Figura 4.11 traz um
exemplo da mesma. 
Desmarque na “Layer Collision Matrix” o campo que encontra as duas Layer desejadas.
Nesse caso, o player e o Inimigo. A Figura 4.11 traz um exemplo: 
g
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 23/66
Como já �zemos a animação de ataque do personagem, vamos pensar em como fazer a
animação de andar do inimigo. Para que o inimigo possa andar, podemos fazer um
sistema de animação simples. Basta fazera transição das pernas de um lado para o
outro, ou seja, devemos arrastar a perna da direita para a posição da perna da esquerda
e depois repetir o processo com a perna da esquerda indo para a posição da perna da
direita. Por �m, copie os primeiros “keyframe” da animação e cole-os no �m na linha de
tempo da animação, deixando uma distância de tempo igual entre as três colunas de
“keyframe”.
Lembre-se sempre de ativar o botão “Record” para que sua animação seja gravada. Caso
contrário, terá que repetir todo o processo que acabou de fazer.
Como cada animação deve ser feita levando em consideração os resultados visuais que
desejamos ter e seu processo é basicamente igual, só mudando as partes do
personagem de posição em uma ordem que seja minimamente coerente. Antes de
continuar, �nalize as animações restantes, para que o inimigo possa andar e atacar.
Por �m, para que o inimigo possa se mover pelo jogo e consiga perceber o personagem e
atacá-lo, precisamos de um sistema que perceba que o player está em seu campo de
visão e quando está em seu campo de ataque.
Para criar este mecanismo, uma das opções mais simples de ser usada é a técnica do
“raycast” e para que tudo dentro do código do personagem possa �car organizado,
Figura 4.11 - Print Con�guração Física 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 24/66
vamos introduzir uma outra técnica, a máquina de estados. 
Raycast: O ray tracer é apenas um raio que tem um determinado
comprimento. Ele vai do ponto A ao ponto B e colide com o collider que estiver
atrelado a um objeto. Sendo assim, devemos dizer em qual collider o ray tracer
precisa colidir. Nesse caso, no collider do player.
Máquina de Estados: A máquina de estados é uma maneira de de�nirmos uma
ordem na execução do código. Em cada “case” desta máquina, devemos
colocar o código que desejamos executar. Dessa forma, �ca mais simples para
organizar o código e, com isso, os movimentos dos NPCs �caram mais �uidos.
Usa-se muito a máquina de estados para criar IAs de maneira simples para
jogos em geral. 
Vamos comentar o código:
public Transform ray: Esta variável armazena o ponto onde o raio terá seu
início. Dessa forma, podemos mover o raio para a melhor posição através da
movimentação de um objeto na aba Scene. Com isso, vemos que será
necessária a criação de um novo objeto vazio como “child” do objeto Inimigo.
private int state = 0: Variável usada para determinar em qual estado a
máquina de estados está no momento. Perceba que ao criar esta variável, já
iniciamos a mesma com o valor zero. Dessa forma, iniciamos a máquina de
estados.
private bool Dir = true: Variável usada para determinar a direção que o
inimigo está se movendo, ou seja, quando verdadeira, está se movendo direita,
e quando falso para a esquerda.
public float mostrador: Esta variável mostra o tempo que o personagem tem
para se mover para determinado lado. A mesma é usada somente para mostrar
o tempo restante na aba “Inspector”.
public bool Direc�on: Esta variável é usada para mostrar a direção que o
inimigo está se movendo. Quando verdadeiro, está se movendo para um lado,
e quando falso está se movendo para o outro lado.
private float tempoPatrulha = 3f: Este valor é o tempo que o inimigo tem para
mudar a direção em sua patrulha. Anda três segundos para um lado e depois
outros três segundos para o outro. Esta variável �ca na espera quando o
inimigo está perseguindo o jogador.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 25/66
private float �mer = 0: Esta é a variável responsável por contar o tempo, ou
seja, ela acumula o tempo e, quando chega nos 3 segundos, ela é zerada para
voltar a contar o tempo.
private bool goTo = false: Esta variável é a que determina a movimentação do
inimigo. Quando o tempo, chega no valor desejado esta variável muda de
verdadeiro para falso e vice-versa.
private bool alcance = false: Esta variável é acionada quando o ray tracer que
usamos para perceber se o jogador está na visão do inimigo colide com o
colisor do player. Dessa forma, acionar outros mecanismos no código, como a
máquina de estado e a mudança do comportamento do inimigo de ronda para
perseguição.
public float dist_ATK: Esta variável determina a distância mínima do ray tracer
que usamos para o ataque.
private Animator Anim: Esta variável é usada para controlar a troca de
animações do inimigo.
public float vida = 100: Armazena a quantidade de vida que o inimigo tem.
public GameObject efeitoHit: Usada na aba “Inspector” para que possamos
atrelar o efeito de partículas ao inimigo.
public GameObject Esmeralda: Usada na aba “Inspector” para que possamos
atrelar o objeto esmeralda ao inimigo. Com esta referência, podemos criar
esmeraldas no local onde o inimigo foi destruído, como um “drop”.
Drop: Esta palavra é usada para simbolizar a ação de soltar um item quando o
inimigo é retirado da cena, sua tradução é “soltar”.
setVida(): Este método é usado para gerenciar a entrada de dano no inimigo.
Ele executa os efeitos de partículas e, quando a vida do inimigo acaba, ele
executa o efeito de drop dos itens.
switch (state): O switch é uma estrutura de camadas. Ela é ótima para criar a
máquina de estados, onde apenas uma de suas “case” podem ser executadas
por vez. Para escolher qual “case” será executada, usamos a variável “state”.
Enquanto a variável “state” mantiver o determinado valor, o mesmo estado
continuará sua execução.  
Timer(): Método que gerencia a troca de tempo. Enquanto a variável “�mer”
não atingir o valor desejado, ela acumula o tempo para que o “�mer” possa
mudar a direção na qual o inimigo está andando. Para isso, ele troca o valor da
variável “goTo”.
Move(): Método que gerencia a movimentação do inimigo.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 26/66
FOV(): Este método é muito importante. Ele é o responsável por criar os “ray
tracer” e perceber quando o jogador entra em contato com o raio e mudar o
estado da máquina de estados, através da variável “alcance”. FOV é um
acrônimo que quer dizer campo de visão (Field of View).
RaycastHit2D: Esta classe é a responsável por criar o raio que será usado pelo
inimigo como campo de visão. Percebe-se no código que temos dois tipos
diferentes de raios: um usado para perceber se o player está no campo de visão
e fazer o inimigo perseguir o player e outro que é menor. Quando o player
atinge esta distância, o inimigo pode então atacá-lo. Os raios são
“followRay2D” que são usados para perceber se o player está dentro do campo
de visão do inimigo e muda o estado da máquina de estados para perseguir o
player, e o “hitRay2D” que gerencia a aproximação de ataque do inimigo.
Physics2D.Raycast(ray.posi�on, -ray.right, dist_ATK): Esta linha de código
mostra a criação do raio “followRay2D” ou “followRay2D”. Veja que temos o
ponto inicial logo em seguida da direção para onde este raio será direcionado
e, por �m, o tamanho deste raio.
Debug.DrawLine(): Este código é usado para desenhar uma linha de um ponto
de origem até um ponto �nal, ou seja, do ponto A até o ponto B. Nesse caso, o
ponto de origem é o inimigo, e o ponto �nal é determinado pelo tamanho deste
campo de visão. Três valores são necessários para desenhar esta linha o ponto
de início o ponto �nal e a cor da linha.
A Figura 4.12 mostra um exemplo de como o inimigo �cará na aba Scene, lembrando que
o raio só vai aparecer quando o jogo estiver rodando, e o mesmo não aparecerá na aba
Game, o comando “Debug” é usado para criar alguns tipos de representações dentro do
cenário de criação do jogo, ou seja, essas informações não são para serem mostradas ao
jogador e não aparecem no produto �nal, mas seus efeitos sim.
Podemos ver também na Figura 4.12 que o ponto de onde sai o raio que vem do inimigo
em direção ao player é a variável ray do tipo“Transform”, ou seja, este é o ponto onde foi
posicionado o objeto vazio que criamos só para a geração do raio. 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 27/66
Perceba na Figura 4.12 que o raio está vermelho em uma parte e em outra está verde.
Isso ocorre porque os dois raios foram posicionados um sobre o outro. O raio que está
vermelho �cou vermelho no momento em que colidiu com o player, e o outro está verde,
pois ainda não colidiu. Outro ponto interessante é que o raio que está verde é o raio que
mede a distância de ação para que o inimigo possa atacar o player.
Veja que, caso o player passe direto pelo inimigo, o mesmo continuará andando na
direção oposta a do player. Isso ocorre porque é necessário criar um terceiro raio que
deve sair das costas do inimigo e permitir que o inimigo perceba quando o player está
tentando fugir dele e mudar de direção, para que o inimigo possa continuar caçando o
player. Entretanto, esta parte deixarei para que você crie e possa praticar. Tenha como
exemplo o código que já está criado.
Basicamente, para criar este outro raio, será necessário criar um novo “ray tracer” e
mudar a direção do inimigo para a direção oposta à que ele se encontra, basicamente
mudando a variável booleana “goTo”.
Veja que inimigo ainda não tem um sistema de ataque, mas anteriormente nós já
criamos um sistema de ataque para o player. Este sistema do player servirá
perfeitamente para o inimigo, pois ambos têm ataques corpo a corpo; portanto, será
somente passar este sistema de ataque para dentro do Script do inimigo e ajustá-lo ao
inimigo.
Figura 4.12 - Print Ray Tracer 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 28/66
Por �m, será necessário criar um sistema de partículas e parametrizá-lo a seu gosto.
Lembre-se de que, para criar este sistema, devemos clicar com o botão direito do mouse
na aba “Hierarchy” > “Effects” > “Par�cle System” e parametrizar este sistema. Por �m,
podemos criar um “Prefab” deste sistema de partículas e arrastá-lo para o campo
efeitoHit.
Perceba que, ao �nal da criação do inimigo, teremos uma IA que anda de um lado para o
outro. Sua patrulha para de seguir o player quando ele entra no campo de visão, mas,
quando o player sai, o inimigo volta para a patrulha. Perceba também que alguns ajustes
precisam ser feitos no inimigo. Por exemplo, caso ele chegue muito perto da parede, o
mesmo �cará andando em direção a ela até que o tempo da patrulha faça-o mudar sua
direção. Para corrigir este problema, podemos usar um sistema muito parecido com este
que já temos.   O sistema percebe a presença do player e faz a patrulha parar de
perseguir o player enquanto estiver no campo de visão do inimigo. Basta que, quando o
raio de visão, que é o mais longo, colidir com a parede, zere o tempo de patrulha e mude
a direção para o lado oposto.
Caso queira deixar o inimigo em uma plataforma no alto onde possivelmente ele
poderia cair, desative o sistema de “follow”, ou seja, de perseguição e deixe o inimigo
atacar o player caso se aproxime o su�ciente. Essas escolhas vão depender muito do seu
level design. 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 29/66
Ajuste para o modo Play da Unity
Provavelmente, se estiver praticando a construção de jogos na Unity, já deve ter tido
problemas com o botão “Play” que faz o jogo ser executado.
Imagine que vamos iniciar um teste. Para isso, é preciso clicar no botão “Play”. Jogamos
e testamos, mas, no meio do teste, apertamos o botão “Pause”, por qualquer motivo que
seja. O jogo �cará parado.
Muitas vezes neste cenário, desenvolvedores esquecem que estão no modo “Play” e
fazem alterações no cenário no level design. Após essas alterações, geralmente
desejamos testar o jogo. Então, novamente, ao pressionar o botão “Play”, tudo será
perdido, pois nada permanecerá alterado, ou seja, para alterar qualquer objeto dentro
do jogo, precisamos que o modo “Play” esteja desligado. Do contrário nenhuma
alteração será salva.
Para evitar este problema, podemos, no momento que o “Play” for acionado, alterar a
cor da Unity, veja na Figura 4.13 o caminho e o campo que precisa ser alterado. Para isso,
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 30/66
podemos seguir o caminho: Edit> Preferences> Colors> General> Playmode �nt e
alterar a cor para a que preferir. Após fazer esta alteração, teste-a executando a Unity
no botão “Play”. Lembre-se de manter o alfa da cor em transparente para que a cor não
�que sólida. 
Provavelmente, você já deve estar se perguntando quando iríamos ajustar a câmera
para que ela seguisse o player pelo mapa. Este é um processo muito simples, e a
quantidade de código envolvida neste processo é mínima. Precisamos fazer a câmera
seguir o player enquanto ele se move pelo jogo. Para isso, precisamos modi�car a
posição onde a câmera está relativa com o jogo. Podemos usar o código a seguir: 
Vamos comentar o código:
public Transform player: Usado para encontrar a posição do player no jogo.
public float smoothSpeed = 0.12f: Neste código, não estamos usando esta
variável, mas substitua posDesejada por smoothSpeed e veja o que acontece.
Dessa forma: transform.position = smoothSpeed.
public Vector3 offset: Este vetor é usado para de�nir um valor de
distanciamento da câmera em um dos eixos. Nesse caso, usamos o valor -5 no
eixo z para distanciar a câmera da posição onde o player está.
Figura 4.13 - Print Alterando Cor 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 31/66
LateUpdate(): Este update é o último update a ser acionado pela Unity. Dessa
forma, todos os movimentos já foram processados e, por último, a câmera é
atualizada.
Vector3 posDesejada = player.posi�on + offset: Este vetor é criado para que
possamos juntar os valores da posição do player mais os valores do vetor
offset.
Vector3 smoothPos: Usando este vetor ao invés do vetor posDesejada, a
mudança de posição da câmera será suavizada pelo efeito do Lerp. 
praticarVamos Praticar
A colisão em geral é uma das partes mais importantes na maioria dos jogos. Quando objetos
não colidem direito ou quando eles aceleram muito rápido e falham na colisão, isso causa
desconforto no jogador e perda da imersão. Nesse sentido, assinale a alternativa que
apresenta o nome da função que gerencia a colisão entre os objetos dentro da Unity.
a) Layer Collision Matrix.
b) Layer Collision Rigidbody.
c) Rigidbody Layer Collision.
d) Collision Matrix Rigidbody.
e) Layer Rigidbody Matrix.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 32/66
Para criar a “UI”, ou interface do usuário (User Interface), precisamos criar um objeto do
tipo Canvas. Para isso, podemos seguir o caminho:
Clique o botão direito do mouse sobre a aba “Hierarchy” > “UI” > “Canvas”; dê
o nome deste objeto canvas de “UI”; arraste a “UI” para dentro da câmera,
transformando o objeto “UI” em um “child” do objeto câmera.
Em seguida, dentro do canvas, crie dois objetos “Image”. Para isso, clique com o
botão direito do mouse sobre o objeto “UI”, que é nosso canvas e siga o
caminho “UI” > “Image”. Os nomes das imagens devem ser, “Vida” e “Pontos”.
Como �gura para nosso objeto “Pontos”, podemos usar a imagem:
“Assets/Free Game Items/300dpi/gem_1.png”. Para nosso objeto “Vida”, seria
interessante usar um coração.
Dentro de cada um destes objetos, “Vida” e “Pontos”, precisamos criar um
objeto “Text Mesh Pro”, para que possamos usar o mesmo para informar
quantos pontos pegamos na fase e quanto de vida ainda resta ao player.
Para criar estes objetos “Text Mesh Pro”, basta clicar o botão direito do mouse
sobre oobjeto desejado, por exemplo, objeto “Vida”, em seguida “UI” > “Text -
Text Mesh Pro”. Para �nalizar, apague o conteúdo do campo “Text” do
componente “Text Mesh Pro UGUI” e digite o número zero (0). 
Game UIGame UI
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 33/66
Posicione as duas imagens, cada uma em um canto da tela, de preferência nos cantos
superiores, pois, nos cantos inferiores, vamos colocar os controles. A Figura 4.14 mostra
um exemplo de como a “UI” deve �car quando �nalizada: 
saibamaisSaiba mais
Aqui podemos encontrar uma imagem de coração
que pode ser usada gratuitamente, mas é claro que,
para fazer uso da mesma, precisamos referenciar o
autor “gpway” que é o criador dessa imagem. Ela foi
disponibilizada no site “itch.io”. Além dessa
imagem, existem muitas outras neste site que
podem ser usadas de forma gratuita.
Fonte: GP WAY (2020).
ACESSAR
https://gpway.itch.io/2d-hearts
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 34/66
Veja que a Figura 4.14 traz um exemplo de onde os botões, que vamos usar para mover o
player, �caram. Mostra também onde �caram o botão de ataque, simbolizado pelo
quadrado com a espada; botão de pulo, simbolizado pelo círculo verde com um triângulo
ou seta para cima; e o botão de ação, simbolizado pelo losango amarelo com uma
engrenagem.
Por serem botões, eles serão percebidos pelo sistema de “Touch” do smartphone.
Para montar esses botões, precisamos primeiro criar um botão dentro nosso canvas
“UI”. Para isso, clique com o botão direito do mouse sobre o canvas “UI” > “Bu�on”. Este
botão será criado com uma “child” “text”. Devemos deletar a mesma. Em seguida, crie
dentro do botão uma imagem.
Vamos ver passo a passo a criação do botão ataque e, em seguida, crie os demais botões
da mesma forma.
O próprio botão tem um componente “Image” no campo “Source Image” do botão
coloque a imagem a seguir:
“Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_square-btn-normal.png”. Na
sequência, coloque a imagem da espada no objeto “Image”, que criou como “child” do
botão, este é o caminho da imagem da espada:
“Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_sword-over.png”.
Figura 4.14 - Print UI 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 35/66
Perceba que o objeto “child” sobrepõe o botão, sendo que, dessa forma, �ca aparente
que o botão tem essa imagem, mas na verdade é uma imagem composta.
Para criar ou outros botões, use as seguintes imagens:
1. Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_radiobtn-press.png
2. Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_play-over.png
3. Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_options-over.png
4. Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_small-btn-
normal.png
5. Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_play-normal.png
6. Assets/[UIFabrica]TrollNest_Free_v01/02.PNG/trollnest_radiobtn-empty.png
Veja que as imagens usadas para criar o botão de pulo e a seta para a esquerda são
imagens que precisam ser rotacionadas. Para isso, altere o eixo “Z” do campo rotate no
componente “Rect Transform”.
Por �m, quando tudo estiver em seu devido lugar, levando em consideração a
organização feita na Figura 4.14, podemos ancorar os objetos nas posições que eles
estão, para que, quando o jogo for executado em uma tela menor ou maior do que esta
que estamos usando como referência, os botões sejam posicionados proporcionalmente
no mesmo lugar, não importando o tamanho da tela.
Para ancorar os objetos que compõem a “UI”, devemos selecionar o objeto e ancorá-lo
usando a aba “Inspector”. No componente “Rect Transform” temos o campo “Anchor
Presets”. Clique ele que uma tela abrirá. Nesta tela, podemos selecionar o ponto da tela
que desejamos ancorar os botões e tudo mais que compuser a “UI”, perceba que, como
colocamos nossos objetos nos cantos da tela, devemos selecionar os respectivos cantos
da imagem para que possamos ancorar os botões e as imagens. A Figura 4.15 mostra um
exemplo: 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 36/66
Veja na aba “Scene” que o objeto selecionado foi o botão de pulo, e na aba “Inspector”
foi selecionado o canto inferior direito. Esses três objetos �caram ancorados no mesmo
canto, e os outros nos cantos respectivos.
UI: Usando Botões
Agora que os botões estão posicionados e ancorados, vamos fazer com que eles possam
mover o player pelo jogo e acionem suas ações respectivas.
Para que esses botões possam mover o player, fazer com que ele ataque, pule, continue
interagindo com as alavancas e portas do jogo, precisamos fazer algumas alterações em
nosso código.
Vamos começar adicionando o código a seguir. O mesmo será o responsável por criar as
variáveis que vão gerenciar se estamos clicando o botão ou não. Devemos adicionar
este código antes do método “Start()” que está no Script “PlayerMove”. 
Em seguida, o próximo código pode ser adicionado após o método “Start()”. Vamos
utilizar esses métodos para indicar que o botão está sendo apertado ou foi liberado, ou
seja, tem a função de gerenciar o clique dos botões. 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 37/66
Na sequência, precisamos alterar o método “FixedUpdate()”. Para facilitar, pode copiar e
colar o código a seguir no Script “PlayeMove”. Faça a substituição do código lá existente
no método “Update()”, apague os métodos “Update()” e “FixedUpdate()” e use este novo
código. Perceba neste novo código que o mesmo usa um sistema parecido com o
sistema que foi usado para mover o inimigo, mas ainda mantivemos o “moveHorizontal
= Input.GetAxisRaw("Horizontal") * speed;”. Dessa forma, podemos continuar usando o
código com o teclado do computador e também com os botões na tela. Isso só nos
facilita no momento de testar o jogo direto no computador. 
Precisamos trocar também os métodos “ATK()” e “Jump()”. Eles também vão permitir
que continue usando o teclado, mas quando o jogo for executado em um dispositivo
mobile. Dessa forma, teremos dois sistemas que movimentam o personagem, um pelo
teclado do PC e outro pelos botões que criamos na tela. Realmente, manter esses dois
sistemas, serve-nos somente para facilitar no momento do teste.
Podemos ver que poucas alterações foram feitas neste código, em comparação ao que
estava aqui anteriormente. Adicionamos mais uma condição que dispara o movimento e
informamos no código que, se for detectada a tecla correspondente no teclado, ele
aciona, ou se a variável booleana for verdadeira, ele também aciona o sinal “||” entre as
condições, que quer dizer uma condição “OU”, a outra e também foi inserido um “�mer”
simplesmente para que tenha um pequeno espaço entre a repetição da mesma ação
dentro do jogo. 
Por �m, mas não menos importante, 
Estas alterações são de suma importância para que os controles passem a funcionar, e o
jogo passe a ser viável a plataforma mobile.
Para que possamos �nalizar esta parte, precisamos criar em cada um dos botões que
estão dentro do canvas, ou seja, os botões ataque, pulo, direita,   esquerda e ação.
Precisamos criar dois tipos de gatilho nesses respectivos botões. Para isso, clique o
botão “addComponente” que está na aba “Inspector” de cada um dos botões que forem
selecionados. Encontre o “Event Trigger” e o adicione, dentro dele, os eventos “Pointer
Up” e “Pointer Downs”, nestes eventos precisamos arrastar o Player, para que o Script
“PlayerMove”   possa ser usado para encontrar os métodos que precisaremos usar no
evento. Veja um exemplo na Figura 4.16: 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 38/66
Será necessário fazereste processo para cada botão, mas, para o botão que faz a ação
com a alavanca e com a porta, precisaremos criar uma interação para cada porta e
alavanca do jogo. A Figura 4.17 demonstra um exemplo: 
Veja na Figura 4.17 que temos a porta e a alavanca referenciadas no mesmo botão.
Dessa forma, será necessário fazer alterações nos códigos da alavanca e da porta.
Figura 4.16 - Print Event Trigger 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 39/66
Para a “Porta_On/Off”, adicione o código a seguir antes do método “Start()”. 
E ainda, para a “Porta_On/Off”, adicione o código a seguir dentro do método
“FixedUpdate()”. Na verdade, precisamos somente alterar o código lá existente. Apague
a sequência de “IF Else IF” que está presente em seu código e substitua por este código
abaixo. Veja que a diferença aqui é que adicionamos novamente o sinal de “OU”(||) para
que, da mesma forma, as outras condições, esta também possa ser acionada de duas
formas.
Fique atento(a)!
O sinal de “OU”(||) não são duas letras “i” maiúsculas, são duas barras. Temos as barras
“|, / e \”, caso a letra “i” seja confundida e colocada no lugar das barras, o compilador de
C# anunciará um erro. 
Conceito: Esta imagem mostra a ordem dos Layers da Unity. Quanto menor o número,
mais Layers estarão sobre o mesmo, ou seja, o Layer número 0 tem 31 Layers sobre ele.
Podemos fazer uma comparação com uma pilha de pratos. O primeiro prato da pilha,
neste caso, é o primeiro prato colocado sobre a mesa, e o último prato é o mais alto
desta pilha.
Está ordem cria a ilusão de que todas as imagens estão lado a lado, mas esta ordem é
usada para mostrar para a Unity quem ela deve renderizar sobre quem.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 40/66
Não só a Unity trabalha com esta técnica de multiLayers, mesmo não tendo a �gura do
Layer, a ideia de sobreposição por posição ou ordem de render é uma ideia muito usada
na construção de jogos 2D. 
Conceito: Como aqui é um castelo, o layer 0 é a parede deste castelo, mas, caso fosse ao
ar livre, o primeiro Layer seria o céu.
Podemos ver que, sendo um castelo e não tendo outras imagens para mostrar que
representariam o mundo fora dele, as paredes podem ocupar o Layer 0, mas, caso neste
jogo tivessem imagens que mostrassem a parte de fora do castelo, as paredes do castelo
estariam em outro Layer, 3 ou 4, para que assim os Layers debaixo pudessem ser usados
para representar a paisagem de fora do castelo. 
Figura 4.19 - Fundo 
Fonte: Unity.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 41/66
Conceito: Aqui temos a parte onde o jogador vai colidir e podemos seguir a mesma
regra. Caso a parede de fundo azul for o Layer 0, em sequência podemos ter a parte
colisivo do jogo e, como esta parte precisa se sobrepor, o Layer 0 precisa estar acima
dele, podendo �car no Layer 1.
Veja que aqui já temos então um padrão para esses Layers, ou seja, a cada novo Layer,
torna-se maior a distância do Layer 0. Por esta questão, devemos deixar um espaço e
não usar uma quantidade dos primeiros Layers. Deve-se começar a ordenação deles a
partir do Layer 3, mas, caso tenhamos certeza de que não utilizaremos os layers abaixo,
podemos então manter esta con�guração. 
Figura 4.20 - Paredes Laterais, Tilemap 
Fonte: Unity.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 42/66
Conceito: Aqui temos o layer das plataformas que, neste caso, não serão sobrepostas
pelo player, mas, para manter uma ordem hierárquica, podemos colocar as mesmas no
layer 4. 
Conceito: As esmeraldas também serão sobrepostas pelo jogador; portanto, devemos
colocá-las sobre as plataformas mais abaixo do Player.
Aqui poderíamos colocar então todos os itens neste Layer. O coração seria um deles. 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 43/66
Conceito: Veja que neste caso a ordem seria sobre quem é renderizado primeiro, ou
seja, qual dos dois objetos vão passar pelo render primeiro. Caso seja o player, ele será
sobreposto pelo inimigo. Caso contrário, o inimigo será sobreposto pelo player. 
Conceito: Esta parte precisa sobrepor o jogador e todo o resto do jogo. Em outros tipos
de ferramentas que podemos usar para construir jogos, usamos ainda uma técnica de
criação de duas câmeras. Onde está parte do jogo, a interface com o usuário �caria
localizada em outra câmera. Dessa forma, ela iria sobrepor todo o resto como se
estivesse em um outro Layer. 
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 44/66
Conceito: Veja que aqui temos a soma de todos os layers, ocupando seus Layers
individuais e sobrepondo cada imagem que deve ser sobreposta pelo mesmo.
Com isso, criamos a ilusão de que os objetos estão todos lado a lado, no mesmo Layer,
dando a impressão de maior realidade no jogo. Uma outra função que faz uso desta
técnica dos Layers é a função de criar o Parallax. 
Player: Recebe Dano
Precisamos de uma maneira de fazer o player receber dano. Para isso, precisamos criar
uma variável que irá armazenar a sua vida e métodos que decrementem essa variável e
outro que incremente.
Devemos, então, criar dentro do Script “PlayerMove” uma variável chamada vida do
tipo inteira. Outra chamada “maxVida” do tipo inteira. A variável “maxVida” vai guardar
o valor máximo que a vida do player pode chegar.
A variável “maxVida” deve ser iniciada na sua criação, sendo o valor de 100 como
máximo de vida. Este número deve ser ponderado segundo o game design. Em geral, é
um bom número.
Figura 4.25 - Imagem Final
Fonte: Unity.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 45/66
Neste código, não há nada de novo. Basicamente, são métodos que tratam das variáveis
criados no “Script” que gerencia o player. Como são métodos, podemos colocá-los em
qualquer lugar do “Script”, desde que seja dentro da classe e fora de outro método, mas,
para que o código tenha uma ordem de novos métodos, vamos adicioná-los ao �nal do
código já existente no Script “PlayerMove”. 
Player: Coleta itens
Precisamos de um sistema que faça a coleta dos itens. Dessa forma, precisamos coletar
as esmeraldas e os corações, mas, para a coleta dos corações, não queremos que o valor
de “MaxVida” seja excedido. Portanto, o código precisa gerenciar esta coleta e descartar
o valor que exceder o total de vida permitido. 
Perceba que, basicamente, aqui fazemos uma máquina de estados e não existem muitos
pontos novos, apenas outra maneira de organizar o código. O elemento novo que temos
aqui é o  “default:”:
default: Usado na estrutura do “switch()”, ele é usado para que exista uma
saída padrão, onde todas as informações não desejadas devam ser designadas,
ou seja, para que algum código seja executado, precisamos informar um valor
igual ao “case” que lá existe. Quando o valor informado não existe, o “case”
“default” é acionado.
Armadilha: Spikes
Vamos criar uma armadilha para que tenhamos mais uma maneira de o personagem
perder vida pelo jogo. Esta armadilha pode ser colocada em qualquer um dos quatro
lados do tile.
Para isso, precisamos criar um novo objeto vazio e dar o nome de “Spikes”. Para que esta
armadilha possa ser animada, precisamos fazer como temos feito com todas as
animações. Precisamos animar sempre a “child” de um objeto e nunca o objeto principal,
pois a animação não funcionará corretamente caso seja feito de outra forma.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 46/66
Faça um teste. Crie uma “Sprite”. Anime-a e execute o projeto. Veja o que ocorre como
objeto “Sprite” que acabou de animar.
Devemos dentro deste objeto “Spikes” criar outro objeto vazio. Este segundo objeto
vazio precisa ser uma “Sprite”. Devemos então colocar uma imagem de um tile nele.
Escolha o tile que preferir. Para este novo objeto, daremos o nome de “Tile_Armadilha”.
Em seguida, precisamos de mais uma “Sprite” que �cará dentro do objeto
“Tile_Armadilha” que chamaremos de “Armadilha” e colocaremos a seguinte imagem:
“Assets/Medieval_pixel_art_asset_FREE/Textures/Medieval_tiles_free_135.png”, a
animação �cará no objeto “Armadilha”, ou seja, na “child” da “child” do  objeto “Spikes”. 
Perceba que, como se trata de um objeto, igual ao “Player”, “Inimigo” e a “Esmeralda”,
precisamos posicionar este novo objeto no mapa da maneira que preferir. Para que a
armadilha funcione, antes precisamos colocar no objeto “Armadilha” um collider e ativar
no mesmo o campo “IsTrigger”. Podemos ver um exemplo na Figura 4.27: 
Figura 4.26 - Print Alterando Cor 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 47/66
No exemplo da Figura 4.27, podemos ver que a imagem da armadilha, �cará escondida
por trás da imagem do tile. Dessa forma, podemos fazer uma animação simples, ou seja,
somente alterar a altura da armadilha e fazer o processo inverso para que ele suba e
desça por trás do tile e dê a impressão de que ele está levantando e furando os pés do
personagem, na Figura 4.26. Podemos ver o exemplo da armadilha acima do limite do
tile.
Vamos usar o “IsTrigger” para dar dano no jogador no momento que ocorrer a entrada
do trigger, ou seja, usaremos o método “OnTriggerEnter2D”.
Para isso, precisamos criar dentro do objeto “Armadilha” um novo “Script” que daremos
o mesmo nome do objeto ao qual ele pertence. Nesse caso, “Armadilha”. 
Podemos ver que este código não traz novos comandos, mas sim uma maneira de
encontrar e causar dano ao jogador que passar por cima dos espinhos. 
praticarV P ti
Figura 4.27 - Print Armadilha 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 48/66
praticarVamos Praticar
No momento de se criar um código, é necessário usar várias técnicas de codi�cação diferentes
e também muita imaginação. Na criação de um código, precisamos basicamente resolver
problemas matemáticos e sequências. Muitas vezes, saber qual código pode ser acionado em
determinada ordem muda muito o resultado �nal do projeto. Nesse sentido, assinale a
alternativa que apresente o sinal de código que signi�ca “OU”. Este sinal deve permitir a
passagem quando um “ou” outro parâmetro for atendido:
a) &&
b) ==
c) !=
d) ||
e) //
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 49/66
Neste ponto, já temos todas as ferramentas para a criação de um jogo plataforma e até
mesmo para outros tipos de jogos 2D. Vimos partes muito importantes sobre como criar
um inimigo, acionar objetos, coletar objeto, coletar vida e pontos. Vamos agora à parte
�nal, onde devemos polir o jogo e criar o APK.
Polindo: Tilemap
Para �nalizarmos nosso “Tilemap”, precisamos adicionar mais um novo componente. O
mesmo irá poupar memória e ajustará alguns possíveis problemas de movimentação
dentro do jogo.
Dentro do objeto “Grid”, selecione o “Tilemap” que demos o nome de plataforma, nele
adicione um novo componente. Seu nome é “Composite Collider 2D”. Este componente
mudará a maneira que os tiles são divididos em relação ao funcionamento do collider que
colocamos anteriormente. Para que o mesmo funcione, precisamos marcar um campo
no componente “Tilemap Collider 2D”, o campo “Use By Composite”. Com isso, você
verá que, ao invés de vários quadradinhos dividindo cada tile, teremos um corpo inteiro,
diminuindo muito o número de vértices deste collider e arestas, causando uma grande
economia em processamento.
Polindo o JogoPolindo o Jogo
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 50/66
Vér�ces: Os vértices são os cantos, ou seja, são as junções das arestas, onde
existem duas linhas se encontrando e criando uma ponta ou em uma curva
existem um ou mais de um vértice.
Arestas: As arestas são as linhas que ligam os vértices. Quando queremos
desenhar um quadrado, que é uma forma geométrica bidimensional, temos o
conjunto de 4 vértices e 4 arestas. As arestas são os cantos deste quadrado.
Polindo: Player
Já deve ter percebido que o player agarra muito nas paredes. Provavelmente, já deve ter
�cado louco com este problema. Mas, �que tranquilo! Agora ele será eliminado.
Para acabar com este problema, precisamos adicionar ao campo “Material” dos
componentes collider do player um novo material. Sendo assim, devemos criar este novo
material que precisa ser físico.
Na aba “Project”, onde �cam as pastas do projeto, escolha uma pasta e clique o botão
direito do mouse. Selecione a opção “create”. Ela é a primeira opção na aba que se abrirá.
Ao levar o mouse sobre o “create”, uma nova aba será aberta e dentro dela temos a
opção “Physics Material 2D”. Clique ela para que o material seja criado na pasta que
selecionou.
Veja que este material traz apenas dois campos, fricção(Friction) e
elasticidade(Bounciness). Zere esses dois campos. Simplesmente, deixe o valor ( 0 )
dentro destes deles.
Agora é só arrastar este novo material para dentro do campo “Material” que �ca dentro
do componente collider. Selecione o objeto “Player”, encontre o collider e coloque este
material no respectivo espaço e pronto. Teste para ver o resultado. Seu personagem
agora vai deslizar pelas paredes e plataformas quando esbarrar nelas ao cair ou pular.
Perceba que isso não vai alterar seu atrito com o chão. Caso contrário, reveja os passos
para corrigir possíveis erros.  
Criando o Menu
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 51/66
Claramente que este jogo precisa de uma tela com um botão start, créditos e tudo mais
que for necessário para a conclusão de um jogo. Entretanto, como este processo já foi
visto anteriormente de maneira minimamente satisfatória, neste ponto, este processo
�cará como desa�o para que você termine seu jogo.
Devemos lembrar também de selecionarmos efeitos sonoros e músicas para este jogo.
Como esta parte também já foi vista de maneira minimamente satisfatória, deixarei ela
para que você possa praticar suas novas habilidades de programador de jogos.
Fim do Jogo
O �m deste jogo será o ponto onde encontraremos o “Rei”. Para isso, precisamos então
criar mais um personagem, o nosso “Rei”.
A imagem que será usada para criar o rei pode ser encontrada junto à imagem que
usamos para criar o inimigo. O nome da imagem é “PackCastle01.png”.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 52/66
O sistema que fará o jogo saber que foi �nalizado é um sistema muito parecido com o
sistema usado para abrir as portas ou mover as alavancas. Basta que tenha um collider
que, no momento em que o jogador entrar, o jogo terá seu �m. A Figura 4.28 traz um
exemplo.
Nada de novo aqui também. Será fácil reutilizar partes de códigos que já escrevemos
para criar este �nal do jogo. Lembre-se de que o “Rei” também precisa de animação,
então não esqueça de fazer esta parte.
Figura 4.28 - Print Armadilha 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 53/66
Build: Criando o APK
Antes de construir seu APK, limpe seu código e seu projeto como um todo, delete todas
as imagens, Scripts, áudios e tudo mais que não estiver usando em seu jogo. Lembre-se
que os dispositivos mobile são muito potentes, mas têm memória de processamento e de
armazenamento limitados. Precisamos aproveitarcada bit que pudermos.
Veja na Figura 4.29 que, dentro de algumas das con�gurações necessárias para a criação
do APK, o campo “Package Name” é uma das mais importantes, para abrir esta tela. Vá
em: Edit > Project Se�ng   e escolha a opção “Player”. No campo “Package Name”,
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 54/66
escreva um nome, que em geral é o nome de sua empresa ou grupo que desenvolveu o
jogo. Este nome é usado para identi�car o pacote que vai virar o APK.
Na Figura 4.29, podemos ver também que, após o nome do pacote, temos a versão do
projeto, a versão de construção(Build) e, nesse caso, como estamos criando um APK,
que é designado à plataforma Android, podemos selecionar o sistema mínimo e o
máximo para qual desejamos que nosso jogo seja executado. Sugere-se que essas duas
opções permaneçam como padrão, a não ser que esteja desenvolvendo um jogo para
uma versão especí�ca do Android.
Está alteração é muito necessaria para que o jogo não mude sua orientação de tela, ou
seja, ela deve �car com a orientação de tela marcada como panorama(Landscape).
Dessa forma, a tela do jogo �cará travada e não permitirá que a tela gire.
Para travar a orientação da tela, basta seguir o exemplo da Figura 4.30. Na mesma tela
que está, role para cima e encontre a opção de resolução e apresentação(Resolution and
Presentation). Clique a mesma que as opções de orientação(Orientation) vão aparecer.
Mude a opção de orientação padrão(Default Orientation) para panorama(Landscape) e
escolha a opção de direita(Right) ou esquerda(Left).
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 55/66
Para gerar o APK, é simples. Veja o exemplo da Figura 4.31. Precisamos selecionar a
plataforma Android e fazer apenas uma alteração no campo “Build System”. Precisamos
mudar de “Gradle” para “Internal” e clicar no botão “Build”. Escolha uma pasta onde o
APK será gerado e pronto. Claro! Certi�que-se se todas as Scenes do seu projeto estão
listadas no campo “Scenes in Build”.
Figura 4.30 - Modo Landscape 
Fonte: Elaborada pelo autor.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 56/66
Após o processo de “Build” ser concluído, o APK aparecerá na pasta escolhida. Para
instalar o mesmo em um celular com Android, basta ligar o celular ao computador e
arrastar o APK para dentro do celular. Lembre-se de veri�car a versão do seu Android
que precisa estar dentro dos limites estipulados anteriormente na tela de
con�gurações.
praticarVamos Praticar
Na criação de um colisor para um objeto dentro do jogo, precisamos gerar basicamente uma
caixa ou círculo que informe a partir de onde começa a área da colisão com o determinado
objeto ou personagem. Para isso, a Unity nos traz vários tipos diferentes de colliders e todos
eles têm arestas. Mesmo que sejam muito pequenas e não consigamos ver se elas estão lá.
Nesse sentido, assinale a alternativa que descreva o que são arestas.
a) Podemos dizer que as arestas são os cantos de uma caixa.
b) Podemos dizer que as arestas são a área de uma caixa.
c) Podemos dizer que as arestas são o tamanho de uma caixa.
d) Podemos dizer que as arestas são as bordas de uma caixa.
e) Podemos dizer que as arestas são um conjunto de objetos.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 57/66
indicações
Material
Complementar
L IVRO
Design de Games: uma abordagem prática
Paul Schuytema
Editora: Cengage
ISBN: 8522106150
Comentário: Este livro é um livro excelente, pois traz muitas
informações sobre a maneira de se pensar na criação de um
jogo, a noção da “BluePrint” que é o game design em si. Muito
utilizado em faculdades para cursos de graduação e pós. Possui
uma linguagem prática e simples de ser compreendida e conta
passo a passo sobre a criação de personagens, níveis, menus e
tudo mais que está relacionado à criação de um bom design
para jogos.
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 58/66
WEB
INDIE GAME: THE MOVIE
Direção: Lisanne Pajot, James Swirsky. Estados Unidos:
Produção de Lisanne Pajot, James Swirsky. Documentário. 18
de maio de 2012.
Comentário: Documentário que traz os bastidores do
desenvolvimento de jogos de forma independente. Empresas
formadas por uma ou mais pessoas que começam a ganhar
mercado e mudar o panorama do desenvolvimento de jogos no
mercado do mundo inteiro, novos padrões pode ser testados e
novos limites podem ser vistos, pois estes desenvolvedores
muitas vezes estão tentando ganhar seu espaço ao sol.
Trailer do documentário a seguir.
A C E S S A R
https://www.youtube.com/watch?time_continue=150&v=dINgx0y4GqM&feature=emb_logo
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 59/66
conclusão
Conclusão
Foi uma jornada árdua, com muitos altos e baixos, teorias que não tem �m, códigos que
podem ser usados de várias maneiras diferentes, mas o mais importante, muita
criatividade.
A construção de um jogo é baseada na criatividade. Por mais que tenhamos todas as
ferramentas necessárias para a criação de um jogo, a criatividade é uma ferramenta que
não pode ser ensinada em poucas páginas e precisamos praticá-la para que a mesma
chegue nos mais altos níveis.
Na construção de um jogo, leve em consideração que a prática lhe trará conhecimento
para chegar à criação de um jogo cada vez mais completo. Estamos em uma era onde
muitos jogos independentes estão fazendo sucesso pelo mundo dos jogos. Lembre-se de
que não é necessário uma grande equipe para a criação de um jogo que pode lhe render
milhões.
Lembre-se dos desenvolvedores independentes que alcançaram esse marco para citar
apenas em temos o Minecraft.
referências
Referências
Bibliográ�cas
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 60/66
ESCOBAR, Diego Game Dev. Game mobile plataforma. 2020. Disponível em:
https://diegoescobar-gamedev.itch.io/game-mobile-plataforma. Acesso em: 16 fev.
2020.
GP WAY. 2D hearts. Banco de Imagens. 2020. Disponível em: https://gpway.itch.io/2d-
hearts. Acesso em: 16 fev. 2020.
LEVEL DESIGN - 5 REGRAS PARA ÓTIMAS FASES NOS SEUS JOGOS. YouTube.
Disponível em: https://www.youtube.com/watch?v=fskiT9pyEhU. Acesso em: 16 fev.
2020.
ROUSE, Richard. Game Design: Theory & Practice. 2. ed. USA,Texas: Wordware
Publishing, 2005.
SCOLASTICI, Claudio; NOLTE, David. Mobile Game Design Essen�als. UK,
Birmingham: Packt Publishing, 2013.
SCHUYTEMA, Paul. Design de games: uma abordagem prática. São Paulo: Cengage,
2017.
TUTORIAL UNIT 5 - SISTEMA DE PLATAFORMAS COM ROTAS. YouTube. Disponível
em: https://www.youtube.com/watch?v=El2wvn0VyEo. Acesso em: 16 fev. 2020.
UNITY. Unity Technologies. [2020]. Disponível: https://unity.com/pt. Acesso em: 17 fev.
2020.
https://gpway.itch.io/2d-hearts
https://www.youtube.com/watch?v=fskiT9pyEhU
https://www.youtube.com/watch?v=El2wvn0VyEo
https://unity.com/pt
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 61/66
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 62/66
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 63/66
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 64/66
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 65/66
09/10/2020 Ead.br
https://unifacs.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller 66/66

Continue navegando