タワーデフェンスゲーム　Unity タレット設置機能 4/14　45-1 Nodeオブジェクトを押した時　UIを表示するように実装

# 概要
目次

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



今回はNodeオブジェクトを押した時にタレットUIが表示する実装します。
以下gifアニメはNodeオブジェクトをクリックした時にタレットUIが表示している様子です。

![4-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/b03b1dec-7000-90e4-35d3-1dc6ebd9ef5b.gif)







# 開発環境

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

# UnityEditor上の設定
Nodeオブジェクトを作成しNodeスクリプトをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/f48b679b-c26a-3248-2e70-c41d40189440.png)



その下にuGuiのボタンを作成しNodeクラスのSelectTurretメソッドを実行する設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/6a8a9046-7e8c-8487-cabf-b3e84153aeb1.png)

# 実装のポイント
新規クラスにNodeとUIManagerを作成します。
Nodeクラスはクリック時に実行されるメソッドを追加します。
UIManagerクラスはタレットUIを表示するメソッドを追加します。
既存クラスのTurretShopManagerは選択したNodeを受け取る処理を追加します。

ObservaleをNode
ObserverをUIManager TurretShopManagerクラス
としてオブサーバーパターンを用いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/cbe7d6f9-3475-1119-876b-bfd9acf4fcc1.png)



# コード部分

## TurretShopManager

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

public class TurretShopManager : MonoBehaviour
{
    [SerializeField] private GameObject turretCardPrefab;
    [SerializeField] private Transform turretPanelContainer;

    [Header("Turret Setting")] [SerializeField]
    private TurretSetting[] turrets;
    
+    private Node _currentNodeSelected;

    private void Start()
    {
        for (int i = 0; i < turrets.Length; i++)
        {
            CreateTurretCard(turrets[i]);
        }
    }
    
    private void CreateTurretCard(TurretSetting turretSetting)
    {
        GameObject newInstance = Instantiate(turretCardPrefab, turretPanelContainer.position, Quaternion.identity);
        newInstance.transform.SetParent(turretPanelContainer);
        newInstance.transform.localScale = Vector3.one;

        TurretCard cardButton = newInstance.GetComponent<TurretCard>();
        cardButton.SetupTurretButton(turretSetting);
        
    }
+    private void NodeSelected(Node nodeSelected)
+    {
+        _currentNodeSelected = nodeSelected;        
+    }



+    private void OnEnable()
+    {
+        Node.OnNodeSelected += NodeSelected;
+    }



+    private void OnDisable()
+    {
+        Node.OnNodeSelected -= NodeSelected;
+    }

}


```

## UIManager

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

public class UIManager : MonoBehaviour
{
    [SerializeField] private GameObject turretShopPanel;

    private Node _currentNodeSelected;

    private void NodeSelected(Node nodeSelected)
    {
        _currentNodeSelected = nodeSelected;
        if (_currentNodeSelected.IsEmpty())
        {
            turretShopPanel.SetActive(true);
        }
    }
    private void OnEnable()
    {
        Node.OnNodeSelected += NodeSelected;
    }

    private void OnDisable()
    {
        Node.OnNodeSelected -= NodeSelected;
    }
}


```

## Node

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

public class Node : MonoBehaviour
{
    public static Action<Node> OnNodeSelected;
    public Turrets Turrets { get; set; }

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

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

    public void SelectTurret()
    {
        OnNodeSelected?.Invoke(this);
    }
}


```



# 参考




Section8 45

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


github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/b88d20270af8fd81375b374e99f2bdb4531543b5#diff-270904865003e00885d49f1ec391ad343480c288ebc9b7a9cb50540c4e8feb26