🐷

[Unity]FungusのVariableの型を追加する

2021/11/16に公開

Unityの会話イベント用アセットであるFungusのVariableの型を追加する方法のメモです。

Fungusの公式サイト
https://fungusgames.com/

FungusのGitHub
https://github.com/snozbot/fungus

Fungusのフローチャートで使用できるVariableの型を新しく追加します。

追加するコンポーネント

以下の、SomeComponentクラスと対応するVariableを追加します。

SomeComponent.cs
using UnityEngine;
public class SomeComponent : MonoBehaviour {}

XXX型と対応するXXXVariable.csを追加する

まず、任意のフォルダにXXX型と対応する、XXXVariableクラスを定義したスクリプトを追加します。
SomeComponentの場合は、以下のようなスクリプトになります。
SomeComponentの部分を、追加したいクラスの型名に置き換えてください。

注意点として、SomeComponentDataで定義している変数のsomeComponentRefsomeCompoentValの箇所は、追加したいクラスの名前の最初の文字を小文字にした名称である必要があります。
例えば、BGMComponentクラスの場合は、変数の名称をbGMComponentRefbGMComponentValにする必要があります。

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