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.
Défi
MoyenLe joueur commence avec 150 unités d’argent, et une ArrowTower coûte 50.
- Dans
Tower, ajoute un int publiccost. Le prefab ArrowTower lui attribue la valeur 50. - Dans
GameManager, ajoute un int sérialiséstartMoneyet un TMP_Text sérialisémoneyText, ainsi qu’un int privémoneyqui commence àstartMoney. Affiche-le sous la formeMoney: 150au démarrage et après chaque changement. - Ajoute
public bool TrySpend(int amount): siamountest supérieur à l’argent disponible, renvoie false et ne change rien ; sinon, déduis ce montant, affiche l’argent et renvoie true. - Dans
BuildManager, ajoute un champ sérialiségame(un GameManager). Un emplacement libre ne reçoit une tour que sigame.TrySpendpaie lecostdu prefab ; sinon, consigneNot 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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.