Menu
CoddyTech
flag Ar iconالعربيةdown icon

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

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

ضع النتيجة في نصّ اللاعب البرمجي، والأرواح في نصّ الصحة البرمجي، والتحقق من انتهاء اللعبة في نصّ ثالث، وكل نص يحتاج إلى أرقام النصوص الأخرى، لذا تمسّ كل قاعدة جديدة عدة ملفات. عادةً ما تُسنِد ألعاب 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 البرمجي الموجود على ذلك الكائن. كما أن المدير هو المكان المناسب لواجهة HUD: فعندما يحتفظ بنص النتيجة ولوحة انتهاء اللعبة، تتغير الشاشة في الأسلوب نفسه الذي يغيّر الأرقام، ولا يلمس أي نص آخر واجهة المستخدم.

challenge icon

التحدي

سهل

لعبة البحث عن الجواهر. تحرّك الأسهم اللاعب (النص البرمجي الخاص به جاهز). تساوي الجواهر قيمة points الخاصة بها، وتكلّف القنابل حياة واحدة، ويتولى GameManager إدارة كل ذلك. يربط Inspector مسبقًا حقل game لكل جوهرة وقنبلة بكائن GameManager، ويربط حقول GameManager بلوحة HUD واللاعب.

في GameManager.cs:

  • تضيف AddScore(int points) النقاط إلى score وتعرضها في scoreText، على النحو التالي: Score: 6.
  • تطرح LoseLife() حياة واحدة من lives (تبدأ اللعبة بـ 3) وتعرض العدد في livesText، على النحو التالي: Lives: 2.
  • عندما تصل lives إلى 0، تنتهي اللعبة: أظهر gameOverPanel وعطّل النص البرمجي للاعب كي تتوقف الأسهم عن العمل. بعد ذلك، لا تغيّر AddScore أي شيء.

في Gem.cs وBomb.cs: عندما يلمس اللاعب (الذي يحمل الوسم Player) أحدهما، يُبلغ كائن اللعبة (الجوهرة بقيمة points الخاصة بها، والقنبلة بحياة مفقودة) ثم يزيل نفسه.

اضغط Play، واجمع الجواهر واصطدم بالقنابل، ثم اضغط Check.

جرّب بنفسك

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 حيوات تنتهي اللعبة
    }
}
quiz iconاختبر نفسك

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

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