ながつきぶろぐ

Unityのこととかゲームのこととか書けたらよいなブログ。

Arbor3のビヘイビアツリーでAIをつくる【前編】

この記事は、「Unity アセット真夏のアドベントカレンダー 2018 Summer!」8/27分の記事の前編になります。
Unity アセット真夏のアドベントカレンダー 2018 Summer! – Unity公式 Asset Portal

私は、「Arbor3」というアセットでAIを作るという内容を書かせていただきます。
珍しく文章盛り盛りです。2部構成です。
後編はこちら。 nagatuki.hateblo.jp




Arbor3について

Arbor3はステートマシンとビヘイビアツリーが使えるビジュアルスクリプティング(ソースを書くことなく見たままに処理を組み立てることができる)エディターアセットです。
「ソースを書くことなく」とは書きましたが、ソースを書いて自作の制御を作ることもできます。

ビジュアルスクリプティングのアセットは「PlayMaker」や「Bolt」など他にもいろいろあるのですが、
日本製なので翻訳に頼らなくてよいのと直接スクリプトリファレンスが見れるところが推しです。

f:id:nagatuki_elv:20180611205031p:plain また、こういう感じのキャプチャがボタン1つで撮れるようになっており、個人的にはこの機能がお気に入りです。
私がこのアセットの存在を知ったのは去年のUnite2017の講演(ららマジのAIの話)で、その時はArbor2でした。
こちらはその2のアップグレード版になります。Arbor3からビヘイビアツリーが追加されました。
(ちなみにArbor2はArbor3と入れ替わりで配信停止になりました)

公式サイトはこちら。
arbor.caitsithware.com チュートリアルや体験版(ゲーム開始から2分間のみ有効、コアの処理編集不可など制限あり)もあるのでぜひどうぞ。
ぶっちゃけ公式様のチュートリアルだけで十分なんじゃないかなと思います。

ビヘイビアツリーについて

ビヘイビアツリーとは、条件分岐と優先度をもとに、処理の流れを制御しやすくするための機構です。
その性質から、主にAIを作るのに向いていると言われています。(多分)
※同じくArbor3で扱っている「ステートマシン」については今回関係ないので割愛します。

f:id:nagatuki_elv:20180611205041p:plain


細かい制御については後述の解説にて記載します。

解説

Arbor3をプロジェクトにインポートしている前提で書いていきます。
念のため、制作環境は以下の通り。

  • Unity2018.1.5f1
  • Arbor 3.2.3

作るAIの例

今回は、以下のAIを作る手順を紹介いたします。

  1. 一定のルートをウロウロする
  2. プレイヤーが一定の距離より近い位置にいると立ち止まる
  3. プレイヤーにさらに近づくと近づいてくる
  4. プレイヤーからの距離が離れると、1のルートに戻って再度ウロウロする

ステージを作る

AIを作るまでの部分は既存のサンプル、もといチュートリアルで簡略化しちゃいます。
詳しくはこちらもご覧ください。
arbor.caitsithware.com
以下の画像のところ(Assets\Plugins\Arbor\Examples\Common)にFloorObjects.prefabがあるので、そちらをHierarchyにドロップします。
f:id:nagatuki_elv:20180815104726p:plain

操作キャラクターを作る

Standard AssetsのThirdPersonCharacterを使います。
メニューバーから「Assets」→「Import Package」→「Characters」を選択して必要なプロジェクトをインポートします。
f:id:nagatuki_elv:20180815105456p:plain

続いて、Assets\Standard Assets\Characters\ThirdPersonCharacter\PrefabsにあるThirdPersonController.prefabをHierarchyにドロップ。
f:id:nagatuki_elv:20180815105751p:plain

そのままだと壁に埋まっているのと小さいので、
配置した「ThirdPersonController」のTransformのPositionを(0, 0, -10)、
Scaleを(5, 5, 5)あたりに変えちゃいましょう。
分かりやすいよう、名前も「Player」に変えてしまいます。

カメラをいじる

ホントはプレイヤーに追従とかさせた方が見やすいんだろうけど、バッサリ割愛します。
「Main Camera」のTransformのPositionを(0, 45, -20)、Rotationを(70, 0, 0)に設定して、
ステージを見渡せるようにします。
f:id:nagatuki_elv:20180818220436p:plain

AIキャラクターを作る

続いて、前述のAI動作をさせるキャラクターを作っていきます。

キャラクターを生成

「Hierarchy」で右クリック、またはメニューバーの「GameObject」から「3D Object」→「Capsule」を選択し、楕円球体を生成します。
続いて、その球体のTransformのPositionを(0, 1, 10)に変更してステージ上に配置します。
あと、適当に「Enemy」辺りに名前を変えてしまいましょう。
f:id:nagatuki_elv:20180821221454p:plain 見た目はともかく、敵のキャラクターができました。

コンポーネント配置

作成したEnemyに対して、「Inspector」から「Add Component」を選択し、
NavMeshAgent」、「AgentController」、「BehaviourTree」をアタッチします。

続いて、「AgentController」の「Agent」にEnemy自身をドラッグして、自身のNavMeshAgentを参照するようにします。
「Animator」にAnimatorをアタッチすれば、移動や回転に合わせてパラメータを付与することができるのですが、今回は使わないので割愛します。

f:id:nagatuki_elv:20180821222635p:plain

決まったルートを歩くようにする

ここまでが下準備。ここからようやくAIについて触っていきます。長い…

道筋(Waypoint)を作成する

「Hierarchy」で右クリック、またはメニューバーの「GameObject」から「Create Empty」で空のオブジェクトを作成します。
そちらには「Waypoint」と名前を変えておきます。

続いて、そのWaypointに対して同じく「Create Empty」を4つほど行います。
それらのオブジェクトは以下の設定にしましょう。

  • 名前を「point1」、positionを(10, 0, 10)
  • 名前を「point2」、positionを(-10, 0, 10)
  • 名前を「point3」、positionを(-10, 0, -10)
  • 名前を「point4」、positionを(10, 0, -10)

その後、「Waypoint」に対して「Waypointコンポーネントを追加します。
「Points」の+ボタンを4回押して、先ほど追加した4オブジェクトを順番に配置します。

f:id:nagatuki_elv:20180821223707p:plain

このように、緑色の線ができていればOKです。

AIの作成

「Enemy」を選択し、少し前に追加した「BehaviourTreeコンポーネントの「Open Editor」ボタンを押します。
「Arbor Editor」というウィンドウが立ち上がります。

そのウィンドウのグラフエリア内で右クリックをし、「アクション作成」を選択すると、
コンポーネントを選ぶ画面が表示されます。
f:id:nagatuki_elv:20180821224217p:plain こちらは、「アクション」と呼ばれる処理のみが一覧に並ぶ、特殊なコンポーネント選択になります。(アクションについては後述)

AgentMoveOnWaypoint」を選択し、「Waypointに沿って移動する」処理ノードを追加しましょう。
追加したノードには、以下の設定を行います。

  • AgentController:Enemyオブジェクトをドラッグ
  • Speed:5
  • Waypoint:Waypointオブジェクトをドラッグ
  • Type:Cycle(いわゆるループ)

また、「Root」ノードの下に矢印があるのですが、こちらから「AgentMoveOnWaypoint」の上部にある矢印にドラッグして、
先ほど設定した処理を実行できるようにします。

f:id:nagatuki_elv:20180821225000p:plain

このようになっていれば、一旦は作成完了。

f:id:nagatuki_elv:20180821225714g:plain

実行すると、作成したwaypointをもとにEnemyオブジェクトが移動するようになります。
※もしNavmeshのエラーがいっぱい出る場合、ステージに対してNavmeshのBakeができていない可能性があります。
(これまでに道筋を作ってきましたが、いわゆる自動でたどるための足場が生成できていない状態)
その場合は、「Window」→「Navigation」で「Navigation」を開き、「Bake」メニューの「Bake」ボタンを押すことでいけるようになるはずです。
f:id:nagatuki_elv:20180821225410p:plain

後半に続く

長くなりすぎたので当記事ではここまで。
続きは以下からどうぞ。

nagatuki.hateblo.jp