ATMWRIによるUE5の記録

Unreal Engine 5 を使い始めました

BlenderでPython使ってPLATEAUのモデルをランダム選択して結合

ぷちスタで作成したUE5のタイムアタックゲームを拡張しようとマップの作成を考えていたところ、PLATEAUという国のサービス?の存在を知り、23区のFBXデータをダウンロードした。解凍後のサイズは約9GBで結構でかい。
LOD2のモデルはテクスチャ付きだが加工難易度が高そうなのでLOD1のモデルを使用することにした。が、一つ一つはローポリの豆腐建築であってもUE5へインポートするとオブジェクト数が多すぎて応答なしが多発してうまくいかなかった。

Blenderで加工

とりあえず以下のような作業を機能を試しながらポチポチとやってみた。7回なのはテトリスのあれが7色だからなんとなく。

  1. ランダムに選択
  2. 選択したオブジェクトを結合
  3. マテリアルを追加
  4. 非表示にする
  5. 1に戻って7回繰り返す

PLATEAU 23区マップをこんな風に加工した

一つのエリアは100個に分割されている。23区全体で14エリアで1400回もポチポチする気になれない。存在だけは知っていたBlender Pythonの出番かと、重い腰を上げて使ってみた。

Blender Pythonを使ってみる

Editor TypeInfoにするとこんな画面が出てくる。マウスやキーボードでBlenderを操作するとそのたびにログが出てくる。これをコピペでやればいいんだろうと最初は甘く見ていた。

Blenderの操作はだいたい出力されているらしい

すんなりいかなかった点

  • オブジェクトの結合 Ctr + Jをするのには複数選択したうえでActiveな状態のオブジェクトが必要、マウス無しでどうやるの?

  • Brows Material to be linkedをクリックして選んでたけどどうすんの?

ググったらなんとかなった。

  • セレクトしてるオブジェクトのうち最初の1つをターゲットにする
target = bpy.context.selected_objects[0]
    bpy.context.view_layer.objects.active = target
  • 結合されたターゲットに対して
if target.data.materials:
        target.data.materials[0] = bpy.data.materials[sd]
    else:
        target.data.materials.append(bpy.data.materials[sd])

そんな感じでこんな感じになった。

ランダムセレクトして結合、マテリアルのセットを7回繰り返すスクリプトのテスト

まとめ

23区全体を処理しようとすると結局1400回近くFBXをBlenderへインポートしてスクリプトを走らせる作業があると思うとぞっとしてきた。それも自動化できたらいいなぁと思いつつも、時間がないのでエリアを縮小することする。