目次
はじめに
こんにちは。 情熱開発部・プログラム1課の日高です。
友人に誘われてPhasmophobiaをやってみました。
ホラーゲームですが、「アイテムや落ちている物の多くを掴む。」「ドアや引き出しは掴んでから開閉する。」という風に「掴む」アクションが重要になっていました。
UnrealEngineではこの掴む動作を簡単に作れそうだったので、実際に作ってみました。
今回はその時に起きた問題と、解決方法について紹介していきます。
UE5のバージョンは5.0.3を使用しています。
UE5で物を掴む機能の作り方
UE4ですが、作り方を紹介したサイトがいくつか見つかったので、その中から以下2つの方法を試してみました。
1.PhysicsConstraintを使う方法
https://www.youtube.com/watch?v=irk5NAuFPMc
2.PhysicsHandleを使う方法
https://shuntaendo.hatenablog.com/entry/2016/03/04/004331
1. PhysicsConstraintを使う方法
始めにPhysicsConstraintを使う方法で作ってみました。
結果がこちらになります。

動かない・・・。
掴んだアイテムが全く動かないという状況になってしまいました。
プレイヤーが体当たりすると動き始めましたが、動かすのをやめるとその場で固定されてしまいます。
2. PhysicsHandleを使う方法
バグは一旦置いておいて。
PhysicsHandleを使った方法も試してみました。

掴んですぐは動くものの、一度動きが止まるとそこで固定されてしまいました。
離した時にも動き始めました。
物理オブジェクトが固定される原因
原因について調べてみました。
物理が有効になっているオブジェクトの動きが止まると、スリープモードになってしまうようです。
PhysicsHandleの方は掴んだ時と離した時にSetCollisionResponseToChannelを呼んでいるので、ここでスリープが解除されています。
物理がスリープしてしまう問題の解決方法
解決するために色々と試してみました。
1. スリープファミリーでスリープするまでの時間を設定する。
これは効果がありませんでした。

2. TickでWakeAllRigidBodyを呼ぶ。
物理のスリープで固定されることが無くなりました!
プレイヤーキャラクターのTickで掴んでいるオブジェクトのスリープを解除しています。

3. 物理マテリアルを設定する。
物理のスリープで固定されることが無くなりました!
物理マテリアルでスリープになる速度等の条件を0にしました。

動いた~!!
ということで、今回作成した物の実際に動いている動画を載せておきます。
PhysicsConstraintで作成した物

PhysicsHandleで作成した物

最後に
UE5でも無事に物を掴む事が出来るようになりました。
今回の解決方法ですが、TickでWakeAllRigidBodyを呼ぶのは強引な気がするし、物理マテリアルの方法だとスリープしなくなるのは処理負荷が上がりそうです。
実際には以下のような対応が出来ると良いのかなと思います。
- 掴んだ時・離した時・カメラを動かした時だけWakeAllRigidBodyを呼ぶ。
- 掴んでいる時だけ物理マテリアルを使う
この記事がUnrealEnginの物理に悩まされている皆様の参考になりますと幸いです。
参考サイト
UE4 How to Grab or Pick Up Object with Gravity Physics Gun in Unreal Engine 4 Tutorial
https://www.youtube.com/watch?v=irk5NAuFPMc
【UE4】物体を「持つ」!「運ぶ」!「放す」!
https://shuntaendo.hatenablog.com/entry/2016/03/04/004331
Sleep Family / Thresholds ignored – Physics abruptly stop
https://forums.unrealengine.com/t/sleep-family-thresholds-ignored-physics-abruptly-stop/251979
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。