執筆バージョン: Unreal Engine 5.1
|
どうもこんにちは。
第19回ぷちコンのテーマ「ロック」にちなんで、「弾が当たると岩が破壊される」仕組みの作成方法を紹介していきます。
破壊表現について、以前にこんな記事がありました。
[UE4] 手軽にオブジェクトを破壊する
UE4のDestructibleMeshも面白いものですが、UE5には新しい破壊システム「Chaos Destruction(ケイオス破壊)」が備わっています。今回はこれを使ってファーストパーソンの弾を使った岩の破壊を作っていきましょう。
完成イメージはこちら
目次
事前準備
まずはファーストパーソンテンプレートと破壊するための岩石のメッシュを用意します。
この記事ではStarterContentに付属している「SM_Rock」使用していきます。
もちろん、Megascansなどを利用してもっと忠実度の高い岩を手に入れても構いません。

また、この記事では物理フィールドシステムを使用します。デフォルトでは有効になっていないので、プラグイン設定から「Field System」のプラグインにチェックします。


チェックするとプラグインがベータ版であることの旨が表示されます。ここでは「Yes」を選択しましょう。

有効にしたら一旦UE5を再起動します。これでフィールドシステムが使えるようになります。
ジオメトリコレクションの作成
Chaos Destructionを適用するには、まず破壊するメッシュをジオメトリコレクションという別のアセットに変換する必要があります。用意した岩をジオメトリコレクションにするためにドラッグ&ドロップでマップ上に配置しましょう。

左上のボックスからエディターを「Fracture Mode」に切り替えます。これはChaos Destructionに関する各種ツールの使用やジオメトリコレクションの作成・編集を行えるモードです。

岩を選択したまま、左パネルのGenerate→Newをクリックするとジオメトリコレクションを保存するための場所とアセットの名前を決めることができます。


保存場所を選んで「Create Geometry Collection」をクリックすると、メッシュに黄色い模様が適用されます。これでメッシュがジオメトリコレクションに変換されました。

ジオメトリコレクションの分割
Chaos Destructionではオブジェクトを複数の破片に分けて破壊表現を行います。作成したばかりのジオメトリコレクションはまだ分割されておらず、言うなれば1つの大きな破片として扱われます。
このままでは物理を適用した普通のオブジェクトとあまり変わらないので、Fracture Modeのツールを使って分割していきます。
左のパネルからFracture→UniformでUniform Voronoiフラクチャツールを開始します。

選ぶとUniform Voronoiによって岩が複数の破片に分割される様子がシミュレーションされます。この状態でFractureボタンを押せば、岩を破片(ボーン)に分割することができます。

再びFractureボタンを押すことでジオメトリコレクションをさらに分割します。今回は全体をUniform Voronoiの初期設定で3回ほど割っていきます。
破片にはFracture Hierarchy(フラクチャ階層)という概念があり、分割するたびに破片による階層が作成されます。3回割ることによりLevel0~3まで合計4つ、Fracture Hierarchyを持ったジオメトリコレクションが作られます。
階層は左下にある「Level Statistics」のパネルで確認することができます。Valueはその階層に属している破片の数です。(分割にはある程度ランダム性が含まれるため、毎回結果は異なります)

分割すると破片ごとに色分けがされますが、これはDetailsパネルのShow Bone Colorsのチェックを外すことで元通りになります。また、FractureパネルのHide Unselectedにチェックを入れると選択している破片のみが表示されるとともに黄色い模様が消せるので、見た目の確認の際には活用しましょう。
終わったらCancelボタンを押してツールを抜け、Explode Amountでそれぞれの階層の分割の様子を確認します。ここで分割が思うようにならなかった場合、Fracture Modeの各種ツールで破片を編集することができます。違った割り方で破片ごとにさらに分割したり、分割した破片を再びくっつけたり、最初からやり直すこともできます。

編集が終わったらこのジオメトリコレクションはすでに破壊可能な状態になっています。実際にゲーム内で破壊してみましょう。
エディタ上で初期位置をやや高めに浮かしておくだけで、自由落下により床に激突、破壊されます。
ジオメトリコレクションは設定を変えることで破壊のしきい値や内部マテリアルなど、破壊に関するさまざまなパラメーターをコントロール可能です。詳しく知りたい人は公式ドキュメントを確認しながら試してみてください。
フィールドシステムを試してみる
UE5では物理的な力を制御したい場合にフィールドシステムを使うことができます。これは各種物理挙動に直接作用する「力場」のようなもので、単に物体を動かすだけでなく静止させたり、クロスやパーティクルのシミュレーションなどにも影響を及ぼすことができます。
ContentExampleにも豊富なサンプルが収録されているので、触れてみると面白いかもしれません。

ここでは汎用的なフィールドとして使えるMaster Fieldを使い、岩を内部から爆発させるような表現を作りたいと思います。
先ほどの岩を空中に浮かせたまま、DetailsパネルのPhysics→Advanced→Start Awakeのチェックを外します。これでゲーム内で物理的な力が加わるまで、重力を無視して静止した状態になります。

「Engine/Content/EditorResources/FieldNodes」から「FS_MasterField」をドラッグ&ドロップし、マップに追加しましょう。

位置とスケールを調整して水色の球で岩を包み込むようにします。

「FS_MasterField」は初期状態でActivationTypeが「Delay」になっています。これはフィールドが生成されて一定時間が経ったら力場が発動するものです。Delay Amountでタイミングを変更することができるので、プレイ開始から3秒後に発動するようにしましょう。

プレイを開始して3秒経つと、空中で岩が爆発します。
爆発の力を変えたい場合はField Settings→Apply Linear and Angular Velocities→Radial Magnitudeを設定することで調整することができます。爆発をもっと派手にしてみましょう。

フィールドの大きさは重要で、小さすぎる場合にはかける力をいくら増やしても、はみ出した部分が取り残されたような爆発になってしまいます。
下の動画ではRadial Magnitudeは10000.0と充分な力をかけているにも関わらず、きれいな爆発になっていないことが分かると思います。
弾での破壊
今度はファーストパーソンの弾を使って弾が岩に当たると爆発したように破壊されるシステムを作ります。さっき作ったマップ上のFS_MasterFieldは削除しておきましょう。
まず、弾のブループリントである「BP_FirstPersonProjectile」を開きます。


イベントグラフ内のEvent Hitから弾がヒットした時の処理を書くことができます。何かにヒットした時はその位置(Hit Location)にFS_MasterFieldを呼びましょう。フィールドはActorの一種なのでSpawn Actor From Classノードを使って呼ぶことができます。また、Spawn TransformのピンはLocation、Rotation、Scaleにピンを分割しておきます。

このノードを以下のように処理の間に挟みましょう。

生成したFS_MasterFieldのパラメーターをブループリントで設定していきます。Set Sphere Radius(Sphere Volume Col)でフィールドの大きさを150.0にし、Radial Magnitudeは5000.0程度にしておきましょう。

次に「CE Trigger」を繋げて出現時に物理的な力を即適用します。力をかけ終わった後のFS_MasterFieldは残しておくとマップ上にどんどん溜まっていってしまうので、Destroy Actorを使って削除しましょう。

これで弾で岩を破壊する準備ができました。試しにさっきの岩にこの弾を撃ちこんでみましょう。
いい感じですね!岩をたくさん並べて撃つと次々と壊すことができます。ただし、岩の破片が他の岩に少しでも当たると、無効にしている重力が働き、落ちて勝手に破壊されてしまいます。
CollisionPresets→DestructibleをIgnoreにしてジオメトリコレクション同士の衝突を無効化しておくことをおすすめします。

ぜひとも画面上のオブジェクトをバンバン破壊できる、爽快感のあるゲームを作ってみてください!