Unity:自機の移動と弾の発射~公式チュートリアル 2Dシューティングに挑戦

今回はUnityの公式サイトに掲載されているチュートリアルの2Dシューティングに挑戦。自機の移動と弾の発射処理までのステップを行いました。チュートリアルを進めながら変更した箇所などをピックアップしています。

Unity公式チュートリアル2Dシューティングについて

Unityの公式サイトに掲載されている 2Dシューティング は初級チュートリアルとして12のステップで構成されています。

  1. スプライトとスプライトアニメーションの作成
  2. プレイヤーの移動
  3. プレイヤーから弾を撃つ
  4. 敵を作成しよう
  5. 当たり判定とアニメーションイベントとレイヤー
  6. 背景を作る
  7. Wave型の仕組み作り
  8. 音をつける
  9. プレイヤーの移動制限と様々な修正
  10. タイトルを付ける
  11. エネミーのHP、弾の攻撃力、アニメーションの追加
  12. Waveを5個にする、スコアの実装

イントロダクション:チュートリアルのプロジェクトファイルをUnityで開く

公式サイトの このチュートリアルを始める前に – Unity にチュートリアルで使用するプロジェクトファイルのダウンロードリンクが掲載されているのでダウンロードします。

ZIP形式で圧縮されたファイル 2d-shooting-game.zip を解凍し、Unityを起動してプロジェクトを開きます。
Unity 2018.2.8 でプロジェクトを開くと プロジェクトがセーブされたバージョン(Unity 5.5.0 )と異なってますよ。続けますか?とダイアログが表示されるのでそのまま[Continue]ボタンをクリック。

しばらくファイルの読み込みを待つと無事にプロジェクトが開きました。
このチュートリアルを始める前に – Unity のページを参考にエディタのレイアウトや[Game]ビューのサイズ調整を行いました。

プロジェクトフォルダの内容

[Project]ウィンドウ > Assets を確認しましょう。

右端にある シーンファイル Demo はチュートリアルの完成見本になっています。左端にある _Completed-Assets フォルダには Demo シーンで使用されているアセットが入っています。それ以外の Fonts、Sounds、Sprites、Textires フォルダはチュートリアルで使用する素材ファイルが入っています。

まずは完成見本の Demo シーンを開いてプレイ。弾が自動連射なので操作は機体の移動だけなので簡単かと思いきや、敵の数と弾幕が襲ってくるとあっという間にゲームオーバーになってしまいました。

スプライトとスプライトアニメーションの作成

チュートリアルページ:スプライトとスプライトアニメーションの作成

このステップの手順は次の通りです。

  1. Sprite Editor(スプライトエディター)で1枚のテクスチャから複数のスプライトを作成する
  2. 自機(Player)のスプライトとアニメーション
  3. 敵(Enemy)のスプライトとアニメーション
  4. 弾の作成
  5. 爆発のアニメーション

チュートリアルの手順に従い、スプライトを作成できました。

チュートリアルでは、スプライトを[Scene]ビューにドラッグした際、自動的にAnimation Clip ファイルが作成されるように書かれていましたが、実際にやってみると Animation Clip ファイルの保存ダイアログが表示されたので、ファイル名 Normal と入力して保存しました。

このステップで3つのプレハブができました。

プレイヤーの移動

チュートリアルページ:プレイヤーの移動
このステップの手順は次の通りです。

  1. 読む前におさえておこう
  2. Prefabからゲームオブジェクトを作成
  3. プレイヤーを動かす準備
  4. プレイヤーにスクリプトをアタッチ

チュートリアルに掲載されているスクリプトでは 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;
    }
}

ここまでのステップで自機がキーボードで動かせるようになりました。

プレイヤーから弾を撃つ

チュートリアルページ:プレイヤーから弾を撃つ
このステップの手順は次の通りです。

  1. プレイヤーの弾を作成する
  2. プレイヤーの弾を動かす
  3. プレイヤーから弾を発射する
  4. スプライトの描画順

今回のステップで 自機の発射する弾のプレハブが作成されました。

チュートリアルに掲載されているスクリプトでは 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

ここまでの内容を動作確認用にWebGLでビルドしてみました。ゲーム画面の縦横比はチュートリアルでは4:3ですがWebページ埋め込み用に16:9に変更しました。
ここまでのチュートリアルでは発射した弾の削除処理がないので、発射1秒後に削除する処理を追加してあります。
画像クリックで再生(ファイルサイズ:約4MB)

スポンサーリンク
スポンサーリンク

スポンサーリンク

フォローする

コメント

  1. 初心者 より:

    弾の複製までは良いのですが、弾を複製した後弾が進んでくれません。どうすればよいでしょうか?