いつものように、アーキテクチャは要件に依存します。あなたはいくつのmobを持っていますか?彼らのAIはどのくらい複雑ですか?それは何に反応しますか?どのくらいの頻度で状態が変化しますか?これらの質問に答えてください。そうすれば、何が欲しいのか、どうやってそれを得るのかについて、はるかによく理解できます。
一般的に、少なくとも何らかのイベントシステムが必要です。AIは通常、イベントに関して定義されます。「Aが発生したら、Bを実行してください」。実際のコードにイベントがない場合は、これらの定義を何らかの方法で変換する必要があります。
私の経験では、(他の回答が示唆しているように思われる)非常に単純なmobが少ない場合は、単純なループ実装で回避できます。たとえば、現在のゲームでは、数百の小さなインスタンスがあり、それぞれに最大10個のMobがあります。そして、これらの暴徒は非常に愚かです。99%のAIは1つの文で説明できます。この場合、単純なループで十分です。1秒に2回、新しいターゲット(およびまれな「スマート」mobのための他のいくつかのこと)をチェックします。
ただし、モブの数が増えたり、スマートになったりすると、単純なアプローチが機能しなくなります。AIが何らかの刺激に反応するためには、AIループ内でそれを検出するコードを記述する必要があります。例:あなたの暴徒が「プレイヤーに当たったときに」何かをするべきだとしましょう。ループアプローチでは、mobがヒットしたかどうかを判別する簡単な方法はありません。AIが実行されているときに、最後のティック以降に暴徒の健康状態が低下したこと、または暴徒が現在誰かの標的になっていることを確認できます。ただし、実際のヒットを検出するには、ハックに頼らなければなりません。たとえば、各ヒット情報をどこかに保存して、後でAIがアクセスできるようにします。
次に、何が起こっても、単純なループが常に実行されます。モブがたくさんいる場合、AIをできるだけ速く実行したいのですが、最速のコードはまったく実行されないコードです。アクティブでないMobがある場合は、AIを実行しないようにするか、散発的にのみ実行するようにします(さまようMob AIは、次に移動する場所を決定したときにのみ実行する必要があります)。
イベントベースのアプローチを使用すると、他のサブシステムにAIイベントを都合のよいときに送信させることができ、「ヒットの検出」の問題を排除できます。もちろん、一部のイベントではコードの検出が必要になります。最も悪名高い例は「アプローチ」イベントです。そして、何も起こらないときにループでAIルーチンを実行しないと、パフォーマンスが向上します。
ハイブリッドアプローチを使用することもできます。AIイベントをすぐに処理する代わりに、ある種のキューに詰め込むことができます。次に、AIルーチンが(ループで)実行されると、このキューからイベントが削除され、1つずつ処理されます。このアーキテクチャでは、AIのパフォーマンスは少し遅いかもしれませんが、より予測可能です。また、すべてのAIが単一のスレッドで実行されることを保証できます(そうでない場合は注意が必要です)。この種のループは、一部のイベントをスキップすることで簡単に調整することもできます(たとえば、各AI反復は、最新の3つのイベントのみを処理し、残りは破棄します)。または、イベントが優先され、AIが遅れていることが判明した場合、重要度の低いイベントは破棄されます。
全体として、「イベントキューでループする」アプローチがおそらく最も柔軟です。繰り返しますが、盲目的に「最高」として選択するだけではありません。最初に要件について考えてください。単純なアプローチの方が優れている場合があります。