Menu
CoddyTech

商店

Coddy Unity 塔防游戏 课程的第 15 课,共 25 课。

有两座塔后,玩家就需要一个商店。商店根据数据自动生成:每个塔预制件都有一个按钮,显示名称和价格,点击后会为下一个塔台选择对应的塔。底部的 ShopPanel 放着这两个按钮。

在循环中创建的按钮,要在循环里用 lambda 为它们添加监听器。lambda 会捕获变量,而不是变量的值;for 循环的所有轮次共用一个 i:等到之后点击按钮时,每个 lambda 读取的都是循环结束后的 i。在循环内声明的局部变量每轮都会重新创建,所以要先把值复制进去:

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

挑战

中等

添加一个商店,点击按钮即可选择要建造的炮塔。

  1. 在 BuildManager 中,用序列化的 Tower[] shop、Button[] shopButtons 和 Color chosenColor 替换 towerPrefab,并添加 private Tower chosen;。
  2. 在 Start 中,将每个按钮的标签设为 prefab.data.towerName + "\n" + prefab.data.cost,并让点击按钮时调用 Choose(prefab);然后调用 Choose(shop[0])。
  3. Choose 会保存炮塔,并将它对应的按钮染成 chosenColor,其他按钮则染成白色。使用 chosen 建造炮塔,并支付 chosen.data.cost。

按运行,建造两种炮塔。然后点击检查。

亲手试试

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 在线编辑器