アルゴンUE4/UE5開発日記

UE4/UE5の機能やプラグインを紹介します。初心者や中級者向けになってます!!

【UE5】 鎖の表現を作成する方法

久しぶりのものづくり系記事です( ・`ω・´)

今回はゲームとかでよくある鎖の表現を作ってみようと思います。
主に片方のみ繋げた鎖、左右を固定した鎖、力を加えると切れる鎖など
様々な設定を付与できる鎖用のBPを製作します

※UE5.4.4で検証しています。
※書き間違え等あればコメントください!
※実際に動作させたのはこちらになります。

Githubの方にプロジェクトを公開しております。
 こちらも合わせてご確認ください。

モデルの準備

今回下記のデータを活用して作成しています。
鎖のスタティックメッシュと鎖用のマテリアルになります。

鎖のスタティックメッシュと鎖のマテリアル

鎖の当たり判定についてはUEのStaticMeshの設定画面からボックスコリジョンを、
追加して作成していっていました。

※作り方については割愛しています。

鎖の当たり判定

・目次に戻る

実際に鎖を作る

Constraintで破綻することなく繋げる方法を紹介します。
まずは各種活用する変数の説明からしていこうと思います。
◯Chain Dataカテゴリ
・ChainTransform                ← 鎖の位置・角度・大きさ
・ChainDistance                   ← 鎖の間隔
・ChainMesh                        ← 作成した鎖のスタティックメッシュの配列
・ChainKg                             ← 鎖一つ一つの重さ
・First Index                         ← 配列で作成した
・ChainNum                         ← 鎖の数(この数が多くなると鎖が長くなります)
・isFixEndChain                   ← 最後の鎖を作って固定するかどうか
◯Componentsカテゴリ

・EndChainMesh                   ← 最後の鎖を固定する用のスタティックメッシュ
・StartChainMesh                 ← 最初の鎖を固定する用のスタティックメッシュ

◯Constraint Dataカテゴリ

・ConstraintTransform         ← コンストレイントの位置・角度・大きさ
・SwingAngle                        ← 曲がる角度の数値
・SwingMotion Type            ← 曲がる動作の構造体
・isBreakable                         ← 繋がりが解除されるかどうか
・Linear Break Threshold      ← 繋がりが解除されるまでの強度

ChainBPの各種変数

つづいて各種StartChainMeshに鎖のモデルを指定しておきます。
※EndChainMeshにも同様に設定してます。

鎖のモデルで設定をしている

続いて各種関数を作成していきます。
まずは鎖の位置・角度とコンストレイントの位置を決める関数から作成しました。
鎖動作としては2で余る場合はpitchの角度を90度加算する動作になります。
鎖の幅とコンストレイントの幅は同じくY方向に「6.5」になります。

鎖の追加

コンストレイント側も間隔の位置を設定しています。

鎖のコンストレイントの位置を設定

位置を指定するTransformの変数を設定が完了したので、
今度はそのTransformを元に鎖やコンストレイントを作成していきます。
まず鎖の方ですがStaticMeshComponentを追加して、
無事生成できてるかチェックして鎖のメッシュを適応して、
物理動作を行うようにするためSimulatePhysicsをONにしています。

鎖の生成1

そして鎖の動作をムーバブルに設定して当たり判定まわりを、
物理ボディのブロックに指定して重さをChainKgで指定した数値にする。
最後に配列変数に作成した情報を追加して完了になります。

鎖の設定2

続いてコンストレイント側を製作するための関数の説明をします。
まずその前に関数の引数として下記の変数を設定しておきます。
・Constraint 1                       ← 接続元のモデル(StaticMeshCommponent)
・Constraint 2       ← 接続先のモデル(StaticMeshCommponent)
・Need Constraint Instance ← コンストレイントの接続情報のインスタンスを作るか?

実際に処理の中身を見てみましょう
コンストレイントを作り、無事生成できることを確認していきます。
まずメッシュのときと同様に物理コンストレイントの追加
そして引数で持ってきたモデル情報とモデル情報で結合する。

鎖のコンストレイント1

それが出来上がったらConstraint intanceのON/OFFを確認して、
ONの場合のみConstraint Instanceを設定する。
SetAngular Limitは鎖の設定をON/OFFする。
そして曲がれる角度かどうかと各種設定をしていく。
・SwingAngle     ← 曲がる角度など
・SwingMotionType ← Free Limited Lockedの3種類で固定する。

鎖のコンストレイント2

最後に曲がったときの振れ幅などの計算で設定したり、
破壊できるかの動作の設定を行っています。
振れ幅やねじれに関してはすべてOFFに設定していて、
isBreakableで破壊可能か確認してONの場合は破壊する形で、
「Linear Break Threshold」で強度を指定して完了になります。

鎖のコンストレイント3

これで主な関数の説明は完了なので実際に各種関数を用いて、
各種実際に処理を実行していきます。
まずはシーケンスを用いて最初の鎖を連結します。
1.鎖の間隔を作成する関数を動作させる。
2.実際に鎖の間隔の位置に合わせて鎖のモデルを作成する。
3.連結用のコンストレイントの間隔を作成する関数を動作させる。
4.コンストレイント作成の関数を呼び出してStartChainMeshと、
   作成した鎖をコンストレイントで接続する。

最初の連結する鎖を作成

続いて連続する鎖のコンストレイントと鎖のモデルを作成していきます。
こちらはFor文でChainNumの数だけ鎖を繋げるために、
連続して処理を実行していきます。
やっていることの流れは下記の通りになります。
1.鎖の間隔を作成する関数を動作させる。
2.実際に鎖の間隔の位置に合わせて鎖のモデルを作成する。
3.連結用のコンストレイントの間隔を作成する関数を動作させる。
4.コンストレイント作成の関数を呼び出して作成した鎖と一つ前の鎖を連結させる。

連結させる中間の鎖を作成

ForLoopが完了した際にisFixChainをON/OFFによって動作が変化します。
OFFの場合はEndChainMeshを削除します。
ONの場合の動作は下記の通りになります。
1.EndChainMeshの位置を設定する。
2.作成した位置にEndChainMeshを指定(ForLoop最後の鎖のとなり)
3.連結用のコンストレイントの間隔を作成する関数を動作させる。
4.コンストレイント作成の関数を呼び出して、
 EndChainMeshとLoop最後の鎖と連結して固定する。

最後の鎖を連結するかどうかチェックして必要があれば作成する

以上で今回の鎖のActorの処理は完成になります。

最初の方にGithubのリンクも置いてますので、
そちらを確認するのが早いかもしれません。

・目次に戻る

最後に

ここまで見ていただきありがとうございました。
作っていく中で幾つか反省点や拡張性の低さがありますね・・・
・数値で鎖を増やしているので希望する長さにしづらい。
・別の装飾品などもつけれるようにしたい。
・鎖の起きさなどを自由に変えたい。

ここら辺は修正したいですね。
見ていただきありがとうございました!

・目次に戻る