はじめに。
本記事ではUnity Labsにて開発中のゲームAIライブラリ AI Planner について記載していきます。
2020年11月28日に行われたオンライン勉強会にてこのライブラリについて紹介をする機会を頂きましたが、これから挑戦する人のガイドとなるように登壇で話しました内容に補足を加えて整理をしておきたいと思います。
ろっさむさん主催で行われたこのイベントについてはイベントページをご覧ください。
【オンライン開催】Game AI Tech #1
登壇時のスライドも公開していますので本記事と合わせて参照頂ければと思います。
AI Planner入門 - Road of kanzen ni rikaishita.
AI Plannerとは。
(前述のとおり)AI PlannerはUnity公式で開発中のゲームAIライブラリで、「ゴール指向プランニング」であること「DOTSベース」であることが大きな特徴となっています。
- 公式マニュアル
About AI Planner
Changelog
20202年11月3日にアップデートより【 0.2.4-preview.3 】となりクラス名や利用方法などの変更が入ったほか、Unityの必須バージョンも2019.2から2020.1.2fに上がっています。
Unite講演
日本では殆ど紹介されていない印象ですが海外では2017年から3年連続でUniteにてセッションがあったりします。
- (Unite Austin 2017) Unity Labs Behavioral AI Research
- (Unite Los Angeles 2018) [AI for behavior: Advanced research for intelligent decision making]
(https://www.youtube.com/watch?v=ZdN8dDa0ff4) - (Unite Copenhagen 2019) How to generate game character behaviors using AI and ML - Unite Copenhagen
PackageManager提供の新機能で遊ぼう 〜AI Planner編〜
また日本語で見られる数少ない資料としてユニティ・テクノロジーズ・ジャパン公式セミナー配信であるUnityステーションでAI Plannerを取り上げている回があります。
プランニングの概要からセットアップまで動画で説明されており、AI Plannerについて知りたい方は最初に見ておくとセットアップのイメージが付くと思います。
但し使用しているバージョンが【 0.2.3 】なので最新バージョンとは操作方法が一部違うところがありますので注意してください。
公式のサンプル
公式のサンプルは3種類ありAI Plannerの可能性を感じさせるのに十分な出来となってます。
- EscapeRoom
3つの駒が協力して部屋を脱出
- Match3
色を合わせて消す2Dパズル
- VacuumRobot
ル〇バ似のロボットがごみ集め
こちらも使用しているバージョンが【 0.2.3 】となります。
AI Plannerを使ってどのようなことが出来るのか知るのには大変有用なのですが現行のバージョンと設定の仕方が違うため、参考とする場合は注意が必要です。
現行バージョンに対応したサンプルですが、Unity Forumのコメントでは"Coming soon!"とのことなので期待して待ちたいと思います。
どんなAIなのか
AI Plannerは「ゴール指向プランニング」なゲームAIです。
一言でゴール指向プランニングと言っても色々な種類があるのですが、AI Plannerは比較的シンプルな仕組みである「フォワードプランニング」を採用しているようです。
フォワードプランニングは選択肢(アクション)の全組合せを想定して、その中から目的(ゴール)を達成しているパターンを見つける方式です。
ゴールまでの様々な実行パターンを生成しつつ、報酬(Reward)を基に適切なものを決定して実行します。
ここ(パターンの生成)にDOTSベースであることが役立っているようです。
作ってみた。
最新バージョン【 0.2.4preview 】での設定と動作確認を兼ねて簡単なプロジェクトを用意しました。
GitHubにて公開していますので学習などにご利用ください。
もう少し詳しく。
先ほどのサンプルプロジェクトを例にAI Plannerを動作させるのに必要なファイルやコンポーネントについて紹介します。
AI Planner をセットアップすることは Decision Controller を正しく設定すること
「解決する領域」「選択肢(アクション)」「ゴール」を決めることでAI Plannerは計画を立案と実行を行うことが可能となります。
その際に必要な情報は Decision Controller というコンポーネントに集約していくことになります。
このコンポーネントを正しく設定するのには幾つかのファイルが必要となっています。
- Trait Definition (GameObjectに設定する特性)
- Action Definition (選択肢・アクション)
- Action Callback Method (アクションをシーンに反映するスクリプト)
- Termination Definition (プランの終了条件)
- Problem Definition (問題領域の定義)
それぞれの役割について説明していきます。
1. Trait Definition
シーン上のGameObjectに付加する特性の定義ファイルです。
AI Planner に認識される= プランニングの対象となります。
2. Action Definition
Traitを操作する選択肢である Action のルールの定義ファイルです。
どのような条件のときにどのような操作を行うかを設定します。
- Preconditions(実行条件)
- Effects(Traitの操作内容)
- Reward(報酬)
3. Action Callback Method
AI Plannerが Action を実行時する際に呼び出すコールバックメソッドをC#にて定義します。
シーン上のGameObjectを操作するのが主な利用方法になります。
2つのAction
Action Definition と Action Callback Method の役割の違いと関係性は大まかに言うと以下の様になります。
- Action Definition は AI Plannerがプランを作成して実行する為の選択肢を定義、Traitの状態を変更する
- Action Callback Method は AI Planner実行されたActionに合わせてシーン上のオブジェクトを変更するメソッド(C#)
4. Termination Definition
プランの終了条件(Criteria=基準)を設定する定義ファイルです。
AI Plannerは定義された終了条件を満たすと、その時点でプランの実行終了します。
- Criterai(Planの終了条件・クライテリア)
5. Problem Definition
プランを立てる際の条件を設定する定義ファイルです。
選択肢として使用するActionとゴールとなるTerminationを設定します。
- Actions(Traitを操作するルール)
- Terminations(終了条件)
Decision Controller
計画を立てて実行するコンポーネントです。
これまで出てきた定義ファイルやスクリプトファイルを設定していくことでAI Plannerの実行条件を教えることが出来ます。
- Problem Definition の指定をする(使用するActionとTermination(終了条件)が設定される)
- Action と コールバックメソッドの関連付けを行う(Action実施時にコールバックメソッドの呼び出しを行う)
- Trait が設定されたGameObjectを登録する条件を設定する(条件に合ったGameObjectが自動で登録される)
やってみよう。
ここからは実際にプロジェクトの設定をしてみたい人向けの手引きとなります。
用意した学習用プロジェクトをサンプルに、定義ファイルやスクリプトの作成方法を説明していきます。
準備
準備① パッケージインストール
先ずはAI Plannerのパッケージをインストールするところからになりますが、Unity 2020ではPreview版のパッケージは一部のみしか表示されないようになりました。
AI Plannerも表示されないパッケージとなりましたのでURLを指定してインストールする方法を紹介します。
手順
- メニューより Window → Package Manager を選択してウインドウを表示
- 左上の + ボタンより「Add package frome git URL...」を選択してAI PlannerのURL【 com.unity.ai.planner 】を入力してインストールを実行
詳しくは公式を確認して頂くのが良いと思います。
準備② シーンの作成
シーン上にAI Plannerのプランの対象とするGameObjectをいくつか配置します。
- Eater(捕食者) → 青い四角
- Goal(ゴール) → 赤い丸
- Feed(餌)を2つ → オレンジの丸
置き方は基本自由ですが、ここでは下の図のように設置しています。
準備③ ルールを決める
AI Plannerはルールに沿って計画を立てて順番通りに実行するゲームAIライブラリなので、どの様な動きにするかを決めてそれを定義ファイルやスクリプトに落とし込んでいきます。
サンプルプロジェクトでは以下のルールを設定しています。
ルール
- Eater(青い四角) が移動して Feed(オレンジの丸) とGoal(赤い丸)を食べる
- Goal(赤い丸) はいちばん最後に食べる
- 全部食べたら終了
定義ファイルとスクリプト
準備が出来たら定義ファイルとスクリプトを用意していきます。
1. Trait Definition
1-1. Definitionファイルの作成
GameObjectに設定するTrait(特性)の定義ファイルを作成します。
手順
Projectウィンドウ上で右クリック、Create → Semantic → Trait Definition
サンプルプロジェクトでは以下の3つのTrait Definitionファイルを作成しました。
1-2. プロパティ
プロパティはTraitが持てる変数です。
サンプルプロジェクトでは食べた数をカウントするプロパティを EaterTrait に用意しています。
手順
- プロジェクトウィンドウでEaterTraitを選択
- インスペクタに表示されるPropertiesにIntegerのプロパティを追加してEatCountに名称を変更
1-3. Traitのビルド
Trait Definitionが準備出来たらSematicメニューからTraitをビルドします。
これによりGameObjectにTrait(特性)を付与出来るようになります。
手順
- メニューより、Semantic → Traits → Build を実行
1-4. GameObjectへの設定
作成したTrait(特性)をGameObjectに付加することで、AI Plannerの計画に組み込みます。
サンプルプロジェクトでは各GameObjectに以下のTraitを付加しています。
Traitの付加はSematicObjectコンポーネントを使って行います。
手順
- Traitを付加するGameObjectを選択
- SematicObjectコンポーネントを付加
- SematicObjectコンポーネント内の ⊕ ボタンを押下して付加するTraitを選択する
以下ではEaterのGameObjectに EaterTrait、Location、Moveable を設定しています。
EaterTraitの他に指定している2つの特性「Location」と「Moveable」は、AI Plannerに用意されている既存の特性となります。
- Location を付加することでGameObjectのLocationを参照できる様になります。
- Moveable は移動するGameObjectであることをAI Plannerに示すことが出来ます。
同様の手順でFeedとGoalのGameObjectにもTrait(特性)の設定を行っています。
ただしFeedとGoalは移動しないのでMoveableは付加していません。
Feedの設定
Goalの設定
2. Action Definition
Actionは実行条件と実行時の効果(操作)を設定することでAI Plannerが計画を立てる為の選択肢として機能します。
- Preconditions(実行条件)
- Effects(Traitの操作)
- Reward(報酬)
また各項目を設定するのに変数として利用するパラメータを設定することが出来ます。
- Parameters(パラメータ)
2-1. Action Definitionファイルの作成
Traitを持ったオブジェクトを操作するActionの定義ファイルを作成します。
手順
Projectウィンドウ上で右クリック、Create → AI → Planner → Action Definition
サンプルプロジェクトでは以下の3つのAction Definitionファイルを作成しました。
- FeedEatAction 「 餌(FeedTrait)を食べる」
- GoalEatAction 「ゴール(GoalTrait)を食べる」
- WalkAction 「(Moveableを)移動する」
2-2. パラメータの設定
Trait Definitionをパラメータとして定義することでAction内で利用することが出来ます。
AI Plannerで用意されているLocationとMoveableも指定可能です。
- Location を指定することでGameObjectのLocationを利用可能となります。
- Moveable を指定することで対象とするTraitを「Moveableが指定されている(指定されていない)Trait」に限定します。
2-3. Actionの定義
作成したAction Definitionの設定を行っていきます。
FeedEatActionの設定
「餌を食べる」というアクション(選択肢)を作成します。
① パラメータ(Parameters)
「餌を食べる」というアクションは EaterTrait が FeedTraitに重なったときに餌(FeedTrait)を削除するという動作とします。
この時に利用する EaterTrait と FeedTrait をパラメータとして定義します。
② 実行条件(Preconditions)
パラメータを利用してアクションの実行条件を設定します。
Location から参照できる Position(位置)を判定し、EaterTraitとFeedTraitが同じ位置であることを条件としています。
③ 操作(Effects)
(実行条件と同じく)パラメータを利用してTraitをどの様に操作するかを設定します。
ここでは2つの内容を同時に行っています。
- EaterTraitの持つプロパティ EatCount を1つ加算
- FeedTrait を削除(Removed)
ここでの削除(Removed)でFeedTraitが設定されるGameObjectが削除される訳ではないということに注意してください。
④ 報酬(Reward)
アクション実行時の報酬を設定します。
AI Plannerは報酬の合計が高くなるように計画を立てて実行します。
報酬は優先順位ではないことに注意してください。
GoalEatActionの設定
基本的な手順はFeedEatActionと同じとなります。
ここではサンプルプロジェクトで設定している値のみを紹介します。
WalkActionの設定
基本的な手順は上2つと同じとなります。
特徴として UnmovableTarget パラメータの指定に論理否定(赤の⊕への設定)の方に Moveble を指定してます。
これは「Movebleが指定されていない」ことを意味しています。
サンプルプロジェクトでは FeedTrait、GoalTrait、EaterTrait の3つのTraitがあります。
この内「Movebleが指定されていない」のは FeedTrait、GoalTrait の2つになりますので、UnmovableTargetパラメータは FeedTrait、GoalTrait の2つを指すことになります。
また、報酬に LocationDistance を使っており、その引数としてパラメータの Eater と UnmovableTarget を指定しています。
これは2点間(EaterとUnmovableTarget)の距離をReward(報酬)の計算に使用する為の設定で、Base Value に設定した値より減算(-=)することで、距離が遠いほど報酬が減るという設定を行っています。
3. Action Callback Method
Action Callback Method はアクション実行時に呼び出すコールバックで、主にシーン上のGameObjectの操作に利用します。
サンプルプロジェクトでは以下の2つのコールバックメソッドを用意しました。
ファイル自体はUnityで通常使うC#ファイルと同じ作成の方法となりますので、詳細は省略します。
Move
Lerpを使用してGaneObjectを移動させます。
public IEnumerator Move( GameObject target )
{
while (target != null && ! IsArrival( target ) )
{
transform.position =
Vector3.Lerp (
transform.position, target.transform.position, 0.03f );
transform.LookAt ( target.transform.position );
yield return null;
}
}
DestroyObject
DestroyImmediateを使用してGaneObjectを削除します。
削除に0.3秒止めていますが、これを動きを確認する為のものです。
public IEnumerator DestroyObject( GameObject target )
{
DestroyImmediate ( target );
yield return new WaitForSeconds ( 0.3f );
}
4. Termination Definition
Termination Definitionにて終了条件を指定することでAI Plannerを終了させることが出来ます。
継続的に動き続ける様なゲームAIを作成したい場合は指定をしないことも可能です。
その場合、 Termination Definitionファイルの作成は不要となります。
4-1. Termination Definitionファイルの作成
手順
Projectウィンドウ上で右クリック、Create → AI → Planner → State Termination Definition
サンプルプロジェクトでは FoodEaterTermination という名前でファイルを作成しました。
4-2.Termination Definitionの設定
Termination Definitionの設定項目は以下の3つになります。
- Parameters(パラメータ)
- Criteria(終了条件)
- Terminal Reward(報酬)
サンプルプロジェクトのFoodEaterTerminationファイルでは以下の様な設定を行っています。
① Parameters(パラメータ)
パラメータは終了条件で使用する特性(Trait)を定義します。
パラメータには終了条件 EatCount をプロパティとして持つ EaterTrait を参照できるよう Eater を定義しています。
② Criteria(終了条件)
終了条件にはパラメータが取り得る状態を設定します。
FoodEaterTerminationではEaterTraitに用意したプロパティ EatCount が3になったらという終了条件を設定しています。
これは「準備③ ルールを決める」で定義した「全部食べたら終了」というルールに沿ったものとなります。
アクション FeedEatAction、GoalEatAction の実行時にEaterTraitのEatCountを加算する操作(Effects)を設定しているため、シーン上の全FeedとGoalを削除した時点でEatCountの値は3となり終了条件が満たされます。
③ Terminal Reward(報酬)
Terminal Reward は終了条件が満たされた場合に加算される報酬となります。
計画がゴールするのは良いことなのでアクションより高い値を設定しました。
5. Problem Definition
AI Plannerがプランを立てて実行するのに必要な条件(問題領域)を定義します。
5-1. Problem Definitionファイルの作成
手順
Projectウィンドウ上で右クリック、Create → AI → Planner → Problem Definition
サンプルプロジェクトでは FoodEaterProblemDefinition という名前でファイルを作成しました。
5-2. Problem Definitionの設定
Problem Definitionの設定項目は以下の2つになります。
- Actions(プランの作成に使用するAction)
- Terminations(終了条件)
サンプルプロジェクトのFoodEaterProblemDefinitionでは以下の様な設定を行っています。
① Actions(プランの作成に使用するAction)
作成したAction Definitionファイル FeedEatAction、GoalEatAction、WalkAction を設定しています。
この設定によりAI Plannerが計画を立てるときの選択肢として利用できるようになります。
② Terminations(終了条件)
作成したTermination Definitionファイル FoodEaterTermination を設定しています。
この設定によりAI Plannerが終了条件(ゴール)を達成するように計画を立てて実行します。
Termination Definitionでの記載しましたように一定の動きを繰り返すような場合には終了条件の設定は不要です。
6. Decision Controller
定義ファイルとスクリプトファイルの準備が出来たら Decision Controller を構築します。
Decision Controllerを正しく設定することでAI Palnnerは計画を立てて実行を行い、シーン上のオブジェクトを動かし、プランを完了させることが出来ます。
6-1. Decision Controllerコンポーネントの付加
Decision ControllerはコンポーネントなのでGameObjectにAdd Componentして利用します。
Decision Controllerはシーン上にあれば動作するので、どのGameObjectに付けても大丈夫です。
サンプルプロジェクトでは DecisionController オブジェクトにAdd Componentしています。
6-2. Decision Controller コンポーネントの設定
Decision Controller コンポーネントの設定は以下の3つになります。
- Problem Definition(プランの作成に使用するProblem Definition)
- Available actions from the plan(Action DefinitionとAction Callback Methodの紐付け)
- Semantic Query(プランの対象とするGameObjectの条件)
サンプルプロジェクトのDecision Controllerでは以下の様な設定を行っています。
① Problem Definition(プランの作成に使用するProblem Definition)
Problem Definitionファイルを設定することで(Problem Definitionの)Actions に設定している Action Definition が、(Decision Controllerの) Available actions from the plan に自動で設定されます。
サンプルプロジェクトでは Problem Definition ファイル FoodEaterProblemDefinition を設定しており、FoodEaterProblemDefinition に設定した FeedEatAction、GoalEatAction、WalkAction が Available actions from the plan に設定されています。
② Available actions from the plan(Action DefinitionとAction Callback Methodの紐付け)
登録されたActionに対する Action Callback Method の指定を行います。
サンプルプロジェクトでは3つのActionに対して Move、DestroyObject のコールバックメソッドを設定しています。
その際、コールバックメソッドに引数として渡す値(GameObject)を(Problem Definitionに設定した) Action Definition の Parameters の中から指定します。
③ Semantic Query(プランの対象とするGameObjectの条件)
Semantic Query を作成、設定することでAI Plannerが対象とするシーン上のGameObjectを Decision Controller に設定することが出来ます。
Semantic Query の作成は Decision Controller コンポーネント上で実行でき、作成したファイルがそのまま設定されます。
Semantic Query は作成された時点でシーン上のTraitを持った全てのGameObjectを対象としますが、設定を行うことで距離などの制限を付けることが出来ます。
サンプルプロジェクトではデフォルトの状態のままとしている為、シーン上のTraitを持った全てのGameObjectが Decision Controller に登録されています。
AI Planner のビルド
Decision Controller の設定が出来たら AI Planner のビルドを行います。
手順
- メニューより、AI → Planner → Build
無事にビルドが通ったら完了です。おつかれさまでした。
より活用したい人向けの情報
本記事は「AI Planner入門」という形でサンプルプロジェクトを例にしてどの様なファイル、設定、スクリプトが必要か、それらがどの様に結びついてくるかを(ざっとではありますが)説明したものになります。
より活用したい人向けに公式マニュアルの Custom Planner Extensions ページと Unity Forum の AI & Navigation Previews のスレッドを紹介しておきたいと思います。
Custom Planner Extensions
AI Plannerはインスペクタの設定だけで条件付けがある程度出来るようになっており本記事でもインスペクタ上で出来ることを中心に構成しましたが、実際に活用するためにはアクションの実行条件、報酬設定、終了条件などゲームロジックに合わせて動的に変更する必要が出てくると思います。
そうしたより複雑な設定を行うため AI Planner はC#での実装を行う interface が用意されています。
以下のページにInterfaceの利用方法が解説されていますので参照ください。
AI & Navigation Previews
UntiyオフィシャルのAI関連のフォーラムです。
AI Planner に限らずUL-AgentやNevMeshなどについての質問やディスカッション、バグ報告などが行われています。
AI Planner は公式のTwitterなどを見ていても情報が流れてこないのですが、フォーラムを見に行くと新しい情報があったり他の開発者の方からの質問に公式が答えていたりして安心します。
最後に。
AI Planner はやっと出てきたUnityのゲームAIとなります。
未だこれからの部分も多々ありますが実験的なプロジェクトなどで使ってみても良いのではと思えるくらいに充実した内容となっております。
興味を持ちましたら是非公式サンプルや動画を見てみて下さい。
本記事が AI Planner の普及と開発者の方の一助となることを願っています。