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

2021年7月19日

これまでに学習したポストプロセスの演出を、メインシーンにも加えてみましょう。
まずは、HierarchyウィンドウからDirectional Lightを選択、「Directional Light (Wall)」にリネーム。InspectorウィンドウからTransformコンポーネントをResetして、

No.618

値を以下のようにします。

No.619

同様にLightコンポーネントをResetして、各項目を以下のようにします。

No.620

このLightを、四方の壁と床に配置していきます。
HierarchyウィンドウからDirectional Light (Wall)を、Ctrl + Dで3つ複製します。

No.621

Directional Light (Wall) (1)~(3)のTransformコンポーネントの値を以下のようにします。

No.622
No.623
No.624

後々編集しやすいように、HierarchyウィンドウでDirectional Light (Wall)を他のDirectional Lightの近くに配置しておきます。

No.625

次に、以前と同様、Main Cameraへポストプロセスの設定をし、Post-process VolumeコンポーネントからBloomのIntensityを「25」に設定します。

No.626

GroundオブジェクトのMaterialで、AlbedoのColor値を以下のようにします。

No.627

Tillingの値は以下のように変更しましょう。

No.627_2

ライトに照らされたオブジェクトとUIに、滲みの表現が加わりました。

No.628

HPゲージが少し見えづらいので、位置と高さと色を変えていきます。
「Remaining_HP_2~5」のPos Xを、左隣から「25」ずつ離れるようにしましょう。

No.629
No.630

ImageのColorを全て、以下の値に変えましょう。

No.631

高さを全て「80」にします。
まとめて数値を変える場合は、Hierarchyウィンドウから「Shift」キーを押してオブジェクトをグループ選択し、Inspectorウィンドウで値を入力します。

No.632

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

No.633

現状では、GameClearやGameOverにシーン遷移した後、それ以上の動きがありません。
これでは一度ゲームをプレイし終えたら、再プレイの度にゲームを起動し直す必要が生じる為、とても不便ですね。
その為、一定時間経過後はTitleシーンに遷移して、再びゲームをプレイできるようにしていきます。

No.634

まずは、GameClearシーンへ切り替え、空のゲームオブジェクトを作って「SceneManager」にリネームします。

No.635

スクリプトを「ToTitleSceneFromGameClear」の名前で新規作成します。

No.636

そこへ、以下のコードを貼り付けてください。

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

public class ToTitleSceneFromGameClear : MonoBehaviour
{
    [SerializeField] Image switchingEffect;

    float elapsedTime;

    float heightNum;

    const int maxWidth = 1920, maxHeight = 1080;

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

    // Update is called once per frame
    void Update()
    {
        elapsedTime += Time.deltaTime;

        if (elapsedTime > 5.0f) 
        {
            if (switchingEffect.rectTransform.sizeDelta.y < maxHeight) 
            {
                heightNum = Mathf.Pow(heightNum + 1.1f, 1.1f);

                switchingEffect.rectTransform.sizeDelta = new Vector2(maxWidth, heightNum);
            }
            else
            {
                switchingEffect.rectTransform.sizeDelta = new Vector2(maxWidth, maxHeight);

                Invoke("ToTitleScene", 1f);
            }
        }
    }

    void ToTitleScene() 
    {
        SceneManager.LoadScene("TitleScene");
    }
}

スクリプトの内容を見ていきます。
今回、シーン切り替えと暗幕用としてUIを使うので、その機能が含まれた名前空間を4~5行目に宣言しています。

No.637

9~15行目で、Imageオブジェクト、経過時間、幅の値、幅・高さの最大値を扱う為の変数や定数を宣言しています。

No.638

Updateメソッド内の26行目で経過時間を計測し、5秒を超えた時点でImageオブジェクトの高さを1.1ずつプラスして、さらに1.1ずつ掛け合わせます。
RectTransformの幅や高さはVector2型の値で代入する必要がある為、変える必要のない幅の値には定数を使っています。

No.639

最初は高さ「0」の状態で見えなくしておいて、均一ではなく時間経過とともに急速に展開させる為、1.1ずつプラスした値に1.1ずつ掛け合わせて、画面いっぱいに広げています。

No.640

36行目以降で、画面外まで広がった暗幕を画面サイズに合わせ、1秒後にTitleSceneへと切り替えています。

No.641

今回は指定時間後に処理を行う為に、以前に使用したコルーチンではなく「Invoke」というものを使っています。
単に指定時間後に関数を呼び出す場合は、コルーチンよりもシンプルに記述できます。

No.642
次に、HierarchyウィンドウへImageオブジェクトを作り、「SwitchingEffect」にリネームしてください。
No.643

TransformとColorの値を以下のように変更します。

No.644

さきほど作成した「ToTitleSceneFromGameClear」スクリプトを「SceneManager」オブジェクトにアタッチし、Image型変数の欄に「SwitchingEffect」を指定します。

No.645

ゲームを実行してみましょう。

No.646

ClearSceneからTitleSceneへの遷移が確認できました。
長くなってきたので続きは次回にしたいと思います、おつかれさまでした!

FPS

Posted by kenji