0% acharam este documento útil (0 voto)
5 visualizações31 páginas

M4 - Unity

O documento aborda a aprendizagem baseada em competências para o desenvolvimento de jogos digitais utilizando a engine Unity. Ele cobre desde a instalação do software, criação de objetos e materiais, até a utilização de terrenos e controladores de personagens. O conteúdo é estruturado em seções que detalham as ferramentas e técnicas necessárias para criar jogos de baixa e média complexidade.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
5 visualizações31 páginas

M4 - Unity

O documento aborda a aprendizagem baseada em competências para o desenvolvimento de jogos digitais utilizando a engine Unity. Ele cobre desde a instalação do software, criação de objetos e materiais, até a utilização de terrenos e controladores de personagens. O conteúdo é estruturado em seções que detalham as ferramentas e técnicas necessárias para criar jogos de baixa e média complexidade.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

APRENDIZAGEM BASEADA EM COMPETÊNCIAS

Desenvolver jogos digitais de baixa e média complexidade utilizando motores gráficos 3D

UNITY Prof. Armando Agra


[Link]@[Link]

01 A COMPETÊNCIA
➔ bem vindos a “desenvolver jogos digitais de baixa e média complexidade utilizando motores gráficos
3d”
➔ ou… “unity”.... ou “lab3d”!
➔ nessa competência, aprenderemos tudo que for fundamental para a criação de um jogo na unity :)

02 INSTALAÇÃO
➔ os laboratórios já estão equipados para o uso da unity, mas em casa, vocês terão que instalar a
unity hub e a unity (versão lts mais nova)
➔ unity hub é o programa responsável pelo gerenciamento dos projetos e instalações da unity (é
comum ter mais de uma versão da unity instalada!)
➔ unity é a game engine em si! é o que usaremos nessa competência.

➔ após a instalação, é necessário criar uma conta e instalar a unity


➔ unity é gratuita e você só precisa pagar alguma coisa a partir dos 200.000 dólares em vendas no
ano – basta escolher o plano personal
➔ a unity tem diversas versões que podem ser instaladas, mas as mais notáveis são:
◆ versão lts: 2022.3.11f1 (versão recomendada e usada na competência)
◆ versão 2023.1.17f1 (versão estável e com novidades)
◆ pre-release 2023.2.0b14 (versão beta, instável e mais novidades)
◆ pre-release 2023.3.0a10 (versão alpha, ainda mais instável e ainda mais novidades)
➔ no desenvolvimento de um jogo, é sempre melhor utilizar a versão mais estável (lts), a não ser
que seja necessário
➔ para criar um projeto, vá no unity hub → projects → new project → 3d core e escolha um nome
pro projeto e onde ficará salvo
03 INTERFACE

Hierarquia Cena/Scene Inspector

Nossa visão de desenvolvedor da Janela de edição de


Todos os objetos
cena, é possível selecionar e propriedades do objeto
da cena ficam
transformar objetos selecionado
aqui

Project

Todos os assets (recursos) do


nosso projeto ficam aqui

➔ estão presentes também as janelas game e console


◆ game é a nossa visão de jogador
◆ console é onde as mensagens provenientes da programação ou da unity são enviadas

04 GAMEOBJECTS
➔ a base de qualquer jogo na unity
➔ todos os objetos presentes numa cena são gameobjects
◆ main camera
◆ directional light
◆ o player, inimigos, moedas, etc.
➔ os gameobjects podem (e devem) ter seus comportamentos alterados a partir de componentes

05 COMPONENTES
➔ componentes são responsáveis por alterar o comportamento de gameobjects
➔ directional light é um gameobject, mas que assume o comportamento de luz direcional por ter o
componente “light”
➔ main camera também é um gameobject, mas funciona como uma câmera por possuir o
componente camera
➔ do mesmo jeito, outros gameobjects podem assumir diversos comportamentos ao utilizar
diferentes componentes
➔ também é possível criar componentes utilizando programação, mais sobre isso já já!
06 CRIAÇÃO DE GAMEOBJECTS
➔ na hierarquia, através do botão +, é possível criar
diversos objetos prontos.
➔ experimente ir no menu de criação (+) → 3d object →
cube
➔ nesse exemplo, criamos um cubo, mas é possível criar
muito mais que isso!
➔ esferas, cilindros, cápsulas e planos…
➔ figuras 2d…
➔ efeitos e sistema de partículas…
➔ objetos que trabalham com áudio…
➔ terrenos…
➔ interface de usuário…

07 NAVEGAÇÃO
➔ agora que já sabemos criar objetos e encher nosso cenário, é interessante aprender a se
movimentar pela cena criada
➔ primeiro, com o botão esquerdo do mouse, clique em qualquer lugar da cena (visão de dev)
➔ depois, pressionando (e segurando) o botão direito do mouse, use as teclas wasd para
movimentar a câmera (nossa visão)
➔ também é possível usar as teclas q e e para ajudar na movimentação

08 PRATICANDO
➔ crie um cenário repleto de objetos: cubos, cilindros, esferas, o que der na mente!
➔ navegue pelo cenário
➔ modifique as opções de rotação e escala dos objetos

09 MATERIAIS
➔ agora que já sabemos criar objetos e encher nossa cena, é hora de dar uma corzinha e
personalidade pros objetos!
➔ para isso, trabalharemos com materiais!
➔ materiais são responsáveis por mudar a aparência dos objetos, alterando propriedades como a
cor, capacidade de reflexão, entre outras.

10 CRIANDO MATERIAIS
➔ a criação de materiais é feita de uma forma um pouco
diferente do que já vimos até agora
➔ antes, para criar objetos, acessamos o menu de criação da
hierarquia (através do +)
➔ dessa vez, criaremos um arquivo que representa o material
➔ na janela project → + → material
➔ o comportamento (propriedades, aparência) de um material é
definido pelo seu shader
➔ quando um material é criado, usa o shader padrão (standard)
➔ esse shader tem algumas propriedades bacanas de mexer!
◆ albedo: cor
◆ metallic: quão metálico é o material
◆ smoothness: quão suave (ou não-rugoso)
◆ maps: mapas para textura
◆ emission: se é um material que emite luz ou não

11 USANDO MATERIAIS
➔ depois de criar o material, para aplicá-lo num objeto, basta clicar e arrastar o material para cima do
objeto
➔ você pode arrastar tanto para o objeto na hierarquia, como também para o objeto na cena
➔ também é possível alterar o material clicando num objeto que usa o material
➔ atenção: alterar um material faz com que todos os objetos que usam esse material sejam
alterados também
12 TEXTURAS
➔ uma outra forma de pintar materiais é usando texturas
➔ texturas são imagens usadas na criação de materiais, servindo para adicionar detalhes mais
complexos para os materiais
➔ texturas podem ser fotos, pinturas, atlas de cores…

13 USANDO TEXTURAS
➔ dessa vez, precisaremos importar uma imagem, que será nossa textura
➔ vamos criar uma no paint :)
➔ depois de criar a imagem, temos que carregar a imagem para dentro da pasta de assets do projeto

➔ aí, é só carregar a textura (imagem) para um objeto – isso fará com que um material seja criado.
➔ esse material irá usar a textura como cor base (albedo)!
➔ continua sendo possível editar as propriedades do material, mesmo usando textura

14 OUTROS RECURSOS
➔ na maioria das vezes, texturas feitas no paint não serão o suficiente!
➔ o ideal é criar texturas apropriadas de acordo com cada objeto e sua malha/uv, utilizando
ferramentas de edição de imagem (photoshop, krita, gimp ou o próprio blender)
➔ …e às vezes, precisamos mesmo é de texturas realistas
➔ podemos usar os sites [Link] e [Link]
➔ nos sites, podemos baixar até texturas com qualidades decentes ou até 4k
➔ depois, é salvar, jogar no projeto e usar!

15 TERRAIN
➔ a unity possui um bom sistema de criação
de terrenos
➔ é mais uma ferramenta que pode ser usada
na criação de cenários
➔ terrenos são malhas 3d facilmente
alteráveis, que são usados em paisagens
➔ é possível criar montanhas, editar alturas,
pintar o terreno com texturas, criar árvores
e detalhamento, entre outras opções!

16 CRIANDO UM TERRENO
➔ utilizando o menu de criação de objetos da hierarquia,
podemos escolher 3d object → terrain
➔ um terreno imenso será criado!
➔ para evitar problemas de processamento, memória, é
necessário diminuí-lo
➔ selecione o terreno, escolha a última opção nos botões do
inspector (terrain settings)
➔ em mesh resolution, altere o terrain width e length para 100.
17 PRINCIPAIS OPÇÕES
em ordem, temos
➔ criar terrenos vizinhos
➔ ferramentas de terreno
◆ pintar textura
◆ pintar buracos
◆ “carimbar” terreno
◆ suavizar terreno
◆ subir ou descer terreno
◆ alterar altura
➔ adicionar árvores
➔ adicionar detalhes (ex: flores, pedras, grama)
➔ configurações do terreno

18 FERRAMENTAS DE TERRENO - “PAINT TEXTURE”


➔ essa ferramenta é usada para pintar texturas no terreno
➔ para trabalhar com ela, primeiro importe alguma textura
(grama, pedra, etc.)
➔ escolha a opção “edit terrain layers” → “create layer” e
escolha a textura
➔ a primeira textura criada irá preencher todo o terreno
➔ você pode criar mais e adicionar texturas diferentes
➔ depois é só escolher a textura desejada e pintar o terreno
➔ você pode também adicionar um mapa normal, editar
propriedades (metallic, smoothness)...
➔ experimente os diferentes tipos de pincel e altere seu
tamanho e opacidade!

19 FERRAMENTAS DE TERRENO - “RAISE OR LOWER TERRAIN”


➔ ferramenta usada para subir ou baixar terreno
➔ clique/segure o botão esquerdo do mouse para subir o terreno
➔ segure shift e clique/segure o botão esquerdo do mouse para descer o terreno
➔ só é possível descer o terreno até chegar na altura interna 0
➔ para colocar uma altura base em todo o terreno, podemos usar a ferramenta set height
20 FERRAMENTAS DE TERRENO - “SET HEIGHT”
➔ essa ferramenta é usada para determinar a altura de algum pedaço de terreno ou
o terreno inteiro
➔ bastante útil para estabelecer a altura inicial do terreno, utilizando a opção “flatten
tile”, após estabelecer a altura
➔ pode ser necessário reajustar a posição y do terreno
➔ a partir de agora, com a ferramenta de subir e descer terreno, será possível
descer o terreno mais que o normal

2 3

21 FERRAMENTAS DE TERRENO - “SMOOTH HEIGHT”


➔ essa ferramenta é usada para suavizar diferenças de altura

22 FERRAMENTAS DE TERRENO - “PAINT HOLES”


➔ essa ferramenta é usada para criar buracos no terreno
➔ não é possível criar terrenos por cima do buraco, nem é
possível fazer buracos “horizontais”, como cavernas
➔ para criar estruturas mais complexas, é possível trabalhar
com mais que um único terreno

23 FERRAMENTAS DE TERRENO - “STAMP TERRAIN”


➔ essa ferramenta é usada para “carimbar” algum um pincel no terreno
➔ é útil quando você tem algum pincel em algum formato específico
24 ÁRVORES
➔ é possível criar árvores diretamente na Unity através do menu de criação na hierarquia
➔ create → 3d object → tree
➔ mas atenção! não funciona tão bem. é melhor importar as próprias árvores de outro canto
➔ por causa disso, não vou falar sobre aqui!
➔ de qualquer forma, o sistema de terrain permite que árvores sejam posicionadas aleatoriamente dentro
do pincel do terreno
➔ é só usar a opção paint trees

25 DETALHES (MALHAS, GRAMA)


➔ do mesmo jeito que as árvores que podem ser “pintadas” no terreno, esses detalhes também podem
➔ basta trabalhar com prefabs (mais sobre isso em breve!)
➔ também é possível (e recomendado, nesse momento), simplesmente posicionar esses objetos
manualmente
➔ no exemplo abaixo, importei um .fbx de uma pedra low poly, adicionei um “detail mesh” e espalhei pelo
terreno

26 CRIANDO UM PERSONAGEM PRO JOGADOR


➔ uma parte bem difícil no desenvolvimento de cada jogo é criar um sistema de movimentação para
o jogador
➔ são muitas situações que precisam ser resolvidas:
➔ o personagem consegue pular?
➔ como o pulo é implementado?
➔ consegue subir rampa?
➔ escada?
➔ como a câmera se comporta?
➔ ainda é um pouquinho cedo para a gente implementar tudo isso do zero!
➔ portanto, dessa vez, trabalharemos com um asset pronto que faz tudo isso para a gente
➔ bônus: vem com animações!

27 STARTER ASSETS
➔ a unity disponibiliza dois controladores de
personagem que vão nos introduzir a algumas outras
ferramentas importantes
➔ controlador em primeira pessoa:
[Link]
arter-assets-first-person-character-controller-urp-196
525
➔ controlador em terceira pessoa:
➔ [Link]
arter-assets-third-person-character-controller-urp-196
526
➔ atenção: se certifique de adquirir o asset na mesma
conta que você usa na unity hub
28 IMPORTANDO OS CONTROLADORES
➔ depois de adquirir os assets, vá no menu de pacotes da unity
➔ window → package manager
➔ na janela, troque a opção “unity registry” por “my assets”
➔ procure o asset escolhido (first person ou third person)
➔ nesse .pdf (e durante as aulas), trabalharemos com o
controlador em terceira pessoa (third person controller)
➔ faça o download e depois importe
➔ escolha a opção install/upgrade, isso vai baixar outros
pacotes necessários para o funcionamento
➔ durante o import, será necessário reiniciar a unity

➔ verifique se foi criada uma pasta “StarterAssets” no projeto. se não, volte no package manager,
selecione o asset que você havia escolhido e clique em import novamente
➔ import na janelinha que aparece de novo

29 UTILIZANDO OS CONTROLADORES
➔ o asset vem repleto de pastas, scripts e outros arquivos
➔ para simplificar, não vai ser explicado o que é absolutamente tudo
➔ mas para usar o asset, vamos na pasta StarterAssets → ThirdPersonController →
Prefabs
➔ de lá, vamos arrastar o NestedParentArmature_Unpack.prefab para dentro do cenário
➔ na hierarquia, vamos selecionar esse objeto, clicar com o botão direito, prefab → unpack
➔ podemos deletar os elementos “UI_Canvas” e “UI_EventSystem”
➔ aproveite e delete também a MainCamera QUE JÁ EXISTIA NO CENÁRIO, mantenha a que
veio dentro do prefab
➔ os elementos que restam são:
◆ MainCamera (é a câmera)
◆ PlayerFollowCamera (é o objeto que a câmera segue, usa o Cinemachine para seguir
o player (falaremos mais sobre Cinemachine no futuro))
◆ PlayerArmature (é o personagem)
➔ arraste os objetos restantes para fora do NestedParentArmature_Unpack, por motivos de
organização
➔ remova o objeto NestedParentArmature_Unpack da hierarquia

30 POSSÍVEL PROBLEMA
➔ é possível que seu personagem esteja com essa aparência
➔ para corrigir, vamos em edit → project settings → graphics
➔ na opção “scriptable render pipeline settings” precisamos clicar no círculo à direita
➔ escolha “StarterAssetsURPAsset” e depois “continue”
➔ possivelmente o problema “inverteu”
➔ agora, vá em window → rendering → render pipeline converter
➔ selecione todas as opções
➔ initialize and convert
➔ voltando em edit → project
settings → graphics é
possível escolher uma
nova configuração de
qualidade
➔ as configurações são de
acordo com a qualidade
desejada: baixa (low),
média (medium), alta
(high), ultra…
31 MODIFICANDO VALORES DO CONTROLADOR
➔ depois de muito trabalho, nosso personagem
está pronto!
➔ é só dar play na unity e andar pelo cenário!
➔ o asset é bastante customizável, e é possível
editar valores como a força do pulo, a
velocidade, velocidade de corrida, etc.
➔ ao selecionar o PlayerArmature, é possível ver,
no inspector, todas as variáveis que podem ser
alteradas. use suas habilidades no inglês para
saber o que é cada coisa!

32 MUDANDO APARÊNCIA DO PERSONAGEM


➔ atenção: esse é um passo OPCIONAL na nossa
avaliação (fase 1)
➔ não queremos usar o modelo padrão da unity para
sempre!
➔ felizmente, modificar a aparência do personagem
e reutilizar as animações é super fácil
➔ só vamos precisar de um modelo 3d riggado (com
esqueleto/bones)
➔ para importar o modelo, é daquele mesmo jeito:
encontra o asset na pasta do pc, clica e arrasta
para dentro de uma pasta da unity
➔ depois, selecione o objeto 3d importado (.fbx), vá
na aba rig e troque animation type para humanoid
➔ clique e arraste o .fbx para dentro do objeto
geometry, que é um dos filhos de playerarmature
➔ nesse momento, você pode fazer ajustes no
tamanho e posicionamento do seu personagem 3d
no transform
➔ repare que o animator foi removido do gameobject
novo (botão direito - remove)
➔ por fim, vá no playerarmature e modifique o avatar
do componente animator, clicando no círculo do
lado direito
➔ escolha o avatar gerado para seu personagem

➔ uma breve explicação sobre o que fizemos:


➔ mudar o animation type para humanoid faz com que o avatar gerado seja
equivalente ao do personagem antigo
➔ colocar o .fbx dentro de geometry faz com que ele siga a movimentação do
personagem e possa ser manipulado pela animação
➔ removemos o animator (componente responsável pela animação) do objeto
importado pois já temos outro animator (dentro de playerarmature)
➔ no playerarmature, modificamos o avatar, para indicar que quem deve ser
animado agora é o nosso personagem novo
➔ é muita coisa, mas vale lembrar que isso é
opcional nessa primeira fase!
33 EVENTOS DE COLISÃO
➔ de nada adianta termos um personagem bonitão, animado, se não temos gameplay!
➔ uma das coisas mais básicas e importantes em jogos são eventos de colisão
◆ coletar moedas
◆ colidir com espinhos
◆ pegar uma vida
◆ entrar num portal
➔ que tal fazermos nosso personagem pegar moedas?
➔ vamos precisar de moedas e programação

34 CRIANDO UMA MOEDA


➔ essa parte vocês já sabem fazer!
➔ crie um objeto que represente uma moeda, use a criatividade (e materiais :))
➔ vamos problematizar!
➔ imagina que você fez uma moeda linda (igual a minha →)
➔ espalhou moeda pelo cenário todo…
➔ em todos os níveis do jogo…
➔ até moeda escondida…
➔ e aí a gente percebe que precisamos mudar alguma coisa na aparência, no
tamanho, etc.
➔ isso é um problema bem comum, e é resolvido com o uso de prefabs

35 PREFABS
➔ prefabs são objetos “pré-fabricados”, que são um pouco mais complexos que os objetos comuns
➔ bons candidatos para prefab são objetos que se repetem, que são usados em diferentes níveis, objetos
que são criados durante o jogo…
➔ nossa moeda é um objeto mais complexo e que se repete bastante durante o jogo!

36 CRIANDO E USANDO PREFABS


➔ criaremos uma pasta com nome Prefabs, por motivos de
organização
➔ depois, vamos clicar e arrastar a moeda criada para dentro
da pasta prefabs
➔ prontinho! prefab criado
➔ agora é só arrastar de dentro da pasta até a posição
correta no cenário

➔ a partir de agora, quando quisermos editar a moeda, basta


abrir (clique duplo) a moeda da pasta e fazer as edições
desejadas. todas as moedas serão alteradas!
➔ preencha seu mapa com moedinhas!
➔ as últimas configurações que faltam na moeda são:
➔ 1) selecionar o prefab, ir no collider do objeto e marcar a
opção Is Trigger
➔ 2) selecionar o prefab, ir na opção tag → add tag → tags
→ + → escreva “Moeda”
➔ 3) selecionar o prefab mais uma vez, ir na opção tag →
selecionar Moeda

37 TIPOS DE COLISÃO
➔ existem dois tipos de colisão:
➔ collisions, que são colisões físicas (exemplo: personagem bate numa parede)
➔ triggers, ou gatilhos, que são colisões por overlap/sobreposição (exemplo: personagem encosta
numa moeda, num portal…)
➔ hoje trabalharemos apenas com triggers, já que a complexidade dos collisions não é necessária
38 SEU PRIMEIRO SCRIPT
➔ agora, FINALMENTE, começaremos a programar!
➔ vamos criar uma pastinha para os scripts (podemos chamar de Scripts)
➔ criaremos scripts para criar comportamentos que não existem por padrão na unity
➔ no nosso caso, vamos modelar o comportamento de uma moeda!
➔ dentro da pasta, vamos no menu de criação de arquivos (+) → c# script → escolha o
nome Moeda
➔ é importante seguir algumas convenções na hora de criar scripts!
➔ primeira letra maiúscula, sem números, sem espaço, sem acentos, sem cedilha…
➔ para editá-lo, clique duas vezes.
➔ o visual studio deve abrir, mas pode demorar um pouquinho.

bibliotecas
utilizadas

nomes iguais! gameobject


usa isso

o que estiver aqui dentro


é executado apenas 1 vez
(quando começa o jogo)

o que estiver aqui dentro


é executado 1 vez POR quadro
(60 fps = 60 vezes por segundo)

➔ dentro (entre os { }) do método Start(), vamos fazer a unity imprimir uma mensagem
➔ o [Link] funciona como o [Link] do C#, a diferença é que vai aparecer na
janela console, como veremos em breve
➔ os códigos devem ser escritos da mesma forma como indicado!
➔ não se esqueça de salvar!!! (ctrl + s)
➔ vamos ver se funcionou?

39 UNINDO OBJETOS E SCRIPTS


➔ os scripts não funcionam por conta própria
➔ temos que adicionar o script criado ao objeto desejado
➔ no nosso caso, criamos um script chamado Moeda, e temos um prefab de moeda no
nosso jogo!
➔ vamos no prefab Moeda, seleciona, clica em add componente, pesquisa por moeda e
escolhe!
➔ agora, é só dar play na unity e ver se funcionou :)
➔ se tudo deu certo, algo assim apareceu no console →

40 EVENTO DE COLISÃO
➔ a unity tem alguns métodos prontos, com assinaturas fixas, que são usados
automaticamente
➔ um desses métodos prontos é o OnTriggerEnter(Collider other)
➔ esse método é usado quando um objeto encosta em outro + ambos têm colisores + pelo
menos um deles usa colisor trigger + e pelo menos um usa o componente rigidbody (no
nosso caso, o nosso player já tem esses componentes implicitamente)
➔ vamos editar nosso script da moeda

➔ OnTriggerEnter → quando objetos entram em contato e um é


trigger
➔ Collider other → é o outro colisor (o objeto que encostou no
trigger)
➔ [Link] → nossa mensagem

➔ a mensagem “encostou na moeda” só deve ser apresentada quando um objeto que segue
os requisitos encostar na moeda
41 DESTRUIÇÃO DE OBJETOS
➔ já conseguimos “pegar” a moeda
➔ normalmente, quando coletamos um item, ele é deletado do cenário
➔ é possível fazer isso utilizando a função Destroy, como abaixo:

➔ repare no uso do termo gameObject, com o G minúsculo.


➔ quando usamos esse termo, estamos fazendo uma referência ao próprio objeto que está
executando esse código
➔ hora de testar!
➔ …e se a gente trocasse “gameObject” por [Link], o que aconteceria?
(hipoteticamente!)
➔ já sabemos encostar na moeda e destruir o objeto… precisamos ganhar pontos agora.
➔ nesse momento, vamos precisar trabalhar com comunicação entre scripts, porque quem
deve armazenar a pontuação do jogador não é a moeda!

42 SCRIPT “JOGADOR”
➔ vamos criar um script Jogador, responsável por
guardar a pontuação do jogador
➔ já sabemos criar scripts ;)
➔ no script Jogador, iremos criar uma variável do tipo
inteiro chamada moedas
➔ podemos também deletar os métodos Start() e
Update(), já que não iremos usá-los
➔ não se esqueça de adicionar o script ao objeto do
jogador!
➔ precisamos que o script Moeda manipule o valor de
moedas sempre que uma moeda for coletada 1
➔ e aqui vem uma parte complicada…
2 3
➔ precisamos dizer para a unity: 4
➔ “ó. sabe quem colidiu com a moeda? pronto. (1)
➔ acesse o componente “Jogador” desse objeto (2)
➔ e adicione UMA moeda. (3)
➔ depois, aproveita e me diz quantas moedas eu já
peguei.” (4)
➔ prontinho! vamos testar
➔ e vamos problematizar 😨

43 E SE… UM INIMIGO ENCOSTASSE NA MOEDA?


➔ suponha que seu jogo tem inimigos ou plataformas ou objetos móveis que poderiam,
eventualmente, encostar na moeda
➔ o que aconteceria? isso geraria algum problema?
➔ *tempo para resposta*
➔ *não olhem abaixo antes de pensarem* 👀
➔ .
➔ .
➔ .
➔ sim, isso geraria um problema!
➔ a gente está tentando acessar o componente Jogador de um objeto que não necessariamente
tem esse componente, e isso geraria um erro
➔ é importante evitar que isso aconteça, então faremos uma verificação com if, para confirmar
quem que encostou na moeda.

➔ o nosso código da moeda mudou um pouquinho, mas basicamente:


➔ antes de realizarmos os passos de adicionar, imprimir e destruir moeda, fazemos uma verificação
(if). verificamos se a tag de quem colidiu com a moeda é “Jogador”.
➔ já sabemos criar tags. essa tag “Player” deve ser colocada no personagem principal.
➔ se sim, a gente executa
➔ se não, a gente não faz nada
44 O COMPONENTE RIGIDBODY
➔ isso foi mencionado antes, mas para uma colisão acontecer, é necessário que pelo menos
um dos objetos tenha o componente rigidbody
➔ para conhecer mais o componente, crie alguns objetos 3D novos
➔ os posicione um acima do outro e adicione o componente rigidbody em todos eles
➔ dê play!
➔ o rigidbody adiciona propriedades físicas aos objetos, como colisão, gravidade,
resistência do ar…
➔ não vamos explorar isso no momento, mas é importante conhecer

45 INTERFACE DE USUÁRIO (CANVAS)


➔ nossa coleta de moedas está funcionando perfeitamente ✨
➔ …mas quem estiver jogando não sabe qual a pontuação atual
➔ precisamos criar a hud do nosso jogo, para informar dados
como a pontuação, vida, progresso…
➔ todos os elementos de interface (menu, hud, inventário…)
ficarão dentro de um objeto do tipo canvas
➔ é possível criar o canvas pelo menu de criação na hierarquia
➔ (não criem ainda!)

46 OPÇÕES
➔ diversos objetos prontos estão disponíveis para uso
➔ algumas opções importantes:
◆ image → imagem → background, logo, ícones…
◆ text (textmeshpro) → texto | textmeshpro é uma extensão
◆ raw image → usado para colocar imagens a partir de texturas (não usaremos)
◆ slider → barrinha deslizante (carregamento, volume)
◆ button → botões (botão de jogar, sair)
◆ canvas → o canvas em si (explicado acima)
◆ event system → é o responsável por ler eventos de clique

47 NOSSA INTERFACE DE USUÁRIO


➔ pensando no que temos no nosso jogo até agora, temos algumas necessidades:
➔ uma hud que apresente quantas moedas foram coletadas até agora
➔ eventualmente, precisaremos também de um menu inicial, com um background, o nome/logo
do jogo, e botões (jogar, sair)
➔ vamos começar com a hud!
➔ o elemento mais importante da hud, no nosso jogo, é o texto indicativo de pontuação
➔ portanto, vamos começar criando um elemento de texto

➔ ao escolher a opção text - textmeshpro, essa janela vai aparecer


➔ é só clicar em import tmp essentials
➔ foram criados 3 objetos: canvas, eventsystem e text (tmp) – vamos configurar o canvas, mexer
um pouquinho no eventsystem e depois editar o text (tmp)
48 CONFIGURANDO O CANVAS
➔ a primeira etapa quando vamos trabalhar com interface de usuário é configurar o canvas
➔ a configuração do canvas permite que a interface de usuário criada se comporte da forma
desejada, independente do tamanho ou resolução da tela
➔ no canvas, no componente canvas scaler, iremos alterar o ui scale mode para scale with screen
size
➔ em reference resolution, iremos trabalhar com a resolução padrão da maioria dos monitores:
1920 x 1080 (16:9). caso o jogo fosse mobile, poderíamos trabalhar com 1080 x 1920
➔ para o canvas, por enquanto é só!

49 EVENTSYSTEM
➔ ao selecionar o eventsystem, vocês podem ver uma grande mensagem de erro falando sobre o
sistema de input
➔ isso acontece porque nosso projeto está usando o novo sistema de input (que veio com com o
asset do personagem)
➔ se for o caso, é só clicar em replace with inputsystemuiinputmodule
➔ pronto, vamos deixar o eventsystem quieto!

50 TEXT (TMP)
➔ o objeto text apresenta texto na tela
➔ textmeshpro é uma extensão, um pacote, que melhora o componente text, com mais opções
➔ ao selecionar o objeto, podemos editar o texto que ele apresenta
➔ dica 1: no canto superior direito da janela scene, podemos selecionar a opção 2d, para que nossa
visão fique em 2d (como o canvas)
➔ dica 2: podemos, em seguida, clicar duas vezes no objeto canvas, para que preencha toda a tela
➔ como nosso texto vai representar apenas um número (quantidade de moedas), podemos
substituir por “0” (vai facilitar nossa vida depois), mas poderia ser qualquer coisa

➔ existem muitas opções de customização nesse componente, explore!

51 POSICIONAMENTO
➔ é possível mover os elementos de interface para um local mais apropriado (ainda bem, né)
➔ para mover elementos de interface, a melhor ferramenta é a rect tool, que pode ser acessada
usando a tecla T
➔ mova o texto para algum canto apropriado na tela
➔ agora, vamos fazer um teste!
➔ vá para a aba game
➔ troque a terceira opção (talvez esteja em free aspect)
➔ veja como o texto se comporta

➔ conseguem identificar o problema? os nossos elementos de interface se posicionam de forma


diferente de acordo com a resolução – como corrigir?
52 ÂNCORAS DO CANVAS
➔ por padrão, a posição de um elemento no canvas é determinado pela sua distância do meio do
canvas
➔ no nosso caso, que colocamos o texto no canto superior esquerdo, temos as seguintes
coordenadas:
➔ pos x: -836 (836 pixels para a esquerda)
➔ pos y: 495 (495 pixels para cima)
➔ pos z: 0 (é um elemento 2d, então não precisa mexer no z)
➔ width: 200 (largura normal de um texto)
➔ height: 50 (altura normal de um texto)
➔ como esses números são relativos e são calculados a partir do centro da tela, diferentes
resoluções apresentam posicionamentos diferentes
➔ para minimizar esse problema, podemos fazer com que o cálculo da posição de um elemento
seja a partir do canto da tela mais próximo, nesse caso, o canto superior esquerdo
➔ podemos clicar na representação da âncora e substituir por top left

➔ veja como a posição relativa se torna bem menor, o que diminui as discrepâncias que podem
haver com diferentes resoluções

➔ temos uma interface!


➔ …mas o valor é sempre 0.
➔ queremos que coletar moedas aumente esse número.

53 PROGRAMAÇÃO DE INTERFACE
➔ a programação de interface não é tão diferente do que já fizemos até então
➔ já trabalhamos com variáveis, modificação de valores, referências
➔ para atualizar o valor na tela, tudo que a gente precisa é:
➔ ter um elemento de texto na cena ✅
➔ ter um contador de moedas ✅
➔ saber programar ✅✅✅
➔ criar uma referência, no código, para o elemento de texto ❌
➔ atualizar o elemento de texto ❌
➔ vamos abrir o script do jogador (aquele que guarda a quantidade de moedas)
➔ lá, vamos precisar criar um método, já que dessa vez nossa instrução é um pouquinho mais
complexa

54 MÉTODO: ATUALIZARHUD
➔ o objetivo do nosso método é atualizar a hud, portanto, é interessante escolher um nome que
demonstre isso
➔ que tal AtualizarHUD? (public void AtualizarHUD())
➔ toda vez que a gente pegar uma moeda, a gente atualiza a hud, o que significa que a gente vai
modificar o texto da hud para ficar igual a quantidade de moedas
55 CHAMANDO O MÉTODO
➔ o método não se executa sozinho! é preciso chamar o método
➔ qual o momento apropriado para fazer isso?
➔ é interessante que a interface seja atualizada sempre que a gente pegue uma moeda…
➔ então, por enquanto, podemos mandar a moeda atualizar a interface, já que é a moeda que sabe
quando é coletada

➔ (ainda não vai funcionar!)

56 COMPLETANDO A REFERÊNCIA
➔ lembram da linha de código “public TMP_Text moedasHUD;”?
➔ esse campo, por ser público, permite que a gente determine o valor (nesse caso, o objeto)
➔ vamos precisar carregar (clicar + arrastar) o nosso objeto de texto para a caixinha que apareceu
na unity, dentro do componente jogador
➔ depois disso… é só testar!

57 MELHORANDO A COLETA DE MOEDAS


➔ nosso código funciona! mas tá bem desorganizado.
➔ por que a moeda que é responsável por aumentar a pontuação do player?
➔ por que a moeda que atualiza a hud?
➔ essas duas ações deveriam ser responsabilidades do jogador
➔ então vamos criar um novo método: ColetarMoeda e deixar o jogador cuidar de todo o resto

depois de encostar na moeda, se for o player (if), acessamos o


jogador e usamos (executamos) o método coletarmoeda

➔ pronto!
➔ tudo funcionando
➔ tudo bonitinho
➔ só nos resta agora criar o menu inicial! coletarmoeda aumenta as moedas e executa
atualizarhud, que altera o texto do elemento de texto
➔ (e fazer a build – a versão executável do jogo)

58 CRIANDO UMA NOVA CENA


➔ cenas são basicamente níveis do nosso jogo
➔ fora isso, podemos criar o menu inicial, telas de vitória, derrota, tutorial…
➔ ao criar uma cena, na maioria das vezes, começaremos “do zero”, sem nenhum elemento na
cena
➔ mas com o uso de prefabs, podemos rapidamente popular a cena novamente
➔ para criar a cena: file → new scene → basic
➔ aproveite para salvar a cena (ctrl + s ou file → save) e escolha a pasta scenes
59 CONFIGURANDO O MENU INICIAL
➔ a nossa cena do menu inicial será composta de: luz, câmera e o canvas
➔ precisamos configurar o canvas corretamente (igual o primeiro canvas)
➔ e aí vamos trabalhar com: imagem de fundo (image), nome do jogo (text), e botões de jogar e
sair (button)

➔ de novidades, temos:
◆ o uso de image como imagem de fundo pode ser facilitado
usando a âncora de esticar
◆ isso faz com que a imagem possa preencher toda a tela
➔ uso de botões
◆ é “só” criar e editar suas propriedades
◆ o objeto de texto do botão é um gameobject separado, que
fica dentro do botão

60 PROGRAMANDO O MENU INICIAL


➔ precisamos dizer para a unity qual a funcionalidade dos botões
➔ aqui, temos dois objetivos:
◆ botão de jogar – leva para a cena de gameplay
◆ botão de sair – sai do jogo
➔ vamos precisar de um script novo: MenuManager
➔ temos uma novidade aqui: precisaremos importar um pacote:
➔ using [Link]; (no início do código)

pacote com a classe que precisamos (SceneManagement)

nome do método (ComecarJogo) – deve ser público e void


parâmetro – valor que iremos determinar em outro momento
método usado para carregar cena + usando o parâmetro

nome do método (Sair) – deve ser público e void

método usado para sair do jogo (só funciona em builds)

61 APLICANDO AS FUNCIONALIDADES DOS BOTÕES


➔ como sempre, os métodos não são executados por conta própria
➔ e também como sempre, tudo (até então) na unity depende de
gameobjects
➔ portanto, criaremos um novo gameobject (opção “create empty”)
e vamos aplicar o nosso componente menumanager nesse objeto
➔ agora, nos botões, temos que procurar o componente button e
encontrar a área “onclick()”, que é responsável pelos eventos de
clique no botão
➔ clicando no +, é possível adicionar um novo objeto, para assim
procurar seus métodos públicos
➔ vamos jogar o novo objeto, que colocamos o menumanager, e
vamos procurar o método ComecarJogo()
➔ no nosso outro botão (de sair), vamos fazer a mesma coisa, mas
agora usando o método Sair()
➔ agora, precisamos descobrir qual o número da cena que
queremos carregar (temos 2!), para preencher o valor dessa caixa
62 BUILD SETTINGS
➔ para descobrir o número da cena, precisamos
determinar quais cenas estarão presentes na build,
que é a versão que o jogador tem acesso
➔ no nosso caso, é simples: queremos as duas cenas – o
menu e o gameplay
➔ para fazer isso, vamos em file → build settings
➔ em seguida, no explorador de arquivos (janela project),
vamos navegar para a pasta scenes, e arrastar as
cenas criadas para dentro da caixinha scenes in build
➔ é importante que a cena MenuInicial tenha o índice 0,
pois deve ser a primeira cena apresentada ao jogador
quando o jogo é aberto
➔ é possível remanejar a ordem das cenas, clicando na
cena em scenes in build e arrastando para cima ou
baixo

63 FINALIZANDO O BOTÃO ‘JOGAR’


➔ lembram que ficamos devendo o índice da próxima cena que
seria carregada no botão “jogar”?
➔ descobrimos que o índice é 1 (conforme janela scenes in build
acima)
➔ então, voltando no botão jogar, podemos ir no evento onclick e
modificar o valor para 1
➔ vamos finalizar nosso jogo?

64 CONFIGURAÇÕES DA BUILD
➔ voltando na janela build settings, clique no botão player settings
➔ nessa janela, podemos mudar o nome do produto (nome do nosso
jogo) e também mudar o ícone
➔ existem diversas outras configurações, mas não vamos nos
aprofundar nelas aqui

65 FAZENDO A BUILD
➔ voltando na janela build settings, clique no botão build
➔ crie uma nova pasta e dê um nome apropriado (por exemplo:
Build)
➔ selecione a pasta e pronto, a unity vai começar o processo de
criar a build
➔ depois de finalizado, você terá uma pasta com diversos
arquivos
➔ para jogar, execute o arquivo <nome do seu jogo>.exe, no meu
caso: meu jogo!!.exe
➔ ah, evite caracteres especiais no nome do jogo, incluindo “!”
➔ …se não conseguir fechar seu jogo, você pode pressionar alt +
f4

66 COMPARTILHANDO A BUILD
➔ para que outras pessoas joguem seu jogo, é necessário enviar TODOS os arquivos presentes
nessa pasta
➔ portanto, faça uma pasta compactada (.zip, .rar) com TODO o conteúdo e envie
➔ NÃO adianta enviar apenas o [Link]

67 COMPARTILHANDO O PROJETO
➔ feche a unity
➔ vá na pasta do seu projeto (pode ser descoberta pela unity hub → projects → … 3 pontinhos →
show in explorer
➔ abra a pasta do projeto, apague a pasta Library e faça uma pasta compactada com todo o resto
das pastas/arquivos
➔ envie a pasta compactada (.zip, .rar)
68 SEGUNDA FASE
➔ nessa segunda fase, vocês terão que elevar seu jogo para o próximo nível!
➔ mecânicas únicas, mais desafios, mais recompensas, mais sistemas, e jogos mais completos e
divertidos
➔ nessa fase, aprenderemos sobre: animação, animação de personagens, áudio, mais ferramentas
de criação de cenário, raycasts, input de usuário (sistema velho e sistema novo), controle de
versão, sistema de partículas, movimentação com inteligência artificial, pós-processamento,

69 ANIMAÇÃO
➔ animação vai nos permitir mover, rotacionar e até mudar propriedades sem ter que
necessariamente programar essa movimentação
➔ podemos usar as ferramentas de animação para animar objetos simples, como portas, moedas,
plataformas
➔ e também objetos mais complexos, como o personagem principal, inimigos, npcs…
➔ vamos começar do simples: vamos animar a moeda!

70 CRIANDO UMA ANIMAÇÃO


➔ para criar uma animação, precisamos abrir a janela animation
➔ window → animation → animation
➔ dica: arraste a janela animation para o lado das janelas project/console, assim:
➔ depois, selecione o objeto que você quer animar e pressione create

➔ selecione uma pasta e escolha um nome para o arquivo, e é hora de animar


➔ a janela de animação deve ser familiar para quem já aprendeu a animar em algum programa
➔ a ideia geral é: vamos criar keyframes e modificar os valores desejados nesses keyframes
➔ voltando à moeda… quero fazê-la girar, então vou precisar modificar seu eixo Y (ou Z, dependendo
de como a moeda foi feita, sua rotação, etc.)
➔ já que quero modificar o eixo Y, vou add property (adicionar propriedade) → transform → rotation
➔ agora, vou escolher a rotação inicial (frame 0, y = 0) e rotação final (frame 60, y = 180)
➔ por fim, clico com o botão direito no Y (em rotation) e escolho a opção key all modified
➔ é possível acessar a janela curves, no canto inferior do animation, para modificar as curvas

71 CRIANDO UMA ANIMAÇÃO (OUTRO JEITO)


➔ tem um outro jeito mais fácil de animar (só tem que ter cuidado!!!)
➔ na janela de animação, é só pressionar a bolinha vermelha, que a unity vai gravar tudo que você
fizer no objeto que está sendo animado
➔ é importante escolher em que momento da animação (na linha do tempo) essa mudança vai
ocorrer
➔ depois, é só clicar de novo na bolinha vermelha e você tem uma animação!

72 PLAY! (E ANIMAÇÕES EM LOOP)


➔ dê play no jogo e veja a animação rolando
➔ por padrão, as animações vem em loop, ou seja, se repetem sem fim
➔ se não for interessante que a animação seja em loop, como no caso de uma porta, por exemplo,
basta selecionar o arquivo da animação (na pastinha selecionada no passo 70)
➔ em seguida, com o arquivo selecionado, é só desmarcar a opção loop time
73 JANELA ANIMATOR
➔ se você selecionar o objeto que você acabou de animar, você pode ver uma novidade
➔ foi adicionado automaticamente o componente animator nele
➔ esse componente é o responsável por executar as animações
➔ através do animator também vamos conseguir criar transições entre animações, assim como os
parâmetros e condições para essas transições ocorrerem (além de muitas outras coisas :))
➔ indo em window → animation → animator, podemos ter uma noção de como funciona o animator

camadas da animação árvore de animações


para animações mais complexas sempre começa no entry e vai para algum estado de animação

parâmetros
para transições

74 MAIS ANIMAÇÕES…
➔ experimentem criar mais animações
➔ sugestão: portas e plataformas móveis – atenção: alguns problemas podem surgir!
➔ mas também poderia ser: janelas, espinhos, baús, inimigos simples, elementos de interface…

75 PROBLEMA 1: PIVÔ DA PORTA


➔ se você tentar animar algo criado diretamente na unity, vai perceber que o pivô (ponto de rotação)
desse objeto é o centro
➔ mas isso nem sempre é o ideal, já que às vezes queremos rotacionar um objeto a partir de um
ponto, como é o caso de uma porta!

➔ para resolver isso, precisamos fazer uma pequena gambiarra: criar um


novo ponto de origem para a porta
➔ esse ponto de origem será um gameobject vazio, que terá que ser
posicionado no canto da porta onde queremos que seja o ponto de
origem/pivô
➔ depois de posicionar corretamente, é importante tornar a porta um filho
desse objeto que está servindo como ponto de origem!
➔ agora, quando você rotacionar o ponto de origem, a porta irá rotacionar
corretamente
➔ dica: para posicionar o ponto de origem, você pode mudar o tipo da
câmera (de perspectiva para isométrico) e mudar a visão (para ver de
frente, trás, lado…)
76 PROBLEMA 2: POSIÇÃO DA PLATAFORMA
➔ se você tentar animar algum objeto mudando sua posição, ao tentar usar a mesma animação em
outros objetos semelhantes, você terá um grande problema
➔ todos os objetos estarão indo para o mesmo lugar!
➔ isso acontece porque ao animar (determinar keyframes) uma posição, você está dizendo que o
objeto deve ir para uma determinada posição local, mas se o objeto não tiver um parent (objeto
pai), ele vai para a posição global
➔ para resolver isso, convém colocar plataformas móveis (ou qualquer objeto que tem animação de
posição) dentro de gameobjects vazios, mais ou menos como foi feito com a porta

posição global posição local/relativa

➔ agora, se formos animar a plataforma, estaremos modificando apenas a posição local dela, e não
a global. desse jeito, podemos criar várias plataformas com a mesma animação, mas ao
posicionar o objeto plataformago em cantos diferentes, a plataforma irá fazer sua animação
corretamente, sempre levando em consideração apenas a sua posição relativa (relativa ao
plataformago)
➔ abaixo um exemplo de como ficam os valores da plataforma (veja que só o Y está sendo editado)

77 TRANSIÇÃO DE ANIMAÇÃO
➔ vamo ver na aula

78 TRANSIÇÃO COM PARÂMETROS


➔ vamo ver na aula

79 PROGRAMANDO PARÂMETROS
➔ vamo ver na aula (abrindo porta)

80 IMPORTANDO UM PERSONAGEM
➔ vamo ver na aula (sapo véi)

81 ANIMAÇÕES DO PERSONAGEM
➔ vamo ver na aula

82 ANIMATOR COM ANIMAÇÕES DO PERSONAGEM


➔ vamo ver na aula
83 UM CONTROLADOR BÁSICO
➔ vamo ver na aula

84 MODIFICANDO ANIMAÇÕES DO
PERSONAGEM IMPORTADO
➔ vamo ver na aula

85 BLEND TREES
➔ vamo ver na aula

86 ÁUDIO
➔ trabalhar com áudio é relativamente tranquilo, mas na maior
parte do parte do tempo envolve programar alguma coisa
➔ afinal de contas, precisamos determinar quando um áudio
será executado, e isso tende a ser feito na programação
➔ antes, podemos dividir “áudio” em duas categorias:
◆ música de fundo (geralmente tocada em loop)
◆ efeito sonoro pontual (feedback – ao coletar moedas,
sofrer dano…)
➔ uma última coisa que precisamos entender são os
pré-requisitos para um áudio ser executado
◆ precisamos de um audio listener (geralmente já tá na
câmera) – responsável por OUVIR os sons
◆ também de um audio source (fonte do áudio) – pode
ser um objeto vazio, a moeda que foi coletada…
qualquer coisa.
◆ por fim, precisamos de um audio clip – é o arquivo de
som que será executado

87 AUDIOSOURCE
➔ o componente audio listener dispensa apresentações, mas só porque não dá pra
fazer nada com ele
➔ já o audio source tem um bocado de configurações!

clipe de áudio
mutar o source

reproduzir som quando começar jogo/objeto nascer


loop

volume
tom

definição se é 2d ou 3d

distância mínima para diminuir som (3d)


distância máxima para ser ouvido (3d)
88 TRILHA SONORA
➔ definir uma trilha sonora é o mais simples que temos!
➔ trilhas sonoras tendem a começar assim que o jogo é iniciado (play on
awake)
➔ e trilha sonoras tendem a tocar em loop
➔ pronto! com essas configurações e uma música apropriada, seu jogo já
tem trilha sonora!

89 EFEITOS SONOROS
➔ clipes de áudio pontuais podem ser chamados de efeitos sonoros,
também conhecidos como sfx
➔ a configuração deles acaba sendo o oposto de uma trilha sonora, já
que normalmente não são executadas on awake e nem são
reproduzidos em loop
➔ nesse caso, quando queremos que um efeito sonoro seja
reproduzido, precisamos fazer isso na programação
➔ mesmo esquema de sempre: referência ao objeto que tem um
audiosource, acessa o objeto e executa algum método (nesse caso:
play)
➔ atenção! se você tentar executar um som e em seguida destruir o
objeto que está executando o som, a emissão de som será
interrompida!

90 + CRIAÇÃO DE CENÁRIO
➔ a unity disponibiliza outras ferramentas de criação de cenário
➔ nem tudo se resume a cubos, esferas e cilindros :)
➔ vamos utilizar a ferramenta probuilder, que permite modelagem “leve”, texturização e mais
algumas coisinhas
➔ atenção! o probuilder não substitui a modelagem em ferramentas como blender!
➔ o probuilder pode ser usado para prototipar um cenário, fazer testes rápidos, etc.
➔ para utilizar o probuilder, precisamos importar o pacote antes
➔ window → package manager → packages: unity registry → probuilder

91 PROBUILDER
➔ após importar o probuilder, precisamos acessá-lo!
➔ ao escolher a opção probuilder window, uma janelinha será
aberta com várias opções
➔ antes de tudo, sugiro clicar e arrastar a janelinha e colocar
do lado esquerdo da janela da unity
➔ vai ficar assim
➔ agora é usar a curiosidade e a criatividade!
➔ mesmo assim, apresento algumas ferramentas
➔ new shape permite que uma nova forma seja criada

➔ após escolher uma das formas, clique e arraste dentro do


cenário para definir comprimento e largura (é meio
ruinzinho no começo)
➔ quando soltar o clique, mova o mouse para definir a altura
➔ após a criação da forma, é possível alterar algumas
configurações, como a seguir:
➔ também é possível selecionar vértices, arestas e faces
➔ dessa forma, dá para fazer edições, mover, rotacionar, pintar
qualquer elemento do objeto criado

92 USANDO MATERIAIS
➔ para trabalhar com materiais, escolha a opção material
editor
➔ arraste o material desejado para a paleta de materiais (ou
pesquise clicando no círculo)
➔ após selecionar os materiais, é possível aplicar os
materiais clicando numa face de um objeto e usando o
atalho apropriado (alt + 2, por exemplo)

93 OUTRAS OPÇÕES
➔ são muitas opções!!!
➔ inclusive, quando você troca entre vértice, aresta e face, mais opções
aparecem
➔ então o melhor jeito de descobrir é explorar, ler e traduzir as ferramentas e
experimentar :)

94 SISTEMA DE PARTÍCULAS
➔ a unity tem um sistema de partículas bem completinho, que
permite a criação de efeitos visuais complexos
➔ esses efeitos visuais podem servir como feedback visual
para o jogador, podem embelezar o cenário, explicitar o
trajeto de um objeto, reforçar algum aspecto de uma
habilidade, podem ser usados na ambientação, etc.
➔ existe uma área específica dentro do mundo do
desenvolvimento de jogos que estuda e aplica sistema de
partículas (além de outras coisas, como shaders): a arte
técnica / tech art (teremos mais sobre isso no curso!!!)
➔ para criar nosso primeiríssimo sistema de partículas, iremos
no menu de criação de gameobjects (na hierarquia!) →
effects → particle system
➔ …acabou, agora é “””””””””só“”””””””” fazer algo bonitinho

95 FAZENDO UM FOGUINHO
➔ aqui eu aposto que vocês conseguem fazer algo melhor que eu
➔ …mas vou tentar mostrar algo
➔ selecione o sistema de partículas recém criado
➔ altere duration para 1, é a duração de um ciclo do sistema
➔ start lifetime → 1, isso representa o tempo de vida de cada partícula
➔ start speed → 1, é a velocidade da partícula
➔ start size → 0.5, o tamanho da partícula
➔ vá na aba emission e aumente rate over time para 50, isso é a
quantidade de partículas geradas por segundo
➔ em shape, diminua o ângulo (angle) do cone para 10
➔ também dá para diminuir o raio (radius) do cone… talvez para 1
➔ marque a opção color over lifetime e crie um degradê de amarelo
para vermelho
➔ e… é só
➔ tenho certeza que dá pra fazer algo melhor, que tal modificar as
cores, size over lifetime, rotation over lifetime, ou até alterar
algumas propriedades que já mexemos, como emission e shape?
96 TRAIL
➔ esse é mais um efeito que pode ser criado do mesmo jeito que o sistema de partículas
➔ sempre que esse objeto é movido, ele deixa um rastro que dura alguns segundos
➔ o rastro, duração e um monte de coisa são completamente configuráveis

➔ é possível editar a largura do trail de acordo com a


duração
➔ o tempo de vida
➔ a cor (dá pra fazer degradê também)
➔ o material…
➔ esse aqui eu não vou deixar nenhum exemplo não
➔ mas sugiro tornar um objeto com trail renderer como
filho de um personagem ou qualquer coisa móvel e ver o
que acontece :)
➔ importante, ao fazer isso, verifique se a posição do trail
renderer está próxima ao personagem, senão talvez você
não consiga ver o efeito

97 URP
➔ o universal render pipeline, ou urp, é uma configuração de
renderização que pode ser usada para melhorar o visual do jogo
➔ o urp fornece diversas opções de customização, como alterações
nas luzes, sombras, criação de shaders (sombreadores – ou como
um material é apresentado), também permite o uso de efeitos
visuais mais complexos e o uso de pós-processamento
➔ se você está usando o personagem passado na competência (o do pacote starter assets), ou importou
algum outro asset, é bem possível que seu projeto já tenha urp
➔ para ter certeza, vá em window → package manager → packages → unity registry → universal rp
➔ se a opção import ou install estiver disponível, então é porque seu projeto não está usando urp

98 INSTALAÇÃO
➔ antes de tudo, faça backup!
➔ o momento pós-instalação do urp pode ser um pouco
aterrorizante, então é melhor fazer o backup para evitar qualquer
desespero ou problema :)
➔ (basta fechar o projeto, fazer um .zip ou .rar do projeto e deixar
num canto guardadinho)
➔ de volta à unity, volte ao package manager e instale o urp
➔ vá no menu de criação de assets → rendering → urp asset (with
universal renderer)
➔ por fim, vá em edit → project settings → graphics
➔ no primeiro campo (scriptable render pipeline settings), clique
no círculo e escolha o asset criado → continue
➔ isso pode demorar um pouquinho
➔ …esse deve ser seu projeto depois do urp
➔ para corrigir: window → rendering → render pipeline converter
➔ seleciona os três primeiros (rendering settings, material
upgrade, readonly material converter) → initialize and convert
➔ se você estava usando o probuilder, é possível que os materiais
não tenham sido convertidos automaticamente (mas só os
materiais que o probuilder implementa por conta própria)
➔ você terá que ajustar esses materiais manualmente (crie novos
materiais e os atribua para os modelos)
99 PÓS-PROCESSAMENTO
➔ o nosso único uso para o urp, nesse primeiro momento, será a aplicação de
pós-processamento
➔ podemos entender o pós-processamento como filtros do photoshop que são aplicados ao
jogo inteiro
➔ é possível alterar cores, saturação, adicionar efeitos de movimento, adicionar brilho… um
bocado de coisa!
➔ para começar, vá no menu de criação de objetos (na hierarquia) → volume → global volume
➔ no objeto criado, vá no inspector e clique em new (new profile)
➔ depois, é só adicionar overrides e escolher os efeitos desejados
➔ experimente vários!
➔ por último, selecione sua câmera e marque a opção post processing (dentro de rendering)
➔ …deve funcionar
➔ no exemplo abaixo foi adicionado um efeito de color adjustment, e escolhido o color filter na
cor vermelha
➔ importante: na hora de criar o “volume”, escolhemos a opção global para que fosse aplicado
em todo o jogo, porém, é possível criar volumes locais, que só são aplicados a certos locais
(por exemplo: debaixo d’água)

100 INPUT DE USUÁRIO


➔ algo muito importante na hora do desenvolvimento de um jogo é a coleta do input do usuário
➔ na verdade, já estamos usando isso no controlador do personagem, o que supre as
necessidades mais básicas do nosso projeto (movimentação)
➔ mas, se quisermos criar mais ações, como atacar, deslizar, interagir ou outros, é necessário
realizar a checagem do input do usuário
➔ para fazer isso, vamos precisar programar essa checagem de tecla. caso a checagem seja
verdadeira, podemos realizar uma ação.

101 A CLASSE “INPUT”


➔ a classe Input será responsável pela coleta de input do usuário
➔ é essa classe que tem informações sobre se uma tecla específica está sendo pressionada,
se foi clicada, se já acabou o clique, onde está o mouse, etc.
➔ temos três métodos muito importantes:
◆ [Link](KeyCode.SUA_TECLA_AQUI) → vê se sua tecla foi pressionada
nesse exato momento
◆ [Link](KeyCode.SUA_TECLA_AQUI) → vê se a tecla está pressionada nesse exato
momento
◆ [Link](KeyCode.SUA_TECLA_AQUI) → vê se a tecla deixou de ser pressionada
nesse exato momento
➔ todos esses métodos retornam (ou seja, te dão) um boolean, que pode ser usado dentro de
um if, assim:
➔ replique o exemplo anterior, dê play e veja o funcionamento, não se esqueça de colocar o componente
em algum objeto
➔ repare também que nossas checagens de input foram colocadas no método Update()
➔ isso é muito importante, pois só o método update garante que você nunca vai perder o input do usuário,
já que o update é executado uma vez por frame, sem exceção

102 INTERAÇÃO BÁSICA


➔ e se, no nosso jogo, a gente tivesse que clicar E para coletar uma moeda?
➔ …não é o melhor design do mundo, mas poderia ser usado para outros itens
➔ vou mostrar uma forma de fazer isso, mas não é a ideal, é só uma forma de fazer usando o que já
conhecemos :)
➔ reparem na conversa entre os scripts

1
3
?

4
5
➔ 1) o jogador se aproxima da moeda – em seguida, a moeda acessa o script Jogador, presente no objeto
que encostou nela, e utiliza o método “SetMoedaProxima”, passando ela própria como parâmetro… ou
seja: ela tá dizendo: “jogador, sou eu que tô perto de você!”
➔ 2) o script Jogador guarda (salva, deixa na memória) essa informação de quem é a moeda que está
próxima
➔ 3) >>SE<< o jogador pressionar E e também >>SE<< existir uma moeda próxima do jogador, é executado
o método ColetarMoeda(), e em seguida a moeda é destruída e o script Jogador volta a não conhecer
nenhuma moeda próxima
➔ 4) o funcionamento do método ColetarMoeda() vocês já conhecem: a quantidade de moedas é
aumentado e a HUD é atualizada (AtualizarHUD())
➔ 5) atualização da HUD
➔ ?) caso o jogador vá para longe da moeda, a moeda diz para o jogador: “ei, pois então me esqueça…”, e o
jogador passa a não saber se existe alguma moeda por perto
➔ MUITA ATENÇÃO: é importante notar que esse script NÃO é perfeito, e pode falhar em algumas
situações
➔ por exemplo: como o script se comporta caso o jogador esteja próximo de duas moedas ao mesmo
tempo? o que acontece se tentar coletar? e se tentar coletar duas vezes? você pode tentar replicar essa
situação ;)

103 PROBLEMA NA LUZ APÓS TROCA DE CENA


➔ um pequeno problema que pode ocorrer quando estamos testando o jogo pelo editor, e através do menu
inicial é que, ao trocar de cena, a iluminação fica errada, geralmente escura
➔ para resolver isso, precisamos fazer o bake da iluminação da cena
➔ precisamos acessar o menu de iluminação (ctrl + 9), escolher a aba scene e pressionar generate lighting
➔ se a cena for grande, tiver muitos objetos, iluminação, etc, pode demorar um pouquinho
➔ depois disso, o problema tá resolvido!
104 MECÂNICA DE PORTAS COLORIDAS
➔ mais uma mecânica “aleatória”
➔ a intenção dessa mecânica é mostrar uma das infinitas formas de fazer um sistema onde o jogador
coletas chaves de algum tipo (pequenas ou grandes, azuis ou vermelhas, etc), e pode abrir a porta
correspondente (uma chave azul abre uma porta azul)

4 2
1
3

5 A 6

B
7

➔ 1) o jogador encosta no cubo azul – isso é a chave ;)


➔ 2) o script Chave verifica quem colidiu, e se foi o player e a string cor for “azul” (imagem A), é executado
o método PegouChaveAzul(), presente em Jogador
➔ 3) PegouChaveAzul() ativa um gameobject (chaveAzulImg), que é um indicador visual que o jogador
coletou a chave, em seguida, o método muda o valor de temChaveAzul (variável bool) para true
➔ 4) agora, o jogador encosta na porta azul
➔ 5) o script Porta verifica quem colidiu, e se foi o player, se a string cor for “azul” (imagem B) e também o
atributo do jogador temChaveAzul for verdadeiro, então o método UsouChaveAzul() é executado. fora
isso, o animador da porta é usado para abrir a porta via animação, e a variável bool portaTaAberta se
torna verdadeira
➔ 6) UsouChaveAzul() serve para desativar o indicador visual de que o jogador possui uma chave azul, e
também torna a variável temChaveAzul em false
➔ 7) quando o jogador finalmente sair de perto da porta, a porta se fecha
➔ atenção (vou sempre repetir isso): não é o melhor script do mundo – é meio sujo, ruim de expandir, mas
a intenção é fazer com coisas que vocês já conheçam
➔ outra coisa: a porta foi criada exatamente como nos tópicos sobre animação, então a estrutura é:
portaPrefab (é o objeto com colisor trigger e com o script Porta) → pivot (objeto com animator, que
serve também como pivô da porta) → portaVisual (objeto com o colisor “físíco” (sem trigger) e o visual
da porta)

105 NAVEGAÇÃO COM INTELIGÊNCIA ARTIFICIAL


➔ uma forma bem comum e prática de realizar a movimentação de um inimigo, npc ou até mesmo o
personagem principal é utilizando um sistema de pathfinding, ou “descoberta de caminho”
➔ no league of legends, por exemplo, tanto o campeão quanto as tropas definem o trajeto e desviam de
obstáculos por conta própria. no caso dos campeões, tudo que é necessário é o input do usuário do
destino final
➔ isso é relativamente de implementar usando a ferramenta navmesh, mas é importante notar que no
momento só funciona para ambientes em 3d, já que usa o sistema de malhas
106 NAVMESH
➔ como o nome já diz, é uma navegação (nav) que usa malhas (mesh)
➔ então, tudo que precisamos para fazer isso funcionar é uma malha, que vai ser o chão (pode até ser um
plane comum), e também, se relevante, obstáculos
➔ esse é o nosso cenário no momento
➔ já tem um chão e também tem alguns
objetos que podem servir como obstáculos
➔ para trabalhar com navmesh, vamos
precisar importar o pacote via package
manager
➔ window → package manager → packages:
unity registry → ai navigation → install
➔ depois de instalado: window → ai →
navigation
➔ guarda essa janelinha em algum canto!
➔ eu prefiro deixar junto do inspector, assim:

➔ nessa aba agents, podemos configurar os agentes que vão usar o sistema
de navegação – é possível definir diferentes tipos de agentes, assim como o
nome, raio, altura, altura de degrau que consegue subir, angulação de
rampas
➔ na aba areas, dá para configurar diferentes áreas e o custo de andar por elas
– quanto maior o custo, mais o sistema vai evitar andar por essas áreas
➔ com isso explicado, vamos selecionar o chão do cenário e adicionar o
componente navmeshsurface e pressionar o botão bake

➔ essa área azulada indica a superfície que o


agent humanoid (aquele da configuração)
consegue andar
➔ vamos criar um inimigo que segue o
personagem principal usando o sistema de
navegação?

107 INIMIGO COM NAVMESH


➔ para o inimigo, precisamos de:
◆ um objeto (inimigo) com o componente navmeshagent
◆ um script inimigo, que controla o inimigo
◆ configuração do navmeshagent e do inimigo

➔ a cada frame, o update define o destino (ou seja, o canto que o inimigo está tentando ir) para a posição
do alvo
➔ o alvo pode ser qualquer coisa! nesse caso, eu escolhi que fosse o player
➔ ou seja, o inimigo vai ficar sempre procurando o player
➔ é importante também especificar quem é o navmeshagent que está sendo controlado, já que a unity não
sabe de tudo ;)
➔ para isso, é só jogar o próprio objeto do inimigo dentro do campo agent, no inspector
➔ atenção!!! essa é a implementação mais simples possível!
➔ dentro do script inimigo, você deve fazer uma lógica mais complexa, afinal, você não quer que todos os
inimigos na cena sigam seu personagem, em todos os momentos
➔ poderia criar um campo de visão (utilizando raycast ou colisores), ou usar algum evento (por exemplo:
quando o jogador passar por uma porta específica, aí um inimigo começa a seguir), etc.

Você também pode gostar