【UE5】UnrealPythonの基本的な使い方
プログラマーの尾関です。
今回は UnrealPythonの基本的な使い方について書いていきます。
- UEバージョン: 5.1
目次
- Unreal Pythonとは
- セットアップ手順
- VSCodeのオートコンプリートを有効にする
- スクリプト作成例:アセットの操作
- スクリプト作成例:レベル操作
- スクリプト作成例:UI
- スクリプト作成例:ファイル読み込み
- 参考ページ
Unreal Pythonとは
Unreal Python は、Unreal Engine(特にエディタ操作)を Python スクリプトで制御できるようにする機能です。主に「エディタ拡張」や「アセットの一括処理」「パイプラインの自動化」などに使われます。
他にも、Editor Utility Widget (EUW) に存在しない機能がなぜか Unreal Python では使用できたりすることもあります。
セットアップ手順
プラグインを設定する
メニューから「編集 > プラグイン」を選びます。

“Scripting” から “Editor Scripting Utilities” と “Python Editor Script Plugin” を有効にします。
UE5.1では、すでに有効になっていたので、その場合は設定不要です。

Pythonの動作確認
Pythonが動作するかどうかを確認します。エディタの下部にある “Cmd” をクリックして、”Python” を選びます。

コマンドに 「print(“hello”)」 と入力して Enterキーで決定します。

するとアウトプットログに「hello」と出力されます。

Pythonスクリプトフォルダにパスを通す
これは必須ではないですが、Pythonスクリプト用のフォルダを作っておくと管理しやすくなります。
コンテンツブラウザから「Python」という名前でフォルダを追加します。

メニューから「編集 > プロジェクト設定」を選びます。

パスを追加すると再起動を促されるので、再起動しておきます。

Pythonスクリプトはコンテンツブラウザから追加できないので、”Python” フォルダを右クリックして「エクスプローラーで表示する」を選びます。

エクスプローラー上で、Pythonスクリプトを追加します。

ここでは “hoge.py” としました。
Pythonスクリプトを実行する
スクリプトは以下のように記述してみます。
print("hello python")
このスクリプトを実行するには “Cmd” に戻して、以下のコマンドを実行します。
py hoge.py
実行すると以下のように アウトプットログに “hello python” と出力されるのが確認できました。

なお、”Cmd” でのコマンドは、キーボードの上を押すことで前回の入力を繰り返し使用することができます。

VSCodeのオートコンプリートを有効にする
Unreal Pythonを書く際、使用可能な関数をオートコンプリートで入力できると便利です。これは必須ではありませんが、VSCodeのオートコンプリートを行う方法について書いておきます。
Pythonスタブファイルの作成
UEのエディタのメニューから「編集 > エディタの環境設定」を選びます。

プラグイン > Python から「デベロッパーモード」にチェックを入れます

再起動を促されるので、エディタを再起動します。

するとプロジェクトの「Intermediate」フォルダに「PythonStub」が作成されます。

VSCodeの設定
VSCodeを起動してメニューから「ファイル > フォルダーを開く」を選びます。

Pythonスクリプトを格納しているフォルダに移動して「フォルダーの選択」をクリック。

フォルダのアクセス権の設定確認が表示されますが、問題ないので「親フォルダー “Content” 内のすべてのファイルの作成者を信頼します」にチェックを入れて、「はい、作成者を信頼します」をクリックします。

メニューから「ファイル > ユーザー設定 > 設定」を選びます。

「ユーザー」タブの状態で、「拡張機能 > Python > Auto Completes: Extra Paths」のところにある「setting.json で編集」を選びます。

この表示がない場合は Python の拡張機能がインストールされていないので、インストールしておきます。

settings.json が開かれたら以下のように PythonStubファイルのパスを指定します。
{
"python.autoComplete.extraPaths": [
"C:\\Users\\ozeki\\Documents\\Unreal Projects\\MyProject\\Intermediate\\PythonStub"
],
"python.analysis.extraPaths": [
"C:\\Users\\ozeki\\Documents\\Unreal Projects\\MyProject\\Intermediate\\PythonStub"
]
}
この Jsonファイルを保存して VSCode を再起動します。
するとコードの自動補完機能が有効となります。

スクリプト作成例:アセットの操作
Unreal Pythonの便利機能の作成例として、アセットを操作するスクリプトを書いてみます。
アセットのプロパティを書き換える
アセットのプロパティを書き換えるサンプルとして、メディアプレイヤーを扱ってみます。
まずはメディアプレイヤーを作成します。

Pythonフォルダに「MP_Test」という名前でメディアプレイヤーのアセットを追加しました。

MP_Testを開くと「Play on Open」にチェックがついているのが確認できます。これを Pythonスクリプトで 外すようにしてみます。

hoge.py を以下のように書き換えてみます。
# unrealの操作を行うためのモジュール.
import unreal
# MP_Testを読み込む.
obj = unreal.load_asset("/Game/Python/MP_Test")
# "play_on_open" プロパティを False に書き換える
obj.set_editor_property("play_on_open", False)
“import unreal” は Unrealの機能にアクセスするためのモジュールです。次に “unlreal.load_asset()” でコンテンツからアセットを読み込みます。そして “set_editor_property()” でプロパティを書き換えることができます。
ではコマンドに “py hoge.py” と入力して実行してみます。

“MP_Test” を開くと、“Play on Open” のチェックが外れていることが確認できます。

なお、明示的に型を指定すると、オートコンプリートが有効な場合にプロパティが補完されて入力が便利です。

# unrealの操作を行うためのモジュール.
import unreal
# MP_Testを読み込む.
obj:unreal.MediaPlayer = unreal.load_asset("/Game/Python/MP_Test")
# "play_on_open" プロパティを False に書き換える
obj.play_on_open = False
選択しているアセットを取得する
例えば以下のように “BP_EnemyData” と “DT_EnemyData” を選択しているとします。

以下のように unreal.EditorUtilityLibrary.get_selected_assets() で選択しているアセットのパスのリストを取得できます。
# unrealの操作を行うためのモジュール.
import unreal
# 選択しているアセットを取得する.
for asset in unreal.EditorUtilityLibrary.get_selected_assets():
# アセットのパスを出力する
print(asset.get_path_name())
実行結果
Cmd: py hoge.py
LogPython: /Game/Python/BP_EnemyData.BP_EnemyData
LogPython: /Game/Python/DT_EnemyData.DT_EnemyData
スクリプト作成例:レベル操作
エディタで現在開いているレベルを取得する
unreal.EditorLevelLibrary.get_editor_world() でエディタで開いているレベルを取得できます。
import unreal
# 現在エディタで開いているレベルを取得する.
world:unreal.World = unreal.EditorLevelLibrary.get_editor_world()
print(world
選択しているアクターを取得する
import unreal
# 選択しているActorをリストで取得する (取得でない場合リストは空となる).
list_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
print(list_actors)
現在開いているレベルにアクターを配置する
AActorを配置して名前(ラベル名)を変更する
import unreal
# 現在開いているレベルに配置する.
location:unreal.Vector = unreal.Vector(1000, 1000, 500)
rotator:unreal.Rotator = unreal.Rotator(0, 0, 0)
actor_class:unreal.Actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.Actor, location, rotator)
# 名前を変更する.
actor_class.set_actor_label("test")
アクターにスケール値を設定する
set_actor_scale3d()でスケール値を設定できます。
import unreal
import sys
# 現在開いているレベルに配置する.
location:unreal.Vector = unreal.Vector(1000, 1000, 500)
scale:unreal.Vector = unreal.Vector(1, 2, 3)
rotator:unreal.Rotator = unreal.Rotator(0, 0, 0)
actor_class:unreal.Actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.Actor, location, rotator)
actor_class.set_actor_scale3d(scale) # スケール値を設定.
ブループリントクラスを配置する
“BP_Ball” というブループリントクラスをレベルに配置してみます。

# ブループリントクラスの読み込み.
actor_class:unreal.Actor = unreal.EditorAssetLibrary.load_blueprint_class("/Game/Python/BP_Ball")
# 現在開いているレベルに配置する.
location:unreal.Vector = unreal.Vector(1000, 1000, 500)
rotator:unreal.Rotator = unreal.Rotator(0, 0, 0)
unreal.EditorLevelLibrary.spawn_actor_from_class(actor_class, location, rotator)
上記コードを実行すると “BP_Ball” がレベルに配置されました。

スクリプト作成例:UI
プログレスダイアログの表示
unreal.ScopedSlowTask() を使うと進捗ダイアログを表示することができます。
# 進捗ダイアログ表示テスト.
import time
import unreal
total_frames = 100 # トータルフレーム数.
text_label = "しばらくお待ち下さい..." # 表示するメッセージ.
with unreal.ScopedSlowTask(total_frames, text_label) as slow_task:
slow_task.make_dialog(True) # ダイアログを表示する.
for i in range(total_frames):
if slow_task.should_cancel(): # Cancelボタンを押したら閉じる.
break
slow_task.enter_progress_frame(1) # フレームを進める.
time.sleep(0.05) # 0.05秒待ち
処理時間がかかるときに表示しておくと良いです。

スクリプト作成例:ファイル読み込み
外部ファイル読み込み
外部ファイルの読み込みはUnreal Pythonにはなさそうなので、 “sys” モジュールを使って読み込みます。
import sys
# 起動引数を取り出す.
in_file = sys.argv[1]
# UTF8 BOM付きのファイルを読み込む
f = open(in_file, "r", encoding="utf-8-sig")
print(f.read())
コマンドから引数にファイルパスを渡します(ドラッグ&ドロップではファイルパスが渡せないので、手入力する必要があります)
py hoge.py C:\Users\ozeki\Desktop\test\test.txt
参考ページ
Unreal Pythonの情報を得るのに役立つページをまとめておきます。
まずは公式ドキュメントの以下のページです。
それと非公式ですが以下のページも参考になりました。
以上、Unreal Pythonを理解するためにこの記事が役立てれば何よりです。