Menu
CoddyTech

المتجر

الدرس 15 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.

مع وجود برجين، يحتاج اللاعب إلى متجر. يُنشأ المتجر من البيانات: لكل نموذج برج، يعرض زرٌّ الاسم والسعر، ويؤدي النقر عليه إلى اختيار ذلك البرج للمنصة التالية. وتضم لوحة المتجر الموجودة في الأسفل الزرين.

تُضاف مستمعات الأزرار التي تُنشأ داخل حلقة هناك باستخدام دالة لامدا. تلتقط دالة لامدا المتغيرات، لا قيمها، ولحلقة for متغير i واحد في جميع دوراتها: إذا نُقر على الأزرار لاحقًا، فستقرأ كل دالة لامدا قيمة i بعد أن تكون الحلقة قد تجاوزت نهايتها. أما المتغير المحلي المُعرّف داخل الحلقة، فيكون جديدًا في كل دورة، لذا انسخ القيمة إليه أولًا:

for (int i = 0; i < levels.Length; i++)
{
    LevelData level = levels[i];
    levelButtons[i].onClick.AddListener(() => Load(level));
}
challenge icon

التحدي

متوسط

أضف متجرًا يؤدي النقر فيه إلى اختيار البرج المراد بناؤه.

  1. في BuildManager، استبدل towerPrefab بـ Tower[] shop وButton[] shopButtons وColor chosenColor مُسلسلة، وأضف private Tower chosen;.
  2. في Start، اجعل تسمية كل زر prefab.data.towerName + "\n" + prefab.data.cost واجعل النقر يستدعي Choose(prefab)؛ ثم Choose(shop[0]).
  3. تحتفظ Choose بالبرج وتلوّن زره بـ chosenColor، بينما تكون الأزرار الأخرى بيضاء. ابنِ chosen مقابل chosen.data.cost.

اضغط «العب» وابنِ كلا النوعين. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;
using UnityEngine.InputSystem;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower towerPrefab;

    void Update()
    {
        if (!Mouse.current.leftButton.wasPressedThisFrame)
        {
            return;
        }

        Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
        if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out BuildPad pad))
        {
            Build(pad);
        }
    }

    void Build(BuildPad pad)
    {
        if (pad.tower != null)
        {
            return;
        }

        if (!game.TrySpend(towerPrefab.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

        pad.tower = Instantiate(towerPrefab, pad.transform.position, Quaternion.identity);
    }
}

جميع دروس لعبة Unity: الدفاع عن الأبراج

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