コーディング編


今回は、ステートの切り替わりタイミングがわかるログ出力や、独自の条件によるステート遷移の定義など、スクリプトを自作する方法について解説していきます。

まだ基礎編を見ていない方は、先に基礎編をご覧ください。

基礎編

なお、こちらではUnityにおけるスクリプトの基本的な解説は行いません。
詳しくはUnityマニュアル「Scripting」を参照してください。

Unityマニュアル「Scripting」

動作環境

このチュートリアルは、以下の環境で作成しております。

  • Unity 5.3.0f4
  • Arbor 2.2.0
  • スクリプト言語:C#

バージョンによっては説明と異なる箇所があるかと思いますのがご了承ください。

チュートリアル用プロジェクト作成

まずは、チュートリアル用にプロジェクトを作成してください。

プロジェクト名 ArborTutorial02
モード 3D
インポートするアセット Arbor

プロジェクトの作成やArborのインポートについては「はじめに : Arborを使用するための準備」を参照してください。

ログ出力スクリプトの作成

Arbor用スクリプトには2種類あり、今回はステートに設定できるStateBehaviourを作成します。

まず、ProjectウィンドウのAssetsフォルダを開き、Createボタンから「Arbor > StateBehaviour > C# Script」を選択してください。

スクリプトの名前を「DebugLogBehaviour」とします。

GIF

StateBehaviourとは

StateBehaviourとは、基礎編で使用したTimeTransitionやActivateGameObjectのようにArborFSMのステートの挙動を記述できるスクリプトです。

ステート用の制御のほか、MonoBehaviourと同様に編集可能なパラメータやOnCollisionEnterなどのコールバックも使用できるようになっています。

先ほど作成したDebugLogBehaviour.csファイルをダブルクリックしてIDEで開いてみましょう。

新規で作成されたスクリプトには一般的によく使用するコールバックをあらかじめ定義してあります。

このOnStateAwake()やOnStateBegin()などが、ステートの制御にかかわるコールバックメソッドになります。

簡単に説明しますと、以下のような役割になっています。

OnStateAwake() はじめてステートに入った時点で、一度だけOnStateBegin()の前に呼ばれる。
OnStateBegin() ステートに入った時点で呼ばれる。
OnStateEnd() ステートから出た時点で呼ばれる。
OnStateUpdate() ステートに入っている間、毎フレーム呼ばれる。
呼び出しタイミングとしては、MonoBehaviour.Update()と同様。
OnStateLateUpdate() ステートに入っている間、毎フレームUpdate()後に呼ばれる。
呼び出しタイミングとしては、MonoBehaviour.LateUpdate()と同様。

また、1つのステートに複数挙動を追加している場合、これらのコールバックはArbor Editorウィンドウで見た時の上から順に呼ばれるようになっています。

StateBehaviourについての詳細は、StateBehaviourのカスタマイズを参照してください。

StateBehaviourのカスタマイズ

ステートに入った時点でログ出力

まずは、ステートに入った時点でログを表示して、正常にスクリプトが動いているのを確かめてみましょう。

先ほど作成したDebugLogBehaviour.csをIDEで開いていただき、OnStateBegin()内を記述していきます。

なお、編集した箇所のみ記載いたしますので、ご了承ください。

public override void OnStateBegin() {
	Debug.Log("OnStateBegin : " + state.name);
}

stateプロパティによってスクリプトを設定しているステートが参照できますので、そこからステート名もログに出すようにしています。

記述できましたらファイルを保存して、Unityに戻ります。

ArborFSMオブジェクトの作成

ArborFSMオブジェクトを作成してステートマシンを使用できるようにします。

HierarchyウィンドウのCreateボタンから、「Arbor > ArborFSM」を選択してArborFSMコンポーネントが付いた状態のGameObjectを作成します。

GIF

ステート作成

作成したArborFSMオブジェクトからArbor Editorウィンドウを開き、ステートを作成します。

ステート名は「DebugLog」にします。

GIF

DebugLogBehaviourを追加

DebugLogステートにDebugLogBehaviourを追加します。

作成したスクリプトは、デフォルトではAdd BehaviourウィンドウのScripts内に格納されるようになります。

DebugLogステートの設定アイコンをクリックし、「挙動追加」を選択してください。

「Scripts > DebugLogBehaviouir」を選択して追加します。

GIF

DebugLogBehaviourにはパラメータがないため特に設定の必要もなくこれで完了です。

ここまでの動作確認

ここで一旦実行して確認してみましょう。

Consoleウィンドウが表示されていないとログの確認ができないため、開いていない方はメニューの「Window > Console」を選択して表示してください。

プレイボタン」を押してConsoleウィンドウを確認します。

すると、DebugLogステートに追加したDebugLogBehaviourのOnStateBegin()が呼び出され、先ほど記述したログが表示されるようになりました。

パラメータの定義

次に、DebugLogBehaviourにパラメータを定義して、Arbor Editorで設定できるようにしてみましょう。

DebugLogBehaviour.csをIDEで開き、メンバ変数を定義します。

ArborはUnityのシリアライズ機能によりパラメータを定義できますので、基本はMonoBehaviourと同様です。

今回は、このDebugLogBehaviourにstringを追加して、OnStateBegin()でのログに追加する形で動作を確認します。

メンバ変数は以下のように追加してください。

public string logText;

OnStateBegin()を以下のように変更します。

public override void OnStateBegin() {
	Debug.Log("OnStateBegin : " + state.name + " : " + logText);
}

ファイルを保存して、Unityに戻ると再コンパイルされスクリプトの変更が反映されます。

DebugLogBehaviourの設定

Arbor Editorウィンドウを見ると、先ほど追加したパラメータが表示されていると思います。

この追加されたLog Textに「Hello Arbor Script!」と入力してみましょう。

ここまでの動作確認

正しくログが表示されるか確認してみましょう。

プレイボタン」を押して実行状態にし、Consoleウィンドウを見てみましょう。

Log Textに入力した文字列がログに追加されているのがわかるかと思います。

このように、StateBehaviourで追加したパラメータをArbor Editorから編集して挙動を設定できます。

遷移先の指定を宣言

StateLinkをメンバ変数として宣言すると遷移ボタンが表示され指定できるようになります。

DebugLogBehaviour.csをIDEで開き、StateLinkを宣言してみましょう。

メンバ変数として以下のように追加してください。

public StateLink nextState;

今回はOnStateUpdate()でスペースキーが入力されたら遷移するようにします。

public override void OnStateUpdate() {
	if (Input.GetKeyDown(KeyCode.Space)) {
		Transition(nextState);
	}
}

ファイルを保存してUnityに戻りましょう。

DebugLogステートのDebugLogBehaviourに「Next State」が追加されているのがわかります。

別のステートを作成

まだステートが1つしかないため、もう一つステートを作成して遷移がわかりやすくしてみます。

今回は、DebugLogステートを複製します。

DebugLogステートの設定アイコンをクリックし、「複製」を選択してください。

GIF

名前が同じままだと区別がつかないため、名前欄をダブルクリックして「DebugLog2」にしておきます。

GIF

遷移ボタンを接続

DebugLogステートの「Next State」をDebugLog2ステートへドラッグ&ドロップで接続します。

同様に、DebugLog2ステートの「Next State」をDebugLogステートへドラッグ&ドロップで接続します。

GIF

これでスペースキーを押すたびにステートが遷移し、Consoleにログが表示されるようになりました。

動作確認

最後に動作確認してみましょう。

プレイボタン」を押して実行状態にします。

Consoleウィンドウを見ながらGameウィンドウでスペースキーを押してみてください。

GIF

スペースキーを押すたびにステートが切り替わりログが出力されているのがわかるかと思います。

Arbor Editorウィンドウも確認すると、正常にステートが切り替わっているのが確認できます。

GIF

ステート間や演算ノードとのデータの受け渡しなど、より詳しいカスタマイズ方法は「StateBehaviourのカスタマイズ」を参照してください。

StateBehaviourのカスタマイズ

次のステップ

以上で「コーディング編」は完了です。

「コーディング編」完了をツイート

次回は「コインプッシャーを作ろう」です。

コインプッシャーのように簡単なゲームをArborを用いて作成してみます。

コインプッシャーを作ろう