UE5に結構大規模な街の3Dモデルを突っ込んでみました。
すると、なんとスタティックメッシュが6000個もインポートされてしまいました。
それはいいんですが、インポートしただけだとメッシュにコリジョンが無いので、プレイヤーキャラクターが突き抜けてしまいます。
コリジョンを付ける必要がありますね。
まずスタティックメッシュを開いて~、コリジョン→オートコンベックスコリジョンを選んで~、
「適用」を押してしばらく待てば~、
ハイ!いい感じにコリジョンが自動生成されました!↓
あとはこれを6000回繰り返すだけ!かんたんですね!
…………
やってられるか!
こんな作業をポチポチ手でやらせるんじゃねえよ!自動化できないのか!?
と思ってまず、プロパティマトリックス編集を試してみましたが、しかしここからではコリジョン生成ができません。
常識的に考えて何か方法があるハズだとググったら、公式ドキュメントに「ブループリントおよび Python でスタティックメッシュを使用してコリジョンを設定する」という、まさに求めていた方法が公式ドキュメントに書いてあったので、やってみましょう。
UnrealEngineでは、エディタ拡張的なモノをブループリントでサクッと作れます。
https://docs.unrealengine.com/5.0/ja/scripted-actions-in-unreal-engine/
そのためには、まずEditor Scripting Utilitiesプラグインをインストールします。
では、スタティックメッシュのアセットに、「スクリプト化されたアクション」でコリジョンを追加できるヤツを作りましょう。
「スクリプト化されたアクション」って何じゃ?というと、アクタやアセットを右クリックした時のメニューとして実行できて、アクタやアセットに対してブループリントで書いた処理を実行させられます。
コンテンツブラウザで右クリックして、エディタユーティリティ→エディタユーティリティブループリントを選びます。
で、「親クラスを選択」では、今回はアセットに対して処理したいので、AssetActionUtilityを選びます。
ちなみにアクタに対して処理したい時はActorActionUtilityを選びます。要するにアセットってのはコンテンツブラウザの中にあるヤツで、アクタってのはアウトライナーの中にあるヤツです。
後は普通にブループリントで関数を作れば使えるようになります。
「ブループリントおよび Python でスタティックメッシュを使用してコリジョンを設定する」を参考にブループリント書くとこんな感じです。↓
シンプルですね。まず”Get Selected Assets”で選択中のアセットを取得します。
次に、”Set Convex Decomposition Collision”でアセットにConvexコリジョンを付与します。Hull Countとかのパラメータの意味はエディタで手作業で操作する時のヤツと同じです。
最後に、”Save Loaded Assets”変更したアセットを保存します。この時、”Only if Is Dirty”のチェックを外しておく必要があります。そうしないと保存されません。
あとは、コンテンツブラウザでスタティックメッシュを選んで(複数まとめて選択してもOK)、右クリックして”スクリプト化されたアセットアクション”を選ぶと、今作った関数が出てくるので、それを選べば実行されます。
簡単ですね。
では、早速調子こいて6000個のスタティックメッシュに一気にコリジョンを付けましょう!
自動化イェーイ!ポチ!!
しばらくすると、処理の途中でUEのエディタがクラッシュして落ちました。
なんでや!!
ブループリントをよく見ると、まず最初に選択されたアセット全てに対してコリジョンを追加してからそれらをセーブするって流れですよね。
つまり、最終的に6000個のアセットの変更がセーブされないままメモリに蓄積してしまう事になります。
10個とか100個程度なら大丈夫だったかもしれませんが、6000個となると、そりゃあ当然途中でメモリ不足になって落ちますよね。
ですから、こまめにセーブする必要があるわけです。
というわけで、25個ずつくらいに分割してコリジョン追加→セーブの流れをこまめに実行するように変更しました。
これでいいだろう!と再び実行してみたら、さっきよりは調子よく進みましたが、しばらくするとやっぱりエディタがクラッシュして落ちました。なんでや!?
どこかに相性が悪い?アセットが潜んでるのかもしれません。
問題を突き止めるために、とりあえず処理のプロセスをログに出力するようにしました。
これならエディタが落ちてもログファイルを見ればどこで落ちたのか分かりやすくなります。
とは言え、途中まで上手く行ってたのに、毎回最初からやり直しというのもアホらしいです。
というわけで、メタデータを使ってみます。
メタデータというのはアセットにタグと値(string)の組み合わせで自由に使えるデータを追加できる機能です。
詳細はドキュメントに書いてます。↓
https://docs.unrealengine.com/4.26/ja/Basics/AssetsAndPackages/AssetMetadata/
処理が完了したアセットにはメタデータで印を付けておけば、途中でクラッシュしても次回の処理ではその印を見て処理済みのアセットをスキップできます。
ドキュメントに書いてる通り、”Set Metadata Tag”でアセットにメタデータが付与出来て、”Get Metadata Tag Values”でアセットのメタデータが取得できます。
まあそんなこんなで、何回か処理を実行してる内に、エディタをクラッシュさせてる悪さをしてるアセットが判明しました。
そのアセットにはためしに手作業でコリジョンを追加してみましたが、手作業だと普通に大丈夫でした。
というわけで、何やかんやありつつも、6000個の大量のスタティックメッシュに対して自動でコリジョン追加する事に成功しました。
最終的なブループリントはこんな感じになりました。↓
まあ細かい部分は手作業で調整する必要があるかもしれませんが、最初に一括でコリジョン付けられたのでだいぶラクができましたね。
こんな感じで、UEでは処理の自動化もブループリントでサクッと作れて便利です。というかむしろこんなん手作業でやってたら死ぬケースが度々あると思うので、必須テクと言えるかもしれません。
というわけで、この記事が参考になれば幸いです。