Menu
CoddyTech

Argent

Leçon 6 sur 18 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

Le joueur commence avec 150 unités d’argent, et une ArrowTower coûte 50.

  1. Dans Tower, ajoute un int public cost. Le prefab ArrowTower lui attribue la valeur 50.
  2. Dans GameManager, ajoute un int sérialisé startMoney et un TMP_Text sérialisé moneyText, ainsi qu’un int privé money qui commence à startMoney. Affiche-le sous la forme Money: 150 au démarrage et après chaque changement.
  3. Ajoute public bool TrySpend(int amount) : si amount est supérieur à l’argent disponible, renvoie false et ne change rien ; sinon, déduis ce montant, affiche l’argent et renvoie true.
  4. Dans BuildManager, ajoute un champ sérialisé game (un GameManager). Un emplacement libre ne reçoit une tour que si game.TrySpend paie le cost du prefab ; sinon, consigne Not enough money.

Appuie sur Play et construis jusqu’à épuisement de l’argent, puis clique sur Check.

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;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

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