Pesquisar
Close this search box.

Fazendo Jogos 2D de Física na Unity: Aprenda a Arremessar Objetos e Destruir Torres

Aprenda a fazer Jogos 2D de Física na Unity na prática com esse tutorial

Falamos aqui sobre como funciona a física em jogos 2D, mas aplicar isso na prática é bem mais complexo do que parece. Afinal, assim como no nosso dia-a-dia o movimento, gravidade, a colisão de objetos, tudo afeta a gente e o nosso entorno.

Então, para ajudar você a dar seus primeiros passo, vamos fazer um joguinho em Unity (site oficial) que funciona de forma similar ao famoso Angry Birds. O joguinho que jogamos pássaros em paredes de pedra para atingir porcos e não é considerado crueldade com animais.

Embora o conceito de um jogo baseado em física com objetos sendo arremessados por catapultas seja anterior ao jogo dos pássaros, com vários tipos de game ao estilo “siege” no antigo site Click Jogos, foi o carisma dos passarinhos bravos que conquistou o público.

E, se há tantos jogos nesse estilo, por que não tentar a sorte e criar o “próximo Angry Birds” da Play Store?

Para criar Jogos 2D de Física na Unity ao estilo de Angry Birds em Unity, você vai precisar implementar várias funcionalidades principais, como o estilingue, o elástico, a gravidade, a trajetória do lançamento, e as interações de colisão.

Vamos detalhar cada um desses pontos mais importantes para esse tipo de jogo, com códigos de desenvolvimento e, se você ficar com dúvidas, é só deixar nos comentários.

Jogos 2D de Física na Unity: Recriando Angry Birds

Para se criar um jogo ao estilo Angry Birds, é preciso de alguns elementos básicos:

  • Um objeto que será arremessado, que vamos chamar de “pássaro”, mas pode ser qualquer coisa, como uma bola, uma pedra, um aerolito, etc. O objeto também poderia ser uma pessoa, mas como tem partes móveis que podem afetar a trajetória do voo, vamos ficar com algo redondinho e liso, como um pássaro;
  • Um estilingue, canhão ou qualquer coisa que arremesse nosso objeto. Esse item fica parado e estático para não afetar a física do lançamento. Se quiser que o objeto se mova, é possível, mas as coisas ficam mais complexas;
  • Um elástico, mola ou qualquer coisa que impulsione o objeto. Essa parte é muito importante;
  • Um alvo. Uma torre cheia de porcos, caixas, outras pedras, paredes de um castelo, qualquer coisa que será derrubada pelo nosso objeto. Claro, atingir uma torre de pedra terá consequências diferentes de bater em um vidro ou madeira, então, por enquanto, vamos ficar com uma pilha de caixas que irá funcionar bem para nosso exemplo;
O trailer do primeiro Angry Birds

1. Estilingue Estático

Para o estilingue que fica estático, você não precisa de um script específico para mantê-lo imóvel. Ele pode ser simplesmente um objeto na cena com um SpriteRenderer (se estiver usando gráficos 2D) e talvez Colliders para interações físicas, mas sem Rigidbody, ou com um Rigidbody configurado como isKinematic para evitar que seja movido pela física.

  • Implementação: Para criar o estilingue que fica estático, você pode usar objetos do tipo GameObject para representar as partes do estilingue. Esses objetos não devem ter Rigidbody ou devem ter um Rigidbody com a propriedade isKinematic definida como true, para que não sejam afetados pela física.

2. Elástico Esticável

A mecânica do elástico, que estica e lança o pássaro, foi parcialmente abordada no exemplo de código com o cálculo da direção e força do lançamento baseado na distância entre o ponto onde o jogador começou a arrastar e onde soltou.

No entanto, para visualizar o elástico esticando, você pode usar um LineRenderer ou uma série de sprites que mudam com a distância. Isso requer códigos adicionais para ajustar os pontos finais do LineRenderer com base na posição do pássaro e do estilingue durante o arrasto.

  • Implementação: O elástico pode ser implementado usando a física de molas do Unity, especificamente com SpringJoint ou LineRenderer para desenhar o elástico. Ao arrastar o pássaro para trás, você altera a distância entre o pássaro e o ponto de ancoragem do estilingue, aumentando a tensão da mola. A força aplicada ao pássaro pode ser calculada pela distância esticada multiplicada por uma constante de força que você define.

3. Gravidade Sobre o Pássaro

  • Implementação: Unity já opera com uma gravidade padrão que simula 1G terrestre. Você pode ajustar a gravidade global no Unity através do menu Edit -> Project Settings -> Physics. O Rigidbody do pássaro já responderá a essa gravidade. Certifique-se de que o pássaro tem um componente Rigidbody para que a gravidade possa atuar sobre ele.

4. Cálculo da Trajetória

Para a trajetória, Unity não calcula e mostra automaticamente a trajetória futura do lançamento. Você precisaria calcular manualmente os pontos da trajetória baseando-se na física de projéteis e desenhá-la usando um LineRenderer.

Este cálculo envolveria iterar sobre um intervalo de tempo, aplicando a equação do movimento de projéteis para determinar a posição do pássaro em cada ponto no tempo e atualizando o LineRenderer com esses pontos.

Em cada frame, você pode calcular pontos futuros da trajetória baseando-se na velocidade inicial, ângulo de lançamento, gravidade, e tempo, e usar um LineRenderer para desenhar a trajetória.

Primeiro, adicione um componente LineRenderer ao objeto que representará a trajetória. Em seguida, você pode usar o seguinte script para calcular e desenhar a trajetória. Este script deve ser anexado ao mesmo objeto que tem o LineRenderer:

Angry birds
Os pontos brancos mostram a trajetória que o pássaro fará até atingir o porco
using UnityEngine;

[RequireComponent(typeof(LineRenderer))]
public class TrajectoryRenderer : MonoBehaviour
{
    public Transform projectile; // O ponto de origem do lançamento
    public Rigidbody2D projectileRigidbody; // Rigidbody do projétil
    public LineRenderer lineRenderer;
    public int resolution = 30; // Quantidade de pontos na trajetória
    private float g; // Aceleração gravitacional
    private float radianAngle;

    void Start()
    {
        g = Mathf.Abs(Physics2D.gravity.y); // Obtendo a gravidade do mundo
        lineRenderer = GetComponent<LineRenderer>();
    }

    // Função para chamar e atualizar a trajetória
    public void UpdateTrajectory(Vector2 initialVelocity)
    {
        lineRenderer.positionCount = resolution;
        radianAngle = Mathf.Deg2Rad * Vector2.Angle(Vector2.up, initialVelocity);
        List<Vector3> points = new List<Vector3>();
        for (int i = 0; i < resolution; i++)
        {
            float t = i / (float)resolution;
            Vector3 point = CalculateTrajectoryPoint(t, initialVelocity);
            points.Add(point);
        }
        lineRenderer.SetPositions(points.ToArray());
    }

    // Calcula a posição de um ponto na trajetória em um tempo t
    Vector3 CalculateTrajectoryPoint(float t, Vector2 initialVelocity)
    {
        float x = t * initialVelocity.x;
        float y = (t * initialVelocity.y) - (g * t * t / 2.0f);
        return projectile.position + new Vector3(x, y);
    }

    // Exemplo de como você pode chamar UpdateTrajectory
    void Update()
    {
        if (Input.GetMouseButtonUp(0)) // Este é apenas um exemplo, adapte conforme necessário
        {
            Vector2 velocity = (projectile.position - Camera.main.ScreenToWorldPoint(Input.mousePosition)) * 5; // Calcule a velocidade inicial como preferir
            UpdateTrajectory(velocity);
        }
    }
}

Este script assume que você está lançando o projétil em um plano 2D e usa o Rigidbody2D do projétil para obter a gravidade e calcular a trajetória. A função UpdateTrajectory calcula e atualiza os pontos da trajetória baseando-se na velocidade inicial do projétil. Você pode ajustar a resolução para ter mais ou menos pontos na trajetória, dependendo da precisão desejada e do desempenho.

5. Empilhamento de Caixas

  • Implementação: As caixas podem ser simples GameObjects com componentes Rigidbody e BoxCollider. Para empilhá-las, simplesmente as coloque uma sobre a outra na cena. Unity lidará com a física da estabilidade da pilha.

6. Colisão e Movimento das Caixas

As interações de colisão e a física dos objetos como as caixas não requerem código específico para serem implementadas; você configuraria os Rigidbodies e Colliders nos objetos envolvidos. A forma como eles reagem a colisões e a gravidade é gerenciada automaticamente pelo motor de física do Unity, com base nas propriedades desses componentes (massa, drag, elasticidade, etc.).

Angry birds
Ao atingir a torre, cria-se um efeito em cascata que faz com que os objetos em cima derrubem tudo que está próximo
  • Implementação: As colisões serão automaticamente detectadas e tratadas pelo Unity, desde que os objetos envolvidos tenham componentes Collider e Rigidbody. A maneira como as caixas se movem ao serem atingidas dependerá de suas massas, a força do impacto, e as configurações de física global. Você pode ajustar a mass e o drag nos Rigidbody para afinar o comportamento.

Exemplo de Código para o Lançamento

Aqui está um exemplo básico de como você pode implementar o lançamento do pássaro usando um script em C#:

public Rigidbody2D birdRigidbody;
public float launchForce = 500f;
private Vector2 startPoint;
private Vector2 endPoint;
private Vector2 direction;
private float distance;

void Update() {
    if (Input.GetMouseButtonDown(0)) { // Botão do mouse pressionado
        startPoint = birdRigidbody.position;
    }

    if (Input.GetMouseButton(0)) { // Botão do mouse mantido pressionado
        // Convertendo a posição do mouse para uma posição no mundo
        Vector2 currentPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        // Renderizar a linha do elástico aqui
    }

    if (Input.GetMouseButtonUp(0)) { // Botão do mouse solto
        endPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        direction = (startPoint - endPoint).normalized;
        distance = Vector2.Distance(startPoint, endPoint);

        birdRigidbody.isKinematic = false;
        birdRigidbody.AddForce(direction * launchForce * distance);
    }
}

Este script deve ser um ponto de partida. Você precisará ajustá-lo para atender às necessidades específicas do seu jogo, como adicionar o cálculo da trajetória e a visualização do elástico. A implementação específica pode variar dependendo de como você deseja que seu jogo funcione e se pareça.

Aprendendo tudo sobre a Unity

Quer transformar sua paixão por jogos em uma carreira de sucesso como desenvolvedor de jogos? O CursoGame.Dev é a sua porta de entrada para o mundo do desenvolvimento de jogos! Seja você um iniciante absoluto ou alguém que já brinca com códigos e design, este curso foi feito pensando em te levar para o próximo nível.

Aprenda a criar jogos do zero utilizando as ferramentas e técnicas mais atuais do mercado. Não perca a chance de transformar sua paixão em profissão. Inscreva-se agora no CursoGame.Dev e comece a criar os jogos que sempre sonhou!

FAQ Rápido

O que é física nos jogos 2D?

A física nos jogos 2D refere-se à aplicação de princípios físicos no design e na jogabilidade de jogos eletrônicos bidimensionais. Isso inclui conceitos como movimento, colisões, gravidade e outras interações físicas simuladas dentro do ambiente do jogo.

Por que a física é importante em jogos 2D?

A física é importante porque adiciona realismo e imersão aos jogos 2D, tornando as interações entre os objetos mais naturais e previsíveis. Ela também contribui para a jogabilidade, criando desafios baseados em princípios físicos e permitindo que os jogadores explorem e interajam com o ambiente de forma mais autêntica.

Quais são os principais princípios físicos aplicados em jogos 2D?

Os principais princípios físicos aplicados em jogos 2D incluem movimento, colisões, gravidade, fricção e elasticidade. Esses conceitos são fundamentais para simular o comportamento realista dos objetos e personagens dentro do ambiente do jogo.

Como a física é implementada em jogos 2D?

A física é implementada em jogos 2D por meio de algoritmos e mecanismos de simulação que calculam o comportamento dos objetos com base nos princípios físicos. Isso pode envolver o uso de bibliotecas de física, motores de jogo dedicados ou desenvolvimento de código personalizado pelos desenvolvedores.

Fale conosco nos comentários e diga oque achou dessa matéria e aproveite para ler mais notícias e matérias, como por exemplo, sobre Curso de Criação de Jogos, no nosso site.

BioWare abraça suas raízes narrativas em um RPG single player; Assista uma emocionante sequência de gameplay estendida que prepara a história e os desafios
TEAMGROUP na Computex 2024 apresenta novos produtos com o lema: "Elevate Gaming . Empower AI"
Saiba se vale a pena jogar Fabledom
Quer dar vida aos seus modelos 3D com texturas impressionantes? Continue lendo para aprender tudo sobre o processo de mapeamento UV do Blender!
Saiba mais sobre a espetacular memória RAM DELTA TUF RGB DDR5