Apostila completa · 10 módulos + apêndices

Desenvolvimento de Jogos com Unity:
do zero absoluto ao mercado de trabalho

Um guia progressivo para quem nunca programou: lógica, C#, jogos 2D e 3D, arquitetura profissional, otimização e tudo o que você precisa para conquistar sua primeira vaga na indústria de games.

M0

Começando do Zero

Objetivo: entender a indústria, escolher seu caminho de carreira e deixar o ambiente de desenvolvimento pronto.

0.1 · Por que Unity? O mercado de jogos

A indústria de jogos movimenta mais dinheiro que cinema e música somados. A Unity é o motor (game engine) mais usado do mundo em número de jogos publicados: domina o mercado mobile (a maioria dos jogos para celular usa Unity), tem presença forte em PC, consoles, VR/AR e até em áreas fora de jogos, como simulação industrial, arquitetura e automotivo — o que amplia suas oportunidades de emprego.

Para quem busca empregabilidade, Unity oferece três vantagens práticas:

[LOG] Dica de mercado Estúdios brasileiros e estrangeiros que contratam júnior geralmente pedem: Unity + C#, um portfólio com 2–3 jogos jogáveis, Git, e noções de física/matemática básica de jogos. Esta apostila cobre exatamente esse conjunto — e vai além.

0.2 · Carreiras possíveis com Unity

CargoO que fazHabilidades-chave
Gameplay ProgrammerPrograma mecânicas: movimento, combate, habilidades, IA de inimigos.C#, física, matemática vetorial, padrões de projeto (Módulos 1–6)
Mobile Game DeveloperJogos casuais/híbridos para Android/iOS, com foco em performance e monetização.Otimização, ads/IAP, builds (Módulos 7–8)
UI ProgrammerMenus, HUD, telas responsivas, animação de interface.Canvas, TextMeshPro, UX (Módulo 5)
Tools ProgrammerCria ferramentas internas do editor para acelerar o time.Editor scripting, C# avançado
Technical ArtistPonte entre arte e código: shaders, VFX, pipelines.Shader Graph, otimização gráfica (Módulo 7)
XR DeveloperRealidade virtual e aumentada (treinamento, indústria, jogos).Unity XR Toolkit, otimização

Como iniciante, não se preocupe em escolher agora. O caminho padrão de entrada é Gameplay/Generalista Júnior — e é para isso que esta apostila prepara. A especialização vem com a experiência.

0.3 · Instalando seu ambiente

  1. Unity Hub: baixe em unity.com/download. O Hub gerencia versões da engine e seus projetos.
  2. Versão LTS: no Hub, instale sempre a versão LTS (Long Term Support) mais recente — é a que os estúdios usam em produção. Evite versões "Tech/Beta" para aprender.
  3. Módulos na instalação: marque Android Build Support (e iOS se tiver Mac), além do Windows/Mac Build Support.
  4. Editor de código: instale o Visual Studio Community (Windows) ou VS Code com a extensão C# Dev Kit. O Hub geralmente oferece o Visual Studio junto.
  5. Licença: a licença Personal é gratuita para indivíduos e empresas com receita abaixo do limite anual da Unity — mais que suficiente para aprender e publicar seus primeiros jogos.
[WARNING] Requisitos de máquina Unity roda em máquinas modestas para projetos 2D e 3D simples: 8 GB de RAM é o mínimo confortável (16 GB ideal), SSD ajuda muito, e qualquer GPU dedicada ou integrada recente serve para começar. Não espere ter um "PC gamer" para iniciar.

Criando seu primeiro projeto

  1. No Unity Hub: New Project → escolha o template 2D (Built-in ou URP) para acompanhar o Módulo 3, ou 3D (URP) para o Módulo 4.
  2. Dê um nome sem espaços/acentos (ex.: MeuPrimeiroJogo) e escolha uma pasta fora de OneDrive/Dropbox (sincronizadores corrompem projetos).
  3. Clique em Create e aguarde — a primeira abertura demora alguns minutos.
M1

Lógica de Programação & C# do Zero

Objetivo: sair do zero absoluto e dominar os fundamentos de C# que todo programador Unity usa diariamente. Este é o módulo mais importante da apostila — não pule etapas.

Programar é dar instruções precisas ao computador. Um jogo é um programa que roda dezenas de vezes por segundo, lendo o que o jogador faz e atualizando o mundo. Antes de mexer na Unity, você precisa falar a língua dela: C# (lê-se "cê-sharp").

[LOG] Como praticar este módulo Você pode testar todos os exemplos direto na Unity: crie um script, cole o código dentro do método Start() e use Debug.Log(...) para ver o resultado no Console. O Módulo 2 explica isso em detalhe — se preferir, leia 2.3 primeiro e volte.

1.1 · Variáveis: a memória do jogo

Uma variável é uma caixinha com nome que guarda um valor: a vida do jogador, a pontuação, a velocidade. Em C#, toda variável tem um tipo, que define o que ela pode guardar:

// Os 5 tipos que você usará 95% do tempo em jogos:
int vida = 100;              // número inteiro (sem vírgula)
float velocidade = 5.5f;     // número com casas decimais (note o "f" no final!)
bool estaVivo = true;        // verdadeiro ou falso
string nomeJogador = "Aria"; // texto, sempre entre aspas
char tecla = 'A';            // um único caractere

// Você pode alterar o valor depois:
vida = vida - 25;            // tomou dano: agora vale 75
vida -= 25;                  // mesma coisa, forma abreviada: agora 50

Operadores matemáticos e de comparação

OperadorSignificadoExemplo
+ - * /Soma, subtração, multiplicação, divisãodano = forca * 2;
%Resto da divisão (útil p/ "a cada N vezes")10 % 3 → 1
== e !=Igual / diferente (comparação!)vida == 0
> < >= <=Maior, menor, maior ou igual...pontos >= 100
&& e ||E lógico / OU lógicotemChave && portaFechada
!Negação (inverte um bool)!estaVivo
[ERROR] Erro clássico de iniciante = atribui valor; == compara. Escrever if (vida = 0) em vez de if (vida == 0) nem compila em C# — mas a confusão entre os dois é a dúvida nº 1 de quem começa.

1.2 · Condicionais e loops: o jogo toma decisões

if / else — "se isso, faça aquilo"

if (vida <= 0)
{
    Debug.Log("Game Over!");
}
else if (vida < 30)
{
    Debug.Log("Cuidado, vida baixa!");
}
else
{
    Debug.Log("Tudo sob controle.");
}

switch — vários caminhos a partir de um valor

switch (tipoDeItem)
{
    case "pocao":  vida += 50;  break;
    case "moeda":  ouro += 10;  break;
    case "chave":  temChave = true; break;
    default:       Debug.Log("Item desconhecido"); break;
}

Loops — repetir sem copiar e colar

// for: quando você sabe QUANTAS vezes repetir
for (int i = 0; i < 5; i++)
{
    Debug.Log("Spawnando inimigo número " + i);
}

// while: repete ENQUANTO a condição for verdadeira
while (municao > 0)
{
    Atirar();
    municao--;
}

// foreach: percorre cada item de uma coleção (veremos coleções em 1.5)
foreach (string item in inventario)
{
    Debug.Log("Você carrega: " + item);
}
[WARNING] Loop infinito Um while cuja condição nunca vira falsa trava a Unity inteira (você terá que forçar o fechamento). Garanta sempre que algo dentro do loop altera a condição.

1.3 · Métodos: blocos de ação reutilizáveis

Um método (ou função) é um bloco de código com nome, que você pode chamar quantas vezes quiser. É a base da organização de qualquer jogo:

// Método simples: não recebe nada, não devolve nada (void)
void ReiniciarFase()
{
    vida = 100;
    pontos = 0;
    Debug.Log("Fase reiniciada!");
}

// Método com PARÂMETROS: recebe informações para trabalhar
void ReceberDano(int quantidade)
{
    vida -= quantidade;
}

// Método com RETORNO: devolve um resultado para quem chamou
int CalcularDano(int forca, float multiplicador)
{
    return (int)(forca * multiplicador);
}

// Usando:
ReceberDano(25);
int dano = CalcularDano(10, 1.5f);  // dano = 15

Regra de ouro profissional: um método deve fazer uma coisa só e ter um nome que descreve essa coisa (verbo + substantivo: AbrirPorta(), CalcularDano()). Recrutadores olham isso em testes técnicos.

1.4 · Orientação a Objetos: como jogos são organizados

Jogos são feitos de "coisas": jogador, inimigos, itens, portas. A Programação Orientada a Objetos (POO) organiza o código em classes (moldes) que geram objetos (instâncias). Na Unity, todo script é uma classe — por isso POO é inegociável para o mercado.

// CLASSE: o molde de um inimigo
public class Inimigo
{
    // Campos (dados do objeto)
    public string nome;
    public int vida;
    private int dano = 10;   // private: só a própria classe acessa

    // Construtor: roda quando o objeto é criado
    public Inimigo(string nome, int vidaInicial)
    {
        this.nome = nome;
        vida = vidaInicial;
    }

    // Comportamentos (métodos)
    public void Atacar()
    {
        Debug.Log(nome + " ataca causando " + dano + " de dano!");
    }
}

// Criando OBJETOS a partir do molde:
Inimigo goblin = new Inimigo("Goblin", 30);
Inimigo chefe  = new Inimigo("Rei Goblin", 300);
goblin.Atacar();

Os 4 pilares da POO (cai em TODA entrevista)

PilarEm uma fraseExemplo em jogo
EncapsulamentoEsconder detalhes internos; expor só o necessário (private/public).A vida do inimigo é private; só muda via método ReceberDano(), que valida o valor.
HerançaUma classe filha reaproveita e estende a classe mãe.class Goblin : Inimigo — herda vida e ataque, adiciona "roubar item".
PolimorfismoO mesmo comando se comporta diferente em cada filho.Atacar() do arqueiro atira flecha; do mago, lança magia.
AbstraçãoDefinir "o que" sem definir "como" (classes abstratas, interfaces).Interface IDanificavel: tudo que pode tomar dano a implementa.
// Herança + polimorfismo na prática:
public class Inimigo
{
    public virtual void Atacar()   // virtual: filhos PODEM sobrescrever
    {
        Debug.Log("Ataque corpo a corpo");
    }
}

public class Arqueiro : Inimigo   // ":" significa "herda de"
{
    public override void Atacar() // override: sobrescreve o comportamento
    {
        Debug.Log("Atira uma flecha de longe!");
    }
}

// Interface: um CONTRATO. Quem implementa, promete ter esses métodos.
public interface IDanificavel
{
    void ReceberDano(int quantidade);
}
// Agora jogador, inimigo, barril explosivo... todos podem ser IDanificavel,
// e a bala não precisa saber QUEM acertou — só que dá para causar dano.
[LOG] Dica de entrevista "Prefira composição a herança" é um mantra da indústria — e a Unity é literalmente construída assim (componentes!). Herança profunda (Inimigo → Voador → VoadorQueAtira → ...) vira um pesadelo. Em entrevistas, mencione que usa herança com moderação e interfaces/componentes para flexibilidade. Você entenderá isso na prática no Módulo 2.

1.5 · Coleções, propriedades e recursos que a Unity usa muito

Arrays e Listas

// Array: tamanho FIXO
string[] fases = { "Floresta", "Caverna", "Castelo" };
Debug.Log(fases[0]);           // "Floresta" — índices começam em 0!

// List: tamanho DINÂMICO (precisa de "using System.Collections.Generic;")
List<string> inventario = new List<string>();
inventario.Add("Espada");
inventario.Add("Poção");
inventario.Remove("Poção");
Debug.Log(inventario.Count);   // 1

// Dictionary: pares chave → valor (busca rapidíssima)
Dictionary<string, int> precos = new Dictionary<string, int>();
precos["pocao"] = 50;
Debug.Log(precos["pocao"]);    // 50

Propriedades, enum e mais

// Propriedade: campo com controle de acesso embutido
public int Vida { get; private set; }  // todos leem, só a classe altera

// enum: conjunto fixo de opções nomeadas — perfeito para estados
public enum EstadoInimigo { Patrulhando, Perseguindo, Atacando, Morto }
EstadoInimigo estado = EstadoInimigo.Patrulhando;

// Interpolação de string (jeito moderno de montar textos):
Debug.Log($"Jogador {nomeJogador} tem {vida} de vida");

Exercícios do Módulo 1

  1. Calculadora de dano: escreva um método que recebe força e defesa e retorna o dano final (forca * 2 - defesa, mínimo 1).
  2. FizzBuzz (clássico de entrevista!): para números de 1 a 100, imprima "Fizz" se divisível por 3, "Buzz" se por 5, "FizzBuzz" se por ambos, senão o número. Dica: use %.
  3. Sistema de inventário: crie uma List<string> com métodos AdicionarItem, RemoverItem e ListarItens.
  4. Hierarquia de personagens: classe Personagem com método virtual Atacar(); classes Guerreiro e Mago sobrescrevendo com comportamentos diferentes.
M2

Fundamentos do Unity

Objetivo: dominar o editor, entender a filosofia de GameObjects + Componentes e escrever seus primeiros scripts que controlam o jogo.

2.1 · Conhecendo o Editor

A tela da Unity é dividida em janelas (você pode reorganizá-las). As 6 essenciais:

JanelaPara que serve
SceneOnde você monta o mundo do jogo: arrasta, posiciona e edita objetos. É sua "bancada de trabalho".
GameO que o jogador vê pela câmera. Aperte Play para testar o jogo aqui.
HierarchyLista de todos os objetos da cena atual, em árvore (pais e filhos).
InspectorMostra e edita as propriedades do objeto selecionado — é onde você configura tudo.
ProjectTodos os arquivos do projeto: scripts, imagens, sons, prefabs (a pasta Assets/).
ConsoleMensagens, avisos e erros. Seu melhor amigo para depurar (Debug.Log aparece aqui).
[ERROR] Armadilha do Play Mode Alterações feitas durante o Play (com o jogo rodando) são descartadas quando você para. Todo iniciante perde trabalho assim. Dica profissional: em Preferences → Colors, mude o "Playmode tint" para uma cor forte — assim você nunca esquece que está em Play.

Navegação na Scene (decore isto)

2.2 · GameObjects e Componentes: a filosofia da Unity

Este é o conceito mais importante da engine: tudo na cena é um GameObject, e um GameObject sozinho é apenas um "recipiente vazio". Quem dá comportamento a ele são os Componentes:

Jogador = GameObject + Sprite + Rigidbody + Collider + script PlayerController. Essa montagem por peças chama-se composição — a resposta prática ao "prefira composição a herança" do Módulo 1.

O Transform e vetores

A posição de um objeto é um Vector3 (x, y, z) — ou Vector2 em jogos 2D. Vetores são a matemática nº 1 dos jogos:

transform.position = new Vector3(0, 5, 0);       // teleporta o objeto
transform.Translate(Vector3.right * 2);           // move 2 unidades p/ direita
transform.Rotate(0, 90, 0);                       // gira 90° no eixo Y

// Atalhos úteis: Vector3.up = (0,1,0), .right = (1,0,0), .forward = (0,0,1)
// Distância entre dois pontos (ex.: inimigo → jogador):
float dist = Vector3.Distance(transform.position, jogador.position);

// Direção de A até B (normalizada = comprimento 1, só a direção):
Vector3 direcao = (jogador.position - transform.position).normalized;

2.3 · Scripts e o ciclo de vida (MonoBehaviour)

Para criar um script: clique direito na janela Project → Create → C# Script, nomeie (ex.: PlayerController) e arraste-o sobre um GameObject. Todo script de componente herda de MonoBehaviour e ganha "métodos mágicos" que a Unity chama automaticamente:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Awake()  { }  // 1º de todos — o objeto acabou de nascer. Use p/ pegar referências.
    void Start()  { }  // Antes do 1º frame — inicializações que dependem de outros objetos.
    void Update() { }  // TODO FRAME (30–200x por segundo!) — input, lógica de jogo.
    void FixedUpdate() { } // Em intervalos fixos — TODA física vai aqui.
    void LateUpdate()  { } // Depois de todos os Updates — ideal p/ câmera seguir o player.
    void OnDestroy()   { } // O objeto foi destruído — limpeza.
}

Time.deltaTime: o conceito que separa amador de profissional

Update() roda mais vezes por segundo em PCs rápidos. Se você mover "1 unidade por frame", o jogo fica mais rápido em máquinas melhores! A solução é multiplicar pelo tempo decorrido desde o último frame:

void Update()
{
    // ERRADO: velocidade depende do FPS
    // transform.Translate(Vector3.right * 5);

    // CERTO: 5 unidades POR SEGUNDO, em qualquer máquina
    transform.Translate(Vector3.right * 5f * Time.deltaTime);
}
[WARNING] Pergunta certa de entrevista "Qual a diferença entre Update e FixedUpdate?" — Update roda uma vez por frame (frequência variável); FixedUpdate roda em passos fixos de tempo (padrão 0,02s) sincronizado com o motor de física. Input se lê no Update; forças de física se aplicam no FixedUpdate.

Variáveis no Inspector e referências

public class Exemplo : MonoBehaviour
{
    public float velocidade = 5f;        // public: aparece no Inspector p/ ajustar sem código
    [SerializeField] private int vida = 100; // jeito PRO: privado, mas visível no Inspector

    public Transform alvo;               // arraste outro objeto aqui no Inspector
    private Rigidbody2D rb;              // referência a outro componente

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>(); // pega o componente NO MESMO objeto
    }
}
[LOG] Boa prática de mercado Estúdios preferem [SerializeField] private a public: o designer ajusta no Inspector, mas nenhum outro script mexe na variável por acidente. Encapsulamento na prática. E nunca chame GetComponent dentro do Update() — é caro; guarde a referência no Awake().

2.4 · Prefabs, Input e seu primeiro comportamento completo

Prefabs: objetos reutilizáveis

Um Prefab é um GameObject salvo como arquivo: arraste o objeto da Hierarchy para a pasta Project e pronto. Agora você pode instanciá-lo quantas vezes quiser (balas, inimigos, moedas), e editar o prefab atualiza todas as cópias.

public GameObject balaPrefab;   // arraste o prefab no Inspector
public Transform pontoDeTiro;

void Atirar()
{
    // Instantiate cria uma cópia na cena: (o quê, onde, com qual rotação)
    Instantiate(balaPrefab, pontoDeTiro.position, pontoDeTiro.rotation);
}

// E para remover objetos da cena:
Destroy(gameObject);        // destrói o próprio objeto
Destroy(gameObject, 3f);    // destrói daqui a 3 segundos (ótimo p/ balas)

Lendo input do jogador

// Input Manager clássico (simples, ótimo p/ aprender e protótipos):
float h = Input.GetAxis("Horizontal");  // -1 a 1 (A/D, setas, analógico)
float v = Input.GetAxis("Vertical");

if (Input.GetKeyDown(KeyCode.Space)) { Pular(); }   // no frame em que apertou
if (Input.GetKey(KeyCode.LeftShift)) { Correr(); }  // enquanto segura
if (Input.GetMouseButtonDown(0))     { Atirar(); }  // clique esquerdo
[LOG] Novo Input System A Unity tem também o pacote Input System (novo), padrão em estúdios para suportar controle, teclado e touch com o mesmo código. Aprenda primeiro o clássico (acima); quando estiver confortável, migre — cite os dois no currículo.

Exercícios do Módulo 2

  1. Crie um cubo que gira continuamente usando transform.Rotate e Time.deltaTime.
  2. Faça um objeto se mover com WASD usando Input.GetAxis.
  3. Crie um prefab de "moeda" e um script que instancia uma moeda a cada 2 segundos em posição aleatória (Random.Range).
  4. Explique com suas palavras (escreva mesmo!): a diferença entre Awake/Start e entre Update/FixedUpdate. Isso cai em entrevista.
M3

Desenvolvimento de Jogos 2D

Objetivo: dominar o pipeline 2D — sprites, física, animação e tilemaps — e construir seu primeiro jogo completo de plataforma.

3.1 · Sprites e física 2D

Em 2D, as imagens do jogo são sprites. Importe um PNG para a pasta Assets e, no Inspector, confira Texture Type: Sprite (2D and UI). Para pixel art: Filter Mode: Point (no filter) e Compression: None — senão sua arte fica borrada.

Física 2D: Rigidbody2D + Colliders

ComponenteFunção
Rigidbody2DFaz o objeto obedecer à física: gravidade, forças, velocidade. Body Type: Dynamic (físico), Kinematic (movido por código, empurra outros), Static (imóvel, ex.: chão).
BoxCollider2D / CircleCollider2D / CapsuleCollider2DA "forma sólida" do objeto. Cápsula é a favorita para personagens (não engancha em quinas).
Collider com "Is Trigger"Vira um sensor atravessável: detecta que algo entrou, mas não bloqueia. Perfeito para moedas, checkpoints e zonas de dano.
// Movimento de plataforma com física (vai no FixedUpdate!):
public class PlayerMovement2D : MonoBehaviour
{
    [SerializeField] float velocidade = 8f;
    [SerializeField] float forcaPulo = 12f;
    private Rigidbody2D rb;
    private float inputH;
    private bool noChao;

    void Awake() => rb = GetComponent<Rigidbody2D>();

    void Update()
    {
        inputH = Input.GetAxisRaw("Horizontal");   // input: no Update
        if (Input.GetKeyDown(KeyCode.Space) && noChao)
            rb.linearVelocity = new Vector2(rb.linearVelocity.x, forcaPulo);
        // (em versões antigas da Unity, use rb.velocity)
    }

    void FixedUpdate()                              // física: no FixedUpdate
    {
        rb.linearVelocity = new Vector2(inputH * velocidade, rb.linearVelocity.y);
    }

    // Detecção de chão simples via colisão:
    void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.CompareTag("Chao")) noChao = true;
    }
    void OnCollisionExit2D(Collision2D col)
    {
        if (col.gameObject.CompareTag("Chao")) noChao = false;
    }
}

Colisões vs Triggers — os 6 métodos que você vai usar a vida toda

// COLISÃO física (objetos sólidos se tocam):
void OnCollisionEnter2D(Collision2D col) { }  // começou a tocar
void OnCollisionStay2D(Collision2D col)  { }  // continua tocando
void OnCollisionExit2D(Collision2D col)  { }  // parou de tocar

// TRIGGER (sensor atravessável):
void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Moeda"))
    {
        pontos += 10;
        Destroy(other.gameObject);
    }
}
[ERROR] "Minha colisão não funciona!" — checklist 1) Pelo menos um dos dois objetos tem Rigidbody2D? (obrigatório) · 2) Os dois têm Collider2D? · 3) Trigger marcado usa OnTrigger..., não OnCollision...? · 4) A tag está escrita exatamente igual? · 5) O método termina com 2D? (misturar física 2D e 3D é o erro mais comum).

3.2 · Animação 2D e Tilemaps

O sistema Animator

  1. Animation Clips: selecione o objeto, abra Window → Animation → Animation, crie um clip (ex.: "Idle", "Run") e arraste os frames do sprite sheet.
  2. Animator Controller: a "máquina de estados" que decide qual animação toca. Estados (Idle, Run, Jump) conectados por transições controladas por parâmetros (float, bool, trigger).
  3. No código: você só altera parâmetros; o Animator cuida do resto.
private Animator anim;
void Awake() => anim = GetComponent<Animator>();

void Update()
{
    anim.SetFloat("Velocidade", Mathf.Abs(inputH)); // Idle ↔ Run
    anim.SetBool("NoChao", noChao);                 // Jump ↔ chão
    if (atacou) anim.SetTrigger("Atacar");          // dispara uma vez

    // Virar o sprite para a direção do movimento:
    if (inputH != 0) transform.localScale = new Vector3(Mathf.Sign(inputH), 1, 1);
}

Tilemaps: construindo fases como LEGO

O sistema de Tilemap permite pintar fases com blocos (tiles): crie via GameObject → 2D Object → Tilemap → Rectangular, abra a Tile Palette (Window → 2D), arraste seus sprites de cenário e pinte a fase como num editor de imagem. Adicione um TilemapCollider2D + CompositeCollider2D para o chão inteiro virar sólido de uma vez (marque Used by Composite). É assim que se constroem jogos de plataforma profissionais com rapidez.

3.3 · Projeto guiado

Projeto de portfólio #1

Plataforma 2D — "Coin Runner"

Escopo (1–2 semanas): um jogo de plataforma com 3 fases, moedas, inimigos de patrulha, HUD de pontos/vidas e tela de vitória.

  • Player com movimento, pulo e animações (Idle/Run/Jump) — seção 3.1/3.2
  • Fases construídas com Tilemap + colisores compostos
  • Moedas colecionáveis (trigger) com som e contador na tela
  • Inimigo que patrulha entre dois pontos e causa dano por contato
  • Sistema de vidas + respawn no checkpoint
  • Câmera que segue o player com suavização (Vector3.Lerp no LateUpdate, ou pacote Cinemachine — cite-o no currículo!)
  • 3 cenas de fase + menu inicial + tela de fim (Módulo 5 ajuda na UI)
  • Build para WebGL publicada no itch.io (Módulo 9 explica)
// Inimigo de patrulha — código base:
public class InimigoPatrulha : MonoBehaviour
{
    [SerializeField] Transform pontoA, pontoB;
    [SerializeField] float velocidade = 3f;
    Transform alvoAtual;

    void Start() => alvoAtual = pontoB;

    void Update()
    {
        transform.position = Vector2.MoveTowards(
            transform.position, alvoAtual.position, velocidade * Time.deltaTime);

        if (Vector2.Distance(transform.position, alvoAtual.position) < 0.1f)
            alvoAtual = (alvoAtual == pontoA) ? pontoB : pontoA;
    }
}
M4

Desenvolvimento de Jogos 3D

Objetivo: transferir tudo o que você sabe para o mundo 3D — iluminação, materiais, física, controle de personagem, câmera e inteligência artificial de inimigos.

4.1 · A cena 3D: modelos, materiais e luz

A boa notícia: 90% do que você aprendeu vale igual — GameObjects, componentes, ciclo de vida, prefabs. Muda o eixo Z (profundidade) e os componentes visuais:

Iluminação essencial

LuzUso
Directional LightO "sol": ilumina tudo de uma direção. Toda cena externa tem uma.
Point LightLâmpada: emite em todas as direções a partir de um ponto (tochas, abajures).
Spot LightCone de luz (lanterna, holofote, farol de carro).

Conceito de mercado — luz baked vs realtime: luzes em tempo real são caras. Em cenários estáticos, marca-se os objetos como Static e "assa-se" (bake) a iluminação em texturas (lightmaps) — visual rico quase de graça em performance. Saber disso diferencia candidatos em vagas mobile/VR.

4.2 · Física 3D e controle de personagem

Os mesmos conceitos do 2D, sem o sufixo: Rigidbody, BoxCollider, OnCollisionEnter(Collision col), OnTriggerEnter(Collider other). Para personagens, a Unity oferece um atalho poderoso: o componente CharacterController — colisão em cápsula com controle total de movimento, sem tombar como um Rigidbody:

public class PlayerController3D : MonoBehaviour
{
    [SerializeField] float velocidade = 6f;
    [SerializeField] float gravidade = -20f;
    [SerializeField] float forcaPulo = 8f;
    CharacterController controller;
    Vector3 velocidadeVertical;

    void Awake() => controller = GetComponent<CharacterController>();

    void Update()
    {
        // Movimento no plano, relativo à direção do personagem:
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 mover = transform.right * h + transform.forward * v;
        controller.Move(mover * velocidade * Time.deltaTime);

        // Gravidade manual (CharacterController não tem física própria):
        if (controller.isGrounded && velocidadeVertical.y < 0)
            velocidadeVertical.y = -2f;
        if (Input.GetKeyDown(KeyCode.Space) && controller.isGrounded)
            velocidadeVertical.y = forcaPulo;

        velocidadeVertical.y += gravidade * Time.deltaTime;
        controller.Move(velocidadeVertical * Time.deltaTime);
    }
}

Raycast: o "laser invisível" (indispensável)

Um Raycast dispara uma linha invisível e informa o que ela atingiu. É a base de tiros hitscan, detecção de chão, interação ("o que estou olhando?") e visão de inimigos:

void Atirar()
{
    // Do centro da câmera, para frente, até 100 unidades:
    Ray ray = new Ray(cameraJogador.position, cameraJogador.forward);

    if (Physics.Raycast(ray, out RaycastHit hit, 100f))
    {
        Debug.Log("Acertou: " + hit.collider.name);

        // Lembra da interface do Módulo 1? Ela brilha aqui:
        if (hit.collider.TryGetComponent(out IDanificavel alvo))
            alvo.ReceberDano(25);
    }
}

4.3 · Câmera e IA de inimigos (NavMesh)

Câmeras

IA com NavMesh: inimigos que perseguem e desviam de obstáculos

  1. Instale o pacote AI Navigation (Package Manager).
  2. Adicione um componente NavMeshSurface ao chão e clique Bake: a Unity calcula a "área caminhável".
  3. No inimigo, adicione um NavMeshAgent e mande-o a um destino:
using UnityEngine.AI;

public class InimigoIA : MonoBehaviour
{
    [SerializeField] Transform jogador;
    [SerializeField] float raioVisao = 10f, raioAtaque = 2f;
    NavMeshAgent agente;
    enum Estado { Patrulhando, Perseguindo, Atacando }
    Estado estado = Estado.Patrulhando;

    void Awake() => agente = GetComponent<NavMeshAgent>();

    void Update()
    {
        float dist = Vector3.Distance(transform.position, jogador.position);

        // Máquina de estados simples — padrão citado em TODA entrevista:
        switch (estado)
        {
            case Estado.Patrulhando:
                if (dist < raioVisao) estado = Estado.Perseguindo;
                break;
            case Estado.Perseguindo:
                agente.SetDestination(jogador.position);
                if (dist < raioAtaque) estado = Estado.Atacando;
                else if (dist > raioVisao * 1.5f) estado = Estado.Patrulhando;
                break;
            case Estado.Atacando:
                agente.ResetPath();
                // atacar aqui...
                if (dist > raioAtaque) estado = Estado.Perseguindo;
                break;
        }
    }
}

4.4 · Projeto guiado

Projeto de portfólio #2

Ação 3D em terceira pessoa — "Arena Survivor"

Escopo (2–3 semanas): uma arena 3D onde ondas de inimigos perseguem o jogador, que atira para sobreviver. Demonstra física, IA, câmera e sistemas — exatamente o que vagas de gameplay júnior pedem.

  • Greybox da arena com primitivas + materiais URP + iluminação com bake
  • Personagem com CharacterController + câmera Cinemachine em 3ª pessoa
  • Tiro com Raycast + interface IDanificavel compartilhada
  • Inimigos com NavMeshAgent e máquina de estados (patrulha → perseguir → atacar)
  • Spawner de ondas progressivas (onda N = 3 + N inimigos)
  • HUD: vida, munição, número da onda + tela de game over
  • Sons de tiro, dano e música ambiente (Módulo 5)
  • Vídeo de gameplay de 60s para o portfólio (Módulo 9)
M5

Sistemas de Jogo

Objetivo: dominar os sistemas transversais que todo jogo comercial tem — UI, áudio, dados, salvamento, corrotinas e gerenciamento de cenas.

5.1 · Interface de usuário (UI)

A UI da Unity (sistema uGUI) vive dentro de um Canvas. Elementos essenciais: Image, Button, Slider, Panel e — sempre — TextMeshPro (TMP) para textos (nunca use o Text legado: TMP tem qualidade e recursos muito superiores e é o padrão da indústria).

using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class HUDController : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI textoPontos;
    [SerializeField] Slider barraVida;

    public void AtualizarPontos(int pontos) => textoPontos.text = $"Pontos: {pontos}";
    public void AtualizarVida(float atual, float maxima) => barraVida.value = atual / maxima;

    // Conecte este método ao OnClick() do botão, no Inspector:
    public void BotaoJogar() => UnityEngine.SceneManagement.SceneManager.LoadScene("Fase1");
}

5.2 · Áudio

[SerializeField] AudioSource fonte;
[SerializeField] AudioClip somMoeda, somPulo;

void ColetarMoeda()
{
    fonte.PlayOneShot(somMoeda);
    // Variação de pitch deixa profissional (evita som repetitivo):
    fonte.pitch = Random.Range(0.95f, 1.05f);
}

5.3 · ScriptableObjects: dados como assets

ScriptableObject é uma classe que vira arquivo de dados no projeto — sem precisar existir na cena. É a ferramenta favorita dos estúdios para itens, armas, inimigos, diálogos e configurações, porque separa dados de lógica e permite que game designers criem conteúdo sem tocar em código:

[CreateAssetMenu(fileName = "NovaArma", menuName = "Jogo/Arma")]
public class ArmaData : ScriptableObject
{
    public string nome;
    public int dano;
    public float cadencia;
    public Sprite icone;
    public AudioClip somDisparo;
}

// No script da arma equipada:
public class Arma : MonoBehaviour
{
    [SerializeField] ArmaData dados;   // arraste o asset "Pistola", "Shotgun"...
    void Atirar() => Debug.Log($"{dados.nome} causou {dados.dano} de dano");
}
[LOG] Dica de entrevista "Como você estruturaria 50 tipos de inimigos?" — resposta esperada: um prefab genérico + ScriptableObjects com os dados de cada tipo. Mencionar SOs em entrevista sinaliza experiência real com Unity.

5.4 · Corrotinas, salvamento e cenas

Corrotinas: código que espera sem travar o jogo

using System.Collections;

void Start() => StartCoroutine(SpawnarOndas());

IEnumerator SpawnarOndas()
{
    while (true)
    {
        SpawnarInimigo();
        yield return new WaitForSeconds(2f); // pausa AQUI e continua depois
    }
}
// Usos típicos: cooldowns, fade de tela, sequências de eventos, timers.

Salvando o jogo

// Simples (opções, recordes): PlayerPrefs
PlayerPrefs.SetInt("Recorde", 1500);
int recorde = PlayerPrefs.GetInt("Recorde", 0); // 0 = valor padrão

// Profissional (save completo): serializar para JSON
[System.Serializable]
public class SaveData
{
    public int vida;
    public int pontos;
    public float[] posicao;
}

void Salvar(SaveData dados)
{
    string json = JsonUtility.ToJson(dados);
    System.IO.File.WriteAllText(
        Application.persistentDataPath + "/save.json", json);
}
[WARNING] PlayerPrefs não é para saves PlayerPrefs serve para preferências pequenas. Usar para o save inteiro do jogo é apontado como red flag em code reviews. JSON em persistentDataPath é o caminho correto (e a resposta certa em entrevista).

Gerenciando cenas

using UnityEngine.SceneManagement;

SceneManager.LoadScene("Fase2");              // troca de cena
SceneManager.LoadScene("HUD", LoadSceneMode.Additive); // carrega POR CIMA (UI persistente)
DontDestroyOnLoad(gameObject);                // objeto sobrevive à troca (ex.: GameManager)
M6

Arquitetura & Boas Práticas

Objetivo: escrever código que passa em testes técnicos e code reviews. Este módulo é o que separa "faz joguinhos" de "empregável como programador".

6.1 · Código limpo e SOLID em jogos

SOLID resumido para entrevistas (memorize o S e o D, os mais cobrados):

LetraPrincípioTradução para jogos
SSingle ResponsibilityUm script = uma responsabilidade. PlayerMovement, PlayerHealth e PlayerShooting separados, não um Player.cs de 900 linhas ("God class" — red flag clássica).
OOpen/ClosedAberto para extensão, fechado para modificação: nova arma = novo ScriptableObject, sem editar o código da arma.
LLiskov SubstitutionQualquer filho deve funcionar onde o pai funciona (um Arqueiro serve onde se espera Inimigo).
IInterface SegregationInterfaces pequenas: IDanificavel, IColetavel — não uma IEntidadeDeJogo gigante.
DDependency InversionDependa de abstrações: a bala conhece IDanificavel, não a classe concreta Inimigo.

6.2 · Padrões de projeto que caem em entrevista

Singleton — instância única e global (use com moderação!)

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public int Pontos { get; private set; }

    void Awake()
    {
        if (Instance != null && Instance != this) { Destroy(gameObject); return; }
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void AdicionarPontos(int valor) => Pontos += valor;
}
// De qualquer lugar: GameManager.Instance.AdicionarPontos(10);
// Em entrevista, diga: "uso para 1–2 managers centrais, ciente de que
// abusar cria acoplamento e dificulta testes" — resposta madura.

Observer — eventos: "avise-me quando acontecer"

using System;

public class PlayerHealth : MonoBehaviour
{
    public static event Action<int> AoMudarVida;   // o "canal de aviso"
    public static event Action AoMorrer;

    int vida = 100;
    public void ReceberDano(int dano)
    {
        vida -= dano;
        AoMudarVida?.Invoke(vida);                  // avisa quem estiver ouvindo
        if (vida <= 0) AoMorrer?.Invoke();
    }
}

// A UI OUVE o evento — o Player nem sabe que a UI existe (desacoplamento!):
public class BarraDeVidaUI : MonoBehaviour
{
    void OnEnable()  => PlayerHealth.AoMudarVida += Atualizar;
    void OnDisable() => PlayerHealth.AoMudarVida -= Atualizar; // SEMPRE desinscreva!
    void Atualizar(int vida) { /* atualiza a barra */ }
}
[ERROR] Vazamento de memória clássico Inscrever-se em evento no OnEnable e esquecer de desinscrever no OnDisable causa erros fantasma (objeto destruído ainda "ouvindo") — pergunta frequente de entrevista sênior para júnior.

Object Pool — reciclar em vez de criar/destruir

Instantiate/Destroy em alta frequência (balas, partículas) gera lixo de memória e engasgos (GC spikes). O padrão Object Pool cria N objetos uma vez e os reutiliza, ativando/desativando. A Unity tem implementação pronta: UnityEngine.Pool.ObjectPool<T>. Saber explicar "por que pooling?" é pergunta padrão em vagas mobile.

State (máquina de estados)

Você já usou no inimigo do Módulo 4 com enum + switch. A versão avançada usa uma classe por estado (padrão State formal) — cite as duas abordagens e quando cada uma compensa (enum para 3–4 estados; classes quando os estados têm muita lógica própria).

6.3 · Git para projetos Unity (requisito de vaga)

Nenhum estúdio contrata quem não versiona código. O fluxo mínimo:

  1. Instale o Git e crie conta no GitHub. Um repositório por projeto.
  2. .gitignore de Unity: essencial! Ignore Library/, Temp/, Obj/, Build/, Logs/ (o GitHub oferece o template "Unity" ao criar o repo). Sem isso, o repositório fica gigante e quebrado.
  3. Configurações do projeto: em Edit → Project Settings → Editor: Version Control = Visible Meta Files; Asset Serialization = Force Text. Isso torna o projeto "versionável".
  4. Commits pequenos e frequentes com mensagens descritivas: feat: adiciona pulo duplo, fix: corrige colisão da moeda (padrão "Conventional Commits" — bonito no portfólio).
  5. Branches: main sempre estável; funcionalidades em branches (feature/sistema-de-save) e merge ao terminar.
[LOG] Dica de mercado Seu GitHub É parte do portfólio: recrutadores técnicos abrem os repositórios. Commits frequentes, README com GIF do gameplay e código organizado valem mais que mil certificados. Arquivos grandes de arte pedem Git LFS — mencionar isso em entrevista mostra experiência.
M7

Tópicos Avançados

Objetivo: os diferenciais técnicos — otimização, shaders, multiplayer e DOTS — que elevam seu perfil de júnior para "júnior forte" ou pleno.

7.1 · Otimização e Profiler

Regra de ouro: nunca otimize no chute — meça primeiro. A ferramenta é o Profiler (Window → Analysis → Profiler): grave o jogo rodando e veja exatamente onde o tempo de cada frame é gasto (CPU, GPU, memória, física).

Os vilões clássicos de performance (e as soluções)

ProblemaSolução
Muitos draw calls (cada material/objeto = uma "ordem" para a GPU)Batching (estático/dinâmico/SRP Batcher), atlas de sprites (juntar texturas), menos materiais distintos.
Garbage Collector travando o jogo (GC spikes)Evitar new dentro do Update, concatenação de strings por frame, LINQ em hot paths; usar Object Pooling; cachear referências.
GetComponent/Find no UpdateCachear no Awake. GameObject.Find em produção é red flag.
Overdraw (pintar o mesmo pixel várias vezes — transparências)Menos camadas transparentes sobrepostas; partículas com moderação (crítico em mobile).
Física pesadaColliders primitivos (nunca Mesh Collider em objeto móvel se evitável), Layer Collision Matrix para ignorar pares desnecessários.
Texturas/áudio pesadosCompressão adequada por plataforma, mipmaps, áudio comprimido em streaming para músicas.
[LOG] Frame budget — vocabulário de entrevista 60 FPS significa que cada frame tem 16,6 ms para acontecer (33,3 ms a 30 FPS). Falar em "caber no frame budget" e "medi no Profiler antes de otimizar" impressiona entrevistadores.

7.2 · Shaders e VFX (noções que abrem portas)

7.3 · Multiplayer, DOTS e além

Multiplayer (Netcode for GameObjects)

Conceitos que você deve saber explicar, mesmo sem dominar: arquitetura cliente-servidor vs peer-to-peer; autoridade do servidor (nunca confie no cliente — anti-cheat básico); sincronização de variáveis (NetworkVariable) e chamadas remotas (RPCs); latência e client-side prediction. Um projeto simples de 2 jogadores com Netcode for GameObjects + Relay já é diferencial enorme em currículo júnior.

DOTS/ECS e Jobs (saber o que é)

DOTS (Data-Oriented Technology Stack) é a abordagem da Unity para performance extrema: em vez de objetos com componentes "gordos", dados puros processados em massa (ECS — Entity Component System), em paralelo (Job System) e com código compilado otimizado (Burst). Usado em jogos com milhares de entidades (RTS, simulações). Para júnior, basta saber explicar o conceito e quando faz sentido — dominar DOTS é assunto de vaga pleno/sênior.

Ferramentas modernas que valem citação no currículo

M8

Mobile & Publicação

Objetivo: transformar projeto em produto — builds para Android/iOS e PC/Web, otimização mobile e noções de monetização (o vocabulário das vagas de estúdio mobile).

8.1 · Gerando builds

Android (o mais acessível para começar)

  1. Instale o módulo Android Build Support (com SDK/NDK/JDK) pelo Unity Hub.
  2. File → Build Settings → Android → Switch Platform.
  3. Em Player Settings: nome do pacote (com.seuestudio.seujogo), versão mínima do Android, orientação da tela e ícone.
  4. Build gera um .apk (instalação direta para testes) ou .aab (formato exigido pela Google Play).
  5. Ative o Developer Mode + depuração USB no celular e use Build and Run para testar direto no aparelho.

iOS exige um Mac com Xcode e conta Apple Developer. WebGL gera uma versão que roda no navegador — o formato perfeito para portfólio no itch.io (recrutador joga sem instalar nada!). PC é um clique.

Controles touch e otimização mobile

8.2 · Monetização e lojas (vocabulário de vaga mobile)

ModeloComo funcionaTermos de vaga
Anúncios (Ads)Banner, interstitial (tela cheia entre fases) e rewarded (assiste vídeo, ganha recompensa — o mais aceito pelos jogadores).Unity Ads / LevelPlay, AdMob, eCPM, fill rate
Compras no app (IAP)Moedas, skins, remover anúncios. Pacote Unity IAP integra Google Play e App Store.IAP, conversão, ARPU
PremiumPagar uma vez para baixar. Comum em PC (Steam), raro em mobile.Wishlist, Steam page

Analytics e LiveOps: estúdios mobile vivem de métricas — retenção D1/D7/D30, sessão média, funil de fases. Conhecer Unity Analytics ou Firebase e o conceito de remote config (ajustar o jogo sem atualizar o app) é diferencial real em vagas de mobile.

[LOG] Publicar é diferencial gigante Ter UM jogo publicado (Google Play ou itch.io), por mais simples que seja, prova que você sabe terminar — a habilidade mais rara em candidatos júnior. O processo de publicação (ícones, screenshots, descrição, classificação etária, política de privacidade) é aprendizado que só se ganha fazendo.
M9

Carreira & Mercado de Trabalho

Objetivo: converter conhecimento em contratação — portfólio, currículo, entrevistas, certificações e um plano de estudos realista.

9.1 · O portfólio que contrata

Para vagas júnior, o portfólio pesa mais que diploma. A fórmula que funciona:

[WARNING] Erros que eliminam candidatos Portfólio só com tutoriais seguidos passo a passo sem nenhuma modificação própria · clones sem nenhum toque pessoal · projetos que não abrem/quebram · assets da Asset Store apresentados como se fossem seus (usar é ok; MENTIR não) · repositório com a pasta Library (denuncia que não sabe Git).

9.2 · Entrevistas técnicas: o que cai e como responder

Processos típicos de estúdio: triagem de currículo → conversa com RH → teste técnico (um mini-jogo em alguns dias, ou perguntas ao vivo) → entrevista técnica → cultural. As perguntas clássicas (todas cobertas nesta apostila):

PerguntaNúcleo da boa respostaOnde estudar
Diferença entre Update, FixedUpdate e LateUpdate?Frame variável vs passo fixo de física vs pós-update (câmera).M2.3
Por que multiplicar por Time.deltaTime?Independência de framerate.M2.3
Collision vs Trigger?Bloqueio físico vs sensor atravessável; exige Rigidbody em um dos lados.M3.1
Os 4 pilares de POO? Herança vs composição?Definições + "Unity favorece composição via componentes".M1.4, M2.2
O que são ScriptableObjects e quando usar?Dados como assets; separar dados de lógica; designers criam conteúdo.M5.3
Como evitar GC spikes / o que é object pooling?Evitar alocação no hot path; reciclar objetos frequentes.M6.2, M7.1
Singleton: prós e contras?Acesso global conveniente × acoplamento e testabilidade; usar com moderação.M6.2
Como você otimizaria um jogo que está travando?"Primeiro eu MEÇO no Profiler" — depois draw calls, GC, física, overdraw.M7.1
Como funciona um Raycast? Para que usa?Linha invisível com hit info; tiros, visão de IA, interação.M4.2
Já trabalhou com Git? Descreva seu fluxo.Branches por feature, commits pequenos, .gitignore de Unity, LFS para arte.M6.3

No teste técnico prático, avaliam mais o COMO que o QUÊ

Perguntas comportamentais (prepare 3 histórias)

"Fale de um bug difícil que resolveu", "um projeto que não deu certo", "como lida com feedback". Use o formato Situação → Ação → Resultado, com histórias reais dos seus projetos de portfólio. Fazer os projetos desta apostila te dá essas histórias.

9.3 · Certificações, formação e faixas de mercado

Expectativas salariais (ordens de grandeza, Brasil)

Valores variam muito por região, porte do estúdio e momento do mercado — pesquise faixas atuais no Glassdoor e em levantamentos da comunidade (ex.: pesquisas salariais da Abragames/IGDA). Como referência de estrutura: estágio/júnior em estúdios nacionais costuma ficar na faixa de 2 a 5 mil reais; pleno, de 6 a 12 mil; sênior, acima disso; e vagas remotas internacionais multiplicam esses valores. Estúdios de "serious games" (educação, treinamento corporativo, simulação) e empresas fora de games que usam Unity (arquitetura, indústria, XR) são portas de entrada frequentemente menos concorridas que estúdios de entretenimento.

Onde procurar vagas e comunidade

9.4 · Roadmap de estudos (plano de 6–9 meses)

FaseDuraçãoMeta
1. FundamentosSemanas 1–6Módulos 0–2 desta apostila + exercícios. Meta: mover objetos, entender componentes e ciclo de vida sem consultar nada.
2. Primeiro jogoSemanas 7–10Módulo 3 completo + projeto "Coin Runner" publicado no itch.io (WebGL). Criar o GitHub com o projeto versionado.
3. 3D e sistemasSemanas 11–16Módulos 4–5 + projeto "Arena Survivor" com vídeo de gameplay. Primeira game jam.
4. ProfissionalizaçãoSemanas 17–22Módulos 6–7: refatorar os dois projetos com eventos, SOs e pooling (mostre o "antes/depois" no README — recrutadores amam). Trilha Junior Programmer do Unity Learn.
5. Produto e mercadoSemanas 23–28Módulo 8: publicar um jogo mobile simples na Play Store. Módulo 9: montar portfólio, currículo e LinkedIn.
6. Ofensiva de vagasSemanas 29+Candidatar-se (10+ vagas/semana), simular entrevistas com as perguntas de 9.2, segunda game jam, projeto pessoal contínuo. Ajustar portfólio com cada feedback.
[LOG] A regra de ouro Consistência vence intensidade: 1–2 horas por dia, todos os dias, superam 12 horas no domingo. E a partir da fase 2, a proporção ideal é 30% estudando / 70% construindo. Você aprende Unity fazendo jogos, não assistindo aulas.
A+

Apêndices

Referência rápida: atalhos, vocabulário da indústria e onde continuar aprendendo.

A.1 · Atalhos essenciais do Editor

AtalhoAção
Ctrl+PPlay / Stop
Ctrl+Shift+PPausar o Play (inspecione a cena congelada!)
Q W E R TPan · Mover · Rotacionar · Escalar · Rect
FFocar no objeto selecionado
Ctrl+DDuplicar objeto
Ctrl+Shift+FAlinhar objeto à visão da Scene (ótimo p/ câmera)
V (segurando ao mover)Snap por vértice (encaixar peças de cenário)
Ctrl+Shift+CAbrir o Console

A.2 · Glossário da indústria

TermoSignificado
BuildVersão executável do jogo gerada para uma plataforma.
AssetQualquer arquivo do projeto: sprite, modelo, som, script, prefab.
Greybox / BlockoutProtótipo de fase com formas cinzas simples, antes da arte final.
Game feel / JuicePolimento sensorial: screen shake, partículas, sons, animações que fazem o jogo "gostoso".
GDDGame Design Document — documento que descreve o jogo.
Vertical sliceFatia pequena do jogo com qualidade final, para demonstração.
CrunchPeríodos de horas extras intensas perto de entregas (pergunte sobre isso na entrevista — cultura importa).
Milestone / SprintMarcos de entrega / ciclos curtos de trabalho (metodologia ágil, usada na maioria dos estúdios).
QAQuality Assurance — testes; também uma porta de entrada comum para a indústria.
PortingAdaptar o jogo para outra plataforma.
Tech debtDívida técnica: atalhos de código que cobram juros depois.

A.3 · Recursos para continuar

Palavra final: todo desenvolvedor profissional de jogos já esteve exatamente onde você está agora — sem saber o que era uma variável. A diferença entre quem entrou na indústria e quem desistiu não foi talento: foi terminar projetos pequenos, um depois do outro, e mostrá-los ao mundo. Comece hoje pelo Módulo 0. Bom desenvolvimento! 🎮