Menu
CoddyTech

سكربت واحد يدير اللعبة

جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 12 من 60.

ضع النتيجة في سكربت اللاعب، والأرواح في سكربت الصحة، والتحقق من انتهاء اللعبة في سكربت ثالث، وبما أن كل سكربت يحتاج إلى أرقام السكربتات الأخرى، فإن كل قاعدة جديدة تمس عدة ملفات. عادةً ما تضع ألعاب Unity هذه الأرقام في سكربت واحد، وهو GameManager، على كائن GameObject فارغ خاص به. فهو يدير النتيجة والأرواح والقاعدة التي تنهي اللعبة. أما السكربتات الأخرى فتكتفي بالإبلاغ عما حدث، وذلك باستدعاء أساليبه العامة. في ركلات الترجيح هذه، تبلغ الشبكة عن كل هدف:

public class GameManager : MonoBehaviour
{
    private int goals;
    private int shotsLeft = 5;

    public void ShotTaken(bool scored)
    {
        if (shotsLeft == 0) return;
        shotsLeft--;
        if (scored) goals++;
        Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
        if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
    }
}
// Net.cs، عند مُشغِّل المرمى
public GameManager game;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Ball")) game.ShotTaken(true);
}

لا تعرف الشبكة عدد التسديدات المتبقية أو موعد انتهاء المباراة. إنها تبلغ عن الهدف، ويقرر المدير ما يعنيه ذلك؛ ويبلغ سكربت حارس المرمى عن تصدٍّ باستخدام game.ShotTaken(false). لإجراء ركلات ترجيح من 3 تسديدات، غيّر رقمًا واحدًا في سكربت واحد. يمنع التحقق الموجود في بداية ShotTaken احتساب كرة تتدحرج إلى المرمى بعد انتهاء الوقت.

املأ الحقل game في نافذة Inspector بسحب كائن GameManager وإفلاته عليه، وسيعثر Unity على سكربت GameManager الموجود على ذلك الكائن. ويُعد المدير أيضًا المكان المناسب لعناصر واجهة العرض على الشاشة: عندما يحتفظ بنص النتيجة ولوحة انتهاء اللعبة، تتغير الشاشة في الأسلوب نفسه الذي يغيّر الأرقام، ولا يتعامل أي سكربت آخر مع واجهة المستخدم.

challenge icon

التحدي

سهل

اجعل GameManager يتولى تسجيل النقاط والأرواح.

  1. AddScore(int points): ما لم تكن gameOver، أضف إلى score واعرض Score: 6 في scoreText.
  2. LoseLife(): أنقص lives بمقدار 1 واعرض Lives: 2؛ وعند وصولها إلى 0، عيّن gameOver، وأظهر gameOverPanel، وعيّن player.enabled = false.
  3. في Gem وBomb، عندما يكون other.CompareTag("Player") صحيحًا، استدعِ game.AddScore(points) أو game.LoseLife()، ثم Destroy(gameObject).

اضغط «العب» واصطدم بثلاث قنابل. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text scoreText;
    public TMP_Text livesText;
    public GameObject gameOverPanel;
    public Player player;
    private int score;
    private int lives = 3;
    private bool gameOver;

    public void AddScore(int points)
    {
        // أضف النقاط واعرض النتيجة الجديدة، ما لم تكن اللعبة قد انتهت
    }

    public void LoseLife()
    {
        // أنقص حياة واحدة واعرض عدد الحيوات المتبقية؛ عند 0 حياة تنتهي اللعبة
    }
}

جميع دروس إنشاء ألعاب حقيقية

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