Unity

Behavior Designerで超簡単なAIを作る回 (Day1)

More than 1 year has passed since last update.


Behavior Designerを使ってAIを作ってみる

Behavior DesignerをImportし、さっそくAIを作り始める。

Seekを追加したところで"NavMesh"がないよ!と怒られる。

Seekを使うには、NavMeshが必須らしい。


NavMesh

Unity公式のリファレンスを確認

ナビゲーションと経路探索

簡単にまとめると、NavMeshが歩行可能な面のデータであり、NavMesh Agentはそのデータを元に経路探索を行う。

連続した面ではなく、溝やフェンスを飛び越えるなどを可能にするにはOff-Mesh Linkを使用する。

また、NavMesh Obstacleは障害物となるオブジェクトを指す。

SnapCrab_NoName_2017-8-12_3-53-49_No-00.png

NavMeshはジオメトリから自動的に生成される。

おもちゃラボさんのブログがとてもわかりやすいです。

【Unity】NavMeshで経路に沿って動かす

スクリプトはこんな感じ。


NavMeshTest.cs

using System.Collections;

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class NavMeshTest : MonoBehaviour
{
[SerializeField]
private Transform _target;

private NavMeshAgent _agent;

private void Start()
{
_agent = GetComponent<NavMeshAgent>();
}

private void Update()
{
_agent.SetDestination(_target.position);
}
}


とっても簡単に障害物を避けつつ、目標に向かって進むAIが完成。

SimpleNavMesh.gif

よく見るとAIの端が障害物にかすってるように見えます。

これはベイク時の初期設定でAgetn Radiusの値が0.5になっていたからで、Sceneビューで確認すると壁に沿ってパスが引かれてしまっています。

SnapCrab_NoName_2017-8-12_4-23-5_No-00.png

これを回避するために値を2にします。

こうすることで壁から余裕をもってパスを引くことができました。

SnapCrab_NoName_2017-8-12_4-26-42_No-00.png

無事、壁にぶつからず、すれすれで障害物を避けるようになりました。

SimpleNavMesh2.gif


Behavior Designer

また、先ほどエラーで怒られたBehavior DesignerのEditor上でSeekを追加することで同様の挙動をすることが確認できました。

SnapCrab_NoName_2017-8-12_4-48-35_No-00.png

最終的に以下のようにすることでNavMesh内でTargetの探索を行い、視界に捉え次第、捕獲に向かうAIができました。

SnapCrab_NoName_2017-8-12_5-25-22_No-00.png


おまけ


Abort Typeの違い

SequenceのInspectorを確認すると、Abort Typeというプルダウンがあり、None, Self, Lower Priority, Bothの4つから選択することができます。

これが少し紛らわしいのですが、先ほど作成したTreeをベースに説明すると、今回のケースでは実行直後にAIの視界内にTargetはいないのでCan See ObjectFailureを返します。

その後はSearchRunningとなり、探索を行ったきりになってしまい、Seekに行くことはありません。

これはBehavior Designerでは最適化のために他のノードが実行中のとき、他のノードは実行されないからです。

今回のケースではSearch中であっても、視界内にTargetを捉え次第Can See ObjectからSeekに遷移して欲しいのでSequenceのAbort TypeをLower Priorityに変更します。

このようにすることでSearchを実行中でも、Can See Objectは常に評価され、Successを返し次第Seekが実行されます。

Selfに変更すると、Seekが実行中であっても、Can See ObjectFailureを返し次第Seekに遷移させることができます。

BothLower PrioritySelf、両方を有効にしたい時に使用します。

Day2につづく

超簡単なAIを作る回 (Day2)