はじめに
こんにちは!
情熱開発部プログラム課の角谷です!
突然ですが、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を簡単に生成したい場合等使ってみてはいかがでしょうか。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。