Как создать игру в стиле Flappy Bird в Unity

В этом уроке Unity мы рассмотрим процесс создания игры Flappy Bird. В этой классической мобильной игре вам предстоит провести птицу через ряд труб, постукивая по ней, заставляя ее взмахивать крыльями и избегать препятствий. Давайте углубимся в пошаговые инструкции.

Шаг 1. Настройте свой Unity проект

  • Если вы еще этого не сделали, откройте Unity и создайте новый 2D-проект.
  • Настройте параметры проекта, включая разрешение и таргетинг на платформу.

Шаг 2. Импортируйте игровые ресурсы

  • Найдите или создайте ресурсы для птицы, труб и фона.
  • Импортируйте эти ресурсы в свой проект Unity.

Шаг 3: Создайте Flappy Bird

  • Добавьте 2D-спрайт для птицы.
  • Реализуйте простое управление касанием, чтобы птица взмахнула крыльями.
  • Примените силу тяжести, чтобы птица упала естественным образом.

Шаг 4: Спроектируйте трубы

  • Создайте трубу prefab, используя 2D-спрайты.
  • Настройте систему появления для генерации труб через равные промежутки времени.

Шаг 5: Реализуем игровую логику

  • Добавьте систему подсчета очков за успешное прохождение через трубы.
  • Внедрите обнаружение столкновений, чтобы завершить игру, когда птица ударится о трубы или землю.

Проверьте приведенный ниже сценарий, он инкапсулирует части 3, 4 и 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!");
    }
}

Приведенный сценарий Unity представляет собой упрощенную игру Flappy Bird, в которой управляемая игроком птица перемещается по среде прокрутки. Птица может прыгать по команде пользователя, и игра проверяет наличие столкновений с трубами и землей, в случае обнаружения запуская игру. Трубы динамически появляются через равные промежутки времени и движутся к игроку. Скрипт включает логику для удаления труб, выходящих за пределы поля зрения камеры, для оптимизации производительности. Функция 'EndGame' вызывается при столкновении, и ее можно расширить для обработки различных сценариев завершения игры, таких как отображение счета или перезапуск игры. Цель кода — предложить базовую реализацию механики Flappy Bird в среде Unity.

Шаг 6: Пользовательский интерфейс и меню

  • Разработайте пользовательский интерфейс для отображения счета.
  • Создайте меню для запуска и перезапуска игры.

Шаг 7. Точная настройка игрового процесса

  • Настройте игру физику и скорость, чтобы игра была сбалансированной и приятной.
  • Тестируйте и совершенствуйте свою игру, чтобы обеспечить плавный и увлекательный игровой процесс.

Шаг 8: Добавьте звуковые эффекты

  • Импортируйте или создайте звуковые эффекты для взмахов, ударов и столкновений.
  • Интегрируйте эти звуковые эффекты в свою игру.

Примеры модификаций для добавления звуковых эффектов в '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...
}

Шаг 9. Сборка и развертывание

  • Создайте свою игру для своей целевой платформы (iOS, Android и т. д.).
  • Разверните и протестируйте на выбранном вами устройстве или эмуляторе.

Заключение

В этом уроке описаны основные шаги по воссозданию классической игры Flappy Bird в Unity. Экспериментируйте с дополнительными функциями и улучшениями, чтобы сделать игру своей. Удачной разработки игры!

Рекомендуемые статьи
Как создать игру-змейку в Unity
Создание 2D-игры Brick Breaker в Unity
Мини-игра в Unity | CUBEизбегать
Учебное пособие по Endless Runner для Unity
Мини-игра в Unity | Флаппи-куб
Создание скользящей игры-головоломки в Unity
Учебное пособие по игре-головоломке «три в ряд» в Unity