3

ゲーム用の堅牢な AI/スクリプト システムをどのように作成しますか?

1)すべての NPC/environment/entities に対して、個別の単一の動作ツリー (patrolBehavior、allyBehavior、vendorBehavior、doorBehavior など) を提供しますか? 画面に 500 ユニットある場合、ツリーを完全にパスする必要がありますか (ルートからノード/アクションへ)、またはすべてのユニットに対して 1 ノードの進行を行う必要がありますか?

2)私は update() 関数で AI ロジックを実行しています...しかし、一部のゲームには個別の AI スレッドがあると聞きましたが、何かアイデアはありますか?

3)ゲームをセクション/チャプターに分割する方法を考えています...単純な変数 (EVENT="Mission 3") を使用して、プレイヤーがどのように過ごしたかを示し、すべてを線形にしますか? そして、上のツリーで変数を利用しますか?

4

2 に答える 2

6

私はあなたの質問に答えようとします。

  1. たとえば、静的クラスですべての分岐ロジックと動作ツリーを実行します。

     public static class Behavior
    {
        //Branch
        public static Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) {
            return () => { if (cond()) { ifTrue(); } else { ifFalse(); } };
            }
        public static Action Sequencer(Action a, Action b) {
              return () => { a(); b(); }
            }
    
        //Example trees
        public static Func<bool> ifPlayerIsInSight = () => { return true; /*...true iff WorldState shows guard can see player...*/};
    
        public static Action shootAtPlayer = () => { /*...aim guard's weapon at player and fire...*/ };
    
        public static Func<bool> ifUnderFire = () => { return true; /*...true iff WorldState shows guard hears player gunfire...*/};
    
        public static Action takeCover = () => { /*...guard runs for nearest shelter... */};
    
        public static Action walkBackAndForthGuardingDoorway = () => { /*...default guard patrol behaviour...*/ };
    
        public static Action patrollingGuardBehaviour =
          Selector(Behavior.ifPlayerIsInSight, Behavior.shootAtPlayer,
            Selector(Behavior.ifUnderFire, Behavior.takeCover,
              Behavior.walkBackAndForthGuardingDoorway));
    }
    
    1. メインループに遅れが生じないように、LateUpdate() または最後に実行します。

    2. それはあなた次第です。各動作ツリーに「状態」を実装するか、それを分割して、いつ使用するかを管理できます。

于 2012-05-23T08:38:09.403 に答える
0
  1. 各 NPC/エージェントには独自のビヘイビア ツリーがあります。ツリーは更新され、続行する場所を「認識」しているため、通常、効率は非常に良好です。
  2. AI はメイン スレッドで更新できますが、別のスレッドで更新することもできます。それはあなた次第です。
  3. それはあなた次第です。

振る舞いは本当に優れたものです。

behaviac は、ビヘイビア ツリー、有限状態マシン、および階層型タスク ネットワークをサポートしています。ビヘイビアーは、デザイナーで設計してデバッグし、ゲームでエクスポートして実行できます。

C++ バージョンは、クライアント側とサーバー側に適しています。

そして、それはオープンソースです!

于 2015-12-24T09:35:57.927 に答える