hasht's notes

ゲームAIやUnityの話題

UnityのAI Planner

UnityがGDC2019でAI Plannerについて発表していた。

schedule.gdconf.com

今のところ(バージョン0.0.1)は正直GUIの挙動が怪しくてよく分からないが、プランニングシステムとして汎用的で良くできいそうなので、その設計についてメモ。 Unity 2018からのEntity Component Systemをベースにしているらしい。

仕組み

大雑把に言えばAI Plannerは

  • trait
  • action

の2要素で動く。

traitがいくつかフィールド(名前と値の組)を持っていて、それをエージェントやオブジェクトに持たせる。 actionはエージェントやオブジェクトに対してtraitの値を操作する。オブジェクト自体を作ったり消したりもできる。

domainとtrait

traitはdomainの中に定義する。

Unity公式の提供するOttoというサンプルプロジェクトでは、Inventory、Need、LocationやTimeといったtraitの他にBedやAgentといった特にフィールドのないtraitもあり、actionの対象を特定する機能と値を保持する機能を別々のtraitに担わせているのが分かる。

domainにはもう一つaliasを定義できる。traitのセットをaliasとして設定するとactionの定義などで利用できる。(UI上だけのものでコードには特に反映されない)

action

Assets→Create→AI→Plan Definitionで作ったアセットにactionを追加していくのだが、どちらかと言うとAction Definitionなのではないかという気がする。Ottoでのファイル名もWorkaholicActions.assetだし。

actionには

  • パラメータ
  • 前提条件
  • 効果
  • 報酬/コスト
  • Operational Action(実装)

を指定する。

パラメータにはそれぞれ要求するtraitが決められる。aというパラメータにAgentとLocationを指定すれば、aは場所を参照できるエージェントになっている筈(ちゃんと運用されていれば)。bをBed、Locationとしてa.Location.Position == b.Location.Positionといった前提条件を置き、効果をaの睡眠欲の低下(aにそういうtraitをまた指定しておく)とすれば睡眠のactionができる。

報酬/コストは固定値なので、例えば移動のactionで移動量を反映させたい場合、前提条件でどうにか移動距離を制限するなどすればいいだろうか。この辺りはちゃんと触ってみる必要がある。