المتجر
الدرس 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));
}التحدي
متوسطأضف متجرًا يؤدي النقر فيه إلى اختيار البرج المراد بناؤه.
- في
BuildManager، استبدلtowerPrefabبـTower[] shopوButton[] shopButtonsوColor chosenColorمُسلسلة، وأضفprivate Tower chosen;. - في
Start، اجعل تسمية كل زرprefab.data.towerName + "\n" + prefab.data.costواجعل النقر يستدعيChoose(prefab)؛ ثمChoose(shop[0]). - تحتفظ
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