[Unity]FungusにTimeline用のコマンドを追加する
Unityの会話イベント用アセットであるFungusにTimeline用のコマンドを追加するメモです。
Fungusの公式サイト
FungusのGitHub
Fungusのコマンドを追加する
Fungusのコマンドを追加するには、Command
クラスを継承したカスタムのCommand
クラスを作成します。
using UnityEngine;
using Fungus;
[CommandInfo("Test","Test Command", "test command.")]
[AddComponentMenu("")]
public class TestCommand: Command
{
public override void OnEnter()
{
Debug.Log("Test");
// 次のコマンドへ
Continue();
}
}
上記のクラスを追加すると、自動的にTest/Test Command
というコマンドが追加されます。
このコマンドを実行すると、OnEnterの中身が実行され、Test
というログが出力されます。
Continue()
を呼び出すことで、次のコマンドを遷移します。逆に言うと、Continue
を呼び出すまでは次のコマンドに遷移しないので、他の処理を待機したい場合は、処理の完了までContinue
の呼び出しを遅らせることで、待機することができます。
コマンドの見た目を変更する
GetSummary
メソッドをオーバーライドすることで、コマンドに表示される文章を変更することができます。
また、GetButtonColor
メソッドをオーバーライドすることで、コマンドの色を変更できます。
[CommandInfo("Test","Test Command", "test command.")]
[AddComponentMenu("")]
public class TestCommand: Command
{
// ~~~中略~~~
// コマンドに表示されるテキストを変更する
public override string GetSummary()
{
return "hogehoge";
}
// コマンドの色を変更する
public override Color GetButtonColor()
{
return Color.red;
}
}
Timelineを操作するコマンドを追加する
以下のような、Timelineを再生するコマンドを追加してみます。
Timelineの再生は、playableDirector.Play
で実行できます。このメソッドをOnEnter
メソッドの中で呼び出します。
また、WaitUntilFinished
変数を追加して、Timelineの再生を待機できるようにします。
using System.Collections;
using UnityEngine;
using UnityEngine.Playables;
using Fungus;
[CommandInfo("Timeline","Play Timeline","Play Timeline.")]
[AddComponentMenu("")]
public class PlayTimeline : Command
{
// PlayableDirectorへの参照
[Tooltip("Playable Director")]
[SerializeField]
protected PlayableDirector playableDirector;
// Timelineの再生が完了するまで待機する
[Tooltip("Wait Until Finished")]
[SerializeField]
protected BooleanData waitUntilFinished = new BooleanData(true);
public override void OnEnter()
{
if (playableDirector == null)
{
Continue();
return;
}
playableDirector.Play();
if (waitUntilFinished.Value)
{
StartCoroutine(WaitTimeline());
}
else
{
Continue();
}
}
private IEnumerator WaitTimeline()
{
while (playableDirector.state == PlayState.Playing) yield return null;
Continue();
}
public override string GetSummary()
{
if (playableDirector == null)
{
return "Error: No PlayableDirector selected";
}
return playableDirector.name;
}
public override Color GetButtonColor()
{
return new Color32(235, 191, 217, 255);
}
public override bool HasReference(Variable variable)
{
return base.HasReference(variable) ||
(waitUntilFinished.booleanRef == variable);
}
}
コマンドの引数は、通常のインスペクター同様、public変数にするか、SerializeField
属性をつけることで表示されるようになります。
また、基本的な型に関しては、BooleanData
などの型を使用することで、FungusのVairiableとして設定できるようになります。FungusのVariableを使用している場合、HasReference
メソッドをオーバーライドすることで、コマンドが使用している最中のVariableがハイライトされるようになります。
その他
以下に一通りのコードを掲載しています。
Discussion