1. サイトトップ
  2. ブログ
  3. Unreal Engine
  4. 【UE4】スケルタルメッシュのLOD作成をUnrealPythonで行う

【UE4】スケルタルメッシュのLOD作成をUnrealPythonで行う

はじめに

こんにちは!
情熱開発部プログラム課の角谷です!

突然ですが、UnrealEngineにはSkeltalMeshのLODを生成する便利な機能があります。

上記の画像のLOD再生成というボタンを押すだけでLODをBaseLODから良い感じに作成してくれます。
便利ですが、LODが増えれば増えるほど入力が多くなり、スクロールも増え大変です…
更に、モデルのインポートし直しなどが発生した場合、モデル自体にLOD情報が無ければ再度同じ入力をする事になってしまいます。

上記の手間を省くべくデータアセットを設定するという手もありますが、
今回は拡張性のありそうなUnrealPythonからLODを作成してみたいと思います。
※ UE4のバージョンは4.25.3を使用しています。

UnrealPythonでスケルタルメッシュのLODを作成するには

まず、初めにUnrealでPythonを使用するには準備が要ります。
以前弊社で書いたブログの方にUnrealPythonの使用の仕方が載っていますので、是非ご確認ください。
UnrealPythonでスケルタルメッシュのマテリアルを書き換えてみる
さて、UnrealPythonでLODを生成するにはUnrealEngineがLOD生成の処理をPythonに公開している必要があります。
公開されているのか調べたところ以下の関数がありました。
https://docs.unrealengine.com/en-US/BlueprintAPI/EditorScripting/SkeletalMesh/RegenerateLOD/index.html


BluePrintに公開されている関数はPythonでも公開されているはずです。
この関数を使えばPythonからLODを生成する事が可能そうです!
早速サードパーソンの以下のスケルタルメッシュを使って生成してみます。

実装

コードは以下のように実装しました。
今回はテスト的にコード自体にリダクション設定の値を書き込んでいます。

# -*- coding: utf-8 -*-
import unreal

# 選択しているアセットを取得
util = unreal.EditorUtilityLibrary.get_default_object()
assetList = util.get_selected_asset_data()

# LODの設定名を定義
unreal.log("LOD作成開始")
# 選択しているアセットのLOD設定を変更
for asset in assetList:
    skeletalmesh = asset.get_asset()

    # Lod設定用の配列
    lodinfo = []

    # Baseのモデルは変更したくないためBaseのLODを取得し、設定
    baselodinfo = skeletalmesh.get_editor_property("lod_info")
    lodinfo.append(baselodinfo[0])

    # ScreenSizeを設定
    screensizearray = [0.8, 0.6, 0.4, 0.3]
    # ScreenSizeを設定
    for screensize in screensizearray:        
        PerPlatformFloat = unreal.PerPlatformFloat()
        PerPlatformFloat.set_editor_property("default", screensize)
        Info = unreal.SkeletalMeshLODInfo()
        Info.set_editor_property("screen_size", PerPlatformFloat)
        lodinfo.append(Info)

    # BaseLODからの頂点の割合を設定
    vertparcentagearray = [0.06, 0.03, 0.02, 0.01]
    # リダクションの方法を設定
    terminationarray = [1, 1, 1, 1]
    # BaseLodの次から開始するためにcount変数を1に設定
    count = 1
    for i in range(len(screensizearray)):
        OptimizationSetting = unreal.SkeletalMeshOptimizationSettings()
        OptimizationSetting.set_editor_property("num_of_vert_percentage", vertparcentagearray[i])
        # 頂点の%率で削減率を決定
        OptimizationSetting.set_editor_property("termination_criterion", unreal.SkeletalMeshTerminationCriterion.cast(terminationarray[i]))
        lodinfo[count].set_editor_property("reduction_settings", OptimizationSetting)
        count += 1
    # LODInfoを設定
    skeletalmesh.set_editor_property("lod_info", lodinfo)
    # LODを再生成
    skeletalmesh.regenerate_lod(len(lodinfo), True)

    minlod = [1]
    # MinLODを設定
    for SettingVal in minlod:
        PerPlatformInt = unreal.PerPlatformInt()         
        PerPlatformInt.set_editor_property("default", SettingVal)
        skeletalmesh.set_editor_property("min_lod", PerPlatformInt)

    #スケルタルメッシュ保存
    unreal.EditorAssetLibrary.save_asset(asset.get_full_name(),only_if_is_dirty = False)

unreal.log("LOD作成完了")

今回は、ScreenSizeをLOD1から順番に0.8,0.6,0.4,0.3で設定
削減率は違いが分かりやすいようにLOD1から0.06,.0.03,0.02,0.01で設定
削減方法は頂点数で設定しました。
削減方法のどの値が何を表しているのかは以下のページをご参照ください。
https://docs.unrealengine.com/en-US/PythonAPI/class/SkeletalMeshTerminationCriterion.html
また、MinLODも1を設定しました。

実際にLODを作成する

さて、実装も出来たところで実際にLODを作成してみます。
サードパーソンのスケルタルメッシュを選択して、上記で書いたPythonを呼び出します。すると…

問題なくLODが生成されているのを確認できます!
もちろんこれは、複数のスケルタルメッシュを選択した場合も可能です。

まとめ

上記の対応のみでは半自動と言った感じですが、
UnrealPythonはUE4起動時に呼び出し等も出来るので起動時にPythonを呼んでLODを作成といった事が出来そうです。
また、Pythonであるのでエクセルに書いてある表等を元にLODを生成するといった事も出来、拡張性が高いです。
実装もそこまで手間ではなく負荷調査の兼ね合いでLODを簡単に生成したい場合等使ってみてはいかがでしょうか。


【免責事項】

本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。