タワーデフェンスゲーム　Unity タレット機能3/10　24 タレットが取得したEnemy方向を向くようにする

# 概要
目次

https://qiita.com/RYA234/items/c9925ce07d6afe64be7e

前回の続きです。

今回は敵に追従して、タレットが向きを変えるように実装します。
以下gifアニメは、その時の様子です。白いのがEnemy 青い四角がタレットです。

![rotate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c6e2f604-a211-f1dd-9752-a558db5dd43e.gif)



# 開発環境

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

# UnityEditor上の設定
特に変更点は無いです。

# 実装のポイント
TurretクラスにRotateTowardTargetメソッドとOnTriggerExit2Dメソッドを追加します。
RotateTargetメソッドではタレットオブジェクトの角度を変える処理を行います。

OnTriggerExit2DメソッドはUnityのイベント関数でコライダーの範囲が外れた時に実行されます。
Turrets内のEnemyクラスを削除します。
削除することでEnemyの動きに対して角度を合わせる必要がなくなります。


# コード部分
```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; }
    private bool _gameStarted;

    private List<Enemy> _enemies;
    
    private void Start()
    {
        _gameStarted = true;
        _enemies = new List<Enemy>();
    }

    private void Update()
    {
        GetCurrentEnemyTarget();
+        RotateTowardsTarget();
    }

    private void GetCurrentEnemyTarget()
    {
        if (_enemies.Count <= 0)
        {
            CurrentEnemyTarget = null;
            return;
        }

        CurrentEnemyTarget = _enemies[0];
    }

+    private void RotateTowardsTarget()
+    {
+        if (CurrentEnemyTarget == null)
+        {
+            return;
+        }
+
+        Vector3 targetPos = CurrentEnemyTarget.transform.position - transform.position;
+        float angle = Vector3.SignedAngle(transform.up, targetPos, transform.forward);
+        transform.Rotate(0f,0f,angle);
+    }
    
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Enemy"))
        {
            Enemy newEnemy = other.GetComponent<Enemy>();
            _enemies.Add(newEnemy);
        }

        CurrentEnemyTarget = _enemies[0];
        
    }

+    private void OnTriggerExit2D(Collider2D other)
+    {
+        if(other.CompareTag("Enemy"))
+        {
+            Enemy enemy = other.GetComponent<Enemy>();
+            if (_enemies.Contains(enemy))
+            {
+                _enemies.Remove(enemy);
+            }
+        }
+    }

    private void OnDrawGizmos()
    {
        if (!_gameStarted)
        {
            GetComponent<CircleCollider2D>().radius = attackRange;
        }
        
        Gizmos.DrawWireSphere(transform.position, attackRange);
    }
}



```


# 参考

タレット回転させる処理で初見のメソッドが多かった印象です。
Vector3.SingnedAngled

https://docs.unity3d.com/ja/2020.3/ScriptReference/Vector3.SignedAngle.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/82c82ac7-3b93-a0c9-26c4-557286bc870c.png)

Vector3.up

https://docs.unity3d.com/ja/2020.3/ScriptReference/Vector3-up.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/d7323f90-7ecf-f45d-b5d5-7af242ca19b7.png)


Vector.forward

https://docs.unity3d.com/ja/2019.4/ScriptReference/Vector3-forward.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/31f78b05-6a52-9452-dbf3-3f3c6a8004d8.png)

transform.Rotate

https://docs.unity3d.com/ScriptReference/Transform.Rotate.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/68a66dc9-d644-8fc9-b25c-3152630034a1.png)



Section5 24

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


github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/bb5b60d5245317269e4fc6c5f36cce887b571a78#diff-e3060f0a28a3723ed32a1bb592698a46c11714fa26d8106305e7d270f8cb1282