スマゲ

スマートなゲームづくりを目指して日々精進

UnityでSceneManagerを使う(応用編)

Unity5.3から実装されたSceneManagerでソーシャルゲームによくあるUIを実装していきます

基本編はこちら
UnityでSceneManagerを使う(基本編その1) - スマゲ
UnityでSceneManagerを使う(基本編その2) - スマゲ

■完成イメージ
f:id:sanukin39:20160303202938g:plain

~ 実装 ~
■基本シーン作成
Unityで新規プロジェクトを作成後新しいシーンを作成します。名前は適当にBaseにしました
UnityのuGUIでボタンを5個作成し、いい感じにしますf:id:sanukin39:20160303204257p:plain

■メインシーンを定義する
Enumを利用してメインとなるシーンを定義します

public enum MainScene{
    Friend,
    Gacha,
    Monster,
    Quest,
    Shop
}

■メインシーンを作成する
定義したシーン名と同じ名前でシーンを作成します。これらのシーンは基本シーンに追加される形でロードされるのでEventSystem, Cameraは削除しておきます
f:id:sanukin39:20160303211102p:plain


■メインシーンを管理するクラスを作る

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

public class SceneHolder : MonoBehaviour {
    
    // ロードされているシーンを保持する
    Scene LoadedScene;
    
    // 最初のシーンをロードする
    void Start(){
        LoadMainScene(MainScene.Quest);
    }
	
    // メインのシーンをロードする
    public void LoadMainScene(MainScene scene){
        SceneManager.UnloadScene(LoadedScene.name);
        SceneManager.LoadScene(scene.ToString(), LoadSceneMode.Additive);
        LoadedScene = SceneManager.GetSceneByName(scene.ToString());
    }
}

■フッターのボタン用スクリプトを作成する

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class FooterButton : MonoBehaviour {
    
    // ロードしたいシーンを設定する
    public MainScene scene;
    
    // ボタンを押下した時の処理を設定する
    void Start(){
        GetComponent<Button>().onClick.AddListener(LoadScene);
    }    
    
    // メインのシーンをロードする
    public void LoadScene(){
        FindObjectOfType<SceneHolder>().LoadMainScene(scene);
    }
}

■基本シーンに各スクリプトを設定する
基本シーンに空のゲームオブジェクトを作成、作成したSceneHolderをAddComponentします
f:id:sanukin39:20160303212648p:plain
基本シーンに作成したボタンそれぞれにFooterButtonをAddComponentして遷移したいシーンをFooterButtonのプルダウンから設定します
f:id:sanukin39:20160303212652p:plain

■この実装方法のメリット
・必要なシーン部分のみロード、アンロードするので遷移が早い
・メインシーン毎にシーンファイルを分けるので多人数開発はし易い
・基本シーンに全部詰め込む設計にならないので、依存性が低く、保守が容易

■Github
github.com

■まとめ
いまは基本シーンのみの遷移なので今後は重複可能のシーン(メニュー画面、ポップアップなど)を上手く組み合わせる方法を考えていきたいと思います