マスターUI

ゲームのシーン(ステージ)が切り替わっても常に表示され続けるUIを用意する。
全てのシーンに同じUIをGameObjectとして設置せずに済むようにする。

方法1 マスタUIのシーンにゲームステージのシーンを読み込んで入れ替える

プロジェクト MasterUI.zip をレポートフォルダに置いておいた。

参照:

シーンのロード/アンロード
Unityでの複数シーンを使ったゲームの実装方法とメモリリークについて

シーン MasterUI にスコア表示のText UI とシーン切り替え用ボタン Prev と Next を配置する。

メインカメラと照明は読み込むシーン側に用意するのでMasterUIの方は無効にしておく。

切替用のシーン Stage1 ~ Stage3を用意する。

Build Settings にシーンを追加しておく。MasterUIはシーン番号 0 の先頭に置く。

MasterUIをGameビューで表示した様子。シーンを再生しないとこの様になる。

シーンを再生するとシーン番号 1 が読み込まれる。

HierarchyにもStage1が追加して読み込まれている。

Nextボタンを押すと、Stage1が消去されてStage2が読み込まれる。

スクリプト FoldScore.cs

シーン MasterUI のTopPanelの子供の Score GameObjectにアタッチしてある。

概要

・最初のシーンの読み込みをAwakeメソッドで実行する。AdditiveモードでMasterUIシーンに追加する。

・PrevボタンとNextボタンのメソッドを定義している。シーンの消去と読み込み。

・Startメソッドでスコアを表示する。FoldScoreClassのhi_scoreから値を読み取っている。

スクリプト FoldScoreClass.cs

このクラスはMonoBehaviourを継承していないのでUnityのGameObjectにアタッチできない。

このクラスのフィールド hi_scoreは staticフィールドなので、他のクラスから FoldScoreClass.hi_score でアクセスして値の読み書きが可能。

{get;  set; } の部分はC#のプロパティ機能に関する記述。

方法2 シーン遷移に影響されないGameObjectやClassでマスターUIを作成

要素技術:

・シーンが遷移しても消えずに常駐するGameObject
LoadSceneで別のシーンを読み込む際にDestoryされないようにスクリプトでマークする

・GameObjectにアタッチせずにデータを保持するオブジェクト
Monobehaviourを継承しないC#のClassで staticなフィールドを持つClassはシーンとは独立してデータを保持できる。

・Unityエディタで途中のシーンを再生してもUIセットアップ用のシーンを読み込む処理
マスターUIに追加して読み込むシーンは、マスターUIを読み込んでから追加する必要がある。
この手間を省くために追加読み込み用のシーンを読み込んだ際にマスターUIがセットアップされていなかったら読み込むようなスクリプトを用意する

・各ゲームステージのシーンが読み込まれる前に開始するスクリプト
マスターUIをセットアップする。
UIを多重生成しないようにSingletonパターンを使う。

参照:

unity どのシーンでも共通でサブシーンを常駐させる


Unityでシーンを移動した時のデータやゲームオブジェクトの引き継ぎ
UnityのScriptableObjectを使う
UnityのScriptableObjectを使ったシーン間のデータ共有

シーンの読込とシーン中のスクリプトの起動より前に起動するスクリプトのmainメソッド。

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]

 static void main()


シーンが遷移してもObjectが消えないようにするコード。

UnityEngine.Object.DontDestroyOnLoad(this.gameObject);


データ管理用クラスを用意する。

staticフィールド

にデータを保持させる。

UnityのScriptableObjectを使うほうがUnityに適している。