العب مرة أخرى
الدرس 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 الجديد.
التحدي
متوسطتحتوي واجهة HUD على GameOverPanel مخفي مع PlayAgainButton، ويضبط المشهد كليهما على GameManager.
- في
GameManager، أضفusing UnityEngine.UI;وusing UnityEngine.SceneManagement;وpublic GameObject gameOverPanel;وpublic Button playAgainButton;. - اكتب
public void GameOver()لإظهار اللوحة. - اكتب
void PlayAgain()لتحميل المشهد النشط مجددًا، واجعل الزر يستدعيها فيStart(). - في
Die()الخاصة بـSnake، استدعِGameOver().
اضغط Play، واصطدم، والعب مجددًا، ثم اضغط Check.
جرّب بنفسك
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)];
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.