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:弾で敵を倒す」ではアマビエ様のシャボン弾で敵を倒せるようにする。
★チュートリアル一覧
2020.6.3投稿