Unityで簡単なシューティングゲームを作る[4]
Step4:弾を発射する
今回はスペースキーを押すとアマビエ様(プレイヤー)がシャボン弾を発射するように設定する。
※このサイトのチュートリアルはとりあえず自力でゲームを作ってみることを目的としているため、プログラム言語に関する解説部分はかなり大雑把で意訳気味です。プログラム言語(C#)について正しく、詳しく学びたい方は、入門書やUnityの解説サイトなどをご参考にしていただけたらと思います。また、このサイトはコピープロテクトをかけているため、画面上からスクリプトのコピペができません。「スクリプトはこちら」というリンクからテキストファイルを表示して使ってください。面倒くさくてすみません。
弾をステージに配置する
シーンビューでAssetsフォルダから弾の画像を選択し、ドラッグ&ドロップでステージ上に配置する。配置するとヒエラルキーリストにも「bullet」が表示される。
弾を移動させるスクリプトを書く
続いて弾のオブジェクトを上に移動させるスクリプトを作成する。メニューの「Assets」からプルダウンメニューの「Create」を選択し「C# Script」でファイルを作成。ファイル名は「BulletController」とする。
「BulletController」をダブルクリックして開き、スクリプトを以下のように記述する。スクリプトはこちらから。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletController : MonoBehaviour { void Update () { transform.Translate (0, 0.2f, 0); if (transform.position.y > 5) { Destroy (gameObject); } } }
スクリプトの構造をごくごく簡単に説明する。まず最初の
transform.Translate (0, 0.2f, 0);
の部分では、Translate関数を使って弾を上に0.2ずつ移動するよう命令している。しかしこれだけでは弾がステージ上から出ても移動し続けてしまう。かといってStep.3でやったように移動範囲をステージ内に設定してしまうと、弾がステージの先まで飛んで行った感じにならない。そこで、弾がステージを超えた時はそのオブジェクトを消すという命令を加える。それが以下の部分。
//もしy軸方向に上に5以上進んだら
if (transform.position.y > 5) {
//このオブジェクトを破壊する
Destroy (gameObject);
}
スクリプトをアタッチする
スクリプトを書いたら保存し「bullet」にアタッチする。シーンビューで「bullet」を選択した状態で、前のように「Add Component」から「Script」を選択し「BulletController」をアタッチする。あるいは、下図のようにAssetsの中の「BulletController」をヒエラルキーリストの「bullet」の上にドラッグ&ドロップしてもよい。
動作確認をする
アセットしたらゲーム ビューに切り替え動作確認をする。弾が一度だけ発射され、上方向に移動し消えればOK。
Prefabを作る
弾は発射されるが、このままではキラークイーンの空気弾のように一発しかでない。シューティングゲームにするためには、シーザーのシャボンランチャーみたいに連射で出るようにしたい。そんな時に使うのがPrefabだ。Prefabを使うと、同じオブジェクトを複数配置することができる。クッキーの型みたいなものだという説明をしているサイトがあったがまさにそんなイメージだ。
Prefabの作り方は簡単である。シーンビューの状態でヒエラルキーリストの「bullet」をAssetsフォルダにドラッグ&ドロップする。ファイル名は「bulletPrefab」する。これで「上に移動するシャボン弾」のPrefabができた。
弾のPrefabができたので、ステージ上の「bullet」は削除する。弾はスペースキーを押した時に発射したいのでステージに置きっぱなしにしてしまうと、ゲームスタート時に弾が表示されてしまう。
スペースキーで弾が出るようスクリプトを書く
「上に移動するシャボン弾」のPrefabができたら、今度はそれを使ってスペースキーを押すたびに「上に移動するシャボン弾」を複製するスクリプトを作成する。弾を出すのはプレイヤーなのでプレイヤーの動きを制御するスクリプト「PlayerController」を開き、以下の赤い部分を追記する。スクリプトはこちらから。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour{ public GameObject bulletPrefab; void Update () { transform.localPosition = Range.ClampPosition( transform.localPosition ); if (Input.GetKey (KeyCode.LeftArrow)) { transform.Translate (-0.1f, 0, 0); } if (Input.GetKey (KeyCode.RightArrow)) { transform.Translate ( 0.1f, 0, 0); } if (Input.GetKey (KeyCode.UpArrow)) { transform.Translate ( 0,0.1f, 0); } if (Input.GetKey (KeyCode.DownArrow)) { transform.Translate ( 0,-0.1f, 0); } if (Input.GetKeyDown (KeyCode.Space)) { Instantiate (bulletPrefab, transform.position, Quaternion.identity); } } }
ここでまたごくごく簡単にスクリプトの説明。まず追記した最初の一文で、ゲーム内のオブジェクト「bulletPrefab」を使いますよと宣言している。
public GameObject bulletPrefab;
そして一番下に追記したスクリプトでは、スペースキーを押した時に「bulletPrefab」を複製するよう命令している。ここで使われているのはInstantiate関数というものでオブジェクトを複製する時などに使用する。
//スペースキーを押したら
if (Input.GetKeyDown (KeyCode.Space)) {
//bulletPrefabを複製
Instantiate (bulletPrefab, transform.position, Quaternion.identity);
}
関連づけを行う
スクリプトを書いたら保存し、シーンビューに戻る。ヒエラルキーリストの「player」を選択してインスペクタを見ると、アタッチされているスクリプト「Player Controller」内に「BulletPrefab」という項目ができている。横のボックスを見ると「None(GameObject)」となっている。スクリプトで使用すると宣言したゲームオブジェクトがありませんよ、とうこと。
そこでこの空のボックスにAssetsフォルダの「bulletPrefab」をドラッグ&ドロップする。
スクリプト上で呼び出しているオブジェクトとの関連づけができ、ボックスに「bulletPrefab」と表示されるようになった。
動作確認をする
ゲームビューに切り替え、動作確認を行う。スペースキーで弾がでるようになっていれば成功。
プレイヤーの設定が終わったので次回の「Step5:敵を動かす」では敵であるウィルスの動きを設定していく。
★チュートリアル一覧
2020.6.3投稿