العب مرة أخرى
الدرس 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 الجديد.
التحدي
متوسطيؤدي الموت إلى إظهار لوحة «انتهت اللعبة»، ويبدأ «العب مجددًا» لعبة جديدة.
- في
GameManager، أضفusing UnityEngine.UI;وusing UnityEngine.SceneManagement;وpublic GameObject gameOverPanel;وpublic Button playAgainButton; - تعرض
public void GameOver()اللوحة؛ وتحملvoid PlayAgain()المشهد النشط مجددًا، ويضيفها Start() إلىplayAgainButton.onClick. - تستدعي
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)];
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: الثعبان ثلاثي الأبعاد
تدرّب بنفسك: Playground لـ Unity