エンティティ
AIありのエンティティはLepinoidEntityを継承することで作成が可能です。
中でも敵MOBを作成したい場合はLepinoidMonsterを継承することである程度手間が省けて独自Goal等も利用することができます。
新たに実装した変数やメソッドに関してはコード内に説明を書いているのでそちらを参照してください。
基本的な実装に関してはTestMobを参照してださい
注意事項
バニラでは移動速度はAIごとに指定しますが、基本的に
speed.normalを用いて設定を行い、新たにGoalを作成する際は内部でLepinoidEntity.speedを取得するようにしてください。EntityTypeを指定しただけではMobの各音声は変更されません。必要に応じてget[Hurt/Death/Fall]Soundを変更してください。- 死亡時などにアイテムをドロップさせる際は、
DropManagerを介して処理を行ってください
AsyncBrain
バニラのBrainを基に非同期的にAi処理を実行できるように変更を加えたクラスです。
GuideEntityと併用することをおすすめします。
Brainとの違い
基のBrainでは毎Tick処理で以下の処理を行なっています
- Memoryのクリーンアップ
- Sensorの更新
- 新しく追加されたTaskの初期化
- Taskの実行
AsyncBrainは基本的に上記の処理を踏襲していますが、いくつか違いがあります。
VanillaのSensor/Taskとは別に専用のAsyncSensor/Taskを受けつける
従来のSensor/Taskも使用可能ですが、処理効率を上げるためにもあまりおすすめはできません。特にTaskはAsyncに対応させて使用することをおすすめします。
CurrentStateActivityで保持しているActivityに紐付けされたTaskのみ処理する
Activity.COREに紐付けされたもののみ例外的に如何なるときでも実行します。(そのためsetAsyncTaskListではなくsetCoreTaskListから設定する必要があります。)
Sensorの更新時/Taskの処理時に待ち時間が発生する
Sensor/Taskの処理の多くはServerThreadを使用して安全性を確保する必要のある処理が多いため、一度serverThreadに処理を投げ、全ての処理が終了するまで待機します。
追加された全てのTaskを実行しない
Brainでは追加された全てのTaskが実行できないか毎Tick精査しますが、これをAsyncBrainは行いません。現在の状態と同じActicityのグループに属するTaskのみを実行します。状態はバニラのActivityを使用しているため、TaskListの登録時もバニラと比べてそこまでの違いはありませんが、状態の推移を管理する専用のTaskが必要になります。
50ms以内に処理がおわる気がしねえ
一回の処理で二回もserverThread待つことになるので2tickかかる可能性は全然あるね。こわいね serverThreadに処理を投げなくて済む方法も考えてはいる。 現状はTask内で行うことなんて後に作成するModelEntityのアニメーション指定とかだけな気がしてるので、別にいいんじゃねって気もする