Menu
CoddyTech

Para

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 6 / 18.

Kuleler paraya mal olur. Para GameManager'a aittir ve BuildManager ondan ödeme yapmasını ister. İstemek ve ödemek tek bir adımdır: parayı kontrol eden, yeterli olduğunda parayı alan ve bunu yapıp yapmadığını Dictionary.TryGetValue yanıtlarındaki gibi bir bool ile belirten bir yöntem. Bir otomatın cüzdanı:

public bool TryPay(int price)
{
    if (price > coins)
    {
        return false;
    }

    coins -= price;
    coinText.text = coins + " coins";
    return true;
}

Kontrol yapılmadan hiçbir çağıran ödeme yapamaz ve başka hiçbir şey paraları değiştirmediği için para miktarı asla sıfırın altına düşmez. price, prefab üzerinde bulunur: kendi betiğinin bir alanıdır ve prefab'ın Inspector'ında ayarlanır. Prefab, diğer nesneler gibi yüklenmiş bir nesnedir; bu nedenle snackPrefab.price, herhangi bir şey oluşturulmadan önce okunarak oluşturulup oluşturulmaması gerektiğine karar verilebilir.

challenge icon

Görev

Orta

Oyuncu 150 parayla başlar ve bir ArrowTower 50'ye mal olur.

  1. Tower içinde bir public int cost ekleyin. ArrowTower prefab'ı bunu 50 olarak ayarlar.
  2. GameManager içinde serileştirilmiş bir int startMoney ve serileştirilmiş bir TMP_Text moneyText ile startMoney değerinden başlayan private int money ekleyin. Başlangıçta ve her değişiklikten sonra bunu Money: 150 olarak gösterin.
  3. public bool TrySpend(int amount) ekleyin: amount para miktarından fazlaysa false döndürün ve hiçbir şeyi değiştirmeyin; aksi takdirde bu miktarı paradan düşürün, parayı gösterin ve true döndürün.
  4. BuildManager içinde serileştirilmiş bir game alanı (bir GameManager) ekleyin. Boş bir alana yalnızca game.TrySpend prefab'ın cost değerini öderse kule yerleştirilir; aksi takdirde Not enough money günlüğe yazılır.

Play'e basın ve para bitene kadar kule inşa edin, ardından Check'e basın.

Kendin dene

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    [SerializeField] private int startLives = 20;
    [SerializeField] private TMP_Text livesText;

    private int lives;

    void OnEnable()
    {
        Enemy.ReachedBase += OnReachedBase;
    }

    void OnDisable()
    {
        Enemy.ReachedBase -= OnReachedBase;
    }

    void Start()
    {
        lives = startLives;
        ShowLives();
    }

    void OnReachedBase(Enemy enemy)
    {
        lives -= enemy.data.damage;
        ShowLives();
    }

    void ShowLives()
    {
        livesText.text = "Lives: " + lives;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity Oyunu: Kule Savunması bölümündeki tüm dersler