TD-コスト(コイン)を利用したディフェンダーの設置-part15

タワーディフェンスゲームづくりの締めです。コストを利用して、ゲームらしくしていきましょう。

目次

スタンプがコストを考慮した作りに変更

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が絞り込まれるので、それをセット

動かして確認

確認する内容としては以下

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

この記事を書いた人

コメント

コメントする

目次