商店
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));
}挑战
中等添加一个商店,点击按钮即可选择要建造的炮塔。
- 在
BuildManager中,用序列化的Tower[] shop、Button[] shopButtons和Color chosenColor替换towerPrefab,并添加private Tower chosen;。 - 在
Start中,将每个按钮的标签设为prefab.data.towerName + "\n" + prefab.data.cost,并让点击按钮时调用Choose(prefab);然后调用Choose(shop[0])。 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 在线编辑器