UnityでVampire survivers 風のゲームを作ろう!第8回攻撃用ドローンの追加

vampire survivors

今回は攻撃用ドローンを作っていきます。
一定時間ごとに一番距離が近い敵に向けてビームを出すようにします。

攻撃用ドローンの追加

・ドローン本体

・ビーム

・ドローン本体に付けるスクリプト(DroneScript)

・ビームを制御するスクリプト(RayScript)

・RayStatus(ScriptableObject)

というように分けて実装していきます。

ステータスを決める

ScriptableObjectsフォルダの中にStatusDataを作成し、名前を”RayStatus”にします。

ATKを1
SPEEDを2
NockBackを0
SPANを5に設定してください。

ビームを作る

ヒエラルキー上で右クリック Create→2D Object Squareを作成して、名前をRayにします。
色は黄色にします。

ScaleのYを0.1にします。
AddComoponentからBoxCollider2Dを追加して、IsTrrigerに☑をつけます。

RayScipt

続いてRaySciptを作っていきます。
・索敵を行い一番距離の近い敵に向かって飛んでいく
・敵に当たった時に相手のダメージ関数を起動する
・敵が周囲にいないときは消滅する
という機能を持たせます。

    <code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayScript : MonoBehaviour
{
private GameObject[] targets;
private GameObject closeEnemy;
[SerializeField] StatusData statusdata;
Vector3 diff;



    void Start()
 {
	Search();//どの敵が一番近いかを比べる
	
  }

void Update() {
	 if (closeEnemy != null)	{//敵が見つかった時
	   transform.position = Vector2.MoveTowards(transform.position, closeEnemy.transform.position, statusdata.SPEED * Time.deltaTime);
		diff = (closeEnemy.transform.position - this.transform.position).normalized;
		this.transform.rotation = Quaternion.FromToRotation(Vector3.right, diff);
           
	 }
else{//敵がいない場合
            Destroy(gameObject);
        }
    }

void Search() {
        float closeDist = 100;//仮に初期値を100にする

        targets = GameObject.FindGameObjectsWithTag("Enemy");//EnemyというTagを検索する
        foreach (GameObject t in targets)//見つかった数だけループする
        {
          
            float tDist = Vector2.Distance(transform.position, t.transform.position);//ビームとその敵の距離を測る
            if (closeDist > tDist)//現在の最短距離よりも近い場合に実行される
            {
                closeDist = tDist;//最短距離を更新する
		    closeEnemy = t;//ゲームオブジェクトにも代入する
            }

        }

void OnTriggerEnter2D(Collider2D other)//敵とぶつかったらダメージ関数を発動
    {
        if (other.gameObject.tag == "Enemy")
        {
            other.gameObject.GetComponent<EnemyScript>().Damage(statusdata.ATK);
            other.gameObject.GetComponent<EnemyScript>().NockBack(statusdata.NockBack);
            Destroy(gameObject);//自分自身を消す
        }
    }

    }</code>
    

RayにRayScriptを読み込ませます。
StatusDataにはRayStatusを読み込ませてください。
AddComponentからBoxCollider2Dを追加してください。

ヒエラルキー上からPrefabフォルダにドラッグ&ドロップをしてPrefab化します。
ヒエラルキー上にあるRayは削除します。

ドローンを作る

ヒエラルキー上で右クリックし、Create 2DObject Circleを選択します。
色は黒にします。
Scaleは0.7 0.7 0.7にします。
名前をDroneに変更しましょう。
Tagをクリックし、Add TagからDroneを追加して、TagをDroneに変更します。
AddComoponentからAudio Sourceを追加してください。

名前をDroneにします。
TagのプルダウンをクリックしてAdd TagでDroneを追加します。
TagをDroneにします。

DroneScipt

最後にDroneSciptを書いてきます。
持たせる機能は
・ドローンが生成された時のポジションを決める

・プレイヤーの子要素になる
・定期的にビームを生成する
この3つです。

    <code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DroneScript : MonoBehaviour
{
[SerializeField]
    private GameObject RayPrefab;
[SerializeField]
    StatusData RayStatus;
GameObject Player;
Vector2 PlayerPos;
Vector2 myPos;
GameObject[] targets;
int DroneQuantity;
float localdistance;
public AudioClip sound;
AudioSource audioSource;
void Start()
{
	Player =GameObject.FindGameObjectWithTag("Player");//PlayerというTagを持つオブジェクト検索する。
	PlayerPos=Player.transform.position;
	this.transform.parent = Player.transform;//生成された時自分自身をプレイヤーの子要素にする
	Search();
	PositionSet();
	audioSource = GetComponent<AudioSource>();
}

void Update()
    {
        currentTime += Time.deltaTime;
        if (currentTime > RayStatus.SPAN)
        {
            Debug.Log("RayStatus.SPAN:"+RayStatus.SPAN);
            RayGenerate();
            currentTime = 0f;
        }
    }
public void RayGenerate()
    {
        audioSource.PlayOneShot(sound);
        var ray = Instantiate(RayPrefab, transform.position, transform.rotation);
    }

 void Search()
    {
        targets = GameObject.FindGameObjectsWithTag("Drone");//Droneタグを持つオブジェクトを検索する
        foreach (var t in targets)
        {
            DroneQuantity = targets.Length;//Droneタグのオブジェクトの数を保存する
        }
    }
void PositionSet() {//自分が何個目なのかによってポジションを決める
	localdistance = 0.8f;//主人公との距離
	myPos = Player.transform.position;
	switch (DroneQuantity){
		case 1://1個目の場合
                myPos.x = localdistance;
                myPos.y = localdistance;
                transform.localPosition = myPos;
             break;
            case 2://2個目の場合
                myPos.x = -1*localdistance;
                myPos.y = -1*localdistance;
                transform.localPosition = myPos;
                break;
            case 3://3一個目の場合
                myPos.x = -1*localdistance;
                myPos.y = localdistance;
                transform.localPosition = myPos;
                break;
            case 4://4個目の場合
                myPos.x = localdistance;
                myPos.y = -1*localdistance;
                transform.localPosition = myPos;
                break;
            case 5://5個目の場合
                myPos.x = 0;
                myPos.y =5f;
                transform.localPosition = myPos;
                break;
        }
}
}
</code>
    

以上のスクリプトを保存し、Droneに読み込ませてください。
Droneのインスペクターを開いて、
RayPrefabにはPrefabフォルダからドラッグ&ドロップをしてアサインします。
ヒエラルキー上のRayをアサインしてしまうとRayが自壊した後に生成する時にエラーが起きてしまうので、必ずPrefabフォルダのオブジェクトをアサインするようにしてください。
RayStatusにはRayStatusをアサインします。何秒に一回生成するかを決めるSPANの数値を利用します。
終わったらPrefabフォルダにドラッグ&ドロップしてPrefabにします。

プレイヤーの子要素になることでプレイヤーの動きと連動するようになります。

ヒエラルキー上に一つだけDroneがある状態でテストプレイしてみましょう
敵に向けてビームを発射してれば成功です。
続いてPredfabからヒエラルキー上にもう一つドラッグ&ドロップしてみましょう。
二個目のドローンが追加されて自動的にポジションが決まったと思います。

そこまでできていればOKです。

次回は倒した敵がアイテムを落とす処理を実装していきます。

WebTime | Unityでゲーム作って遊んでます

コメント

タイトルとURLをコピーしました