Menu
CoddyTech

النمط Singleton

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

يحتاج مرجع Inspector إلى شيء يُسحب إليه. الأعداء الذين يُنشئهم مُولِّد أثناء اللعبة يأتون من prefab، ولا يمكن لـ prefab أن يشير إلا إلى الأصول وإلى أجزائه الخاصة، وليس إلى كائن في مشهد، لذلك يكون حقل GameManager لديهم فارغًا. الحل المعتاد هو singleton: يخزّن GameManager نفسه في حقل يمكن لكل نص برمجي الوصول إليه عبر اسم الصنف.

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    private int kills;

    void Awake()
    {
        Instance = this;
    }

    public void EnemyDown()
    {
        kills++;
        Debug.Log("Kills: " + kills);
    }
}
// Enemy.cs، على قالب العدو
public void Die()
{
    GameManager.Instance.EnemyDown();
    Destroy(gameObject);
}

تعني static أن الحقل يتبع الصنف، لا كائنًا. سيحصل كل كائن GameManager على kills خاص به، لكن لا توجد سوى Instance واحدة في اللعبة كلها، ويمكنك الوصول إليها باستخدام اسم الصنف: GameManager.Instance. يمكن لأي نص برمجي قراءتها، بما في ذلك عدو ظهر قبل دقيقة، من دون الحاجة إلى ملء حقل خاص به.

يعيّن المدير Instance = this; في Awake، حيث تشير this إلى النص البرمجي نفسه. تشغّل Unity كل استدعاءات Awake في المشهد قبل أي استدعاء Start، لذا يمكن للنصوص البرمجية الأخرى استخدام GameManager.Instance بدءًا من Start. سيستبدل GameManager ثانٍ في المشهد Instance بنفسه؛ يوضّح فصل Scenes and Levels كيفية منع ذلك.

challenge icon

التحدي

سهل

اجعل النيازك تصل إلى GameManager عبر كائن مفرد.

  1. في GameManager.cs، أضف public static GameManager Instance; وAwake() مع Instance = this;.
  2. في Meteor.cs، احذف الحقل game واستدعِ GameManager.Instance.MeteorLanded() وGameManager.Instance.MeteorCaught() بدلًا منه.

اضغط «العب» والتقط نيزكًا: سيظهر Caught: 1، دون أخطاء في Console. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text caughtText;
    public TMP_Text shieldText;
    private int caught;
    private int shield = 3;

    public void MeteorCaught()
    {
        caught++;
        caughtText.text = "Caught: " + caught;
    }

    public void MeteorLanded()
    {
        shield--;
        shieldText.text = "Shield: " + shield;
    }
}

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

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