UnityのAI Planner
UnityがGDC2019でAI Plannerについて発表していた。
今のところ(バージョン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で移動量を反映させたい場合、前提条件でどうにか移動距離を制限するなどすればいいだろうか。この辺りはちゃんと触ってみる必要がある。