ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UE4・UE5】〈Tips〉物理挙動が変なときのトラブルシューティング

目次

 

はじめに

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

今回はブループリントなどで作成したアクターなどが物理挙動をしないときに確かめるべき項目を紹介します。

環境

UE5.4.3

 

参考したドキュメント

dev.epicgames.com



コンポーネントの設定によるもの

前提知識

>> コリジョンプリセットついて

プロジェクト設定からコリジョン応答のプリセットを管理できます。
Customを選ぶことでその時々に応じた設定もできますが、開発終盤で大変な目に合うので、プリセットを作成して利用することを強くお勧めします。

>> エンジンの提供する物理挙動ついて

プロジェクト設定=>物理から物理シミュレーションに関する設定を数多く変更することができます。荒ぶりといったものをアセット別でなくこちらで設定することで安定した挙動をプロジェクト全体で共有できるので、問題がある場合は確認するのをお勧めします。


>> メッシュコンポーネントごとの物理挙動について
コンポーネントを複数持つアクタの場合、それぞれのメッシュコンポーネントで物理計算の有無を変更できます。メッシュコンポーネントの物理計算がバラバラな場合、アクタの位置と見えているメッシュの位置が異なるといった現象もあることを知っておきましょう。

 

可動性がムーバブルじゃない あるある【★★★】

スタティックやステイショナリーでは物理挙動ができません。
物理挙動をしたい場合ムーバブルにしましょう。


SimulatePhysicsのフラグがOFF あるある【★★★】

MeshComponentの物理->SimulatePhysicsにチェックがついていないと物理挙動してくれません。

動的に変更もできるので実装しているときは要確認!!

 

CollisionEnabledが物理に対応していない あるある【★★★】

このような警告が出ているときは大体これです。
コリジョンプリセット内のCollisionEnabledがNoCollisionやQuery Onlyなどほかのオブジェクト応答との応答が無い場合、物理計算のフラグを有効化しても計算が行われません。

CollisionEnabledが物理計算を想定しているプリセットを利用しましょう。
プリセット例,PhysicBody,BlockAll,Pawn,など

EnableGravityのフラグがOFF あるある【★★☆】

エンジンの重力計算を利用する場合、チェックがついていないと自由落下運動をしてくれません。
動的に変更もできるので実装しているときは要確認!!

 

Auto Weldが有効化されている あるある【★☆☆】

SimulatePhyscsがOFFの場合、この項目がTrueにできます。
これにチェックが入っている場合ルートコンポーネントに物理設定が依存します。

例えば、StaticMeshComponentが階層を持つ場合を考えてみましょう。

子であるChild StaticMeshComponentのSimualtePhysicがFlaseの場合、物理挙動は行いません。しかし、AutoWeldがTrueな場合、親であるRoot StaticMeshComponentの物理設定に依存するため、たとえ子が物理を無効化する設定をしても、親が物理挙動すれば一緒に動くという奇妙な動きをします。

Child StaticMeshComponentのSimualtePhysicがFlaseでNoCollisionでもRoot StaticMeshComponentにくっついて物理挙動を一緒にしている。

単一のブループリント内で物理挙動の設定をルートにまとめたい場合はTrue、MeshComponent個別で設定したい場合はFalseをお勧めします。

MassやDampingの値が不正 あるある【★☆☆】

Dampingなど極端に大きい値が入っていたりすると落ちてこなくなります。
用法用量を守って利用しましょう。




参考までに、通常の重力 (9.8m/s^2) では、シミュレーション開始時に最初に重力で引っ張られて単一のボディ アクタが落ちないようにするには、Linear Damping 値 30 で十分です。
複数の物理ボディが相互作用すると (物理コンストレイントの使用によって、またはコリジョンが発生している場合)、物理ボディを止めるために必要な減衰量は増えます。 力を適用された物理ボディを止めるための 最小 Linear Damping 値は、約 100 です。

Angular Damping (傾斜減衰) がないと、外部の力の作用を加えられるまで回転し続けます。小さな値でも、回転を迅速に減らすことができます。 値 100 は、外部発生源で生じた角運動を直ちに止めます。

公式ドキュメントより引用

 

dev.epicgames.com

アセットの設定によるもの

StaticMeshアセットにコリジョンがついていない あるある【★★★】

アセットの問題を抱えている場合、SimulatePhysicがTrueにできないことあります。

 

当たり判定はアセットに依存しているため、アセット側で適切な当たり判定が設定されていない場合、見た目とのギャップや有効にできない問題があります。

 

目的のアセットを開き、表示=>単純なコリジョンを押してコリジョンが設定されているか確認しましょう。

 

存在しない場合は、コリジョンから追加しましょう。

緑のふちでコリジョンの形状を設定できます。

 

SkeletalMeshアセットに物理アセットがついていない あるある【★★★】

アセットの問題を抱えている場合、SimulatePhysicがTrueにできないことあります。

 

当たり判定はアセットに依存しているため、アセット側で適切な当たり判定が設定されていない場合、見た目とのギャップや有効にできない問題があります。

目的のSkeletalMeshを開き、アセット詳細->PhysicsAssetが登録されているか確認しましょう。

 

物理アセットは、スケルトンに紐づいたどの骨がどの向きにどの角度まで移動できるか?そしてその骨のサイズや動きやすさなど細かく調整することができる物理計算用のアセットです。

新規作成する場合は、任意のスケルタルメッシュを右クリックして作成する->物理アセットから作ることができます。

詳しい使い方は公式ドキュメントが参考になります。

dev.epicgames.com

 

CollisionComplexityの設定が不正 あるある【★★☆】

このような警告が出ているときは大体これです。


StaticMeshや物理アセットにはアセットのコリジョンをどのように扱うかを指定できます。



物理計算に利用できるシンプルなコリジョンと複雑なシェイプを同時に持てるSimpleAndComplex (おすすめ)

 

設定したシンプルなコリジョンをすべてで利用するUse Simple Collision As Complex

一番複雑な形状を利用できるが、落下や加速ができないUse Complex Collision As Simple(これに指定されているとSimulatePhyscs有効時にエラー)

 

詳しくは公式ドキュメントに記載されています。

dev.epicgames.com



最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる