[第16回UE4ぷちコン]振り返り:Chaos Physics

ここは[第16回UE4ぷちコン]振り返り子頁です。

概要

  • 2年前のChaos Destruction デモでほぼ学べる

  • それを通して学んだ方々の資料も2年分ある🙏

  • 自分のゲームに適用する際の工夫を紹介

学習過程

まず公式ドキュメントを読む…前に、とにかく動くものが見たいという事で、下記記事を参考に手元のUE5EA環境でデモを動かした。

自分のゲームでどれを使おうかな、と思いながらデモを一通り眺める。

何が出来るのかわかったら、次に解説動画を見る。

なにしろ公式。踏み込んだ解説が聞けるが長いのが難点か。

ハンズオン的に0からノードを置いて学べる。チャプター設定もありわかりやすい。おすすめ。

←の続編。引き続きわかりやすい。おすすめ。

日本語の解説記事も勿論ある。ありがたや、ありがたや…🙏

完全なる理解を実感した後、満を持して公式ドキュメントを読む。

ダニング・クルーガー効果を実感する。

やったこと

Chaosそのものの解説は上記資料群に任せ、具体的にゲーム内でどのような制御をしたかについて記す。

Project Setting変更

Project Settingsから、Substeppingを有効化している。これがあると物理挙動の再現性がかなり安定する他、Time Dilationを変化させた時でも同じ破壊パラメータで近い挙動を得やすくなる(必ず得られるわけではない)。

ライトパネルの破壊

もともと壁ごと壊す予定だったが、ゲームプレイに影響が出る事もあり差し控えた。しかし弾丸回避で壁に着地する際にリアクションが欲しい。壁が表面だけ壊れるのも良かったが、天井の場合はシーリングライトを壊したかった。二種類作るのは大変なので、一旦壁にもライトパネルを置いて、それを破壊すればいいやということになった。

Geometry Collection自体はScalingできないので、天井用と壁用をそれぞれ作成。

壁にプレイヤーが到達した際に、Static Mesh Componentのライトパネルを破棄してGeometry Collection Componentに差し替え。なぜ最初から配置しないかと言うと、Geometry CollectionはLumenにCardとして認識されない為。つまり、EmissiveなMaterialを適用しても光源にならない。

プレイヤーが接触した位置から、破壊したい範囲をDynamic Stateに変更してStrainとForceを付与。これは部分的に破壊しようとした処理の名残で、最終的にはどこにぶつかっても全体が破壊されるように変更した。これは絵的な派手さもあるが、効果音を1種類で済ましたいのが大きい。

破片の吹き飛び量を制御するために、破壊用Fieldの持続時間を指定できるようにしているのがサンプルからの工夫。特にスロー演出で重宝した。

ライトパネルは結構な量が飛び散るが、床にDisable Fieldを敷いてあるので落下した端からどんどん計算から除外される。これでFPSはそれなりに安定する(リプレイは破壊の密度が高いので一部処理落ちするがゲーム外なので許容している)。DemoプロジェクトからMigrateすればOK。古代の谷にもこれが置いてある。

Geometry CollectionのImplicit Typeは全てBoxにした。Sphereだと床で転がるしLevel Setは挙動は良いが重い。Boxそのままだと破片になった瞬間に相互干渉でプリッと押し出されるような挙動になるので、Object Reduction Percentageを上げて回避している。破片同士の干渉表現がそこまで重要ではない場合ならこの辺で十分な気がする。

エネミーの破壊

ブルーマン先生を破壊するのは気が引ける。だがこの破壊衝動を受け止めてくれるのも先生だけだ。先生!うおおお!(高速回転)

ゲーム中の敵は標準的なSkeletalMesh Actorで、子Componentとして銃のStatic Meshを手に持っている。これを直にGeometry Collectionにはできない様なので、まず右クリックからStaticMesh化し、そのMeshをGeometry Collectionにした。反復性は良くないので、EUWなどで自動化するといいかもしれない。

様々な部位への攻撃演出を作る余裕もないので、頭部への攻撃オンリーに割り切った。その分、頭部は分割を細かくしている。

攻撃命中演出に移行した瞬間に、敵Actorを左図のGeometry Collection Actorに差し替える。頑張れば敵Actor内で実装できるとは思うが敵Actorはバトル処理も詰まっているので責任分割した。差し替えられたActorはStatic Stateで生成し、攻撃命中の瞬間に全身Dynamic Stateに切り替える。これでAnchor Filedを作る手間が省ける。

ボスキャラの帽子吹っ飛び

Dynamic Stateに変更するTransient FieldにMovableなStatic Mesh Actorを巻き込むと、Simulate Physicsプロパティがオフなのに物理挙動が始まってしまう。一瞬バグかと思ったが物理計算のベースそのものがChaosになった影響かも。

怪我の功名というか、これのおかげでGeometry Collection Actor内にStatic Mesh ComponentとしてMovableな帽子を置いておけば、ぶん殴った時に勝手にいい感じに吹っ飛ぶ絵ができた。


余談だがこの現象のせいで、攻撃演出で命中する瞬間に敵のビームが画面内を通過すると、ビームが落下し始めるというおもしろバグが実は今も起こる。審査員のみんなには内緒だ。

というか回避の仕方がコレを書いている今もわかっていない。Transient FieldのMeta DataピンでFilterできそうだが、Dyamic Stateにする場合はMeta Data Resolutionで埋まるので入力できないんじゃ。どないしよ…
と書いて気づいたが、ビームが自分自身をKinematic Stateに変更し続ければ一応なんとかなる気はする。ひどい対策だ。

反省点

  • やってみると思ったより理解しやすい

    • よくわかんないところはよくわかんないなりに使える

    • サンプル以上の事もやろうとすると難易度が上がる

      • というかC++コードを読む必要が出てくる

      • そんで工事中だったりしてガックリきたりする

  • 部分的、段階的な破壊を活用できなかったのは心残り

    • 旧Destructible Meshでもできる範囲のことしかやってない気がする

    • もちろんField Systemによって制御性はChaosの方が良い

  • 壊し方も多様にしたかった

    • チョップで縦半分に割れるとか

    • Fieldの設定次第で可能なはず

  • Geometry Collection Cacheを使う機会がなかった

    • リプレイで使えるかなと思ったが、サンプルが機能していなかったので見送った

    • そもそもランタイムで動的に使うものでもないような気はする

    • 最後に敵施設全体を爆破する演出などには使えそう。さすがにリアルタイムでは重い

  • 頭部に攻撃したのに銃ごと粉々になるのはおかしい

    • 今思えば、ボスキャラの帽子と同じ感じに吹っ飛ばせたはず

    • メモを見ると、やられた敵の銃をいい感じにどっかに吹っ飛ばす処理を作るのがめんどくさかったので銃ごと粉砕することにした様だ

      • すっかり忘れていた。過去の自分なんて他人だ。コメントは重要

  • 結局、賑やかし破壊でしかない

    • ゲームプレイに絡んでくるような破壊もやってみたい気はする

    • 破片でビーム防いだり、破片ぶつけて倒したり

    • 壁ぶち抜いて道を作ったり

    • ゲームデザインから考慮する必要がある

    • その前にChaosで何が出来るのか、ということを知っておく必要がある

    • 道は長い