اختر برجًا
الدرس 17 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
يؤدي النقر على برج إلى فتح لوحة تعرض مستواه وما سيقدّمه المستوى التالي. النقر على برج يصيب أحد أجزائه، القاعدة أو الرأس، وهما من أبناء البرج، لذلك يجد hit.collider.GetComponentInParent<Tower>() البرج الذي ينتميان إليه: يبحث في العنصر الذي تم النقر عليه، ثم يصعد عبر العناصر الأصلية.
تعرض اللوحة الإحصاءات الحالية وإحصاءات المستوى التالي جنبًا إلى جنب، ليرى اللاعب ما الذي يقدّمه التطوير:
towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);التحدي
متوسطانقر على برج لفتح لوحته.
- في
BuildManager، أضفprivate Tower selected;. يؤدي النقر على برج إلى تحديده؛ أما النقر على أي شيء آخر فلا يحدد شيئًا. - أضف
towerPanel(وهو GameObject) وtowerNameTextوtowerStatsTextوupgradeLabel(من النوع TMP_Text) كحقول مُسلسلة. لا تظهر اللوحة إلا عند تحديد برج. - املأها:
Arrow level 1، وDamage 2 > 3وRange 4.5 > 5على سطرين، وUpgrade 40.
اضغط على «العب»، وابنِ برجًا ثم انقر عليه. بعد ذلك اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using TMPro;
public class BuildManager : MonoBehaviour
{
[SerializeField] private GameManager game;
[SerializeField] private Tower[] shop;
[SerializeField] private Button[] shopButtons;
[SerializeField] private Color chosenColor = new Color(1f, 0.85f, 0.3f);
private Tower chosen;
void Start()
{
for (int i = 0; i < shop.Length; i++)
{
Tower prefab = shop[i];
shopButtons[i].GetComponentInChildren<TMP_Text>().text = prefab.data.towerName + "\n" + prefab.data.cost;
shopButtons[i].onClick.AddListener(() => Choose(prefab));
}
Choose(shop[0]);
}
void Choose(Tower prefab)
{
chosen = prefab;
for (int i = 0; i < shop.Length; i++)
{
shopButtons[i].image.color = shop[i] == chosen ? chosenColor : Color.white;
}
}
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(chosen.data.cost))
{
Debug.Log("Not enough money");
return;
}
pad.tower = Instantiate(chosen, pad.transform.position, Quaternion.identity);
}
}
جميع دروس لعبة Unity: الدفاع عن الأبراج
تدرّب بنفسك: Playground لـ Unity