Unityアセット「 Game Creator」のコマンド群「 Trigger(発火条件)」、「 Condition(IF文)」、「 Action(処理)」を自作して追加する方法を解説します。
Actionの追加方法
Projectを右クリックし、Create > Game Creator > Developer >C# Simple Action又は、Create > Game Creator > Developer >C# Complete ActionでC#コードを生成し、ActionLogHello.csと命名します。
namespace GameCreator.Core
{
using UnityEngine;
[AddComponentMenu("")]
public class ActionHello : IAction
{
public string LogMessage = "Hello World";
public override bool InstantExecute(GameObject target, IAction[] actions, int index)
{
Debug.Log(this.LogMessage);
return true;
}
#if UNITY_EDITOR
public static new string NAME = "Test/Hello";
#endif
}
}
InspectorのLogMessageで入力した値をログに出力するアクションです。
Actionを生成する時はまずクラス名の上に[AddCompornentMenu(“”)]をつけます。また、クラスはIActionインターフェースを継承させます。IActionはMonoBehaviourを継承したインターフェースです。そのため、IActionを継承させたクラスも、MonoBehaviourの機能をそのまま利用できます。例えば、OnEnableやOnStartで初期処理をしても全く問題ありません。
InstantExcute
IActionを継承すると、Actionsは、そのクラスをInspectorで指定した時にInstantExcuteを順次実行するように命令します。そのため、InstantExcuteをoverrideさせて処理を書けば、その命令が実行されるようになります。boolにtureを返すと成功とみなして次の処理にうつります。
引数は以下の通りです。
target | Actionコンポーネントをセットしているゲームオブジェクト |
actions | このアクションを呼び出すActionsが命令するアクションの一覧。 |
index | このアクションが呼び出される順番 |
戻り値はBool型です。このアクションの実行後、IEnumeratorコルーチンを使用できます。使用しない場合はtrue、使用する場合はfalseを返します。
Excute(IEnumerator)
Excuteは、InstantExcuteを1回実行した後に、InstantExcuteの戻り値がfalseの場合に呼び出されます。
public override bool InstantExecute(GameObject target, IAction[] actions, int index)
{
Debug.Log(this.LogMessage);
return false;
}
public override IEnumerator Execute(GameObject target, IAction[] actions, int index)
{
Debug.Log("IEnumerator :" + this.LogMessage);
yield return 0;
}
引数はInstantExcuteと同じです。主な使い方はアクションに時間がかかり、処理が終了するまで次のアクションを実行したくない場合です。
Excuteが終了してから次のアクションが実行されるため、WaitUntilなどを利用してExcuteを終了するタイミングを調整することで、次のアクションの実行タイミングを変えることができます。
Conditionの追加方法
Projectを右クリックし、Create > Game Creator > Developer >C# Simple Condition又は、Create > Game Creator > Developer >C# Complete ConditionでC#コードを生成し、ConditionGatAxis.csと命名します。
namespace GameCreator.Core
{
using UnityEngine;
[AddComponentMenu("")]
public class ConditionAxisRow : ICondition
{
public string AxisName = "Fire1";
public override bool Check(GameObject target)
{
if (Input.GetAxis(AxisName) == 1)
{
return true;
}
else
{
return false;
}
}
#if UNITY_EDITOR
public static new string NAME = "Test/AxisRow";
#endif
}
}
InputManagerの指定項目に対応するボタンが押されている時にThenのアクションを実行するConditionです。
Action同様、Conditionも生成する時はまずクラス名の上に[AddCompornentMenu(“”)]をつけます。また、クラスはIConditionインターフェースを継承させます。IConditionもIAction同様にMonoBehaviourを継承したインターフェースです。
Check
戻り値がTrueの時はInspector上のThen以降のアクションを実行し、Falseの時はInspector上のElse以降のアクションを実行します。引数のTargetはConditionをセットしているゲームオブジェクトです。
Triggerの追加方法
Projectを右クリックし、Create > Game Creator > Developer >C# IgniterでC#コードを生成し、IgniterGatAxis.csと命名します。何故かGame CreatorのTriggerの命名規則がIgniter~となっているため、規則を揃える意図でこのような命名にしています。
namespace GameCreator.Core
{
using UnityEngine;
[AddComponentMenu("")]
public class IgniterGetAxis : Igniter
{
#if UNITY_EDITOR
public new static string NAME = "Test/GetAxis";
public new static bool REQUIRES_COLLIDER = true;
#endif
public string AxisName = "Fire";
private void Update()
{
if (Input.GetAxis(AxisName) == 1)
{
this.ExecuteTrigger(gameObject);
}
}
}
}
InputManagerの指定項目に対応するボタンが押されている時にコンディション、又はアクションを呼ぶトリガーです。
Action同様、Triggerも生成する時はまずクラス名の上に[AddCompornentMenu(“”)]をつけます。また、クラスはIgniterインターフェースを継承させます。IgniterもIAction同様にMonoBehaviourを継承したインターフェースです。
Triggerの場合は特殊なメソッドはありません。アクション、コンディションを実行したい場所でMonoBehaviourと同じように記述します。例えばUpdate、FixedUpdate、Startなど。
IAction、ICondition、ITriggerのエディタ操作
Action、Condition、Triggerそれぞれエディタ側の操作記述の方法は、同様です。以下の中に記述します。
#if UNITY_EDITOR
//処理を書く
#endif
Name
ActionsのAddActionボタンを押した時の名称とフォルダの位置を決定します。例えば以下のように記述するとTestフォルダの下にHelloの名称でアクションが登録されます。
public static new string NAME = "Test/Hello";
Node Title
Inspector上のタイトルを決定します。未記述の場合はクラス名を表示します。例えば下記のような場合は、タイトルにTest value is testと表記されます。ランタイム側の変数も使用できますので、Game Creatorのデフォルトアクションの多くはタイトル+ユーザーが入力した値で表記しています。
private const string NODE_TITLE = "Test value is {0}";
public override string GetNodeTitle()
{
return string.Format(NODE_TITLE, "test");
}
REQUIRES_COLLIDER
Trigger専用の変数です。Playerにコライダーが必要な場合はtrueにします。
Action、Conditionのメソッド
その他、以下のような抽象化メソッドがあるため、必要に応じて利用します。Action、Conditionが対象で、TriggerはそもそもInspecterに入力ができないため、存在しません。
OnEnableEditorChild | エディタを開いた時の処理。エディタ拡張でしか増やせない入力項目の初期化に利用します。 |
OnDisableEditorChild | エディタを閉じる時の処理。エディタ拡張でしか増やせない入力項目をクリアするなどに利用します。 |
OnInspectorGUI | エディタがインスペクターで操作されている時の処理。 |
OnEnable、OnDisableなどは親クラスが利用しているため、利用しないように気を付けてください。