タワーディフェンスゲームづくりの締めです。コストを利用して、ゲームらしくしていきましょう。
目次
スタンプがコストを考慮した作りに変更
GameManagerはあくまで現在のCoinを増やすのみ。その数を気にしたり、利用するのはスタンプ側になります。
DefenderStampスクリプトの修正
DefenderStampスクリプトでは次のような処理を実装します。
- GameManagerのコインの数を把握できるようにする
- ディフェンダーを配置する際、GameManagerにコインの利用を申請する
- 現在のコインでディフェンダーを設置出来ない場合、半透明にする
最後なんで全文載せておきます。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
[RequireComponent(typeof(SpriteRenderer))]
public class DefenderStamp : MonoBehaviour
{
[SerializeField] private DefenderData defenderData;
[SerializeField] private DefenderController defenderPrefab;
private Dictionary<Vector2Int, DefenderController> defenderMap = new Dictionary<Vector2Int, DefenderController>();
public UnityEvent<Vector2Int, DefenderController> OnDefenderCreated = new UnityEvent<Vector2Int, DefenderController>();
private SpriteRenderer spriteRenderer;
[SerializeField] private GameManager gameManager;
private void Start()
{
// スタンプを表示しているSpriteRendererを取得する
spriteRenderer = GetComponent<SpriteRenderer>();
// はじめは未選択状態にする
Initialize(null);
// スタンプボタンが選択されたら、スタンプを切り替える
StampSelectButton.OnAnyDefenderSelect.AddListener((defenderData) =>
{
Initialize(defenderData);
});
}
private void Initialize(DefenderData defenderData)
{
this.defenderData = defenderData;
// メンバー変数のspriteRendererを利用するため不要になります
//var spriteRenderer = GetComponent<SpriteRenderer>();
if (defenderData == null)
{
spriteRenderer.sprite = null;
}
else
{
spriteRenderer.sprite = defenderData.unitSprite;
}
}
private void Update()
{
if (defenderData == null)
{
return;
}
// マウスの位置がUIの上にある場合は、ユニットを表示しない
if (EventSystem.current.IsPointerOverGameObject())
{
spriteRenderer.enabled = false;
return;
}
else
{
spriteRenderer.enabled = true;
}
// コインが足りない場合は、ユニットを半透明にする
if (gameManager.Coin < defenderData.cost)
{
spriteRenderer.color = new Color(1f, 1f, 1f, 0.5f);
}
else
{
spriteRenderer.color = Color.white;
}
Vector3 mousePos = Input.mousePosition;
Vector3 targetPosition = Camera.main.ScreenToWorldPoint(mousePos);
Vector2Int gridPosition = Vector2Int.RoundToInt(targetPosition);
transform.position = new Vector3(gridPosition.x, gridPosition.y, 0.0f);
if (Input.GetMouseButtonDown(0))
{
// グリッドの場所に空きがあるかどうかをチェックする
if (!defenderMap.ContainsKey(gridPosition))
{
if (gameManager.UseCoin(defenderData.cost))
{
var defender = Instantiate(defenderPrefab, transform.position, Quaternion.identity);
defender.Initialize(defenderData);
// グリッドの場所にディフェンダーを追加する
defenderMap.Add(gridPosition, defender);
OnDefenderCreated.Invoke(gridPosition, defender);
}
else
{
Debug.Log("コインが足りないよ!");
}
}
else
{
Debug.Log("すでにディフェンダーがいるよ!");
}
}
else if (Input.GetMouseButtonDown(1))
{
// 左クリックでディフェンダーを削除する
Initialize(null);
}
}
}
インスペクターのセット
スクリプトが更新できたら、DefenderStampコンポーネントが実装されているインスペクターを開き、設定を追加しましょう。
- GameManagerへのセット
- 右側の丸ポチからGameManagerが絞り込まれるので、それをセット
動かして確認
確認する内容としては以下
- コインが不足している時にキャラが半透明になる
- 十分なコインを所持すると、はっきりと見える
- ディフェンダーを設置すると、設定されたコストが差し引かれる
- コインが足りない状態で左クリックをすると「コインが足りないよ!」ログが表示される
コメント