Menu
CoddyTech

Argent

Leçon 12 sur 25 du cours Jeu Unity : défense de tours de Coddy.

Les tours coûtent de l’argent. L’argent appartient au GameManager, et le BuildManager lui demande de payer. Demander et payer se font en une seule étape : une méthode qui vérifie l’argent, le prélève s’il y en a suffisamment et indique avec un bool si elle l’a fait, à la manière de la réponse de Dictionary.TryGetValue. Le portefeuille d’un distributeur automatique :

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

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

Aucun appelant ne peut payer sans la vérification, et le nombre de pièces ne descend jamais en dessous de zéro, car rien d’autre ne le modifie. Le prix se trouve sur le prefab : un champ de son propre script, défini dans l’Inspector du prefab. Un prefab est un objet chargé comme n’importe quel autre, donc snackPrefab.price peut être lu avant toute instanciation, afin de décider s’il faut l’instancier.

challenge icon

Défi

Moyen

Les tours coûtent de l’argent : 150 au départ, 50 par flèche.

  1. Tower : ajoute public int cost = 50;.
  2. GameManager : ajoute [SerializeField] private int startMoney = 150;, [SerializeField] private TMP_Text moneyText; et private int money;, affiché sous la forme Money: 150.
  3. public bool TrySpend(int amount) : renvoie false si amount > money ; sinon, déduis le montant, affiche-le et renvoie true.
  4. BuildManager : ajoute [SerializeField] private GameManager game; ; construis uniquement si game.TrySpend(towerPrefab.cost), sinon affiche Not enough money dans le journal.

Appuie sur « Jouer » et construis des tours jusqu’à épuisement de l’argent. Ensuite, clique sur « Vérifier ».

Essayez vous-même

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;
    }
}

Toutes les leçons de Jeu Unity : défense de tours

Entraînez-vous par vous-même : Playground Unity