Como fazer um jogo inspirado em Flappy Bird no Unity

Neste tutorial Unity, vamos percorrer o processo de criação de um jogo Flappy Bird. Este jogo clássico para celular envolve guiar um pássaro por uma série de canos tocando para fazê-lo bater as asas 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 de plataforma.

Etapa 2: Importar ativos do jogo

  • Encontre ou crie ativos para o pássaro, canos e fundo.
  • Importe esses ativos para seu projeto Unity.

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 asas.
  • Aplique a gravidade para fazer o pássaro cair naturalmente.

Etapa 4: Projete os tubos

  • Crie um tubo 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 quem passar com sucesso pelos canos.
  • Implemente a detecção de colisão para encerrar o jogo quando o pássaro atingir canos ou o chão.

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 mediante entrada do usuário, e o jogo verifica colisões com canos e com o solo, acionando um game over se 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 canos que saem da visão da câmera para otimizar o desempenho. A função 'EndGame' é chamada mediante colisão, e pode ser expandida para lidar com vários cenários de game over, como exibir uma pontuação ou reiniciar o jogo. O código visa oferecer uma implementação básica da mecânica Flappy Bird dentro de um ambiente Unity.

Etapa 6: UI e menus

  • Crie uma interface de usuário para exibir a pontuação.
  • Crie menus para iniciar e reiniciar o jogo.

Etapa 7: ajuste fino da jogabilidade

  • Ajuste a física e a velocidade do jogo para uma experiência equilibrada e agradável.
  • Teste e repita seu jogo para garantir uma jogabilidade suave 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 de destino (iOS, Android, etc.).
  • Implante e teste no dispositivo ou emulador escolhido.

Conclusão

Este tutorial abrange os passos essenciais para recriar este clássico jogo Flappy Bird em Unity. Experimente recursos e melhorias adicionais para tornar o jogo seu. Feliz desenvolvimento de jogo!