UnityでFPSをつくる その10-1 [ シーン遷移 ]

2020年8月15日

今回はシーン遷移を実装していきます。
前回までで、敵の攻撃を受けて死亡状態が完成したので、そこからゲームオーバー画面へシーンを移行します。
以下は完成イメージです。

No.394

まずはProjectウィンドウへ新たにSceneを作成し、「GameOverScene」にリネームしてください。

No.395

GameOverSceneをダブルクリックしてシーンを切り替え、空のオブジェクトを作成して「SceneManager」にリネーム。

No.396

背景を黒にする為、Imageオブジェクトを用意して、「BackGroundBoard」にリネーム。

No.397

幅、高さ、色を以下のように変更してください。

No.398

次に文字を用意します、HierarchyウィンドウからCreate → UI → Text を選択します。

No.399

「GameOver」にリネームし、各項目を以下のように変更してください。

No.400

Add Componentをクリックして UI → Effects → Outline を選択

No.401

Outlineの各項目を以下のように設定します。

No.402

結果、下図のようになりました。

No.403

この位置を基準に、一文字ずつバラしたテキストをスクリプトで操作していきます。
まずは「Ctrl + D」でテキストオブジェクトを8つ複製して、順に1オブジェクト1文字でGameOverを作ります。
複製されたGameOver(1)~(8)を以下のようにリネームして、テキストもそれに合わせてください。

No.404

各文字が全て左端に位置しているので、複製元のGameOverの位置へ重なるよう移動させます。

No.405

そして、1文字おきににプラスY方向とマイナスY方向へ画面外まで移動させます。

No.406

GameOverオブジェクトを削除して、空のゲームオブジェクトを作り、「GameOver」とリネームします。
各文字をGameOverの子オブジェクトにして、スクリプトでまとめて操作します。

No.407

「TitleSceneChange」と名付けてスクリプトを作り、以下のコードを貼り付けてください。

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

    public class TitleSceneChange : MonoBehaviour
    {
        //Textをまとめたオブジェクトを取得
        [SerializeField] GameObject gameOver;

        //Textを配列でまとめて取得
        Transform[] transforms;

        //TextのXY座標取得用
        float x, y;

        //Textの移動速度
        [SerializeField] float moveCharacterSpeed;

        // Start is called before the first frame update
        void Start()
        {
            //親と全ての子オブジェクトのTransformコンポーネントを取得
            transforms = gameOver.GetComponentsInChildren<Transform>();

            StartCoroutine("MoveCharacter");
        }

        // Update is called once per frame
        void Update()
        {

        }

        IEnumerator MoveCharacter()
        {
            for (int i = 1; i < transforms.Length; i++) 
            {
                //現在のX座標を取得
                x = transforms[i].transform.localPosition.x;
            
                //2で割り切れたら
                if (i % 2 == 0)
                {
                    //Y座標が0より小さかったら
                    while (transforms[i].localPosition.y < 0)
                    {
                        //Y座標をプラス
                        y = transforms[i].transform.localPosition.y + moveCharacterSpeed * Time.deltaTime;

                        //Y座標が0より大きくなった場合は0を代入する
                        transforms[i].transform.localPosition = new Vector3(x, Mathf.Min(y, 0f), 0f);

                        yield return null;
                    }
                }
                else 
                {
                    //Y座標が0より大きかったら
                    while (transforms[i].localPosition.y > 0)
                    {
                        //Y座標をマイナス
                        y = transforms[i].transform.localPosition.y - moveCharacterSpeed * Time.deltaTime;

                        //Y座標が0より小さくなった場合は0を代入する
                        transforms[i].transform.localPosition = new Vector3(x, Mathf.Max(y, 0f), 0f);

                        yield return null;
                    }
                }
            }
        }
    }

スクリプトの中身を見ていきます。
8行目は、さきほど各文字をまとめた空のゲームオブジェクトを取得する為のGameObject型変数を宣言しています。

No.408

11行目はTransform型の配列を宣言しています。

No.409

配列を使うと、同じ型の複数データをまとめて扱えるようになります。

No.410

注意点としては、先頭が[0]から始まります。

14行目はテキストの移動を操作する為に各座標用の変数を宣言、17行目は画面中央に向かってテキストを動かす際に速度調整用としての変数を宣言しています。

No.411
No.412

23行目は配列にGameOverオブジェクトの子も含めたTransformを代入しています。
これにより、Hierarchyウィンドウの表示順で添え字(配列に割り振られた番号)が付きました。

No.413

25行目でコルーチンを開始、MainSceneから切り替わった直後に一度だけ実行させたい為、Start関数内に書きます。

No.414

コルーチンの定義は34行目以降に書いています。

No.415

for文を使って配列の長さ分 (配列名.Lengthで配列の長さを取得) の添え字を指定し、値を取得しています。

No.416

配列の奇数番はーY方向、偶数番は+Y方向へ移動させたいので、添え字を2で割った余り(「%」で取得)から判断して処理を分けています。

No.417

目標地点の座標「0」に向けてY座標を変更します。

No.418

transformのpositionは個別に変更できないため、一旦、float型の変数へ値を代入してからVector3型で変更しています。
Mathf.Min値を比較して小さい方を返してくれます、これによりY座標は0より大きくなりません。

56行目からは配列の添え字、奇数番に対して、偶数番の時とは反対に-Y方向へ移動させ、Mathf.Maxを使って大きい方の値を返しています

No.419
No.420

このスクリプトをSceneManagerオブジェクトへアタッチして各項目を以下のように設定します。

No.421

実行すると文字が中央へ交互に移動していることが確認できます。

No.422

これで、Scene内で実行される処理の実装が完了しました。

長くなってきましたので、続きは次回にしたいと思います。おつかれさまでした!

FPS

Posted by kenji