タワーディフェンスゲームづくりの締めです。コストを利用して、ゲームらしくしていきましょう。
目次
スタンプがコストを考慮した作りに変更
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が絞り込まれるので、それをセット
 
 

動かして確認
確認する内容としては以下
- コインが不足している時にキャラが半透明になる
 - 十分なコインを所持すると、はっきりと見える
 - ディフェンダーを設置すると、設定されたコストが差し引かれる
 - コインが足りない状態で左クリックをすると「コインが足りないよ!」ログが表示される
 


コメント