Project Unknown's Blog

Peojct.Unknownと言う名前で細々とアプリ開発をやってるメンバーのブログです。

A* Pathfinding Project Proを使ってみる

Navmeshの使い方もままならないのに、A* Pathfindingに手を出してしまって、Sample的な使い方をしているのでそのメモ。

以下は今回作ったものです。 適当にTerrainを用意して、カプセルをPlayerに、スフィアを目的地としています。

パターン1 直線距離で移動できる f:id:project-unknown:20170601012308g:plain

パターン2 直線距離を崖で塞ぐ f:id:project-unknown:20170601012440g:plain

うむ、まだNavmeshとの機能差異はさっぱわからない(;・∀・)

とりあえず、ここまでやった内容をメモがてらに記載します。


(Terrainとカプセル、スフィアを作るところは流石に割愛)

まず、A*をSceneに配置する為に空のGameObjectを置きます。 このObjectに「Pathfinder」をアタッチします。 f:id:project-unknown:20170601012719p:plain (Pathfinderでアタッチしたのに、ComponentがAster Path(Script)となっているのは気にしない)

そうすると、↓のようなComponentがアタッチされます。 f:id:project-unknown:20170601012830p:plain

GraphsがNavmeshっぽい所を意味しているっぽく、とりあえず意味も分からず「Grid Graph」を選択します。 すると追加されるので、Grid Graphの中身を見てみます。

f:id:project-unknown:20170601013022p:plain 上記のWidthとDepthはAの適用範囲を指しており、1010で指定すると以下のように見えます (後述しますが、nodeのサイズを10*10で敷き詰めています)

f:id:project-unknown:20170601013153p:plain 今回のTerrainを100100に設定しているので、Aもそれに合わせておきます。

次にnodeですが、これを細かく設定するときめ細やかにA*が設定され、小道などの小回りが聞くようになりますが高負荷っぽいです。 以下は、0.1で設定した際のキャプチャ f:id:project-unknown:20170601013545p:plain 今度は2で設定した際のキャプチャ f:id:project-unknown:20170601013608p:plain

Max Climbは登ることが出来る高さを設定しているっぽく、ここを大きく設定すると、頑張って崖を登るようになりました。 f:id:project-unknown:20170601013807g:plain

後はまだ良くわかってないので割愛(;・∀・)

このタイミングで、Scanを押してみると、設定したA*がどのように貼られるのかが見ることが出来ます。 f:id:project-unknown:20170601013858p:plain

次にカプセルにNavmeshで言うところのagent設定を行います。

まず、SeekerのComponentをアタッチします。 f:id:project-unknown:20170601014022p:plain

次に、カプセルにagent設定を行います。 今回はサンプルとして、「SampleAI.cs」を作って最低限必要な処理を書きます。

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

[RequireComponent(typeof(Seeker))]
public class SampleAI : AIPath {

    void Start () {
        base.Start();
    }
    
    void Update () {
    }
}

(ほんとうに基礎の基礎ですな…

[RequireComponent(typeof(Seeker))]

を宣言することで、HierarchyでA* agentのパラメータが設定出来るようになります。

f:id:project-unknown:20170601014337p:plain ここのTargetにゴールとなるGameObjectを設定し、Speedとかをちょいちょいといじります。

void Start() {
    base.Start();
}

上記で経路探索して、移動を開始します。

途中で経路を再計算したい際は

base.Update();

で行けるっぽい。

ここまで設定することで、以下のように簡単に経路探索が出来るようになりました。 f:id:project-unknown:20170601012440g:plain

まだまだ初歩の初歩なのでNavmeshのほうが遥かに使えそうに見えますが…もうちょい勉強を重ねます。。。


https://www.assetstore.unity3d.com/jp/#!/content/87744

A* Pathfinding Project