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

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

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

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

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

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

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

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

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

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

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

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

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

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

「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型変数を宣言しています。

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

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

注意点としては、先頭が[0]から始まります。
14行目はテキストの移動を操作する為に各座標用の変数を宣言、17行目は画面中央に向かってテキストを動かす際に速度調整用としての変数を宣言しています。


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

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

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

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

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

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

transformのpositionは個別に変更できないため、一旦、float型の変数へ値を代入してからVector3型で変更しています。
Mathf.Minは値を比較して小さい方を返してくれます、これによりY座標は0より大きくなりません。
56行目からは配列の添え字、奇数番に対して、偶数番の時とは反対に-Y方向へ移動させ、Mathf.Maxを使って大きい方の値を返しています。


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

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

これで、Scene内で実行される処理の実装が完了しました。
長くなってきましたので、続きは次回にしたいと思います。おつかれさまでした!