💥

【Roblox】見えない謎の当たり判定 ~CollistionFidelityについて~

2025/02/07に公開

はじめに

今回は、開発中に遭遇した「見えないしオブジェクトもないが何か当たり判定がある!」といった問題について紹介します。

Robloxバージョン 0.658.0.6580461

起きた現象について

開発中に次のような現状が起きました。

  • 見た目上は空洞なのに当たり判定がある。
  • その空洞な箇所には他のオブジェクトは存在しない。

見えない壁があるような現象に非常に困ったのですが、原因はCollisionFidelityというプロパティでした。

CollisionFidelityについて

CollisionFidelityは日本語訳すると衝突忠実度となります。
これはMeshPartやPartOperation(Union・Intersect・Negate・Separate)などに存在するプロパティになります。
これらは通常のBasePartよりも複雑な形状を持つことがあるので、物理的な境界と視覚的な表現をどれだけ一致させるかを設定できるようになっています。

Studioでの確認方法

実際の物理的な境界を確認するには下記のように設定します。

  1. Studio上で3Dビューポートの右上歯車を開く。
  2. Physics simulationのCollisionFidelity(衝突忠実度)にチェックを付ける。

これで実際に確認ができます。

▼ MeshPart

▼ 視覚的表現 ▼ 実際の物理境界

▼ Union(左右上下でPartをつなげたもの)

▼ 視覚的表現 ▼ 実際の物理境界

上記比較から分かる通りデフォルトの状態では、Meshでは紙吹雪や惑星の環などが埋められるような形になっています。
Unionでは四角形につなげたつもりでも、実際は六角形の穴になっています。

CollisionFidelityを設定してみる

実際にプロパティから設定してみます。
設定できる項目(列挙型)は下記のようになっています。

名前 説明
Default 0 ボクセルベースの凸包分解を使用しており、比較的高速ですが、特に穴、出入り口、一般的な空洞については、精度が高くない可能性があります。
Hull 1 ビジュアル メッシュの凸包を使用します。
Box 2 視覚メッシュを囲む境界ボックスを使用します。
PreciseConvexDecomposition 3 HACD と呼ばれるアルゴリズムのバリエーションによって計算されるビジュアル メッシュの凸包分解を使用します。このオプションは、正当化された場合に精度を犠牲にして凸包の総数を減らすための許容値が組み込まれた複雑なオブジェクトの衝突ジオメトリの最も正確な表現です

▼ プロパティにて設定し比較してみる

▼ Default ▼ PreciseConvexDecomposition
▼ Default ▼ PreciseConvexDecomposition

PreciseConvexDecompositionに設定することで、問題を解決できました。
CollisionFidelityがDefaultに設定されていたので、物理境界と見た目がずれ何もない空間に当たり判定があったというわけです。

注意点

CollisionFidelityをPreciseConvexDecompositionに設定することで複雑な形状でも物理境界と視覚的な表現ずれを限りなくおさえることができます。
しかし、対象のMeshPartやPartOperationが複雑であればあるほど、忠実度が高ければ高いほど、パフォーマンスコストが高くエンジンの計算に時間がかかります。
状況に合わせて問題無い範囲で負荷の軽いものを選び、そもそも物理判定が不要な場合はコライダーをオフにしましょう。

まとめ

  • MeshPartやPartOperation(Union・Intersect・Negate・Separate)を使用する際はCollisionFidelityを設定する。
  • 正確に物理判定を取りたい場合は、PreciseConvexDecompositionに設定する。
  • 正確に物理判定を取らなくていい場合は、状況に合わせて問題無い範囲で負荷の軽いものを選ぶ。

以上が謎の当たり判定問題についてでした。
MeshPartやPartOperationを使用する際は必ずCollisionFidelityを正しく設定しましょう!

参考

https://create.roblox.com/docs/workspace/collisions#mesh-and-solid-model-collisions
https://create.roblox.com/docs/reference/engine/enums/CollisionFidelity
https://create.roblox.com/docs/performance-optimization/improve#physics-computation

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

Discussion