🏕️

【Roblox】Pathfindingを用いた際の地形オブジェクトの注意点

2025/02/21に公開

1. はじめに

Robloxでは、Pathfindingを用いて経路探索を行うことができます。
ただし、通行させたい範囲のオブジェクトの配置や設定には注意が必要で、意識せずに配置していると意図通りに歩いてくれなかったり、正しく経路探索ができず移動の途中で停止してしまうこともあります。
特に、プレイヤーについてきたり、ある程度自立行動するNPCなど、多くの場所を自由に動き回るキャラクターがいる場合、地形は常にPathfindingの都合に合わせてあげる必要があります。
今回は、そんなPathfindingを用いた時の地形の注意点についてご紹介したいと思います!

Pathfindingそのものに関する基礎知識はこちらの記事を参照してください。
https://zenn.dev/landho_roblox/articles/13b9323a4ac2c0

バージョン:0.658.0.6580461

2. Pathfindingが見ている世界の可視化

具体的な状況の話の前に、まずはPathfindingが見ている世界を見てみましょう。
基礎知識の方でも少し触れていますが、今回はより詳しく説明しようと思います。

Roblox Studioのゲーム画面が表示されている領域(ビューポート)の右上のアイコンをクリックすると、ビューポートオプションが開きます。
ここの「ナビゲーションメッシュ」をクリックしてチェックを入れると、ビューポート内でPathfindingが見ている世界が可視化されます。

青くなっている所が、通行可能な「床」として判定されている部分です。
基本的には、実際の衝突判定より少し上になっています。
地続きの床でも、おおまかな形で分割されています。

赤い矢印が、自動で付けられているジャンプポイントです。
基本的には段差と、ある程度距離の近いオブジェクト同士の隙間にも付けられ、登る場合はその高低差が一定以下であればジャンプで通行可能として判定されます。
ジャンプ可能な高低差の判定は、Humanoidに設定されているジャンプ力には影響されず、常に一定(おおよそデフォルトのジャンプ力程度)であることに注意が必要です。
降りる場合は、高低差に関係なくジャンプで通行可能の判定になります。

Roblox Studioでのテスト実行中にも同様の操作で可視化することができます。
実行中にPathfindingが実行されると、その経路も可視化されます。


黄色い点が歩行での移動の中間目標地点で、赤い点がジャンプの目標地点、緑の点が最終目標地点です。

また、ナビゲーションメッシュの表示と同じ手順で「経路探索リンク」の項目にチェックを入れると、PathfindingLinkの情報がオレンジの矢印文字列で表示されます。

文字列の左側がPathfindingLinkのLabelを表し、右側の記号が、IsBidirectionalプロパティで設定できる双方向か一方通行かを表します。

さらに、同様の手順で「経路探索修飾子」にチェックを入れると床判定の色が変わり、マテリアルの違いが視覚化され、文字列でも表示されるようになります。

PathfindingModifierが子オブジェクトに存在しているパーツの場合は、マテリアルの代わりにそちらの情報が表示されます。
これらは、経路探索のコスト設定に影響する情報ですね。

これで、Pathfindingの見ている世界が可視化できるようになりました。

3. 注意すべき状況、オブジェクト

さて、ここからが本題です。
Pathfindingで問題になりやすい状況やオブジェクトを紹介していきます。

微妙な隙間のある段差


こちらの画像では、自販機と塀の間に微妙な隙間があるため地続きの地形と判定されず、ジャンプで通行可能な段差として扱われていません。
もう少し近づけて地続きの判定にするか、PathfindingLinkオブジェクトを使用して手動でジャンプポイントを付けてあげれば対応することができます。

狭い入口


こちらの建物の入口は、比較用に置いたリグと見比べても一見問題無い大きさですが、Pathfindingでのキャラクターの大きさ(Pathを生成する時に設定するAgentRadiusとAgentHeight)はきちんとキャラクターを包めるよう少し大きめに設定する場合が多く、逆に地形は大まかな判定で実際より狭くなるため、一般的な設定のPathfindingだと通る事ができない地形になってしまっています。
こういった地形では、入口を広めに取っておいた方がよいでしょう。

メッシュパーツ、ユニオン


メッシュパーツやユニオンは、CollisionFidelityというプロパティで衝突判定の忠実度を設定することができ、Pathfindingもそれで生成された衝突判定を元にナビゲーションメッシュが生成され、地形判定を行います。
この設定がDefaultだとおおまかな判定が付けられてしまうため、上の画像では、見た目上は中央が四角く空いているのに実際の判定は大部分が埋まっている状態になってしまっています。
PreciseConvexDecompositionに設定すれば見た目通りの判定になりますが、忠実度が高いほど処理負荷も高くなる点は注意が必要です。
画像のような簡単な形状であれば、負荷の面でもあまり問題はないかと思います。
忠実な判定である必要が無いのであれば、BoxHullに設定し、かなりおおまかな判定で包んでいるような形にする事で対応することも可能です。
このプロパティは、実際の当たり判定とPathfindingの両方で問題の要因になるので、ユニオンやメッシュパーツを使用する際は必ずこの設定を確認し、当たり判定に問題が無いかチェックすることをオススメします。

こちらの画像では、ユニオンで作成された床の一部が地形扱いではなくなってしまっており、Pathfindingの経路が何も無いはずの所を迂回しようとしてしまいます。
こちらもPreciseConvexDecompositionに設定すれば対応可能です。

CollisionFidelityについてはこちらの記事で詳しく解説しています。
https://zenn.dev/landho_roblox/articles/2dec5294c24721

薄すぎるメッシュパーツ


メッシュを用いた地形で厚みの無いものだと、正しく壁として判定されず、通行可能と判断されてしまう場合があります。
こちらの画像の場合、窓やドアのガラス部分が厚みの無いメッシュのため、通行可能と判断されてキャラクターが引っかかり動けなくなってしまう問題が発生しています。
メッシュに多少の厚みを持たせるか、壁になる透明なPartを重ねて配置する事で対応することができます。
状況次第で、CollisionFidelity設定によって対応可能な場合もあると思います。

キャラクター


正確に言うと、Humanoidを使用して動かしているModel下にあるオブジェクトです。一般的なNPCや、プレイヤーキャラクターも含まれます。
Humanoid影響下のオブジェクトは、Pathfindingでは地形として判定されないため、無視して移動しようとして引っかかってしまう場合があります。
CollisionGroupの設定で、Pathfindingで移動するキャラクターとは衝突せずにすり抜ける設定にしておくか、Humanoidの影響を受けないディレクトリに配置した透明なPartを重ねて置くことで対応することができます。
基本的にはCollisionGroupでの対応がよいと思います。

Creator Storeから持ってきたオブジェクトは特に注意が必要です。
こちらの車は、乗りこんで操作できる車として作られているためか、Humanoidを持つキャラクターになっており、Pathfindingには地形として扱われていません。
このような場合、単純に背景のオブジェクトとして配置したいだけであれば、Humanoidなどの動作させるためのオブジェクトを破棄した上で、各パーツのCollision関連のプロパティを確認し適切な衝突判定がある状態にして対応するか、または透明なPartを重ねて置いて対応するのがよいかと思います。

その他、Creator Storeからオブジェクトを持ってくる際の注意点はこちらの記事で詳しく解説しています。
https://zenn.dev/landho_roblox/articles/db6c98895c3eb5

4. まとめ

  • ビューポートオプションから、Pathfindingに関する情報を視覚化できる
  • 微妙な隙間や狭い入口など、配置に注意
  • CollisionFidelity設定は要確認
  • 薄すぎるメッシュパーツは認識できないかも
  • Humanoidの影響下のオブジェクトは地形として扱われない
  • Creator Storeから持ってきたオブジェクトには特に注意が必要

最終的には、実際に動かしてみて、問題無い地形になっているか検証することが大事だと思いますが、全てにおいてその検証を完璧に行うことは困難です。
特にチームでの制作の場合、Pathfindingに詳しい人だけに地形やオブジェクトの配置をさせられるわけではありません。
制作を行うスタッフ一人ひとりがこういった基礎知識をもち、Pathfindingに合わせて制作を進められれば、問題の発生を抑え、効率的にオブジェクトの作成と配置が行えると思います。
最後までお読みいただき、ありがとうございました!

5. 参考

https://create.roblox.com/docs/characters/pathfinding
https://create.roblox.com/docs/reference/engine/classes/PathfindingService
https://create.roblox.com/docs/workspace/collisions
https://create.roblox.com/docs/reference/engine/enums/CollisionFidelity
https://zenn.dev/landho_roblox/articles/2dec5294c24721

ランド・ホー Roblox開発チーム

Discussion