La boutique
Leçon 15 sur 25 du cours Jeu Unity : défense de tours de Coddy.
Avec deux tours, le joueur a besoin d’une boutique. Elle se construit à partir des données : pour chaque prefab de tour, un bouton affiche le nom et le prix, et un clic choisit cette tour pour la prochaine plateforme. Le ShopPanel en bas contient les deux boutons.
Les boutons créés dans une boucle reçoivent leurs écouteurs à cet endroit, avec une lambda. Une lambda capture les variables, pas leurs valeurs, et une boucle for utilise un seul i pour toutes ses itérations : si l’on clique plus tard, chaque lambda lit i après que la boucle a dépassé la fin. Une variable locale déclarée dans la boucle est nouvelle à chaque itération ; il faut donc d’abord y copier la valeur :
for (int i = 0; i < levels.Length; i++)
{
LevelData level = levels[i];
levelButtons[i].onClick.AddListener(() => Load(level));
}Défi
MoyenAjoute une boutique où un clic choisit la tour à construire.
- Dans
BuildManager, remplacetowerPrefabparTower[] shop,Button[] shopButtonsetColor chosenColorsérialisés, puis ajouteprivate Tower chosen;. - Dans
Start, attribue à chaque bouton le libelléprefab.data.towerName + "\n" + prefab.data.costet fais en sorte qu’un clic appelleChoose(prefab); puisChoose(shop[0]). Chooseconserve la tour et teinte son bouton avecchosenColor, les autres en blanc. Construischosenpourchosen.data.cost.
Appuie sur « Jouer » et construis les deux types. Puis appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using UnityEngine.InputSystem;
public class BuildManager : MonoBehaviour
{
[SerializeField] private GameManager game;
[SerializeField] private Tower towerPrefab;
void Update()
{
if (!Mouse.current.leftButton.wasPressedThisFrame)
{
return;
}
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out BuildPad pad))
{
Build(pad);
}
}
void Build(BuildPad pad)
{
if (pad.tower != null)
{
return;
}
if (!game.TrySpend(towerPrefab.data.cost))
{
Debug.Log("Not enough money");
return;
}
pad.tower = Instantiate(towerPrefab, pad.transform.position, Quaternion.identity);
}
}
Toutes les leçons de Jeu Unity : défense de tours
Entraînez-vous par vous-même : Playground Unity