今回はUnityの公式サイトに掲載されているチュートリアルの2Dシューティングに挑戦。自機の移動と弾の発射処理までのステップを行いました。チュートリアルを進めながら変更した箇所などをピックアップしています。
Unityの公式サイトに掲載されている 2Dシューティング は初級チュートリアルとして12のステップで構成されています。
公式サイトの このチュートリアルを始める前に – Unity にチュートリアルで使用するプロジェクトファイルのダウンロードリンクが掲載されているのでダウンロードします。
ZIP形式で圧縮されたファイル 2d-shooting-game.zip を解凍し、Unityを起動してプロジェクトを開きます。
Unity 2018.2.8 でプロジェクトを開くと プロジェクトがセーブされたバージョン(Unity 5.5.0 )と異なってますよ。続けますか?とダイアログが表示されるのでそのまま[Continue]ボタンをクリック。
しばらくファイルの読み込みを待つと無事にプロジェクトが開きました。
このチュートリアルを始める前に – Unity のページを参考にエディタのレイアウトや[Game]ビューのサイズ調整を行いました。
まずは完成見本の Demo シーンを開いてプレイ。弾が自動連射なので操作は機体の移動だけなので簡単かと思いきや、敵の数と弾幕が襲ってくるとあっという間にゲームオーバーになってしまいました。
チュートリアルページ:スプライトとスプライトアニメーションの作成
このステップの手順は次の通りです。
チュートリアルの手順に従い、スプライトを作成できました。
チュートリアルでは、スプライトを[Scene]ビューにドラッグした際、自動的にAnimation Clip ファイルが作成されるように書かれていましたが、実際にやってみると Animation Clip ファイルの保存ダイアログが表示されたので、ファイル名 Normal と入力して保存しました。
このステップで3つのプレハブができました。
チュートリアルページ:プレイヤーの移動
このステップの手順は次の通りです。
チュートリアルに掲載されているスクリプトでは Update 処理で Rigidbody2D コンポーネントを取得(参照)していますが、ちょっと改造して Start 処理に移動しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
// Rigidbody2D コンポーネントを格納する変数
private Rigidbody2D rb;
// 自機の移動速度を格納する変数(初期値 5)
public float speed = 5;
// ゲームのスタート時の処理
void Start()
{
// Rigidbody2D コンポーネントを取得して変数 rb に格納
rb = GetComponent();
}
// ゲーム実行中の繰り返し処理
void Update()
{
// 右・左のデジタル入力値を x に渡す
float x = Input.GetAxisRaw("Horizontal");
// 上・下のデジタル入力値 y に渡す
float y = Input.GetAxisRaw("Vertical");
// 移動する向きを求める
// x と y の入力値を正規化して direction に渡す
Vector2 direction = new Vector2(x, y).normalized;
// 移動する向きとスピードを代入する
// Rigidbody2D コンポーネントの velocity に方向と移動速度を掛けた値を渡す
rb.velocity = direction * speed;
}
}
ここまでのステップで自機がキーボードで動かせるようになりました。
チュートリアルページ:プレイヤーから弾を撃つ
このステップの手順は次の通りです。
今回のステップで 自機の発射する弾のプレハブが作成されました。
チュートリアルに掲載されているスクリプトでは Start 処理を直接コルーチンにしていましたが、ちょっと改造して コルーチンを分離して Shot 処理を作成して Start で呼び出す形にしました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
// Rigidbody2D コンポーネントを格納する変数
private Rigidbody2D rb;
// 自機の移動速度を格納する変数(初期値 5)
public float speed = 5;
// PlayerBullet プレハブ
public GameObject bullet;
// ゲームのスタート時の処理
void Start()
{
// Rigidbody2D コンポーネントを取得して変数 rb に格納
rb = GetComponent<Rigidbody2D>();
// 弾の発射処理(コルーチン Shot )を実行
StartCoroutine("Shot");
}
// ゲーム実行中の繰り返し処理
void Update()
{
// 右・左のデジタル入力値を x に渡す
float x = Input.GetAxisRaw("Horizontal");
// 上・下のデジタル入力値 y に渡す
float y = Input.GetAxisRaw("Vertical");
// 移動する向きを求める
// x と y の入力値を正規化して direction に渡す
Vector2 direction = new Vector2(x, y).normalized;
// 移動する向きとスピードを代入する
// Rigidbody2D コンポーネントの velocity に方向と移動速度を掛けた値を渡す
rb.velocity = direction * speed;
}
// 弾の発射処理(コルーチン)
IEnumerator Shot()
{
while (true)
{
// 弾をプレイヤーと同じ位置/角度で作成
Instantiate(bullet, transform.position, transform.rotation);
// 0.05秒待つ
yield return new WaitForSeconds(0.05f);
}
}
}
ここまでの内容を動作確認用にWebGLでビルドしてみました。ゲーム画面の縦横比はチュートリアルでは4:3ですがWebページ埋め込み用に16:9に変更しました。
ここまでのチュートリアルでは発射した弾の削除処理がないので、発射1秒後に削除する処理を追加してあります。
画像クリックで再生(ファイルサイズ:約4MB)
View Comments
弾の複製までは良いのですが、弾を複製した後弾が進んでくれません。どうすればよいでしょうか?
質問ありがとうございます。
こちらの記事は公式チュートリアルを参照しながら一部の手順だけを紹介しているので、弾が進む処理は掲載していませんでした。ゴメンナサイ!
参照元のチュートリアルについては Unity の公式学習サイトがリニューアルされ、確認できない状態でした。
ほぼ同じ内容のチュートリアル動画を「Unityゲームスタジオ スタジオしまづ」さんが公開されていますのでぜひご覧ください。
YouTube 動画:縦型2Dシューティングゲームの作り方 #1【Unity2D縦シュー】
再生リスト:Unityゲームスタジオ スタジオしまづ 2D縦シューティング