🐷
[Unity]FungusのVariableの型を追加する
Unityの会話イベント用アセットであるFungusのVariableの型を追加する方法のメモです。
Fungusの公式サイト
FungusのGitHub
Fungusのフローチャートで使用できるVariableの型を新しく追加します。
追加するコンポーネント
以下の、SomeComponent
クラスと対応するVariableを追加します。
SomeComponent.cs
using UnityEngine;
public class SomeComponent : MonoBehaviour {}
XXX型と対応するXXXVariable.csを追加する
まず、任意のフォルダにXXX型と対応する、XXXVariableクラスを定義したスクリプトを追加します。
SomeComponent
の場合は、以下のようなスクリプトになります。
SomeComponent
の部分を、追加したいクラスの型名に置き換えてください。
注意点として、SomeComponentData
で定義している変数のsomeComponentRef
とsomeCompoentVal
の箇所は、追加したいクラスの名前の最初の文字を小文字にした名称である必要があります。
例えば、BGMComponent
クラスの場合は、変数の名称をbGMComponentRef
とbGMComponentVal
にする必要があります。
SomeComponentVariable.cs
using UnityEngine;
namespace Fungus
{
[VariableInfo("Other", nameof(SomeComponent))]
[AddComponentMenu("")]
[System.Serializable]
public class SomeComponentVariable : VariableBase<SomeComponent> { }
[System.Serializable]
public struct SomeComponentData
{
[SerializeField]
[VariableProperty("<Value>", typeof(SomeComponentVariable))]
public SomeComponentVariable someComponentRef;
[SerializeField]
public SomeComponent someComponentVal;
public static implicit operator SomeComponent(SomeComponentData someComponentData)
{
return someComponentData.Value;
}
public SomeComponentData(SomeComponent v)
{
someComponentVal = v;
someComponentRef = null;
}
public SomeComponent Value
{
get { return (someComponentRef == null) ? someComponentVal : someComponentRef.Value; }
set { if (someComponentRef == null) { someComponentVal = value; } else { someComponentRef.Value = value; } }
}
public string GetDescription()
{
if (someComponentRef == null)
{
return someComponentVal != null ? someComponentVal.ToString() : "Null";
}
else
{
return someComponentRef.Key;
}
}
}
}
Editor用のDrawerを追加する
任意のEditorフォルダ内にXXXDataクラスと対応するDrawerクラスを追加します。
SomeComponent
の場合は以下のようになります。
using UnityEditor;
namespace Fungus.EditorUtils
{
[CustomPropertyDrawer(typeof(SomeComponentData))]
public class SomeComponentDataDrawer : VariableDataDrawer<SomeComponentVariable> { }
}
結果
上記のクラスを追加することで、新しいVariableの型を追加することができます。
Discussion