プログラマーの尾関です。
今回は、Unreal Pythonの基本的な使い方を紹介します。
- 動作確認バージョン:Unreal Engine 5.1
Unreal Pythonとは
Unreal Python は、Unreal Engine 内でPythonを使用してエディタのスクリプティングや自動化を行うためのプラグインです。
具体的にはエンジンのエディタ拡張として使い、 Editor Utility Blueprintでは使用できない機能を使えるのがメリットです。
ただ、Unreal Pythonを実行する場合はコマンドを直接指定することとなるので、Editor Utility Widgetから呼び出せるようにしておくと、非プログラマーでも使いやすい機能となります。
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スクリプトはコンテンツブラウザから追加できないので、”Python” フォルダを右クリックして「エクスプローラーで表示する」を選びます。
エクスプローラー上で、Pythonスクリプトを追加します。
ここでは “hoge.py” としました。
Pythonスクリプトを実行する
スクリプトは以下のように記述します。
1 |
print("hello python") |
このスクリプトを実行するには “Cmd” に戻して、以下のコマンドを実行します。
なお、”Cmd” でのコマンドは、キーボードの上を押すことで前回の入力を繰り返し使用できます。
VSCodeのオートコンプリートを有効にする
Pythonを編集するエディタとして、VSCodeを使用するとオートコンプリートが使えて便利なので、VSCodeを使う方法についても紹介しておきます。
Pythonスタブファイルの作成
UEのエディタのメニューから「編集 > エディタの環境設定」を選びます。
プラグイン > Python から「デベロッパーモード」にチェックを入れます。
再起動を促されるので、エディタを再起動します。
するとプロジェクトの「Intermediate」フォルダに「PythonStub」が作成されます。
VSCodeの設定
VSCodeを起動してメニューから「ファイル > フォルダーを開く」を選びます。
Pythonスクリプトを格納しているフォルダに移動して「フォルダーの選択」をクリック。
フォルダのアクセス権の設定確認が表示されますが、問題ないので「親フォルダー “Content” 内のすべてのファイルの作成者を信頼します」にチェックを入れて、「はい、作成者を信頼します」をクリックします。
メニューから「ファイル > ユーザー設定 > 設定」を選びます。
「ユーザー」タブの状態で、「拡張機能 > Python > Auto Completes: Extra Paths」のところにある「setting.json で編集」を選びます。
この表示がない場合は Python の拡張機能がインストールされていないので、インストールしておきます。
settings.json が開かれたら以下のように PythonStubファイルのパスを指定します。
1 2 3 4 5 6 7 8 |
{ "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スクリプトで 外すようにしてみます。
Unreal Pythyonを記述している hoge.py を以下のように書き換えてみます。
1 2 3 4 5 6 7 8 |
# 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” のチェックが外れていることが確認できます。
なお、明示的に型を指定すると、オートコンプリートが有効な場合にプロパティが補完されて入力が便利です。
1 2 3 4 5 6 7 8 |
# 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() で選択しているアセットのパスのリストを取得できます。
1 2 3 4 5 6 7 |
# unrealの操作を行うためのモジュール. import unreal # 選択しているアセットを取得する. for asset in unreal.EditorUtilityLibrary.get_selected_assets(): # アセットのパスを出力する print(asset.get_path_name()) |
実行結果
1 2 3 |
Cmd: py hoge.py LogPython: /Game/Python/BP_EnemyData.BP_EnemyData LogPython: /Game/Python/DT_EnemyData.DT_EnemyData |
レベル
エディタで現在開いているレベルを取得する
1 2 3 4 5 |
import unreal # 現在エディタで開いているレベルを取得する. world:unreal.World = unreal.EditorLevelLibrary.get_editor_world() print(world) |
選択しているアクターを取得する
1 2 3 4 5 |
import unreal # 選択しているActorをリストで取得する (取得でない場合リストは空となる). list_actors = unreal.EditorLevelLibrary.get_selected_level_actors() print(list_actors) |
- 注意:何も選択していない、または「フォルダー」や「ワールド」を選択している場合は何も取得できません
現在開いているレベルにアクターを配置する
AActorを配置して名前(ラベル名)を変更する
1 2 3 4 5 6 7 8 |
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()でスケール値を設定できます。
1 2 3 4 5 6 7 8 9 |
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” というブループリントクラスをレベルに配置してみます。
1 2 3 4 5 6 7 |
# ブループリントクラスの読み込み. 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
プログレスダイアログの表示
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 進捗ダイアログ表示テスト. 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秒待ちを入れる. |
処理時間がかかるときに表示しておくと良いです。
ファイル読み込み
外部ファイル読み込み
外部ファイルの読み込みは “sys” モジュールを使って読み込みます。
1 2 3 4 5 6 7 |
import sys # 起動引数を取り出す. in_file = sys.argv[1] # UTF8 BOM付きのファイルを読み込む f = open(in_file, "r", encoding="utf-8-sig") print(f.read()) |
コマンドから引数にファイルパスを渡します(ドラッグ&ドロップではファイルパスが渡せないので、手入力する必要があります)
1 |
py hoge.py C:\Users\ozeki\Desktop\test\test.txt |
参考ページ
公式ドキュメント
おしまい
以上、Unreal Python の基本的な使い方の紹介でした。
ここで紹介した以外の機能を探す場合には“unreal” + “python” + “調べたいことの文字” を組み合わせて Google検索するとそれなりに情報が見つかります。
この記事が Unreal Python を活用するのに役立てれば幸いです。