UnityでVampire survivers 風のゲームを作ろう!第3回敵のスポーンと主人公への追従

vampire survivors

今回は敵キャラクターを主人公の周りに生成するスクリプトを記述していきます。

Prefabフォルダの作成

Assetsフォルダの下にPrefabという名前のファイルを作成してください。

Enemyオブジェクトの作成
ImagesフォルダのSlimeをクリックし、Pixel Per Unitを600にします。
ヒエラルキー上にSlimeをドラッグします。

名前をEnemy1に変更します。
AddComponentからBox Collider2Dを追加します。BoxCollider2DのSizeを X1.1 Y 0.85にします。

Is Triggerに☑マークを入れます。Colliderの物理的な挙動をなくすことができます。

次にEnemyというタグを追加します。

Tag→AddTag
Tagを”Enemy”に指定します。

Prefab化する

ヒエラルキー上にあるEnemy1をPrefabフォルダにドラッグし、Prefab化します。
Prefabというのは設計書のようなもので、Prefabにすることでスクリプトから生成できるので便利です。

敵を生成するオブジェクトを作る

敵を生成するScriptを読み込ませるようのオブジェクトを作ります。

まずはヒエラルキー上で右クリック、CreateEmptyを作成します。
名前はEnemyGeneratorにします。

AssetsのScriptフォルダの中に右クリックからcreateからC#Scriptを作成します。
名前はEnemyGeneratorScriptにします。

EnemyGeneratorScript

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

public class EnemyGeneratorScript : MonoBehaviour
{
[SerializeField]
private GameObject EnemyPrefab;//生成する用の敵キャラPrefabを読み込む
GameObject Player;
Vector2 PlayerPos;//キャラクターの位置を代入する変数
private float currentTime = 0f;
private float span =3f;
//生成される方向を決める乱数用の変数
int rndUD;(上下)
int rndLR;//(左右)
Vector2 enemyspwnPos;//生成される位置
void Start()
    {
        Player = GameObject.FindGameObjectWithTag("Player");//Playerというタグを検索し、見つかったオブジェクトを代入する
    }
void Update(){
	currentTime += Time.deltaTime;//時間経過をcurrentTimeに代入し時間を測る
        if (currentTime > span)//spanで設定した3秒を越えたら処理を実行
        {
		EnemyGenerate(EnemyPrefab);
            currentTime = 0f;
	 }
	}

public void EnemyGenerate(GameObject Enemy)
    {
	//EnemyPrefabのスポーン位置を決める

	PlayerPos=Player.transform.position;//Playerの現在位置を取得
   
	//上下どちらにスポーンするか
	rndUD = Random.Range(0,2);//0:上 1:下
   //左右どちらになるか
      rndLR = Random.Range(0, 2);//0:左 1:右
	
	//プレイヤーからどれくらい離れた位置で生成するか
	float rndPositiveX = Random.Range(1.0f, 3.0f);
      float rndPositiveY = Random.Range(1.0f, 3.0f);
      float rndNegativeX = Random.Range(-1.0f, -3.0f);
      float rndNegativeY = Random.Range(-1.0f, -3.0f);

	switch (rndUD){
		case 0://rndUDが上の場合
		enemyspwnPos.y= rndPositiveY;//上方向の乱数を代入
		
		break;
		case 1://rndUDが下の場合
		enemyspwnPos.y = rndNegativeY;//下方向の乱数を代入
		break;
	}

 	switch (rndLR) {
		 	case 0://rndLRが左の場合
                  enemyspwnPos.x = rndPositiveX;//左方向の乱数を代入
			break;
		 	case 1://rndLRが右の場合
                  enemyspwnPos.x = rndNegativeX;//右方向の乱数を代入
                  break;
	}

	enemyspwnPos = enemyspwnPos + PlayerPos;//プレイヤーの位置に先ほどの乱数を足した位置に生成する
	var enemy = Instantiate(Enemy, enemyspwnPos, transform.rotation);//Prefabを生成する
    }

}

}</code>
    

ちょっと解説

3秒ごとにEnemyPrefabをプレイヤーの周囲に生成する処理を行っています。
生成する方向はプレイヤーの現在位置から見て右上、右下、左下、左上の四方向のどこかで、距離は1fから3f未満の間の乱数で決められた位置に生成されるようになっています。

GameObject.FindGameObjectWithTag(“Player”)
でPlayerというタグを持ったオブジェクトを検索させます。
そのために、PlayerオブジェクトのTagをPlayerに設定できているか確認してください。

rndUD= Random.Range(0,2);
rndLR = Random.Range(0,2);
Random.Rangeの2番目の引数には乱数の範囲に含まない数字を入力するので0~1になります。

float rndPositiveX = Random.Range(1.0f, 3.0f);
プレイヤーからどれだけ離れた位置で生成するかを決める乱数です。
小数点以下の数字を扱うためintではなくfloat変数を使っています。

switch文では条件によって実行する処理を変えることができます。
enemyspwnPosに今まで代入した数とプレイヤーの現在位置を足して生成位置を決定します。


var enemy = Instantiate(Enemy, enemyspwnPos, transform.rotation);
InstantiateでenemyspwnPosの場所にEnemyPrefabを生成します。

では先ほど作成したEnemyGeneratorにEnemyGeneratorScriptをアタッチします。

EnemyGeneratorのインスペクターの中のEnemyGeneratorScriptにアサインしていきましょう。
EnemyPrefabにPrefabファイルの中のEnemy1をドラッグします。
ヒエラルキー上にあるEnemy1は削除しましょう。右クリックしてからDeleteします。

ここまで完了したら実行してみましょう。
敵キャラが生成されているようなら成功です。

敵キャラの移動

AssetsのScriptフォルダの中に右クリックからcreateからC#Scriptを作成します。
EnemyScriptという名前に変更します。

EnemyScriptは敵キャラの行動を制御するためのスクリプトです。
続いて移動の処理を実装していきます。

EnemyScript

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


public class EnemyScript : MonoBehaviour
{

GameObject Player;
Vector3 PlayerPos;

private float speed=0.5f;

Vector3 diff;
Vector3 vector;

void Start(){
	Player = GameObject.FindGameObjectWithTag("Player");
	PlayerPos= Player.transform.position;
	this.transform.LookAt(PlayerPos);

}
 void Update(){
	PlayerPos= Player.transform.position;//プレイヤーの現在位置を取得
	transform.position = Vector2.MoveTowards(transform.position, PlayerPos, speed * Time.deltaTime);//現在位置からプレイヤーの位置に向けて移動
	diff.x = PlayerPos.x - this.transform.position.x;//プレイヤーと敵キャラのX軸の位置関係を取得する
	if(diff.x > 0){//Playerが敵キャラの右側にいる時右側を向く
            vector = new Vector3(0,-180, 0);
            this.transform.eulerAngles = vector;
        }
	if(diff.x < 0){//Playerが敵キャラの左側にいる時左側を向く
            vector = new Vector3(0,0,0);
            this.transform.eulerAngles = vector;
       }
}

}</code>
    

PrefabフォルダのEnemy1をクリックしてScriptsフォルダのEnemyScriptをアタッチします。

実行してみましょう。
生成された敵キャラたちがプレイヤーの方を向き、追尾するように移動していれば成功です。

次回はプレイヤーキャラや敵のステータスを決めていきましょう。

UnityでVampire survivers 風のゲームを作ろう!第4回プレイヤーや敵のステータスを決めよう
UnityでVampire survivers 風のシステムのゲームを作成していきます。 今回はキャラのステータスを決めるためにScriptableObjectを使っていきます。

コメント

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