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.
Défi
MoyenLes tours coûtent de l’argent : 150 au départ, 50 par flèche.
Tower: ajoutepublic int cost = 50;.GameManager: ajoute[SerializeField] private int startMoney = 150;,[SerializeField] private TMP_Text moneyText;etprivate int money;, affiché sous la formeMoney: 150.public bool TrySpend(int amount): renvoie false siamount > money; sinon, déduis le montant, affiche-le et renvoie true.BuildManager: ajoute[SerializeField] private GameManager game;; construis uniquement sigame.TrySpend(towerPrefab.cost), sinon afficheNot enough moneydans 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