Unity プロジェクト内で使用する単純なビヘイビア ツリー アルゴリズムを実装しました。私の誤解が原因かもしれません. 私の問題は次のとおりです。
リーフ ノードが完了するまでに長い時間がかかる場合 (たとえば、ゲーム ユニットが特定のパスをたどるアクションなど)、それはリーフ ノードが現在「実行中」の状態であることを意味します。ただし、状態を返すと、残りの関数を実行できなくなります。つまり、目的地に到達できません。
私の質問は次のとおりです。葉ノードが実行されていることをツリーに伝える適切な方法は何ですか?
ActionNode クラスで得たものは次のとおりです。
public class ActionNode : BTNode
{
public delegate NodeStates ActionNodeDelegate();
protected ActionNodeDelegate nodeAction;
public ActionNode(ActionNodeDelegate action)
{
nodeAction = action;
}
public override NodeStates Evaluate()
{
switch (nodeAction())
{
case NodeStates.FAILURE:
currentNodeState = NodeStates.FAILURE;
return currentNodeState;
case NodeStates.SUCESS:
currentNodeState = NodeStates.SUCESS;
return currentNodeState;
case NodeStates.RUNNING:
currentNodeState = NodeStates.RUNNING;
return currentNodeState;
default:
currentNodeState = NodeStates.FAILURE;
return currentNodeState;
}
}
}
他のクラスを確認する必要がある場合は、すべてこの記事に基づいています。スレッドをきれいに保つためにリンクします。
アクションの例として、これを考慮してください。
private NodeStates FollowPath() {
bool targetReached;
if (targetReachable)
targetReached = WalkToTarget();
if (targetReached)
return NodeStates.SUCESS;
else
return NodeStates.FAILURE;
}
私が疑問に思っているのは、WalkToTarget に長い時間がかかる場合、どうすれば「実行中」の状態を返すことができるかということです。
この件に関するさまざまな記事を読みましたが、これらの状態の背後にある正確な概念を把握できないようです。たとえば、Sequence または Selector ノードが実行されていることをどのように伝えることができるかを理解しています。
私の頭をよぎった唯一のアイデアは、残りのパスを敵クラスの変数内に保存し、ゲームの更新ティックごとにメソッドを呼び出すということですが、それはコーディングが不十分なように感じます。
葉ノードはいつでも「実行中」に戻るはずですか? もしそうなら、それはどのような場合に起こりますか?任意の例をいただければ幸いです。