AIエージェントの作り方


今回はAgentControllerとBehaviourTreeを使用して、プレイヤーを追いかけるAIエージェントの作り方について解説します。

動作環境

このチュートリアルは、以下の環境で作成しております。

  • Unity 5.4.0f3
  • Arbor 3.0.2

バージョンによっては説明と異なる箇所があるかと思いますのがご了承ください。

チュートリアル用プロジェクトの準備

プロジェクトの作成

まずは、チュートリアル用にプロジェクトを作成してください。

プロジェクト名 ArborTutorial05
モード 3D
インポートするアセット
  • Arbor 3: FSM & BT Graph Editor
  • Characters(Standard Assets)

プロジェクトの作成やArborのインポートについては「はじめに : Arborを使用するための準備」を参照してください。

今回はStandard AssetsのCharactersも使用しますので、忘れずインポートしてください。

シーンの作成

3Dマップの配置

まずは、3Dマップを配置します。

  • 「Assets / Plugins / Arbor / Examples / Common / Prefabs」にある「 FloorObjects」プレハブをHierarchyウィンドウへドラッグ&ドロップして配置。
GIF

シーンの保存

一度シーンを保存します。

  • ProjectウィンドウでAssetsフォルダを選択し、「Createボタン」から「Folder」を選択。
  • フォルダ名を「Scenes」にして決定。
  • メニューの「File / Save Scene」を選択。
  • Scenesフォルダに「AgentScene.unity」という名前で保存。

NavMeshのベイク

NavMeshをベイクします。

  • メニューの「Window / Navigation」を選択し、Navigationウィンドウを表示。
  • Navigationウィンドウの「Bakeボタン」をクリック。
  • シーンを上書き保存。

プレイヤーの作成

プレイヤーの配置

プレイヤーはStandard AssetsのThirdPersonControllerプレハブをそのまま使います。

  • 「Assets/ Standard Assets / Characters / Prefabs」フォルダにある「ThirdPersonController」プレハブをHierarchyへドラッグ&ドロップ。
  • GameObject名をPlayerに変更。
  • TransformのPositionを(-5 , 0 , -5)に変更。

カメラの設定

カメラがPlayerを注視するようにします。

  • MainCameraオブジェクトを選択。
  • TransformのPositionを( 0, 10, -30)に変更。
  • CameraのField of Viewを40に変更。
  • Add Componentボタンから、「Arbor / ArborFSM」を追加。
  • Open EditorボタンでArbor Editorを開く。
  • グラフ上を右クリックし、「ステート作成」を選択し、ステート名を「Look At Player」に変更。
  • Look At Playerステートの「挙動追加」から、「GameObject / LookAtGameObject」を追加。
  • TransformをMainCameraオブジェクトに変更。
  • TargetをPlayerオブジェクトに変更。
  • Apply Late Updateをチェック。

エージェントの作成

エージェント用キャラクターの配置

キャラクターを配置します。

  • 「Assets / Standard Assets / Characters / ThirdPersonCharacter / Models」にある「Ethanモデル」をHierarchyウィンドウへドラッグ&ドロップ
  • HierarchyウィンドウでEthanオブジェクトを選択。
  • InspectorウィンドウでTransfromのPositionを( 5, 0, 5)に変更。
  • AnimatorのControllerを「Assets / Standard Assets / Characters / ThirdPersonCharacter / Animator」にある「ThirdPersonAnimatorController」に変更。
  • 「Add Componentボタン」から「Navigation / NavMeshAgent」を選択してNavMeshAgentを追加。

AgentController

AgentControllerとは、NavMeshAgentでの移動とAnimatorの制御を行うArborに組み込まれているコンポーネントです。

ArborFSMやBehaviourTree上で、Agent系スクリプトを使用することで移動させることができます。

Arborリファレンス : AgentController

AgentControllerの追加

  • HierarchyウィンドウでEthanオブジェクトを選択。
  • Inspectorウィンドウの「Add Componentボタン」から「Arbor / AgentController」を選択して、AgentControllerを追加。

AgentControllerの設定

AgentControllerの設定をInspectorで行っていきます。

  • AgentをEthanオブジェクトにあるNavMeshAgentに変更。
  • AnimatorをEthanオブジェクトにあるAnimatorに変更。
  • Speed ParameterをForwardに変更。
  • Speed Damp Timeを0.1に変更。
  • Turn ParametrをTurnに変更。
  • Turn Damp Timeを0.1に変更。

AIの作成

エージェントのAIを作成していきます。

BehaviourTreeの追加

  • Ethanオブジェクトを選択していない場合は、Hierarchyウィンドウで選択しておく。
  • 「Add Componentボタン」から、「Arbor / BehaviourTree」を選択して、BehaviourTreeを追加。

Waypointを巡回するアクション

Waypointを巡回するアクションを追加します。

Waypointの作成

まずは、シーンにWaypointを追加します。

Waypointはシーンに配置した経路ポイントを管理するコンポーネントです。

Arborリファレンス : Waypoint

  • HierarchyのCreateボタンから「Arbor / Waypoint」を選択してWaypointオブジェクトを作成。
  • Waypoint以下に空のGameObjectを4つ作成。
  • 名前をそれぞれ「Point1」「Point2」「Point3」「Point4」に変更。
  • 各Pointオブジェクトのアイコンをラベルタイプに変更。
    GIF
  • WaypointのPointsにPoint1~4を設定。
  • Point1のPositionを(10, 0, 10)に変更。
  • Point2のPositionを(-10, 0, 10)に変更。
  • Point3のPositionを(-10, 0, -10)に変更。
  • Point4のPositionを(10, 0, -10)に変更。

シーンウィンドウで上から見るとこのようになります。

AgentMoveOnWaypointアクションの追加

AgentMoveOnWaypointアクションはWaypointに沿ってAgentを移動させるアクションです。

Arborリファレンス : AgentMoveOnWaypoint

  • EthanオブジェクトのBehaviourTreeからOpen EditorボタンをクリックしArborEditorを開く。
  • Rootノードの下部にあるスロットをドラッグし、Rootノードの下側でドロップ。
  • 表示されたメニューの「アクション作成」を選択。
  • 「Agent / AgentMoveOnWaypoint」を選択。
GIF

AgentMoveOnWaypointの設定

  • AgentControllerをEthanオブジェクトにあるAgentControllerに変更。
  • Speedを0.5に変更。
  • WaypointをWaypointオブジェクトにあるWaypointに変更。
  • TypeをCycleに変更。
  • Stopping Distanceを0.5に変更。

実行確認

実行して確認してみましょう。

  • プレイヤーの位置に関係なくEthanは決まったルートを巡回し続けます。
GIF

Playerに近づくアクション

Playerがある程度近くにいる場合は接近させましょう。

Selectorコンポジットの追加

Selectorは「成功」を返す子ノードを見つけるまで左から順に子ノードを実行するコンポジットです。

Arborリファレンス : Selector

  • Rootノードの下部にあるスロットをドラッグし、Rootノードの下側でドロップ。
  • 表示されたメニューの「コンポジット作成」を選択。
  • 「Selector」を選択。
GIF

SelectorをAgentMoveOnWaypointに接続

  • Selectorノードの下部にあるスロットをドラッグ
  • AgentMoveOnWaypointノードの上部スロットに接続。

AgentMoveToTransformアクションの追加

AgentMoveToTransformはAgentをTargetに近づくように移動させるアクションです。

Arborリファレンス : AgentMoveToTransform

  • Selectorノードの下部にあるスロットをドラッグし、AgentMoveOnWaypointノードよりも左側でドロップ。
  • 表示されたメニューの「アクション作成」を選択。
  • 「Agent / AgentMoveToTransform」を選択。
GIF

AgentMoveToTransformの設定

  • AgentControllerをEthanオブジェクトにあるAgentControllerに変更。
  • Speedを0.6に変更。
  • Stopping Distanceを2に変更。
  • Target TransformをPlayerオブジェクトに変更。

距離判定デコレータの作成

プレイヤーとの距離によって近づくか判定するデコレータを作成します。

  • ProjectウィンドウでAssetsフォルダを選択。
  • 「Create」ボタンから「Arbor /BehaviourTree / Decorator / C# Script」を選択。
  • スクリプト名を「DistanceCheck」にして決定。
  • DistanceCheckファイルをスクリプトエディタで開く。
  • 以下コードを入力。

DistanceCheckによる距離判定

距離によりAgentMoveTransitionノードを実行させるためDistanceCheckを設定しましょう。

  • AgentMoveToTransformノードの歯車アイコンをクリックし「デコレータ追加」を選択。
  • 「Scripts / DistanceCheck」を選択。
    GIF
  • AbortFlagsをEverythingに変更。
  • TargetをPlayerオブジェクトに変更。
  • Distanceを10に変更。

実行確認

実行して確認してみましょう。

  • プレイヤーを操作してEthanオブジェクトの10m以内に近づくとEthanもプレイヤーに近づいてきます。
  • 逆にプレイヤーが10メートルを離れると巡回に戻ります。
GIF

このように、ノードは左から順に実行され、デコレータは実行可能か判定を行い中断や割り込みを制御するものと覚えると良いでしょう。

次のステップ

今回はAgentControllerとBehaviourTreeを使用してPlayerに近づくAIを作成しました。

実際のゲームでは、Playerにある程度近づいたあと攻撃するなどさらにアクションを取るケースがほとんどです。

「Ethanをより良いAIにするにはどう作ったらいいか」をあなたへの課題として、このチュートリアルを終わります。

攻撃アクションのヒント

  • AgentMoveToTransformはStoppingDistanceまで近づくと「成功」として実行終了します。
  • Sequencerコンポジットは子ノードが「成功」を返す限り左から順に子ノードを実行します。
    Arborリファレンス : Sequencer
  • コンポジットノードにもデコレータを追加でき、ArbotFlagにSelfフラグが付いている場合は、デコレータの条件が一致する限り子ノードを実行します。
  • アクションはスクリプトを自作するだけでなく、SubStateMachineアクションを用いればステートマシンをアクションとして実行させることができます。
    Arborリファレンス : SubStateMachine
  • ArborFSMではEndStateMachineを用いれば、親グラフに結果を返せます。
    Arborリファレンス : EndStateMachine
  • ステートマシンによる攻撃の作り方は「2DSTGの敵を作ろう」が参考になるでしょう。