ZoneGraphのAdjacentリンク登録に関する挙動の確認

Unreal Engine の ZoneGraph 機能について、挙動が想定と異なるケースがありましたので、仕様かバグかご確認をいただきたいです。

<br/>

概要

ZoneGraph のビルド処理において、特定条件下で隣接レーン(Adjacent タイプのリンク)が正しく登録されていないのではないかと思われるケースを確認しました。

<br/>

この挙動が意図された仕様なのか、それともバグなのかを教えていただきたいと思っています。

また、もしバグであれば修正対応の予定についてもお伺いしたいです。

<br/>

前提の理解

現状の仕組みに対する理解として、

ZoneGraph におけるレーンデータには接続情報を保持するために「LaneLinks」の範囲インデックスが格納されており、

この Links には以下の3種類があると認識しています:

  • Outgoing: レーンから出ていく接続
  • Incoming: レーンに入ってくる接続
  • Adjacent: 隣接するレーンの接続

このうち Adjacent については必ず相互に登録されるものだと予想しています。

<br/>

発生している現象

特定の条件下で、隣接しているレーンが Adjacent タイプのリンクとして相互に登録されない場合があります。

具体的には、レーンAとレーンBが隣接しているときに、以下のようになることを確認しました:

  • レーンAの Links には Adjacent としてレーンBが登録されている
  • 一方で、レーンBの Links には Adjacent としてレーンAが登録されていない

<br/>

発生条件

手元で確認した限り、以下の条件でこの現象が発生しています:

  • ZoneShape のタイプが「Polygon」である
  • 各頂点に異なるレーンプロファイルを設定している
  • 細いレーンプロファイルが設定された頂点から、より太いレーンプロファイルが設定された頂点へ繋がるレーンにて発生する

<br/>

原因について

少し ZoneGraphBuilder のコードを確認してみたところ、FZoneGraphBuilder::ConnectLanes()内の処理が原因ではないかと考えています。

<br/>

現状の理解では、Polygon タイプのレーンはこの関数が呼び出される以前に接続先が InternalLinks としては登録されず、以下の条件内で Links が算出されていると認識しています。

> if (AdjacentLaneCount == 0)

<br/>

この中の処理でコメントに「Assumes adjacent lanes have same width.」と記載されていますが、頂点ごとに異なるレーンプロファイルが設定されている場合、この仮定は必ずしも成り立たないのではないかと考えています。

その結果、細いレーンから太いレーンに繋がる場合に条件を満たせず、Adjacentリンクが登録されないケースが起きているのではないかと推測しています。

<br/>

発生する問題

この挙動により、例えば CitySample のような群衆が実装されているとして、

道幅が異なるレーン同士を接続する Polygon タイプのレーン上で引き返す挙動をさせたい場合に、

隣接レーンが取得できず経路計算が失敗する可能性があるのではないかと考えています。

<br/>

質問

  • この挙動は意図された仕様でしょうか、バグでしょうか
  • もしバグであれば、修正対応の予定はありますでしょうか
  • 頂点ごとに異なるレーンプロファイルを持つPolygonタイプのZoneShapeにおいて、Adjacentリンクを正しく登録するための推奨される回避策があれば教えていただけますでしょうか
    • 太さが異なるレーンプロファイルが設定された Spline タイプの ZoneShape を接続する方法として利用しているのですが、もし他に適切な方法がありましたらあわせて教えてください。

<br/>

お忙しいところ恐れ入りますが、ご確認のほどよろしくお願いいたします。

(下記のリンク先は、本スレッドを英語に翻訳した英文スレッドですが、Epic Games のサポートチームが内部的に使用するものですので、ユーザーの方に利用していただく必要はございません。サポートは、この日本語スレッドに日本語で表示されることになります。)

[Issue of Adjacent links being registered incorrectly in a [Content removed]

(以下は、サポート担当の Keeling James によるコメントを翻訳したものです。)

> この挙動は意図された仕様でしょうか、バグでしょうか

> もしバグであれば、修正対応の予定はありますでしょうか

ご指摘の問題は確かにバグのようです。しかしながら、現時点で ZoneGraph にこれ以上の作業が行われる予定はありません。このプラグインは引き続き利用可能である予定ですが、私たちはこれ以上開発を行うつもりはありません。もしご自身で修正されるのでしたら、その修正をエンジンに追加するためのプルリクエストを喜んでレビューさせていただきます。

本件問題、記録上これにてクローズとさせていただきますが、さらに追加の質問が生じた場合や、何らかの問題が発生した場合は、こちらのスレッドにそのまま書き込んでいただければ、自動的に再オープンとなり、サポートを受けられるようになります。どうぞよろしくお願いいたします。ご質問いただきまして、ありがとうございました。

ご確認・ご回答いただきありがとうございます。

バグである旨承知いたしました。

プロジェクト内でZoneGraphを利用する場合には、手元で修正して対応いたします。

>現時点で ZoneGraph にこれ以上の作業が行われる予定はありません。

こちらのついて追加で質問させてください。

ZoneGraphは、Massフレームワークを用いたデータ指向設計(DOD)での利用を想定した、大量のオブジェクトを動かすためのナビゲーションシステムのような位置付けと認識しています。

今後開発が行われないとのことですが、これはBehaviorTreeに対するStateTreeに近いような形で、既存のNavigationMeshの仕組みに似た新しいDODなナビゲーションシステムを、ZoneGraphとは別で新たに開発中というような形になりますでしょうか?

よろしくお願いいたします。​

(以下は、サポート担当の Keeling James によるコメントを翻訳したものです。)

回答が遅くなりまして、大変申し訳ございません。

(「ZoneGraph にこれ以上の作業が行われる予定はありません」について)

> ZoneGraphは、Massフレームワークを用いたデータ指向設計(DOD)での利用を想定した、大量のオブジェクトを動かすためのナビゲーションシステムのような位置付けと認識しています。

> 今後開発が行われないとのことですが、これはBehaviorTreeに対するStateTreeに近いような形で、既存のNavigationMeshの仕組みに似た新しいDODなナビゲーションシステムを、ZoneGraphとは別で新たに開発中というような形になりますでしょうか?

UE 5.6 では、Mass エンティティをナビメッシュと一緒に使えるようにするための実験的なサポートを追加しました。移動や回避に関する改善も行われました。このプラグインは、まだかなり実験的な段階にありますが、Mass エンティティをうまく機能させるための最初の試みです。また、ナビメッシュを利用するための新たな StateTree タスクも追加されました。これらはすべて MassAI プラグインに含まれています。これらのコードは、プラグイン内の MassAIBehavior フォルダおよび MassNavMeshNavigation フォルダ内に含まれています。