Menu
CoddyTech

Mağaza

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 15 / 25.

İki kule olduğunda oyuncunun bir dükkâna ihtiyacı olur. Dükkân verilerden kendini oluşturur: her kule prefab’ı için bir düğme adı ve fiyatı gösterir, tıklama ise sonraki platform için o kuleyi seçer. Alttaki ShopPanel iki düğmeyi barındırır.

Döngü içinde oluşturulan düğmelerin dinleyicileri de burada, lambda ile eklenir. Lambda, değerleri değil değişkenleri yakalar ve bir for döngüsünde tüm turlar için tek bir i vardır: daha sonra tıklandığında her lambda, döngü sona erdikten sonra i değerini okur. Döngü içinde tanımlanan yerel değişken her turda yeniden oluşturulur; bu yüzden önce değeri ona kopyalayın:

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

Görev

Orta

Bir tıklamayla inşa edilecek kuleyi seçen bir dükkân ekle.

  1. BuildManager içinde towerPrefab yerine serileştirilmiş Tower[] shop, Button[] shopButtons ve Color chosenColor ekle; ayrıca private Tower chosen; ekle.
  2. Start içinde her düğmeyi prefab.data.towerName + "\n" + prefab.data.cost ile etiketle ve bir tıklamanın Choose(prefab) çağırmasını sağla; ardından Choose(shop[0]) çağır.
  3. Choose kuleyi seçili tutar ve düğmesini chosenColor ile, diğerlerini beyaza boyar. chosen.data.cost karşılığında chosen kulesini inşa et.

“Oyna” düğmesine bas ve her iki türden de inşa et. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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 Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground