お金
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 6/18。
タワーの建設にはお金がかかります。お金は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で開始し、ArrowTowerのコストは50です。
Towerに、public intcostを追加します。ArrowTowerのプレハブでは、これを50に設定します。GameManagerに、シリアライズされたintstartMoneyとシリアライズされたTMP_TextmoneyText、およびstartMoneyから始まるprivate intmoneyを追加します。開始時と変更のたびに、Money: 150と表示します。public bool TrySpend(int amount)を追加します。amountが所持金を超える場合はfalseを返し、何も変更しません。それ以外の場合は所持金から差し引き、所持金を表示してtrueを返します。BuildManagerに、シリアライズされたフィールドgame(GameManager)を追加します。空いているパッドにタワーが配置されるのは、game.TrySpendでプレハブのcostを支払える場合だけです。そうでない場合は、Not enough moneyをログに出力します。
Playを押し、所持金がなくなるまでタワーを建ててから、Checkを押します。
自分で試してみよう
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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。