プレーヤー死亡時にラグドール化する

ゲームによくある、キャラクターが死んだときに重力に従ってパタッて倒れるやつです。
サードパーソンエグザンプルマップを使ってやってみます。
ラグドール化には
Set Simulate Physics や Set All Bodies Simulate Physics というノードを使います。

Set Simulate Physics は、
「物理シミュレートのオン・オフ」を設定できます。
Target にはもちろん物理シミュレートさせたい(或いはやめさせたい)メッシュを接続します。
Simulate のチェックボックスにチェックを入れると物理シミュレートがオンに、
チェックをはずすと物理シミュレート無しになります。

▼Set Simulate Physics と Set All Bodies Simulate Physics の違い

・Set Simulate Physics
ターゲットは Primitive Component Reference
Primitive Component は一般的に Capsule Component や StaticMeshComponent、SkeletalMeshComponent のこと

・Set All Bodies Simulate Physics
ターゲットは Skeltal Mesh Component Reference となっています。

差は多分それだけです。
今回はプレーヤー死亡時の演出ということで、キャラクターのメッシュ全体を物理シミュレーションするので
どっちを使っても差は無いはずです。

▼ブループリント

Rキーを押したらプレーヤーキャラクターが死んで物理シミュレーションされるようなノードを組みます。

f:id:tabascolabo:20170606020822j:plain

このブループリントでまずカプセルコンポーネントコリジョンを無効化し、
プレイヤーキャラクターのメッシュを物理シミュレーションします。
なぜカプセルのコリジョンを無効化する必要があるのかというと、
物理シミュレーション開始時にカプセルとメッシュのコリジョンが重なってしまい、
わけのわからない方向に突然吹っ飛ぶのを防ぐためです。
またメッシュのコリジョンプリセットをBlockAllにしておかないと、
シミュレーションが始まった瞬間に床をすり抜けて落ちてしまいます。
さらに画像にはありませんが、Camera Boom を Mesh の子にしてあげてください。
こうすることで、死亡時に衝撃を受けて吹っ飛んでもカメラがメッシュを追いかけてくれるようになります。

その場でRキーを押すとフニャァ…とプレーヤーキャラクターが倒れるようになりましたが、
ジャンプしながら死んだり、走りながら死ぬとなぜか2~3秒後にメッシュが消滅する怪現象が
発生するはずです。
この原因は、勢いよく動きながら死んだ場合、カプセルのコリジョンが無効化された時
その勢いを保持したまま床をすりぬけて下に落ち、
デフォルトで存在するキルゾーンに触れてカプセルが消滅し、
結果としてカプセルの子であるメッシュも消滅するためです。

キルゾーンを消す

対策のひとつとして、デフォルトで存在するキルゾーンを消します。
ワールドセッティングの Enable World Bounds Checksをオフにすると
デフォルトのキルゾーンが消滅します。

f:id:tabascolabo:20170606020845j:plain

これでプレーヤーが死ぬと、デストロイされるまでカプセルは無限に下に落ちていきます。
死んでもずっとメッシュは消えないで残ってくれるようになりました。

▼失敗した解決案

以上でとりあえずプレーヤーが死んだときにキャラクターが物理法則に従って倒れるようにできましたが、
カプセルがキルゾーンに触れてメッシュが消滅してしまう問題の対策に、
もうひとつ思いついた案があったものの、うまくいきませんでした。

死んだときにカプセルが重力から影響を受けないように設定する、というものです。

f:id:tabascolabo:20170606020913j:plain

Set Enable Gravity というノードを使って、物理シミュレーション開始と同時に
カプセルが重力の影響を受けないように設定してみたのですが、
うまくいかず、カプセルは下に落ちていってしまいました。
カプセルの Physics にある Enable Gravity をオフにしたらいけるかな?とも思いましたが
これもうまくいかず、カプセルが下に落ちてしまいます。
詳しい人がいらっしゃいましたらぜひ教えて下さい。

▼関連したノード

Set All Bodies Below Simulate Physics
ボーンを指定して、そのボーンとそのボーンより下のボーンすべてを物理シミュレーションする。
つまりキャラクターの一部だけ物理シミュレーションできる。

Set All Bodies Below Physics Blend Weight
上のとほとんど同じだがどれくらい物理シミュレーションの影響を受けるか指定できる。

 

参考
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Physics/SetSimulatePhysics/index.html
https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Actors/Components/index.html#プリミティブコンポーネント
https://docs.unrealengine.com/latest/JPN/Engine/Animation/PhysicallyDrivenAnimation/index.html
https://www.youtube.com/watch?v=VVapMSojytg
http://unrealbussan.hatenablog.com/entry/2015/03/10/200716