絵本レビューとWwbと…

unityで簡単なゲームの作る方法

Unityで簡単なシューティングゲームを作る[5]

Step5:敵を動かす

前回でプレイヤーの動きは大体できたので、今度は敵の動きを作っていく。おおまかな流れは「player」の時とほぼ同じ。

※このサイトのチュートリアルはとりあえず自力でゲームを作ってみることを目的としているため、プログラム言語に関する解説部分はかなり大雑把で意訳気味です。プログラム言語(C#)について正しく、詳しく学びたい方は、入門書やUnityの解説サイトなどをご参考にしていただけたらと思います。また、このサイトはコピープロテクトをかけているため、画面上からスクリプトのコピペができません。「スクリプトはこちら」というリンクからテキストファイルを表示して使ってください。面倒くさくてすみません。

敵をステージに配置する

アマビエ様が闘う敵は…やはりアレである。と言う訳で、ステージにウィルスの画像(敵)を配置する。配置する場所はどこでもOK。シーンビューのAssetsからステージへ「enemy」をドラッグ&ドロップする。するとヒエラルキーリストにも「enemy」が追加される。

敵を動かすスクリプトを作る

敵が配置できたら今度は敵を動かすためのスクリプトを作成する。ファイル名は「EnemyController」とする。

ファイルをダブルクリックで開き、以下のスクリプトを記述する。スクリプトはこちらから。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyController : MonoBehaviour{

	float fallSpeed;
	float rotSpeed;

public void Start () {
		this.fallSpeed = 0.01f + 0.1f * Random.value;
		this.rotSpeed = 6f + 3f * Random.value;
	}
	
public void Update () {
		transform.Translate( 0, -fallSpeed, 0, Space.World);
		transform.Rotate(0, 0, rotSpeed );
		if (transform.position.y < -5.5f) {
			Destroy (gameObject);
		}
	}
}

ごくごく簡単にスクリプトの説明。

this.fallSpeed = 0.01f + 0.1f * Random.value;
this.rotSpeed = 6f + 3f * Random.value;

まずfallSpeedで、敵の落下速度を定義している。Random.valueは、0.1~1までの値をランダムに取り出すメソッド。ここでは基本となる0.01fのスピードに、0.1~1のランダムな値に0.1をかけたもの(0.1f *Random.value)を足す、という処理を行なっている。

二行目のfloat rotSpeedでは、敵の回転速度を定義している。落下速度と同じように、基準スピードの6fに、0.1~1のランダムな値を3倍したもの(3f * Random.value)を足す、という処理をこなっている。

transform.Translate( 0, -fallSpeed, 0, Space.World);
transform.Rotate(0, 0, rotSpeed );

transform.Translateはオブジェクトを移動させる際に使用するメソッド。()の中は(x軸方向の速度,y軸方向の速度,z軸方向の速度)という並びになっているので横と奥行きは0、Y軸に宣言したfallSpeedをマイナス方向(つまり下)と設定する。最後のSpace.Worldは画面内で動作させるために必要なもの。

transform.Rotateはオブジェクトを回転させたい時に使用するメソッド。()の中は(x軸方向の回転速度,y軸方向の回転速度,z軸方向の回転速度)という並びになっている.

if (transform.position.y < -5.5f) {
	Destroy (gameObject);

最後に、ステージを超えたらウィルスのオブジェクトを消す、という処理を行う。(プレイヤーの弾と同じ処理である。)

スクリプトをアタッチする

スクリプトが書けたら保存し、ヒエラルキーリストの「enemy」にドラッグ&ドロップしてアタッチする。

動作確認をする

アタッチできたらゲームビューに切り替え、プレイボタンを押して動作確認をする。ウィルスが回りながら落ちてきたら成功。

Prefabを作成する

敵がたった一つなんてシューティングゲームとしてはつまらない。なにせ敵は倍々で増えてくる厄介なウィルスだ。と言う訳で、同じものをたくさん作る時に使う「Prefab」を作成する。Step4のシャボン弾の時と同じように、ヒエラルキーリストの「enemy」をAssetsにドラッグ&ドロップする。できたファイルは「enemyPrefab」と名前をつける。Prefabを作ったらステージ上の「enemy」は不要なので削除する。

スクリプトを作成する

「上から降ってくるウィルス」のPrefabができたので、今度は「時間が経過するごとにenemyPrefabを複製する」スクリプトを作成する。C#ファイルを作成し、ファイル名は「EnemyMaker」とする。

ファイルを開いて以下のスクリプトを記述。スクリプトはこちらから。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyMaker : MonoBehaviour{

	public GameObject enemyPrefab;

	void Start () {
		InvokeRepeating ("MakeEnemy", 1, 1);
	}
	
	void MakeEnemy () {
		Instantiate (enemyPrefab, new Vector3 (-2f + 4 * Random.value, 5, 0), Quaternion.identity);
	}
}

再びごくごくごく簡単に解説。ここでは定期的に指定した関数を呼び出してくれるInvokeRepeating関数を使用している。日本語でいうと1秒に1度「MakeEnemy」を呼び出して、という感じ。

void Start () {
	InvokeRepeating ("MakeEnemy", 1, 1);
	}

それに続いて「MakeEnemy」の内容を定義する。ここではStep.4と同じくInstantiate関数を用いる。

void MakeEnemy () {
	Instantiate (enemyPrefab, new Vector3 (-2f + 4 * Random.value, 5, 0), Quaternion.identity);

一定時間ごとに「enemyPrefab」をステージ内のランダムな位置に複製する、という処理を行なっている。

スクリプトをアタッチする

スクリプトを保存したら、オブジェクトにスクリプトをアタッチする。ヒエラルキーリストの「+」をクリックするとプルダウンメニューが出てくる。ここで「Create Empty」を選択し、ステージ上に空のオブジェクトを生成する。名前はデフォルトで「GameObject」となっている。

作成した「GameObject」に作成したスクリプト「EnemyMaker」をアタッチする。

関係づけを行う

ヒエラルキーの「GameObject」を選択してインスペクタを確認すると、アタッチしたスクリプト「EnemyMaker」が項目に追加されている。この項目の「enemyPrefab」が「None(GameObject)」と空になっているので、前回と同じようにAssetsフォルダの「enemyPrefab」をドラッグ&ドロップする。空だったボックスに「enemyPrefab」が表示されるのを確認する。

動作確認をする

ゲーム ビューに切り替え、プレイボタンを押して動作確認をする。上から敵のウィルスがランダムに落ちてくるようになった。

これでアマビエ様(プレイヤー)とウィルス(敵)というゲームの役者が揃った。次の「Step6:弾で敵を倒す」ではアマビエ様のシャボン弾で敵を倒せるようにする。

★チュートリアル一覧

  1. Step1:プロジェクトの設定
  2. Step2:プレイヤーを動かす
  3. Step3:移動範囲を制限する
  4. Step4:弾を発射する
  5. Step5:敵を動かす
  6. Step6:弾で敵を倒す
  7. Step7:スコアを更新する
  8. Step8:ゲームオーバーの設定
  9. Step9:リトライボタンの設定
  10. Step10:背景を動かす
  11. Step11:BGMを設定
  12. Step12:爆破エフェクトをつける
  13. Step13:ゲームをビルドする

2020.6.3投稿

最近の投稿

レビュー記事

Work-life

Hobby

Diary