2020年11月25日5 分

Unityで「シューティングゲーム」をつくろう!Vol.04

最終更新: 2021年4月27日

Unityで作る「シューティングゲーム」マイペースで進んでいますが、ちょっと遅いですか?教室に遊びに来ていただければ、もしくはオンラインで体験授業を受けいて頂ければ、ご自身のペースでご説明させていただきますよ。

前回まででプレイヤーの左右の動きが出来上がりましたね?今回はミサイルを撃つことができるように改造していきます。

では早速作っていきます。


Step:1 マシン先端からミサイルを出す

①今回はいきなりスクリプトファイルを書いていきますよ。作成済みの「PlayerController.cs」を開いて、以下のコードを追記してみましょう。


[SerializeField] GameObject weapon_prefab; //①ミサイル
 
float shot_speed; //②ミサイル速度
 

 
void Start()
 
{
 
shot_speed = 800; //③ミサイルの速度に800を代入
 
}
 
void Update()
 
{
 
if (Input.GetKeyDown(KeyCode.Space)) //④スペースキーが押されたら
 
{
 
GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation); //⑤ミサイルを生成し、変数bullet に代入
 
bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed); //⑥変数bullet に上向きの速度を代入
 
}
 
}


では①から順に解説していきましょう。

[SerializeField] を宣言することでUnity の inspector から値を代入したり、オブジェクトをセットしたりすることができます。Public と同じような扱いですが、プログラミング的には共有できる範囲は必要最低限にする方がいいですよね?Publicよりも限定的な共有となります。

GameObject weapon_prefab; 

ゲームオブジェクト型の weapon_prefab という名前の変数を宣言しました。後でつかいますよ。

float shot_speed;

小数点型の shot_speed という変数を宣言しました。ミサイルの速さになります。

shot_speed = 800;

void start で②で宣言した変数に800という値を代入しています。

ここから void Update 関数に入ります。

if (Input.GetKeyDown(KeyCode.Space))

もしスペースキーが押されたら、そのままですね?

⑤ GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation);

Instantiate()関数は何かを生成するというものですよね?通常引数には1つ、または3つ指定することができます。どちらも1つ目の引数は「なにを」つまり生成するオブジェクト。今回は①で宣言したweapon_prefabつまりミサイルを生成します。

2つ目の引数は、「どこに」ですね?今回はプレイヤーの場所を指定しています。

3つ目の引数は、「向き」です。プレイヤーの向きを指定しました。

そしてこの生成され当たオブジェクトを、あらたに「bullet」という変数に代入しています。これはこの直後、このオブジェクトに速度を与えるからですよ。

bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed);

前回、ミサイルのプレハブに「Rigidbody2D」コンポーネントが追加されていました。GetComponent()関数でこのコンポーネントを呼び出して、そこに AddForce()関数で変数を宣言し初期値800を代入したshot_speed に上向きの力をかけた値を代入して言います。

Unityに戻ってPlayer の inspectorを確認しましょう。

「PlayerContoroller」スクリプトに「Weapon_prefab」という項目が出現していますね?

そこに下の図のようにドラッグ&ドロップ、または右側のボタンを押して「PlayerBulletPrefab」をセットしてください。

この状態で動かしてみましょう。スペースキーを押すと、マシンの中央からミサイルが発射されますよね?

さて、これだけではつまらないので、強化版も作ってみましょう。アイテムを取得したときにミサイルが強化される、なんて動き、よく見かけます。この準備をしておきたいと思います。

前回作成した「TurretLeft」および「TurretRight」からもミサイルが発射される動きを作ります。まずは「PlayerTurret.cs」というスクリプトファイルを作成しましょう。

作成したファイルに以下のコードを入力してください。

PlayerController playercontroller; //⑦PlayerCOntroller を格納する変数
 
[SerializeField] GameObject weapon_prefab; //ミサイル
 
float shot_speed; //ミサイル速度
 

 
private void Start()
 
{
 
shot_speed = 800; //ミサイルの速度
 
playercontroller = GameObject.Find("Player").GetComponent<PlayerController>(); //⑧PlayerControllerの取得
 
}
 

 
void Update()
 
{
 
//⑨Zキーを押したらミサイルが発射される
 
if (Input.GetKeyDown(KeyCode.Z))
 
{
 
GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation);
 
bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed);
 
}
 
if (Input.GetKey(KeyCode.D))
 
{
 
transform.Rotate(new Vector3(0, 0, -playercontroller.turret_rotation_speed)); //⑩右回転
 
}
 
if (Input.GetKey(KeyCode.A))
 
{
 
transform.Rotate(new Vector3(0, 0, playercontroller.turret_rotation_speed)); //⑪左回転
 
}
 
}

では解説していきます。

PlayerController playercontroller;

前回、PlayerControllerに turret_rotation_speed という変数を宣言、初期値を3fにしましたね。これは今回使用する変数で、Turretを回転する速度になります。Turretに直接入れてもいいのですが、Turretが今後も増えるかも、ということでPlayerで管理しています。

⑧playercontroller = GameObject.Find("Player").GetComponent<PlayerController>();

上の⑦で宣言した変数に、PlayerControllerのデータを代入しています。そのためにまず、Find()関数で"Player"を探してきます。探せる範囲はHierarchyにいるオブジェクトだけですよ。さらに上で説明したGetComponent()関数にPlayerControllerを指定して取得したわけです。このやり方、今後も何度も使っていくと思いますので、しっかり理解しておきましょう。

⑨ここは先ほどのプログラムと同じですね?先ほどはスペースキーを押してミサイルを出しましたが、いったん区別するためにZキーを押してミサイルを生成しています。

⑩transform.Rotate(new Vector3(0, 0, -playercontroller.turret_rotation_speed));

Rotate()関数は回転を与える関数です。Unityではオブジェクトを回転させる方法がいくつかあります。またどこかのタイミングでまとめて紹介したいと思います。

今回はZ軸を中心に、PlayerControllerから取得した turret_rotation_speed の速度でマイナス方向、つまり逆時計回りに回転させています。Z軸を中心にってどういうこと?

画面手前から画面に向かってペンを立てたとします。そのペンがZ軸になります。例えばペンにキャラクターを貼り付けていたら、キャラクターが回りますよね?そんなイメージです。

⑪これは⑩の逆ですね?時計回りに回転させます。

これでスクリプトファイルは完成したので、「PlaeyerTurret.cs」を「TurretLeft」および「TurretRight」にアタッチします。

続いて、「TurretLeft」および「TurretRight」の inspector から「Weapon_prefab」にドラッグ&ドロップ、または右側のボタンを押して「PlayerBulletPrefab」をセットしてください。

これでZボタンを押すと、ミサイルが左右から1発ずつ、合計2発発射されるはずです。

さらにAボタン、またはDボタンを押したときに、Turretが回転してミサイルが発射される角度も変わるのを確認してみましょう。

※PlayerBulletPrefab はエラーが出るようです。これは次回修正しますので、そちらでご確認ください。

今回はここまで。ちょっと難しかったかな?次回は隕石や宇宙デブリを出現させてみましょう。

ファイブボックスでは教室での授業の他、全国どこからでもご参加できるオンライン授業も行っています。いずれも体験授業を行っているので、今回の授業にご興味がありましたら、ぜひお問い合わせください。

お問い合わせは こちら から。

体験授業のお申込みは こちら から。

過去の「Unityで作るシューティングゲーム」はこちらから。

Unityで「シューティングゲーム」をつくろう!Vol.01

Unityで「シューティングゲーム」をつくろう!Vol.02

Unityで「シューティングゲーム」をつくろう!Vol.03

    7