久しぶりのものづくり系記事です( ・`ω・´)
今回はゲームとかでよくある鎖の表現を作ってみようと思います。
主に片方のみ繋げた鎖、左右を固定した鎖、力を加えると切れる鎖など
様々な設定を付与できる鎖用のBPを製作します
※UE5.4.4で検証しています。
※書き間違え等あればコメントください!
※実際に動作させたのはこちらになります。
片方しか固定されていない鎖、
— アルゴンブログ公式 (@Argonblog) 2025年4月20日
両方固定されている鎖、
力によって壊れる鎖の、
3パターンを作れるアクタを制作中です。
記事になるまでもう少々お待ち下さい。
プログラム量が結構多く説明追加中です。#UE5 #アルゴンブログ pic.twitter.com/htbEJujvC7
※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 ← 繋がりが解除されるまでの強度

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

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

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

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

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

続いてコンストレイント側を製作するための関数の説明をします。
まずその前に関数の引数として下記の変数を設定しておきます。
・Constraint 1 ← 接続元のモデル(StaticMeshCommponent)
・Constraint 2 ← 接続先のモデル(StaticMeshCommponent)
・Need Constraint Instance ← コンストレイントの接続情報のインスタンスを作るか?
実際に処理の中身を見てみましょう
コンストレイントを作り、無事生成できることを確認していきます。
まずメッシュのときと同様に物理コンストレイントの追加、
そして引数で持ってきたモデル情報とモデル情報で結合する。

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

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

これで主な関数の説明は完了なので実際に各種関数を用いて、
各種実際に処理を実行していきます。
まずはシーケンスを用いて最初の鎖を連結します。
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のリンクも置いてますので、
そちらを確認するのが早いかもしれません。
最後に
ここまで見ていただきありがとうございました。
作っていく中で幾つか反省点や拡張性の低さがありますね・・・
・数値で鎖を増やしているので希望する長さにしづらい。
・別の装飾品などもつけれるようにしたい。
・鎖の起きさなどを自由に変えたい。
ここら辺は修正したいですね。
見ていただきありがとうございました!