タワーデフェンスゲーム　Unity タレット機能 5/10 25 弾が敵に向かうように実装

# 概要
目次

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


今回は、生成した弾が向かう様に実装します。
以下gifアニメは、Gボタン押下で弾を生成し、弾が射程内の敵に移動しているときの様子です。

![ASAAAA.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/5804dc32-52fe-d0d4-d848-ef45d4987993.gif)



# 開発環境

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

# UnityEditor上の設定
弾オブジェクトのプレハブにProjectileスクリプトをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/505b2efe-b730-369f-ead1-d154e76ca356.png)


# 実装のポイント
新規クラスProjectileを作成します。
MoveProjecttileメソッドとSetEnemyメソッドを作成します。
MoveProjecttileメソッドはProjecttileクラスのUpdateメソッドで実行され弾オブジェクトの座標を引数の敵の座標まで移動します。

SetEnemyメソッドはTurretProjectileクラスのUpdateメソッドで実行され 移動先の敵情報をProjectileクラスに渡す時に使います。



TurretProjectileクラスのUpdateメソッドに、ProjectileにEnemyを追加する処理を追加します。
この処理はタレットの射程範囲内に敵が存在するかつ、弾が既にある時に実行されます。


# コード部分
```diff_c_sharp:TurretProjectile.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TurretProjectTile : MonoBehaviour
{

    [SerializeField] private Transform projecttileSpawnPosition;
    private ObjectPooler _pooler;
    private Turrets _turret;
+    private Projectile _currentProjectileLoaded;
    

    private void Start()
    {
        _pooler = GetComponent<ObjectPooler>();
        _turret = GetComponent<Turrets>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.G))
        {
            LoadProjecttile();
        }

+        if (_turret.CurrentEnemyTarget != null && _currentProjectileLoaded != null &&
+            _turret.CurrentEnemyTarget.EnemyHealth.CurrentHealth > 0f)
+        {
+            _currentProjectileLoaded.transform.parent = null;
+            _currentProjectileLoaded.SetEnemy((_turret.CurrentEnemyTarget));
+        }


    }

    private void LoadProjecttile()
    {
        GameObject newInstance = _pooler.GetInstanceFromPool();
        newInstance.transform.position = projecttileSpawnPosition.position;
        newInstance.transform.SetParent(projecttileSpawnPosition);

+        _currentProjectileLoaded = newInstance.GetComponent<Projectile>();
        newInstance.SetActive(true);
        

    }
}



```

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

public class Projectile : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 10f;
    private Enemy _enemyTarget;
    
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (_enemyTarget != null)
        {
            MoveProjecttile();        
        }
    }

    private void MoveProjecttile()
    {
        transform.position = Vector2.MoveTowards(transform.position,_enemyTarget.transform.position,moveSpeed * Time.deltaTime);
    }
    
    public void SetEnemy(Enemy enemy)
    {
        _enemyTarget = enemy;
        
    }
}


```


# 参考

Vector2.MoveTowards

https://docs.unity3d.com/ja/2020.3/ScriptReference/Vector2.MoveTowards.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/2dabe48c-89d8-936c-efe9-e4aa883f0ce8.png)



Section5 25

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

github コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/0901972b9044349889903237efdb7ca29a46df2b