UEでランタイムにメッシュ変形がしたいぼくの365日間戦争

これはUEでランタイムにメッシュ変形をしようとした人間の長い戦いの記録である
結論だけ見たい人は[ここまで](#というわけで組んでみる)飛んでください。
## Geometry Scriptとの出会い
Geometry ScriptはUE5で追加された機能で、Lyraサンプルにも使われているメッシュに穴をあけたりゲートの位置をずらしたりできるとにかく便利なやつである。

[公式ドキュメント　Geometry Scripting User Guide](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/geometry-scripting-users-guide-in-unreal-engine)

[MeshのBoolのコミュニティチュートリアルとか](https://dev.epicgames.com/community/learning/tutorials/v0b/unreal-engine-ue5-0-geometry-script-mesh-booleans-and-patterns)
[つべの動画とか](https://www.youtube.com/watch?v=f83TTLzLFaM)
いろいろチュートリアルが出ている。



基本的な動作として、

Geometry Scriptプラグインを有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/148c316f-ecef-493c-872f-9cfbb603fcea.png)
GeneratedDynamicMeshActorを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f8406f26-6973-4128-afb6-bd4c6c195ddc.png)
On Rebuild Generated Meshで元となるボックスを出す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/3f936175-6a35-47ba-b85e-00939a526ca6.png)
Cylinderとかを追加してBool演算する
![BP_OldSystem-EventGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/ac51431b-5466-4dee-9a8a-3c806835b930.png)
大体こんな構成がチョイスされている。
PIEで実行してみるとちゃんと動いているように見える。
![GeometryScript プレビュー [NetMode_ Standalone 0]  (64-ビット_PC D3D SM6) 2025-04-18 10-28-03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/a7daecce-2140-4665-89e2-9be895c62c45.gif)
Runtime Geometry Scriptをうたった動画やチュートリアルは大体ここで終わっている。

**イヤーできたできた。このブログここで終わりっすわ**



## そんなわけがない
そんなことで終わるならこの記事は爆誕していない。
この手法には重大な欠点があり、それは

**Generated Dynamic Mesh Actor 関数は、現時点ではエディタ専用である**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/1efddd8c-b965-4a78-b52a-65df58aa8309.png)
という点である。

こいつはPIEだからいいように動いて見えただけで、実行ファイルにするとたちまち動かなくなるのである。（5.5現在も）ドキュメントはちゃんと読みましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/9930bc45-2af2-480c-8d46-0085850adb96.png)
▲スタンドアロンでプレイしたら喪失した図

これが判明し、1年近くOn Rebuild Generated Meshを使用していないMesh変形を行う手法を探し続けることになるのであった…

## 唐突な出会い

日課の検索を行ったところ、ふいにこの動画に出会った
<iframe width="560" height="315" src="https://www.youtube.com/embed/Pj-3sYOZEow?si=caR3NBzXSufTaOCz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

**実行ファイルで動いている…だと…？？？？**
とりあえず一周してみたところ、確かにOn Rebuild Generated Meshを使っていない。

## というわけで組んでみる

まずDynamic Mesh Actorを新しく作成する。Generatedではないので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/2d502ff8-5659-4aa6-8de7-2b92ceb8e87a.png)

Construnction ScriptでGet Dynamic Meshし、リセットしてからBoxを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/1c9e2f58-5e94-4749-affe-230e34eb8eba.png)
旧バージョンと大体同じようにCylinderを追加。
On Rebuild Generated MeshからTargetMeshを変数にしていないので代わりにGet Dynamic MeshでTarget Meshを取得
![BP_NewSystem-EventGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/8f3eed6a-3be6-43d1-8fe1-cf09b06d23aa.png)

とりあえずPIEで動いていることを確認
![GeometryScript プレビュー [NetMode_ Standalone 0]  (64-ビット_PC D3D SM6) 2025-04-18 11-45-24 - frame at 0m25s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f76f3866-1221-4f8b-b8f7-13c3187b0f01.jpeg)

真価が試されるのはここから。Standaloneで起動！先ほどは消えてしまったが…

![GeometryScript (64-bit Development PCD3D_SM6)  2025-04-18 11-48-22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/57ca00b5-46ae-42e9-aa92-c42b96250478.gif)

**キャー！動いたー！！！（黄色い声）**

ついでにパッケージ化もしてみる。
![GeometryScript   2025-04-18 11-54-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/fc647e93-36bd-4f35-91e2-4e0bb298658f.gif)

**キャー！動いたー！！！（2回目）**

## 結論
GeneratedDynamicMeshActorとOn Rebuild Generated Meshはトラップである
きっと誰かが穴掘ったりするゲームとか切削シミュレーターとか作ってくれるのを楽しみにしてます。