Menu
CoddyTech

العب مرة أخرى

الدرس 12 من 14 في دورة لعبة Unity: الثعبان ثلاثي الأبعاد على Coddy.

عندما يموت الثعبان، تظهر لوحة «انتهت اللعبة» مع زر «العب مجددًا». اللوحة موجودة في واجهة المستخدم HUD وتكون مخفية في البداية، ويُظهرها SetActive(true). يعرف الثعبان متى يموت، ويدير GameManager الشاشات، لذا تستدعي Die() الدالة العامة GameOver() في GameManager.

يبدأ زر «العب مجددًا» اللعبة من جديد بتحميل المشهد مرة أخرى. تعود كل الكائنات إلى حالتها في المشهد: الثعبان في خليته الأولى مع جزأين، والنقاط عند 0، واللوحة مخفية. ويُوصَل زر إعادة المحاولة في لعبة سباق بالطريقة نفسها:

void Start()
{
    retryButton.onClick.AddListener(Retry);
}

void Retry()
{
    SceneManager.LoadScene("Track1");
}

التحميل بالاسم يربط الزر بمشهد واحد. المشهد الذي يجري تشغيله هو SceneManager.GetActiveScene().buildIndex، لذا فإن تحميله يعيد تشغيل أي مشهد يوجد فيه الزر. يحتوي المشهد الجديد على GameManager جديد، وتضبط Awake() فيه Instance مرة أخرى، لذا يتواصل الثعبان الجديد مع GameManager الجديد.

challenge icon

التحدي

متوسط

يؤدي الموت إلى إظهار لوحة «انتهت اللعبة»، ويبدأ «العب مجددًا» لعبة جديدة.

  1. في GameManager، أضف using UnityEngine.UI; وusing UnityEngine.SceneManagement; وpublic GameObject gameOverPanel; وpublic Button playAgainButton;
  2. تعرض public void GameOver() اللوحة؛ وتحمل void PlayAgain() المشهد النشط مجددًا، ويضيفها Start() إلى playAgainButton.onClick.
  3. تستدعي Die() الخاصة بـSnake الدالة GameManager.Instance.GameOver().

اضغط «العب»، واصطدم، ثم انقر «العب مجددًا»: تبدأ لعبة جديدة. ثم اضغط «تحقق».

جرّب بنفسك

using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Unity: الثعبان ثلاثي الأبعاد

تدرّب بنفسك: Playground لـ Unity