سكربت واحد يدير اللعبة
جزء من قسم بناء ألعاب حقيقية في رحلة 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: فعندما يحتفظ بنص النتيجة ولوحة انتهاء اللعبة، تتغير الشاشة في الأسلوب نفسه الذي يغيّر الأرقام، ولا يلمس أي نص آخر واجهة المستخدم.
التحدي
سهللعبة البحث عن الجواهر. تحرّك الأسهم اللاعب (النص البرمجي الخاص به جاهز). تساوي الجواهر قيمة 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 حيوات تنتهي اللعبة
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس بناء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارالمنصات المتحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء بلا نهاية
ثلاثة مساراتعوائق أمامك