Menu
CoddyTech

Choisir une tour

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

Cliquer sur une tour ouvre un panneau indiquant son niveau et ce qu’apporterait le niveau suivant. Un clic sur une tour touche l’une de ses parties, la base ou la tête, qui sont des enfants de la tour. Ainsi, hit.collider.GetComponentInParent<Tower>() trouve la tour à laquelle elles appartiennent : il cherche sur l’objet touché, puis remonte ses parents.

Le panneau affiche côte à côte les statistiques actuelles et celles du niveau suivant, afin que le joueur voie ce qu’apporte une amélioration :

towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);
challenge icon

Défi

Moyen

Clique sur une tour pour ouvrir son panneau.

  1. Dans BuildManager, ajoute private Tower selected;. Un clic sur une tour la sélectionne ; un clic ailleurs ne sélectionne rien.
  2. Ajoute towerPanel (un GameObject) et towerNameText, towerStatsText, upgradeLabel (TMP_Text) avec l’attribut serialized. Le panneau s’affiche uniquement lorsqu’une tour est sélectionnée.
  3. Remplis-le : Arrow level 1, Damage 2 > 3 et Range 4.5 > 5 sur deux lignes, Upgrade 40.

Appuie sur « Jouer », construis une tour et clique dessus. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using TMPro;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower[] shop;
    [SerializeField] private Button[] shopButtons;
    [SerializeField] private Color chosenColor = new Color(1f, 0.85f, 0.3f);

    private Tower chosen;

    void Start()
    {
        for (int i = 0; i < shop.Length; i++)
        {
            Tower prefab = shop[i];
            shopButtons[i].GetComponentInChildren<TMP_Text>().text = prefab.data.towerName + "\n" + prefab.data.cost;
            shopButtons[i].onClick.AddListener(() => Choose(prefab));
        }
        Choose(shop[0]);
    }

    void Choose(Tower prefab)
    {
        chosen = prefab;
        for (int i = 0; i < shop.Length; i++)
        {
            shopButtons[i].image.color = shop[i] == chosen ? chosenColor : Color.white;
        }
    }

    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(chosen.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

        pad.tower = Instantiate(chosen, 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