Unity 宴  別のシーンから「宴」のラベルを呼び出す

#はじめに
「宴」とはビジュアルノベルや会話シーンを手軽に作成するためのUnityアセットです。
この記事ではUnityの別シーン上のC#スクリプトから宴のシナリオの中の特定のラベルを呼び出す方法を記述します。

具体的にどのようなことに応用できるかというと…
・キャラクターセレクト
・画像によるチャプターセレクト
・購入済みのシナリオのみを選択できるようにする
など応用範囲の広いテクニックです。

#開発環境
・Windows 10
・Unity 2019.3.0f6
・「宴」3.8.0

#手順
ここでは最初に上げた「キャラクターセレクト」をイメージした手順を記述します。
![2020-02-11_All2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/b3e2b3f2-d4ad-8512-3a51-537c853bde1c.png)



1．「宴」のセットアップ(プロジェクトの作成)を行ってください。
ここでは「Main」という名前のプロジェクトの作成を行ったと仮定します。
セットアップ(プロジェクトの作成)方法は「宴」の公式サイトのチュートリアルを参照してください。

2．「宴」用シナリオスクリプト(Excelファイル)を用意する
今回は以下のようなテスト用シナリオスクリプトを用意しました。
シナリオスクリプトの詳細な記述方法は「宴」の公式サイトを参照してください。
![2020-02-11_16h24_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/970f47b0-2f8f-bf9e-260a-d0ce35a63783.png)





3．以下の3つのC#スクリプトを用意してください。
C#スクリプトを置く場所はどこでもいいです。

```cs:ExecuteUtage.cs
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;


public class ExecuteUtage : MonoBehaviour
{
	// 他シーンのUtage呼び出し
	public void Execute(string utageSceneName, string label)
	{
		// 実行するラベル名を保存
		ExecuteScenario.Label = label;

		StartCoroutine(ExecuteScenarioCoroutine(utageSceneName));
	}

	// シーン読み込みが完了したか
	private bool IsSceneLoaded;

	private void Start()
	{
		SceneManager.sceneLoaded += OnSceneLoaded;
	}

	// シーン読み込み完了イベント
	private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		IsSceneLoaded = true;
	}

	// シナリオの呼び出しCorotine
	private IEnumerator ExecuteScenarioCoroutine(string utageSceneName)
	{
		IsSceneLoaded = false;
		SceneManager.LoadScene(utageSceneName);
		yield return new WaitUntil(() => IsSceneLoaded);
	}
}
```

```cs:SelectScenario.cs
using System.Collections;
using UnityEngine;
using Utage;


public class SelectScenario : MonoBehaviour
{
	[SerializeField] public AdvEngine Engine;
	[SerializeField] public UtageUguiTitle Title;
	[SerializeField] public UtageUguiMainGame MainGame;


	private void Start()
	{
		StartCoroutine(Execute());
	}

	// シナリオを呼び出す
	private IEnumerator Execute()
	{
		// Utage Engine の起動を待つ
		yield return new WaitUntil(() => !Engine.IsLoading);
		// 機能呼び出し
		yield return StartCoroutine(ExecuteLabel());
	}

	// 機能呼び出し
	private IEnumerator ExecuteLabel()
	{
		// 起動ラベルのラベル名を取得
		string label = ExecuteScenario.Label;

		// 機能呼び出し
		Title.Close();
		MainGame.OpenStartLabel(label);

		yield return null;
	}
}
```

```cs:ExecuteScenario.cs
public class ExecuteScenario
{
	// 呼び出すラベル
	public static string Label;
}
```

4．Mainシーンのヒエラルキーの中に「SelectScenario」という名前の空のオブジェクトを作成して「SelectScenario.cs」スクリプトをアタッチします。

5． 作成した「SelectScenario」コンポーネントのプロパティに以下のオブジェクトを設定します。
![2020-02-11_16h32_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/c185da74-c1a4-3b10-630c-b5c543ceac94.png)

|プロパティー名|オブジェクト名|オブジェクトの位置|
|:---|:---|:---|
|Engine|AdvEngine|ヒエラルキー直下|
|Title|Title|Canvas-AdvUI/Title|
|Main Game|MainGame|Canvas-AdvUI/MainGame|

6．「Main」シーンを保存してください。


7．Unityでキャラクターセレクトを行うシーンを作成してください。
ここでは「Title」という名前のシーンを作ったと仮定します。


8．今回はキャラクターセレクトということでキャラクターの画像が載ったButtonUIを設置しました。
このボタンに「ExecuteUtage.cs」スクリプトをアタッチします。
これで「宴」のラベルを呼び出す準備ができました。


9．この「ExecuteUtage」コンポーネントの...

```
public void Execute(string utageSceneName, string label)
```
関数を呼び出せば「宴」シナリオスクリプト内のラベルが呼び出せます。

|引数名|設定する値|
|:---|:---|
|string utageSceneName|宴のあるシーン名|
|string label|呼び出すラベル名|

10．今回はサンプルとして以下のC#スクリプトを用意しました。
このC#スクリプトを各ボタンにアタッチしてください。

```cs:EventCharacterSelection.cs
using UnityEngine;


[RequireComponent(typeof(ExecuteUtage))]
public class EventCharacterSelection : MonoBehaviour
{
	private ExecuteUtage ExecuteUtageComponent;

	private void Start()
	{
		ExecuteUtageComponent = gameObject.GetComponent<ExecuteUtage>();
	}

	public void CharacterSelect(string label)
	{
		ExecuteUtageComponent.Execute("Main", label);
	}
}
```


11．各ボタンの「On Click ()」を以下の画像のように設定してください。
これでボタンを押すと「宴」のラベルが呼び出されます。
![2020-02-11_16h39_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/5e85b31e-a29f-a797-618b-0e739b4dd8f7.png)


13．以上で完了です。
シーンが変わる際に「メニュー」画面がちらっと見えることがありますが「宴」のシーンの「Canvas-AdvUI/Title」にUIが配置されていますので非表示にするなりローディング画面を出すなり好きにしてください。