ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity学習#29 戦闘シーン、マネージャーシーンの追加 (Unity 2019.4.4f1)

今回は、戦闘の実装に先立って、これまで作ってきたフィールドとは別に、戦闘シーンを作成して、フィールドと戦闘を切り替える管理シーン(マネージャーシーン)を準備します。

方針

シーンの加算ロードを利用して、起動時にフィールドと戦闘の両方をロードします。可視性はカメラで切り替えます。

加算シーンに関わるインターフェースは以下にまとめました。
tomo-mana.hatenablog.com

シーンの構成

フィールドと戦闘でシーンを分け、両方を切り替えるマネージャーシーンを用意します。

f:id:tomo_mana:20210224223527p:plain
Manager から Field、Battle を加算ロード

シーン(.Unityファイル)の作成

マネージャーシーンの作成

Projectウィンドウから、空のシーンを作成します。
(1) Projectウィンドウ:シーンが置かれたフォルダ上で右クリック > create > scene
(2) 作成した Sceneファイル 上でクリック > rename
"ManagerScene" に変更

戦闘シーンの作成

Projectウィンドウから、空の戦闘シーンも作成しておきます。
(作業はマネージャーシーン作成時と同じ。"BattleScene"に変更)

フィールドシーンの名称変更

これまで作ってきたシーンも、"FieldScene"に名前を変えます。

f:id:tomo_mana:20210224223922p:plain
Projectウィンドウ - Scene

BuildSettingsに登録

作成したシーンを読み出せるようにするには、BuildSettingsに登録が必要です。
(1) Unity画面のメニュー: File > BuildSettings
(2) Build Settings ウィンドウ: Scenes In Build 欄に、ManagerScene、FieldScene、BattleScene の3つを追加(Projectウィンドウからドラッグ&ドロップ)

f:id:tomo_mana:20210223220134p:plain
BuildSettings

(3) 画面右上の×ボタンで画面を閉じます。(ドラッグ&ドロップした時点で登録されるようです)

各シーンの設計

戦闘シーン

戦闘シーンは、今の時点ではカメラだけOFFにしておきます。(フィールドのカメラを使用するため)

(1) Projectウィンドウ:BattleSceneを選択
(2) Inspectorウィンドウopen ボタンを押してBattleSceneの編集画面にします。

f:id:tomo_mana:20210224224333p:plain
Inspector - Scene選択時

(3) Hierarchyウィンドウ: Main Cameraを選択
(4) Inspectorウィンドウ: Main Camera の横にあるチェックを外し、Main Cameraゲームオブジェクト全体を非表示にします。

f:id:tomo_mana:20210224224544p:plain
Inspector - MainCameraゲームオブジェクト

マネージャーシーン

マネージャーシーンから起動する時に、フィールドと戦闘の両方をロードする処理を追加します。フィールドのメインカメラをONにする処理も追加します。
(1) Hierarchyウィンドウ: [▼+] > Create Empty
 初回の動作だけさせるつもりなので、名前を Initializer にしました。
(2) Projectウィンドウ上で、C#スクリプトを作成
 Start() で フィールドと戦闘シーンの両方を非同期に読み込む処理と、読み込みが完了したらフィールドカメラをONにする処理とを追加します。
(3) (1)で作成したゲームオブジェクト (Initializer) に追加します。

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

public class ManagerSceneManager : MonoBehaviour
{
    bool initialized = false;
    
    void Start()
    {
        // シーン起動
        SceneManager.LoadSceneAsync("FieldScene", LoadSceneMode.Additive);
        SceneManager.LoadSceneAsync("BattleScene", LoadSceneMode.Additive);
    }
    
    void Update()
    {
        if( !initialized ){
            if( SceneManager.GetSceneByName("FieldScene").isLoaded ){
                
                Scene scene = SceneManager.GetSceneByName("FieldScene");
                
                // フィールドシーンをアクティベート
                SceneManager.SetActiveScene(scene);
                
                // カメラON
                GameObject[] gameObjects = scene.GetRootGameObjects();
                foreach( GameObject g in gameObjects ){
                    if( g.GetComponent<Camera>() != null ){
                        g.SetActive(true);
                        break;
                    }
                }
                initialized = true;
            }
        }
    }
}

動作テスト

マネージャーシーンに切り替えて動作を確認します。
(1) Projectウィンドウ:ManagerSceneを選択
(2) Inspectorウィンドウ: open を押してManagerSceneの編集画面にする
(3) 再生する

ManagerSceneから2つのシーンがロードされて、FieldSceneがアクティブになり、これまで通りキャラクターも動かせることを確認できました。

f:id:tomo_mana:20210224225557p:plain
加算ロードのテスト

次回

戦闘画面の設計