Cum să faci un joc inspirat de Flappy Bird în Unity

În acest tutorial Unity, vom parcurge procesul de creare a unui joc Flappy Bird. Acest joc clasic mobil implică ghidarea unei păsări printr-o serie de țevi atingând-o pentru a o face să bată și a evita obstacolele. Să ne aprofundăm în instrucțiunile pas cu pas.

Pasul 1: Configurați-vă proiectul Unity

  • Dacă nu ați făcut-o încă, deschideți Unity și creați un nou proiect 2D.
  • Configurați setările proiectului, inclusiv rezoluția și direcționarea către platformă.

Pasul 2: importați activele jocului

  • Găsiți sau creați elemente pentru pasăre, conducte și fundal.
  • Importați aceste active în proiectul dvs. Unity.

Pasul 3: Creați pasărea Flappy

  • Adăugați un sprite 2D pentru pasăre.
  • Implementați comenzi simple prin atingere pentru a face ca pasărea să bată.
  • Aplicați gravitația pentru a face pasărea să cadă în mod natural.

Pasul 4: Proiectați țevile

  • Creați o țeavă prefab folosind sprite-uri 2D.
  • Configurați un sistem de spawn pentru a genera conducte la intervale regulate.

Pasul 5: Implementați logica jocului

  • Adăugați un sistem de marcare pentru trecerea cu succes prin țevi.
  • Implementați detectarea coliziunilor pentru a încheia jocul atunci când pasărea lovește țevi sau pământ.

Verificați scriptul de mai jos, acesta încapsulează părțile 3, 4 și 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!");
    }
}

Scriptul Unity furnizat reprezintă un joc simplificat Flappy Bird, în care pasărea controlată de jucător navighează printr-un mediu de derulare. Pasărea poate sări la intrarea utilizatorului, iar jocul verifică dacă există coliziuni cu ambele țevi și cu solul, declanșând un joc terminat dacă este detectat. Țevile sunt generate dinamic la intervale regulate și se deplasează către jucător. Scriptul include o logică pentru a elimina conductele care ies în afara vizualizării camerei pentru a optimiza performanța. Funcția 'EndGame' este apelată la coliziune și poate fi extinsă pentru a gestiona diverse scenarii de final de joc, cum ar fi afișarea unui scor sau repornirea jocului. Codul își propune să ofere o implementare de bază a mecanicii Flappy Bird într-un mediu Unity.

Pasul 6: UI și meniuri

  • Proiectați o interfață de utilizare pentru afișarea scorului.
  • Creați meniuri pentru pornirea și repornirea jocului.

Pasul 7: Ajustați jocul

  • Reglați jocul physics și viteza pentru o experiență echilibrată și plăcută.
  • Testează și repetă jocul tău pentru a asigura un joc fluid și provocator.

Pasul 8: Adăugați efecte sonore

  • Importați sau creați efecte sonore pentru batai, scoruri și ciocniri.
  • Integrați aceste efecte sonore în jocul dvs.

Exemple de modificări pentru a adăuga efecte sonore în '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...
}

Pasul 9: Construiți și implementați

  • Creați-vă jocul pentru platforma țintă (iOS, Android etc.).
  • Implementați și testați pe dispozitivul sau emulatorul ales de dvs.

Concluzie

Acest tutorial acoperă pașii esențiali pentru a recrea acest joc clasic Flappy Bird în Unity. Experimentați cu funcții și îmbunătățiri suplimentare pentru a face jocul propriu. Dezvoltare fericită a jocului!