1. サイトトップ
  2. ブログ
  3. Unreal Engine
  4. 【UE4】UnrealPythonでスケルタルメッシュのマテリアルを書き換えてみる

【UE4】UnrealPythonでスケルタルメッシュのマテリアルを書き換えてみる

こんにちは!情熱開発部の小川です。

世間は大変なことになっていますが皆さまいかがお過ごしでしょうか。

今回はUnrealPythonについて書いていこうと思います。

※UE4バージョンは4.24.3 Pythonは2.7を使用しています。

1.はじめに

ある時、スケルタルメッシュのマテリアルを置き換えるツールを作ろうとしていました。

「よし、EditorUtitlityBlueprintでつくってみよう」

と思っていたら。。。

「あれ?スケルタルメッシュにSetMaterialが無い?」

Edittor Utility BlueprintからSetMaterialでマテリアル置換しようとした時

エンジンを改造等の他の方法で実装できるかもしれませんが、今回はUnrealPythonという別の選択肢を選びました。

2.準備

というわけで、UE4でPythonを使用できる準備をします。

エディター上部の編集→プラグインから「Python Editor Script Pligin」を有効にします。

UnrealPythonを確認するためにアウトプットログを出します。

左下のcmdをPythonにするとログからpythonを書くことが出来ます。

スケルタルメッシュはサードパーソンのマネキンを使用します。

マテリアルは適当に選びました。

3.実装

準備が出来たら実装していきます

コード全体はこんな感じです。

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


# 選択しているアセットを取得
Util = unreal.GlobalEditorUtilityBase.get_default_object()
AssetList = Util.get_selected_assets()
SkeletalMeshList = unreal.EditorFilterLibrary.by_class(AssetList,unreal.SkeletalMesh)

# スケルタルメッシュ分ループさせる
for SkeletalMesh in SkeletalMeshList:

	#新しく設定するマテリアルの配列
	skeletal_materials = []

	# スケルタルメッシュにセットされているマテリアル分ループ
	for Material in SkeletalMesh.materials:

		# SkeletalMatarialからmatarialinterface情報を取得
		interface = Material.get_editor_property("material_interface")

		# 全てのマテリアルを石レンガに置き換えた場合   
		material_data = unreal.EditorAssetLibrary.find_asset_data("/Game/Test/Material/M_Brick_Clay_Old")        
		material_asset = material_data.get_asset()
		material_interface = unreal.MaterialInterface.cast(material_asset)
		
		# 設定するマテリアル配列を作成
		skeletal_materials.append(unreal.SkeletalMaterial(material_interface, Material.get_editor_property("material_slot_name"), Material.get_editor_property("uv_channel_data")))

	# set_editor_propertyでエディタで変更出来るパラメーターの変更が可能
	SkeletalMesh.set_editor_property("materials", skeletal_materials)

4.使ってみる

コードが書けたら次はエディターで実行していきます。

実行はアウトプットログでpy [pythonファイルパス]を入力することで実行できますが、今回はAssetActionUtilityを継承したEditorUtitlityBlueprintを作成し、下記のようにExecuteConsoleCommandノードを使ってEditorUtitlityBlueprintと同じように実行することもできます。

関数名はMterialReplaceにしてます。
※WorldContextObjectピンは必ず繋げないといけません。

コンテンツブラウザでスケルタルメッシュを選択して右クリック

ScriptedActionsの中のEditorUtitlityBlueprintで作成した関数名を選択します。

そして書き換えしたマネキンはこちら。。。。って

分かりづらい!!!!!!

なんで石レンガにしてしまったんでしょうか、とにかく書き換えることができました。

 Util.get_selected_assets()は選択したアセットを配列で取得するので、もちろん複数のスケルタルメッシュを選択して一気に書き換えることも可能です。

マネキンを4体に増やして、次はゴールドにしてみましょう。

パッと書き換えることが出来ました。

今回は特定のマテリアルに書き換えるだけのものでしたが、get_path_name()を使うことでパスを取得したり、EditorAssetLibray.seve_asset()でアセットを保存する手間も省くことが出来ていろいろ使えそうです。

皆さんもぜひ使ってみてください!

最後までご覧いただきありがとうございました!


【免責事項】

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