オブジェクトを切りたくないですか?(^ω^)
今回はゲームとかでオブジェクトが切るために使用する、
ProceduralMeshを使ってみようと思います。
※UE4.27.2を使用して説明しています。
参考にさせていただいたのは下記のyoutubeになります!
サンプル用に作成したプロジェクトはこちらになります。
※私の環境でしか確認していないので動かなかったらご連絡ください・・・
プロジェクトの作成
まずはプロジェクトを作成していきます。
FPSのサンプルプロジェクトを作成して進めていきます。
続いてファーストパーソンテンプレートを選択します。
ここまで行えば行えばプロジェクトが作成されます。
切られる側のオブジェクトを用意する
まずアクターのブループリントを用意します。
右クリックでブループリントを選択してアクターを選択します。
今回はキューブをProceduralMeshに設定します。
ProceduralMeshComponentとCubeを追加します。
※分かりやすいようにマテリアルの変更をするのもいいかもしれません。
つづいてProceduralMeshにするスタティックメッシュに対して、
AllowCPUAccessをTrueにしてCPUから情報を取得できるようにします。
設定をONにしておきます。
その後コリジョンをオートコンベックスコリジョンで作成します。
凸型分解のメニューから適応を押します。
Cubeのコリジョン設定が完了したら、
ProceduralMeshコンポーネントの方のSimulate PhysicsをONにして、
Use Complex as Simple CollisionをOFFにします。
※シンプルな当たり判定を使用し物理シミュレーションが動作する設定にします。
各設定が完了したらコンストラクの方で、
ProceduralMeshに対してCube情報をコピーしてCubeコンポーネントを削除します。
これで切られる側のActor設定は完了になります。
飛ばす物体を用意する
今回はFirstPersonProjectileをコピーして作成します。
コピーを作成したらCollisionComponentを選択して、
コリジョンプリセットをBlockAllに変更します。
プロジェクタイルの設定が完了したらOnComponentHitに設定をします。
Hitの構造体ピンを分割しておきます。
※分割する方法は右クリックで構造体ピンを分割を選択します。
ピンを分割したらHit時にProceduralMeshかどうかを判断し、
ポリゴンを切るという処理を追加します。
1.Cast To ProceduralMeshComponetでキャストできるか確認
2.Castに成功した場合はSlice Procedural Meshでメッシュを切る
Slice ProceduralMeshの設定項目としては下記になっています。
・In Proc Mesh → ProceduralMeshを指定
・PlanePosition → 切れる場所
・Plane Normal → 切れる方向の法線
・Create Other Half → 破片の作成するかどうか
・Cap Option → 切れ目の表示の設定になります
※(何も表示しない・新しい切れた面を作成・既存のマテリアルで面作成)
・Cap Material → 切れた面のマテリアルの設定をします。
それ以外に破片に対しての物理シミュレーションや衝撃などの動作を設定します。
あとはFirstPersonCharacterのBPで弾をSpawnActorしている箇所に、
今回コピーして作成したBP_ProceduralBulletに変更します。
設定して実際に動かしてみると下の絵のように物体をバラバラにできます。
※紫色の箇所が切った段目になります。
以上がProcedruralMeshの設定は以上になります。
※StaticMeshならいろいろ切れるのでぜひ試してみてください(^ω^)
切る角度の設定を行う
キャラクター側で操作するボックスの角度を元に切れる平面の法線を指定します。
まずProceduralMeshを切る弾の方で切られる平面の法線を指定します。
キャラクター側でメッシュを切る角度が、
どうなっているかわかるようにCubeを設定して表示します。
銃に設定しているSphereの箇所にCubeを追加します。
Cubeの角度をプロシージャルメッシュの切れる角度を指定するので、
キューブの角度を変更できる処理を追加します。
まず角度用の変数と変更用のマクロを指定してます。
※マクロについては引数に合わせて角度を加算したり減算しています。
マウスホイールを上下に回転させて角度を変更します。
キューブの角度を弾のPlaneNormalに値を渡します。
弾があるかどうかをチェックして角度を渡してあげます。
上記の処理を追加すると下記の画面のようにブロックの角度に合わせて切れます。
※横方向に切った場合
※縦方向に切った場合
今回はこれで以上になります。
実際にいろいろ出る弾をブレードとかにした場合の結果は下のツイートになります。
以前書いたブログに誤りがあったのを教えていただいたので、
— よしかた@何もしてない (@yoshikata_game) 2022年2月2日
再度赤い長四角の角度に合わせてメッシュを切る
サンプルを作り直しました。
ブログの再構成とともにこちらのサンプルをブログに追加します。
教えていただいたありがとうございます!😃 pic.twitter.com/AdSuaQKK7y