Menu
CoddyTech

タワーを選択

Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 17/25。

タワーをクリックすると、現在のレベルと次のレベルで何が変わるかを示すパネルが開きます。タワーをクリックすると、タワーの子オブジェクトである土台か頭部のどちらかにヒットします。そのため、hit.collider.GetComponentInParent<Tower>()を使うと、それらが属するタワーを見つけられます。ヒットしたオブジェクトを確認し、次にその親をたどります。

パネルには現在と次のレベルのステータスが並べて表示されるため、プレイヤーはアップグレードで何が得られるかを確認できます。

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

チャレンジ

中級

タワーをクリックしてパネルを開きます。

  1. BuildManagerにprivate Tower selected;を追加します。タワーをクリックするとそのタワーが選択され、それ以外のものをクリックすると何も選択されません。
  2. シリアライズするtowerPanel(GameObject)と、towerNameText、towerStatsText、upgradeLabel(TMP_Text)を追加します。パネルはタワーが選択されている間だけ表示されます。
  3. パネルに表示する内容を設定します。Arrow level 1、2行でDamage 2 > 3とRange 4.5 > 5、そしてUpgrade 40です。

「プレイ」を押してタワーを建て、クリックします。その後、「確認」を押します。

自分で試してみよう

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);
    }
}

Unityゲーム:タワーディフェンスのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド