お金
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 12/25。
タワーの建設にはお金がかかります。お金はGameManagerが管理し、BuildManagerが支払いを求めます。要求と支払いは1つの手順です。お金があるか確認し、足りていれば差し引き、支払えたかどうかをboolで返すメソッドです。Dictionary.TryGetValueが結果を返すのと同じです。自動販売機のお財布です。
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}確認を通さずに支払う呼び出し元はなく、コインの値が変わるのはここだけなので、コインが0未満になることはありません。価格はプレハブにあります。独自のスクリプトのフィールドで、プレハブのInspectorで設定します。プレハブはほかのオブジェクトと同じように読み込まれたオブジェクトなので、インスタンス化する前にsnackPrefab.priceを読み取り、インスタンス化するかどうかを判断できます。
チャレンジ
中級タワーの建設にはお金がかかります。初期資金は150で、矢1本につき50です。
Tower:public int cost = 50;を追加します。GameManager:[SerializeField] private int startMoney = 150;、[SerializeField] private TMP_Text moneyText;、private int money;を追加し、Money: 150と表示します。public bool TrySpend(int amount):amount > moneyならfalseを返します。そうでなければ、その金額を差し引いて表示し、trueを返します。BuildManager:[SerializeField] private GameManager game;を追加します。game.TrySpend(towerPrefab.cost)が成功した場合のみ建設し、そうでなければNot enough moneyをログに出力します。
「プレイ」を押して、お金がなくなるまでタワーを建設します。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startLives = 20;
[SerializeField] private TMP_Text livesText;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
}
void Start()
{
lives = startLives;
ShowLives();
}
void OnReachedBase(Enemy enemy)
{
lives -= enemy.data.damage;
ShowLives();
}
void ShowLives()
{
livesText.text = "Lives: " + lives;
}
}
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド