会話シーンとして宴を使う


宴はビジュアルノベルだけではなく、ゲームの会話シーンやチュートリアルとして使うこともできます。
その方法をまとめました。


既存のシーンに、シナリオ再生エンジンを追加

「Tools > Utage > New Project」から新規プロジェクトを作成します。


プロジェクト名を入力し、「Type」を「Add To Current Scene」に設定します。

LayerSettingで、既存シーンのレイヤーとは独立して宴用のレイヤーを設定する必要があります。デフォルトのUtage、UtageUIのままでも基本的には問題ありませんが、好きなレイヤー名を設定することも可能です。
GameScreenSizeで、作成するゲームが想定する画面サイズを設定します。スマートフォンなどでは、実際の機体の解像度はバラバラなのでこのサイズを基準に拡大縮小して表示します。

Createボタンを押して、既存のシーンにシナリオ再生に必要なGameObjectと、シナリオ用のエクセルやAssetが追加します。
また、宴2.4.0以前は、作成したのちにカメラとレイヤーの設定を手動で行うをする必要があります。

ここまでで、準備は終わりです。

ゲーム側から宴を呼び出す

それぞれのゲームに合わせて任意のタイミングでシナリオを呼び出してください。

サンプルコード


using UnityEngine;
using System.Collections;
using Utage;
public class TalkArea : MonoBehaviour {

    public AdvEngine engine;
    public string scenarioLabel;

    // コリジョンにぶつかった
    void OnCollisionEnter()
    {
        StartCoroutine( CoTalk() );
    }

    IEnumerator CoTalk()
    {
        //「宴」のシナリオを呼び出す
        engine.JumpScenario( scenarioLabel );

        //「宴」のシナリオ終了待ち
        while(!engine.IsEndScenario)
        {
            yield return 0;
        }
    }
}

AdvEngineは、JumpScenario()にシナリオラベルを渡せば、その時点からシナリオを開始します。
IsEndScenarioでシナリオを終了待ちをします。これはEndScenarioコマンドが呼ばれるまで待つことになるため、会話シーンの区切りにEndScenarioを設定するようにしてください。

シナリオの記述例
2014-06-11_10h39_44
EndScenarioで、会話パートの区切りとしている。

宴の表示を残したままゲーム側と連動させる

EndScenarioを使った場合は、宴の全ての表示も終了してしまうので、キャラクター等が非表示になってしまいます。
表示を残したままにしたい場合は、PauseScenrioコマンドを使ってください。
チュートリアルの作成などで役立つと思います。

シナリオの記述例

ゲーム側ではこのようにして、宴側のポーズ状態を判定します。

サンプルコード


using UnityEngine;
using System.Collections;
using Utage;
public class PauseSample : MonoBehaviour {
 
	AdvEngine Engine { get { return engine ?? (engine = FindObjectOfType<AdvEngine>()); } }
	public AdvEngine engine;
	 
    // 会話開始
    void OnStartTalk(string scenarioLabel)
    {
        StartCoroutine( CoTalk(scenarioLabel) );
    }
 
    IEnumerator CoTalk(string scenarioLabel)
    {
        //「宴」のシナリオを呼び出す
        engine.JumpScenario( scenarioLabel );
 
        //「宴」のポーズ終了待ち
        while(!engine.IsPausingScenario)
        {
            yield return 0;
        }

		//ゲームの再開処理を書く
		//???????

		//宴を再開するのはResumeScenarioで
		//別シーンを呼び出すなら、改めてJumpScenarioしても良い
		engine.ResumeScenario();
    }
}