接触すると崩落する物体を作るには

  • 接触する
    • これは分かりやすく Collision のコンポーネントを使うことで実現できます
    • Box Collision, Sphere Collision などですね
  • 崩落する
    • 「バラバラにしておいたメッシュに物理を適用しておき、接触したときにそれに入れ替えて崩落するように見せる」のような方法も取れます
    • 今回は Unreal Engine の Chaos Destruction を利用します

崩落するメッシュを作る

空のレベルを用意しておきます。

0. 準備: モデリングモードで適当な形状を作る

すでに自由にできるアセットがあればそれを使ってもらっても構いません。エンジンアセットはたまに「変更できない」と言われるものもあるので、ここではモデリングモードで作ります。

  • モデリングモードを開いたら、ボックスを選択します。
    • 今回は床を作りたかったので以下のように高さを小さめにしました。
    • このような形状ですね
    • 「承諾」します
    • そのまま選択した状態にしておいてください

1. フラクチャモードで崩落するように

モデリングモードからフラクチャモード (Fracture) に変更します

  • まずは、「新規」を選択します。すると保存ダイアログが出てきますので、適当な場所と名前を付けてください。
    • 今回は GC_Floor と命名しました。
    • GCGeometryCollection の接頭辞です
  • 次にフラクチャにある「一様化 (Uniform)」 を選択します。
    • すると以下のような表示に変わります。
      • 私は最小・最大のボロノイサイト数を変更し、破片の数を多くしていますがここは自由です
    • パラメータに問題が無ければ 「フラクチャ」というボタンをクリック します
    • ここで、おそらく右ペインにある「フラクチャ階層」が以下のように指定した数に分割されていることを確認してください
  • 確認
    • この状態で以下のように高いところから落下させてみてください。破壊された状態になります。
    • 分かりにくいようであれば、以下のように Damage Threshold のインデックス 0 の値を小さくすると破壊されやすくなります。
      • さらに下に物体を置いておくと派手に壊れます。今回は Cone を置きました。

3. 破片の一部を固定する

このままでは、問答無用で落下してしまいます。 GeometryCollection を固定する方法はいくつかありますが、まずは簡単な方法から試します。

  • 以下のように、一箇所の破片を「フラクチャ階層」から選択し、コンテクストメニューから「固定」を有効化します。
  • そうすることで、実行しても空中から落下しません。
    • GeometryCollection は固定(またはアンカー / Anchor)箇所からの接続が維持されていると、その場所にとどまることができます。
    • これは後述の Anchor Field でも同じことができます。

さあ、ここまでで崩落するメッシュができました。

接触すると崩落するようにする

まずは Actor 継承の Blueprint を作ります。 BP_DestructOnContact という名前にしました。

コンポーネント追加

  • Blueprint を開いたら、コンポーネントに「ジオメトリコレクションコンポーネント (GeometryCollectionComponent) 」と「Box Collision」を追加します
    • 以下のようなツリーにしています

コンポーネントの設定

  • GeometryCollection コンポーネントを選択し、詳細ペインから「Chaos物理」の Rest Collection を設定します。
  • Box Collision は大きさを合わせます。200x200x50 で作ってあり、床という設定なので、上方にのみ接触させることにします。

Blueprint Graph 作成

  • 上記のようにイベントグラフを記述します
    • プレイヤーの接触判定は自由です。ここでは Player タグを見ています。
    • Apply External Strain で GeometryCollection に負荷を与えています。これにより崩壊を起こさせます。
      • AnchorIndex8 を指定しています。これは、私が固定した破片が 8 だからです。
      • Strain ここは Damage Threshold のインデックス0 と同じ値を指定しています。もし、先程変更していればその値でも動作するはずです。
        • 要は、その閾値よりも大きな値であれば OK です。

結果

Player タグを持ったキャラクターが上から接触すると崩落します。

Anchor Field を使った方法

ここまでは「GeometryCollection 自体が固定(アンカー)点を持つ」状態での例でした。

Anchor Field を使うことでも同じことができます。まずは Anchor Field の使い方も含めて見ていきましょう。

固定されない Geometry Collection を作る

  • 「0. 準備」で作成した床モデルがあるはずなので、それを改めてレベルに配置します
  • フラクチャモードに変更し、先程と同様に崩壊するようにモデルを作り、 「3. 破片の一部を固定する」だけをスキップします。
    • つまり、空中から落としたら勝手に落下して崩壊する状態です
  • 今回は GC_Floor_notAnchored と名前を付けました。
    • 以下の通り固定された破片はありません。

練習: レベルに置いた Anchor Field で試す

ここでの操作はレベルと Level Blueprint での操作です。

  • まず、FS_AnchorField_Generic を配置します。最後にこの例での配置例を示します。
    • Debug を有効にすると見やすいかもしれません。
  • 次に、先程作成した GC_Floor_notAnchored の 「Chaos物理」にある Initialization Fields に上記の FS_AnchorField_Generic を指定します。これはレベルに配置されたものを選択できます。
  • 続いて、プレイヤーの接触イベントを起こすために TriggerBox を配置します。
  • 以下が今回の配置例です。
    • FS_AnchorField_GenericGC_Floor_notAnchored重なるように配置してください
    • TriggerBox はこの例では単にプレイヤーが接触できればいいだけの配置です。
    • コーンはおまけです。
  • 上記は Level Blueprint に記述しています。レベルにあるものを参照しているので、そのままのコピペでは動作しない可能性があります。
    • Remove All Anchors で設定されているアンカー(固定)を削除します。こうすることで、拘束がなくなるため物理が働き落下します。
    • Wake All Rigid Bodies は無くても動作します。もし、うまくいかない場合は繋いでみてください。

これで、プレイヤーが Trigger Box のエリアに入れば崩落するようになります。

Blueprint にまとめる

BP_DestructOnContact_withAnchorField という Actor 継承の Blueprint を作成します。 GeometryCollectionBox Collision コンポーネントは先程の例と同様に追加・設定します。

ChildActor コンポーネントを追加する

  • 「子アクタクラス」に FS_AnchorField_Generic を指定します。ここでは一応 Debug も有効にしています。

Construction Script で設定する

  • レベルに配置した Anchor Field の場合は、直接 GeometryCollectionInitialization Fields に追加できますが、子コンポーネントの場合はスクリプトで追加する必要があります。
    • BeginPlay でも問題ありませんが、Construction Script で設定しておくのがよいでしょう

Box Collision でアンカーを削除

ここに関してはレベルブループリントと同様です。

結果

参考