【unity】3D脱出ゲーム作成_その16

3D脱出ゲーム

シーン遷移

新たにゲーム躯体を起動させたので次はゲームの中でゲームをプレイしたいと思います。気分を変えて2Dゲームにしたいのですが、現在のシーンは3D構成なので(できなくもないのですが)2D用の新たなシーンに遷移して操作していきたいと思います。2D用シーンの名前はroom2としてシーン作成保存→File>BuildSettingsの上段にroom1_room2の順序で配置します。ゲーム躯体に以下新たなスクリプトをアタッチしましょう。

フライングですが後々作るstartとgoalシーンも追加してます。順序は上から0_1_2_3
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//シーン遷移のための名前空間
public class ArcadeGame : MonoBehaviour
{
  public void ArcadeGameClick()
  {
      SceneManager.LoadScene("room2");   
  }
}

名前空間を追加してLoadSceneでroom2を指定するだけの簡単な処理です。現在room2にはオブジェクトは何もないですが、room2のオブジェクトに同じようにスクリプトをアタッチしてLoadScene指定をroom1に変えれば戻ってこれます。

staticによる保持

ここにきて基本的な事になるのですが、シーンを開始した時オブジェクトは初期位置。値やフラグも同様です。つまりシーンを移動して戻った時せっかく手に入れた鍵やナイフがなくなってたり、箱やブレーカーも元通りの振り出し状態になります。これではゲームとして成立しませんね。シーンを移動しても保持させるにはstaticを用いるのが一般的で、int・float・flag 型などに適用できます。その15でPowerBoxにつけたflagがまさにそれです。以下メソッドをArcadeGameクラスに追加して活用します。

public GameObject agc;//ゲーム躯体入のディスプレイ   
    void Start()
    {
        if (PowerBox.flag)
        {
            agc.SetActive(true);
        }
    }

シーンを移動して戻った時本来ならゲーム躯体切の状態ですが、PowerBox.flagの状態はシーンを跨いでも保持されるので、フラグをチェック→true→ゲーム躯体入としてシーン移動前の状態に戻せます。

Singletonで保持

シーン遷移ではオブジェクトの状態も振り出しに戻りますが、これにはstaticが適用されないのでSingleton化という手法で保持されるオブジェクトにする必要があります。空オブジェクトを作り以下新たなスクリプトをアタッチしましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton : MonoBehaviour
{
    static bool existsInstance = false;
    void Awake()
    {
        if (existsInstance)
        {
            Destroy(gameObject);
            return;
        }
        existsInstance = true;
        DontDestroyOnLoad(gameObject);
    }

このコードでシーンを移動しても破棄されないオブジェクトにすることができます。破棄されないという事はシーンに戻ってくる度に同じオブジェクトが一つづつ増えてゆくのですが、対策として古いSingletonがある場合新しいSingletonを削除する処理を加えてます。この空オブジェクトの子にしたオブジェクトは同じくSingleton化します。以下オブジェクトを子オブジェクトにしましょう。

・箱(アイテム含む)・机・ブレーカーボックス・天井の照明・電車

Singleton化したオブジェクトを他のオブジェクトにアタッチ(public GameObjectで割り当て)した場合、シーン移動で外れてしまうので注意しましょう。理由としては新しいSingletonが削除される為です。当然逆(Singleton化したオブジェクトにアタッチ)の場合もシーンを跨ぐと存在しなくなるので外れてしまいます。

その他

箱オブジェクトをSingleton化しましたが、箱の蓋が外れた状態が保持されるのでroom2にColider付きの床を配置しましょう。これで蓋が落下し続ける事を避けられます。

この床はroom2に配置したものでSingleton化はしてません。

コメント

タイトルとURLをコピーしました