タワーデフェンスゲーム　Unity タレット設置機能 11/14　49 タレットの射撃範囲を実装する

# 概要

目次

https://qiita.com/RYA234/private/c3d52a0f4ab3258a494a



今回はタレット設置済みのNodeオブジェクトを選択したときタレットの射撃範囲が表示するようにします。

以下gifアニメはその時の様子です。赤枠内のTurretRangeオブジェクトが非表示から表示に変わります。

![11-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/d5738639-c674-f117-9bf3-dcfea0ff5f4a.gif)




# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# UnityEditor上の設定
Nodeオブジェクトに新規オブジェクトを作成しSprite Rendererコンポーネントを下図のようにアタッチする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/9db90e55-c4d2-4e27-258d-a4e190ea64a8.png)

NodeオブジェクトにTurretRangeオブジェクトをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/1ce903f0-ad80-4b57-7320-11576e844cf6.png)



# 実装のポイント

下図はNodeオブジェクトを押してタレットを表示するまでの流れです。
比率を使ってタレットの範囲を算出するようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f624db47-9c8a-bfa5-2dd7-8414651eee83.png)


AttackRangeが参照する流れは下図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/76064aa7-e427-1ae5-f06e-c20ac630c2aa.png)


attackRangeSpriteの参照の流れは下図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/84d69b04-6499-065b-a886-4f51d50cc63e.png)


# コード部分

## Turrets

```diff_c_sharp:Turrets.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Turrets : MonoBehaviour
{
    [SerializeField] private float attackRange = 3f;
    public Enemy CurrentEnemyTarget { get; set; }
    public TurretUpgrade TurretUpgrade { get; set; }
+    public float AttackRange => attackRange;
    private bool _gameStarted;

    private List<Enemy> _enemies;

    //以下略
}


```

## Node

```diff_c_sharp:Node.cs
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class Node : MonoBehaviour
{
    public static Action<Node> OnNodeSelected;
    public static Action OnTurretSold;
+    [SerializeField] private GameObject attackRangeSprite;
    
    public Turrets Turrets { get; set; }
    
+    private float _rangeSize;
+    private Vector3 _rangeOriginalSize;

+    private void Start()
+    {
+        //size.xでも可
+        _rangeSize = attackRangeSprite.GetComponent<SpriteRenderer>().bounds.size.y;
+        _rangeOriginalSize = attackRangeSprite.transform.localScale;
+    }

    public void SetTurret(Turrets turrets)
    {
        Turrets = turrets;
    }

    public bool IsEmpty()
    {
        return Turrets == null;
    }

    public void SelectTurret()
    {
        OnNodeSelected?.Invoke(this);
+        if (!IsEmpty())
+        {
+            ShowTurretInfo();
+        }
    }

    public void SellTurret()
    {
        if (!IsEmpty())
        {
            CurrencySystem.Instance.AddCoins(Turrets.TurretUpgrade.UpgradeCost);
            Destroy(Turrets.gameObject);
            Turrets = null;
            OnTurretSold?.Invoke();
        }
    }

+    private void ShowTurretInfo()
+    {
+        attackRangeSprite.SetActive(true);
+        //　比率を変形した式　Turrets.AttackRange : rangeSize / 2 = attackRangeSprite.transform.localScale : _rangeOriginalSize 
+        //Turrrets.AttackRange は半径　_rangeSizeは直径
+        attackRangeSprite.transform.localScale = _rangeOriginalSize * Turrets.AttackRange / (_rangeSize / 2);
+    }
}


```





# 参考




Section8 49

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23174280#content

github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/dd6d249cbb601294e4a5d6512d2b48ef934a7afd