hirukoTimeのUnity備忘録

Unityでゲームを作成してます。

【Unity】A* Pathfinding Project Pro 試してみた

・GridGraphのグリッド間の障害物で接続のブロック


グリッド配置のSRPG系のゲームで障害物をグリッド上ではなく、グリッドとグリッドの間に障害物を配置して、その間の接続をブロックする方法。


基本的にアセットの仕様として、移動阻害をする場合はグリッド自体を無効にする処理になるので、障害物としてオブジェクトを配置をする場合は、このようにグリッド(Node)自体が無効になる。

※赤い四角は無効になってるNodeの表示。緑のラインはNode-Nodeの接続


こんな感じでNodeは無効にせずに、接続だけをなくしたい時の方法。

公式のドキュメントにはやり方が見つからなかったのですが、フォーラムの方を探していたら数年前のスレッドだが、参考になるスレッドがありました。
スレッド自体がかなり前なので、修正すべきスクリプトの位置が大分違ったので苦労しました。

GridGenerator.cs/Class::GridGraph

public virtual bool IsValidConnection (GridNodeBase node1, GridNodeBase node2) 
{
    if (!node1.Walkable || !node2.Walkable)
    {
        return false;
    }

   
    //追加部分↓
    if (Physics.Linecast((Vector3) node1.position, (Vector3) node2.position))
    {
        return false;
    }
    //追加部分↑
    
    if (maxClimb <= 0 || collision.use2D) return true;
 
 //変更がないので省略
}

Graph生成時?Scan時?にNode間にLinecastし、障害物がある場合はConnectionを生成しないようにしている。実際に使用する場合はLinecastの第三引数にLayermaskを設定した方がいい。
GridGraphクラスは専用のEditorScriptが存在するのでLayermask変数を用意してInspectorから設定したい場合は
Assets/AstarPathfindingProject/Editor/GraphEditors/GridGeneratorEditor.cs
を編集する必要があるので少し手間がかかる。