14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-13

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)

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?