状態のコールバック

Bolt 0.4以降では、任意のタイプに関するコールバックを定義できます。 これによりコールバックのメソッドは少し複雑になっていますが、コールバックの設定の自由度は非常に高まっています。

state.AddCallback("myStateProperty", myCallbackFunction)

トリガー

トリガーはC#のデリゲートであり、state.AddCallback()メソッドを使用する必要はありません。その代わりに、adding to a delegate 構文が用いられます。プロパティとメソッドの両方に「MyTrigger」という名前を持つことはできないため、状態トリガーコールバックの登録に「OnMyTrigger」(または、あるイベント"X"に対して"OnX"という形)を用います。 以下のようになります。

state.OnMyTrigger += myCallbackFunction

Back To Top

配列上のコールバック

配列内の配列上のコールバックの設定を行うことができます。以下を参照して下さい。

(Bolt.IState、ストリングパス、Bolt.ArrayIndicesインデックス)のフォーマットで3つのパラメータを使用するデリゲートを取るstate.AddCallbackへのオーバーロードがあります。

  1. Bolt.IState をメソッド内において状態タイプにキャストすることもできます(Bolt.IStateは、全ての状態の継承元となるクラスである点に留意して下さい)。 -(全体のAddCallbackメソッドを持つには)強く型付けをされていませんが、これが実際の状態となります。自身のタイプへのキャストが必要となるのはこのためです。

  2. ストリングパス は、プロパティへの 完全な パスです。 

  3. Bolt.ArrayIndicesのインデックス には、コールバック内で付与した配列全てのインデックスが含まれます。

例 1a:メソッドを含む配列コールバック

state.AddCallback("stats[]", OnStatsChanged);
public void OnStatsChanged(Bolt.IState state, string path, Bolt.ArrayIndices indices)
    {
        int index = indices[0];
        IActorState actorState = (IActorState)state;
        // The changed property:
        // actorState.stats[index]
    }

例 1b:ラムダを含む配列コールバック

state.AddCallback("stats[]", (x, y, z) => { OnStatsChanged((IActorState)x, (string)y, (Bolt.ArrayIndices)z); });
public void OnStatsChanged(IActorState state, string path, Bolt.ArrayIndices indices)
    {
        int index = indices[0];
    }

例 2a:メソッドを含む入れ子配列

state.AddCallback("vaults[].contents[]",  OnVaultContentsChanged);
public void OnVaultContentsChanged(Bolt.IState state, string path, Bolt.ArrayIndices indices)
    {
        IActorState actorState = (IActorState)state;
        int vaultIndex = indices[0];
        int index = indices[1];
        int itemID = actorState.vaults[vaultIndex].contents[index];
    }

例 2b:ラムダを含む入れ子配列コールバック

state.AddCallback("vaults[].contents[]", (x, y, z) => { OnVaultContentsChanged((IActorState)x, (string)y, (Bolt.ArrayIndices)z); });
public void OnVaultContentsChanged(IActorState state, string path, Bolt.ArrayIndices indices)
    {
        int vaultIndex = indices[0];
        int index = indices[1];
        int itemID = state.vaults[vaultIndex].contents[index];
    }

例 3:構造体のコールバック内のメソッドに対する参照テーブルの利用

状態における構造体を定義し、その各フィールドに対してコールバックを設定するのではなく単一の全体コールバックを行いたい場合に、かつ特定のプロパティごとに個別のメソッドが呼び出されるようにしたい際には、スイッチ文ではなく参照テーブルの使用が推奨されます。 これは必須というよりも最適化であり、これが有効なのはコールバックが頻繁にトリガーされ、構造体に多くのフィールドが存在する場合のみです。

アクションの参照テーブルを定義するには:

Dictionary<string, Action> lookupTable = new Dictionary<string, Action>()
{
    { "equippedItems.head", UpdateArmor(state.equippedItems.head, 0) },
    { "equippedItems.body", UpdateArmor(state.equippedItems.body, 1) },
    { "equippedItems.arms", UpdateArmor(state.equippedItems.arms, 2) }
};


Action UpdateArmor(Item item, int index) {
  return () => UpdateUMAArmor(item, index);
}

添付されていない状態のパラメータにアクセスすることはできないことに留意してください。そのため、Attached()内の参照テーブルを埋めるか、または遅いアクセスにより初期化される参照テーブルを埋める必要があります。 これをしない場合、以下のエラーが発生します:

Error: An object reference is required for the non-static field, method, or property 'Bolt.EntityBehaviour<IPlayerState>.state.get'

また、これはコールバックの追加に用いられます:

state.AddCallback("equippedItems", UpdateNewArmor);

また、これは以下のメソッドです:

public void UpdateNewArmor(Bolt.IState state, string path, Bolt.ArrayIndices indices)
  {
    lookupTable[path]();
  }

ドキュメントのトップへ戻る