Menu
CoddyTech

ショップ

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

タワーが2つあると、プレイヤーにはショップが必要です。ショップはデータから自動的に作られます。各タワーのプレハブに対して、ボタンに名前と価格が表示され、クリックすると次に配置するパッド用のタワーが選ばれます。画面下部のShopPanelには、2つのボタンが配置されます。

ループ内で作成したボタンには、その場でラムダを使ってリスナーを設定します。ラムダは変数をキャプチャし、その値をキャプチャするわけではありません。また、forループでは、すべての反復で同じiが使われます。ループが終わった後にクリックすると、どのラムダもループ終了後のiを読み取ります。ループ内で宣言したローカル変数は、反復ごとに新しく作られるので、まずその変数にコピーします。

for (int i = 0; i < levels.Length; i++)
{
    LevelData level = levels[i];
    levelButtons[i].onClick.AddListener(() => Load(level));
}
challenge icon

チャレンジ

中級

クリックして建設するタワーを選べるショップを追加します。

  1. BuildManagerで、towerPrefabをシリアライズされたTower[] shop、Button[] shopButtons、Color chosenColorに置き換え、private Tower chosen;を追加します。
  2. Startで各ボタンにprefab.data.towerName + "\n" + prefab.data.costを表示し、クリックするとChoose(prefab)が呼び出されるようにします。その後、Choose(shop[0])を呼び出します。
  3. Chooseでタワーを保持し、そのボタンをchosenColorで色付けし、ほかのボタンは白にします。chosen.data.costでchosenを建設します。

「プレイ」を押して、両方の種類を建設します。その後、「確認」を押します。

自分で試してみよう

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

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

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