bbc_mc @ moddingメモ
概要
最終更新:
bbc_mc
目次
概要
"旧"AI、"新"AIとは
Minecraft ver1.2 で、それまでの AI とは異なる "新" AI が実装された。 ただし、いまだに一部 mob は "新" AI で動作していない。 "新" AI では mob の動作ロジックが改善され、例えば移動時にダメージを受けるような高所から降りる経路を取らなくなった。その結果として、それまで Creeper がダメージを受けてでも飛び降りて襲 ってきていたのが無くなった。
"旧" AI システムと "新" AI システムの大きな違いとしては、"旧" AI ではEntityLiving の onUpdate 内で AI としての処理を行っていた所、"新" AI ではタスクベースの管理システムが実装された。(EntityAITasks)
現在見られる EntityAI~ というクラスは、"新" AI システムで利用される個別タスクの実装クラスとなっている。
以下では、"新"AI システムについて、説明を行う
AIの基礎を構成するファイル
AI システムを構成するファイルは、大きく分けると以下の通りである。
-
EntityAITasks
AI のリストを保持し、どの AI を実行するかを切り替える管理用クラス。各Mobでインスタンスを持つ。 EntityLiving で宣言されており、EntityLiving.onUpdate 内から定期的に update を呼び出されている。 EntityLiving では、通常動作用と戦闘用の 2 つのインスタンスを保持している。
-
EntityAITasksEntry
EntityAITasks に登録する単位。 登録先の EntityAITasks と、AI の実行重要度(priority)、EntityAIBase を継承したクラスへの参照を持つ。
-
EntityAIBase
すべての AI の基礎となるベースクラス。 新AI はこのクラスを継承して作成されている。
-
EntityAITarget
EntityAIBase を継承する抽象クラス。 戦闘に関する AI はこのクラスを継承して作成されている。
基礎となるクラス
EntityAITasks
Mob の AI は、EntityLiving で定義されている以下に格納されている。
EntityAITasks tasks;
EntityAITasks targetTasks;
EntityAITaskEntry
EntityAI~
特徴的な仕組み
shouldExecute
EntityAIBase を継承するタスクは全てこの関数を実装している。 この関数は EntityAITasks により実行され、タスクを今実行すべきかどうかをタスクが判断し、真偽値を返す。 # これは重要なポイントで、"タスク自身" が判断しており、管理クラスはそれをそのまま受け入れている。 真を返した場合、より優先されるタスクが実行されていない限り、そのタスクが実行される。
mutex_bit
同時実行できないタスクを示すために、bit フラグを利用する。
詳細は 別ページ に記載する。
priority
より小さい値をもつタスクが優先的に実行される。
- 同時に実行できないタスクの場合に、executingList への登録が優先される ただし、priority 値が大きい AI が executingList へ先に登録される場合、後から priority 値が小さい AI が登録されるが、先に登録された AI には特に何も影響がない。(要・確認)