君がゲームを作る!Unityゲーム開発入門
第36回 ステージから落ちたらスタート時点に戻る

落ちたらふりだしに戻るパターンだよ

みなさん、こんにちは!

Yahoo!ショッピングで付与された期間限定ポイント。

何に使おう何に使おうとワクワクしながら迷ってるうちに期限が来てしまい、 結局いつもカップ焼きそばを大量購入しているあらたまです。

さて今日は「君がゲームを作る!Unityゲーム開発入門」の第36回目です。

おさらい

前回 はプレーヤーの操作に合わせて、画面が横スクロールするようにプログラミングしましたね。

今日は忍者がステージから落ちてしまったときのプログラミングです!

ステージから落ちたとき

いまは操作していてステージから忍者が落ちてしまっても、そのままゲームが続行されていますね。

これをステージから落ちたらスタート時点に戻すように作っていきましょう

プログラミングする

それでは、早速プログラミングしていきます。

プロジェクトウィンドウで「Scripts」フォルダを選択し、 「CharaControl」ファイルを選択後インスペクターウィンドウで「Open」をクリックします。

下記のように太字の部分を追加してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class CharaControl : MonoBehaviour
{
    // ... 省略 ...

    // Start is called before the first frame update
    void Start()
    {
        // ... 省略 ...
    }

    // 1フレーム毎に呼び出される
    private void Update()
    {
        // このY座標(bottomY)より下へ落ちたらスタートへ戻す
        float bottomY = Camera.main.transform.position.y
                         - Camera.main.orthographicSize * 2;

        // 忍者のY座標がbottomYより低い
        if (gameObject.transform.position.y < bottomY)
        {
            // 現在のシーンを再読み込み
            int sceneIndex = SceneManager.GetActiveScene().buildIndex;
            SceneManager.LoadScene(sceneIndex);
        }

        // そのフレームでスペースキーが押されたか
        if (Input.GetKeyDown("space"))
        {
            // ... 省略 ...
        }
    }

    // 画面表示更新処理
    void FixedUpdate()
    {
        // ... 省略 ...
    }
}
    

追加した内容

追加した部分には大きくわけて3つの処理があります。

  • (忍者が落ちたと判定する)高さの基準位置を決める
  • 忍者の位置と、基準位置を比較する
  • 忍者の位置の方が低い場合、スタート時点に戻す

です。
これらをご説明する前に、Unityにおけるx座標とy座標について確認しておきましょう。

Unityでの座標

Unityの座標は下の画像のようになっています。 横の位置を表すのがx座標、縦の位置を表すのがy座標です。 これって算数でグラフを書くときとかも一緒ですよね。

今回は忍者が落ちたかどうかを調べたいので、「忍者のY座標」が 「ある数値」より小さくなったら、「落ちた」と判定するようにします。

「落ちた」の基準位置を決める

まずは判定基準となる「ある数値」を計算して決めます。プログラムでは

// このY座標(bottomY)より下へ落ちたらスタートへ戻す
float bottomY = Camera.main.transform.position.y - Camera.main.orthographicSize * 2;
の部分がこの処理にあたります。処理を見てみると

「Camera.main.transform.position」のY座標から「Camera.main.orthographicSize」の2倍の値を引いていますね。

Camera.main.transform.position

これは下の画像のような位置を表します。 メインカメラの中心点ですね。

Camera.main.orthographicSize

一方のこちらは、下の画像のような高さ(長さ)を表します。

カメラのY座標の長さの半分ですね。

ここでもう一度プログラムを見てみましょう。

// このY座標(bottomY)より下へ落ちたらスタートへ戻す
float bottomY = Camera.main.transform.position.y - Camera.main.orthographicSize * 2;

カメラの中心点のY座標から、カメラ領域の高さ(高さの半分の2倍)を引いていることがわかりますね。その結果を変数bottomYに入れています。

bottomYの位置

変数bottomYの座標を表すとこの辺りです。

この「bottomY」の位置より忍者が下に行ったら、ゲームのスタート時点に戻すことにします。

カメラの領域の下端ではなく、あえてだいぶ下を基準点にしている理由は、 忍者が落ちてから画面が切り替わるまでの時間が早すぎると、少し違和感が動きになるためです。

忍者の位置と、基準位置を比較する

基準位置が決まりましたので、これと忍者の位置を比較してステージから落ちたことの検出をします。プログラムでは

// 忍者のY座標がbottomYより低い
if (gameObject.transform.position.y < bottomY)
{
    ...
}
の部分がこの処理にあたります。

「gameObject.transform.position.y」が忍者のY座標です。

忍者のY座標が「bottomY」より小さい場合(低い場合)、{}の間の処理を実行します。

スタート時点に戻す

ステージから落ちた時の検出はできましたので、あとはスタート時点に戻すだけですね。プログラムでは

using UnityEngine.SceneManagement;

・・・

// 現在のシーンを再読み込み
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(sceneIndex);
の部分がこの処理にあたります。

「SceneManager.GetActiveScene().buildIndex」は現在実行中のシーン(ステージ)番号を取得しています。 そして取得したシーン(ステージ)番号をSceneManager.LoadSceneメソッドにそれを渡していますね。

この手順を踏むことで、シーン(ステージ)のスタート時点にプレーヤーを戻すことができます。

今回はシーン(ステージ)がひとつだけですので、ゲームのスタート時点に戻る、ということですね。

テストプレイで動作確認をする

それでは、テストプレイをして変化を確認してみましょう!

▶ボタンを押して、プレイモードに入ります。

キーボードで忍者を操作をします。

忍者がステージから落っこちると、、

ゲームのスタート時点に戻されました!

今回はここまでです。

次回は、ステージのゴール地点を作っていきたいと思います。

次回へ続く。

>> 続きの記事
【君がゲームを作る!Unityゲーム開発入門】第37回 ステージのゴールを作る(ゴールアイテム編)