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/>
お忙しいところ恐れ入りますが、ご確認のほどよろしくお願いいたします。