Como fazer um jogo inspirado no Flappy Bird no Unity

Neste tutorial Unity, percorreremos o processo de criação de um jogo Flappy Bird. Este clássico jogo para celular envolve guiar um pássaro através de uma série de tubos tocando para fazê-lo bater e evitar obstáculos. Vamos mergulhar nas instruções passo a passo.

Etapa 1: Configure seu projeto Unity

  • Se ainda não o fez, abra Unity e crie um novo projeto 2D.
  • Defina as configurações do seu projeto, incluindo resolução e segmentação por plataforma.

Etapa 2: importar recursos do jogo

Etapa 3: crie o Flappy Bird

  • Adicione um sprite 2D para o pássaro.
  • Implemente controles de toque simples para fazer o pássaro bater as asas.
  • Aplique a gravidade para fazer o pássaro cair naturalmente.

Etapa 4: projete os tubos

  • Crie um pipe prefab usando sprites 2D.
  • Configure um sistema de spawn para gerar tubos em intervalos regulares.

Etapa 5: implementar a lógica do jogo

  • Adicione um sistema de pontuação para passar com sucesso pelos canos.
  • Implemente a detecção de colisão para encerrar o jogo quando o pássaro atingir os canos ou o solo.

Confira o script abaixo, ele encapsula as partes 3, 4 e 5.

'FlappyBird.cs'

using UnityEngine;
using System.Collections.Generic;

public class FlappyBird : MonoBehaviour
{
    public float jumpForce = 5f;
    public Transform pipeSpawnPoint;
    public GameObject pipePrefab;
    public float pipeSpawnInterval = 2f;
    public float pipeSpeed = 2f;

    private Rigidbody2D rb;
    private Transform mainCameraTransform;

    private List<GameObject> pipes = new List<GameObject>();

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        mainCameraTransform = Camera.main.transform;

        // Start spawning pipes
        InvokeRepeating("SpawnPipe", 2f, pipeSpawnInterval);
    }

    void Update()
    {
        // Flap when the screen is tapped or clicked
        if (Input.GetMouseButtonDown(0))
        {
            Flap();
        }

        // Move towards the pipes
        transform.Translate(Vector3.right * pipeSpeed * Time.deltaTime);

        // Move and manage spawned pipes
        foreach (GameObject pipe in pipes)
        {
            if (pipe != null)
            {
                pipe.transform.Translate(Vector3.left * pipeSpeed * Time.deltaTime);

                // End the game when colliding with pipes or ground
                if (pipe.CompareTag("Pipe") && IsCollidingWithPipe(pipe))
                {
                    EndGame();
                    return; // Exit the loop and update immediately
                }

                if (pipe.CompareTag("Ground") && IsCollidingWithGround(pipe))
                {
                    EndGame();
                    return; // Exit the loop and update immediately
                }

                // Remove pipes that are out of camera view
                if (pipe.transform.position.x < mainCameraTransform.position.x - 10f)
                {
                    Destroy(pipe);
                    pipes.Remove(pipe);
                    break; // Exit the loop to avoid modifying a collection while iterating
                }
            }
        }
    }

    void Flap()
    {
        // Apply force to make the bird jump
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    }

    void SpawnPipe()
    {
        GameObject newPipe = Instantiate(pipePrefab, pipeSpawnPoint.position, Quaternion.identity);
        pipes.Add(newPipe);
    }

    bool IsCollidingWithPipe(GameObject pipe)
    {
        Collider2D pipeCollider = pipe.GetComponent<Collider2D>();
        return pipeCollider != null && pipeCollider.bounds.Intersects(GetComponent<Collider2D>().bounds);
    }

    bool IsCollidingWithGround(GameObject ground)
    {
        Collider2D groundCollider = ground.GetComponent<Collider2D>();
        return groundCollider != null && groundCollider.bounds.Intersects(GetComponent<Collider2D>().bounds);
    }

    void EndGame()
    {
        // Implement game over logic (e.g., display score, restart menu)
        Debug.Log("Game Over!");
    }
}

O script Unity fornecido representa um jogo Flappy Bird simplificado, onde o pássaro controlado pelo jogador navega por um ambiente de rolagem. O pássaro pode pular após a entrada do usuário, e o jogo verifica se há colisões com os canos e com o solo, acionando o fim do jogo se for detectado. Os canos são gerados dinamicamente em intervalos regulares e se movem em direção ao jogador. O script inclui lógica para remover tubos que saem da visualização da câmera para otimizar o desempenho. A função 'EndGame' é chamada em caso de colisão e pode ser expandida para lidar com vários cenários de fim de jogo, como exibir uma pontuação ou reiniciar o jogo. O código visa oferecer uma implementação básica da mecânica do Flappy Bird em um ambiente Unity.

Etapa 6: IU e menus

  • Projete uma IU para exibir a pontuação.
  • Crie menus para iniciar e reiniciar o jogo.

Etapa 7: ajustar a jogabilidade

  • Ajuste física e velocidade do jogo para uma experiência equilibrada e divertida.
  • Teste e repita seu jogo para garantir uma jogabilidade tranquila e desafiadora.

Etapa 8: adicionar efeitos sonoros

  • Importe ou crie efeitos sonoros para batidas, pontuações e colisões.
  • Integre esses efeitos sonoros ao seu jogo.

Exemplo de modificações para adicionar efeitos sonoros em 'FlappyBird.cs':

using UnityEngine;
using System.Collections.Generic;

public class FlappyBird : MonoBehaviour
{
    // Existing variables...

    public AudioClip jumpSound;
    public AudioClip collisionSound;
    public AudioClip gameOverSound;

    private AudioSource audioSource;

    void Start()
    {
        // Existing Start() code...

        // Add AudioSource component and reference
        audioSource = gameObject.AddComponent<AudioSource>();
    }

    void Flap()
    {
        // Apply force to make the bird jump
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);

        // Play jump sound
        audioSource.PlayOneShot(jumpSound);
    }

    void EndGame()
    {
        // Play game over sound
        audioSource.PlayOneShot(gameOverSound);

        // Implement other game over logic...
    }

    // Existing code...
}

Etapa 9: construir e implantar

  • Crie seu jogo para sua plataforma alvo (iOS, Android, etc.).
  • Implante e teste no dispositivo ou emulador escolhido.

Conclusão

Este tutorial cobre as etapas essenciais para recriar este clássico jogo Flappy Bird em Unity. Experimente recursos e melhorias adicionais para tornar o jogo seu. Feliz desenvolvimento de jogos!

Artigos sugeridos
Minijogo em Unity | Flappy Cube
Como fazer um jogo de cobra no Unity
Criando um jogo 2D Brick Breaker no Unity
Tutorial Endless Runner para Unity
Tutorial para o jogo de quebra-cabeça Match-3 no Unity
Fazenda Zumbis | Criação de jogo de plataforma 2D em Unity
Criando um jogo de quebra-cabeça deslizante no Unity