アルゴンUE4/UE5開発日記

UE4/UE5の機能やプラグインを紹介します。初心者や中級者向けになってます!!

【UE5】Python設定とPySide6で簡易画面を作る

PythonGUIの作り方を説明します。

今回はUEとPythonプラグインであるPySide6のセットアップから、

各種GUIをまとめていきたいと思います。

PySide6はPythonプラグインなのでPythonデコーディングします。

◎今回の主な参考資料(動画リンクがメイン)

Unreal Python スタートガイド | UNREAL FEST 2024 TOKYO

※UE5.5.1で検証しています。
※PySideは6.8.1を活用していきます。
※開発環境は今回Riderを使用します。
※書き間違え等あればコメントください!

PythonとRiderのセットアップについて

UE側の設定

デフォルトでONになっているかと思いますが、

Pythonプラグインである「Python Editor Script Plugin」に

チェックが入っているか確認します。

PythonEditorPluginのチェック

チェックが入っていることを確認したら、

プロジェクト用にPySide6にインストールするようにします。

今回はWindowsのPCを使用して行うので、

コマンドプロンプトを起動します。

起動したら「cd」コマンドでPython.exeがある場所まで移動します。

パスの場所はUEのエンジンフォルダ→Engine→Binaries→

ThirdParty→Python3→Win64になります。

※下記は一例です。実際は個人のエンジンフォルダを指定してください。

「C:EpicGameLab\UE5_5.5\Binaries\ThirdParty\Python3\Win64

ここまで移動したらpipを活用することでPySide6をインストールします。

python.exe -m pip install Pyside6 -t "プロジェクトフォルダ内のプラグイン用に作成したフォルダ"
※クリックすると見やすいかもです。すいません。

pip経由でのインストール

インストールが完了したらUE5の方の設定をしていきます。

まずプロジェクト設定のプラグイン項目にあるPython設定を変更します。

こちらで追加パスの項目から先ほどインストールしたフォルダパスを指定します。

Pythonのプラグインのパスを追加

次にエディタの環境設定のプラグインPythonの設定をします。

変更する箇所は2箇所でデベロッパーモード」にチェックを入れるのと、

「コンテンツブラウザ統合を有効化」にチェックを入れます。

デベロッパーモード」をONにすることで関数の情報を作成してくれます。

プロジェクトフォルダ内→Intermediate→PythonStubフォルダ内の格納されます。

PythonStubフォルダ

「コンテンツブラウザ統合を有効化」を行うことで、

コンテンツブラウザ内にPythonスクリプトを右クリックで、

実行可能になります。ダブルクリックするとIDE経由で開きます。

コンテンツブラウザ内でのPythonスクリプト表示

Rider側の設定

続いてRider側の設定に移ります。

Rider側では主にPythonインタプリターを活用しますが、

まずはPythonプラグインをインストールされているか確認します。

ない場合はPython Community Editionをプラグインにチェックを付けて、

インストールして活用するようにします。

Pythonのツールを確認

続いてインタプリター側の設定をしていきます。

設定のダイアログを開いてPythonインタプリターを開きます。

インタプリターの追加を選択してローカルインタプリターの追加を選択します。

インタプリターの追加

選択したらVirtualEnv環境というのが選択されていて、

ラジオボタンで既存を選択してUEのエンジン側のPythonのパスを指定します。

※下記は一例です。実際は個人のエンジンフォルダを指定してください。

「C:EpicGameLab\UE5_5.5\Binaries\ThirdParty\Python3\Win64

パスを指定

そこまでできたらインタプリターのパスを追加していきます。

すべて表示の項目を選択します。

すべて表示を選択

先ほどのインタプリターを選択された状態で、

インタプリターパスの表示を選択して追加します。

追加する場所はPythonの設定をしたプロジェクトの、

Intermediate→PythonStubフォルダになります。

インタプリターのパスを追加

最後にPyside6のインタプリターを追加したい場合は、

パッケージの追加でPySide6を追加すると、

コード補完が行えるので追加するとおすすめします。

パッケージの追加作業

次からPythonの簡単な構文などを説明していきます。

・目次に戻る

Pythonの簡単な構文やよく使うものについて

ここから簡単な構文やサンプルを作成していきます。

まず必ず使うであろう「import」から説明します。

importではPythonの関数などを活用するために宣言するものになります。

例としてUnreal関連のPythonを使う場合の例を記述します。

「import unreal」← これでunreal関連のPythonの処理を活用できます。

または別の.pyファイルからの呼び出しで、

from ~ import ~ と宣言することで一部処理を呼び出すことも可能です。

from ~ import ~ で呼び出す場合はClassを活用している場合など、

呼び方が違ったりします。

importでクラス内の関数を呼び出す場合は下記になります。

「クラス名」.「関数()」※一例:TestClass.TestMethod() 

下記のページがわかりやすい気がしたのでこちらも参考にどうぞ。

【Python】importとfrom~importの使い方 | SCRAWLED TECH BLOG

続いてクラスや関数の宣言になります。

Pythonでもクラスや関数などを活用します。

大変申し訳無いんですがクラスや関数の説明をすると、

1記事丸々かかるので本当に簡単に記載します。

Class クラス名 def 関数名()みたいな形で宣言します。

それからコンストラクタは「def __init__() 」という形で可能です。

細かいClassの活用に関しては下記リンクでまとまっています。

Python クラスについて #Python3 - Qiita

それからコメントですが1行コメントは「#」のあとにコメント本文になります。

例:# テスト用コメント

複数行のコメントの場合は「""" """」で囲った形になります。

例:

""""

テストのクラス

テストの関数

"""

Pythonの細かい部分やPySideの細かい話は次の記事で色々かきます。

・目次に戻る

PySideでのUIのプログラムを紹介

ここからようやくPySide6でGUIを作るプログラムを紹介します。

まずここで使用しているUI関連のプログラムは下記です。

※細かい見た目のカスタマイズに関しては次の記事で説明します。

・QtMainWindow
・Qvboxlayout
・QtLabel
・QPushButton

上記4つを活用してボタンを押したらログが出て、

ウィンドウの文字が変わるように変更します。

今回は.pyファイルを2つ作成していきます。

1つはPySide6のウィンドウ処理のは行っているPythonファイル、
もう1つはPySide6を呼び出すための処理になります。

まずはPySide6のウィンドウ側の処理になります。

# 各種パッケージの宣言
from PySide6 import QtWidgets
from PySide6.QtCore import Qt

class TestWindow(QtWidgets.QMainWindow):
# コンストラクタの処理
def __init__(self):

# 継承する形のインスタンス生成
super(TestWindow, self).__init__()
# ウィンドウのタイトル
self.setWindowTitle("Test Window")
# ウィンドウのサイズ
self.resize(320, 100)

# Layoutの作成(QVBoxを活用して縦に配置)
layout = QtWidgets.QVBoxLayout()

# buttonを作成(selfをつけているのはクラス内の別関数で呼び出すため)
# ボタンの引数としてボタンに表示される文言を記載
self.button = QtWidgets.QPushButton("こんにちは")

# ラベルの作成(こちらもボタンと同様の理由でselfをつけています)
# ラベルの引数は初期の文章になります。
self.label = QtWidgets.QLabel("今日もいい天気?")
# labelの表示位置をQtAlignmentFlagのAlignCenterを指定して
    中心にラベルが配置されるように宣言(LeftやRightももちろんあります。)
self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)

# 先ほど作成したボタンとラベルをQVBoxLayoutに追加します。
layout.addWidget(self.label)
layout.addWidget(self.button)

# 中心に表示するためのWidgetの作成
central_widget = QtWidgets.QWidget()
# このWidget内に先ほど作成したQVBoxLayoutを取り込む
central_widget.setLayout(layout)
# QMainWindow内の中心の表示にWidgetを取り込む
self.setCentralWidget(central_widget)
# 先ほど作成したボタンをクリックした時のイベントを登録
(登録するのは下記のイベント)
self.button.clicked.connect(self.print_hello)

# ボタンを押した時に動作する関数
def print_hello(self):
# Unreal側のログに下記文言が表示される。
print("こんにちは( ´)")

# ラベルの文言を下記文言に変更する。
self.label.setText("こんちゃすこんちゃす")

細かく説明しようかなと思いましたが、

プログラムに全文コメントを追加しているのでざっくり説明します。

まずは一番上の各種パッケージの宣言から。

基本PySide6というパッケージ内のクラスや関数を活用します。
一番上のQtWidgetsにはQtWindowやQVBoxLayoutなど、
レイアウトを活用するQtWidgetsを活用するための呼び出しで、
もう片方はQt内のAlignmentFlagを活用するためにQtCoreから呼び出します。

そこからClassを作成していきますが、
クラス内で何を行っているか下記の手順になります。
1.コンストラクタ内でメインウィンドウのタイトルとサイズを設定。
2.縦に並ぶようにQVBoxLayoutを作成しておく
3.ボタンとラベルをそれぞれ作成する(この宣言時ボタンの文言やラベルの文言指定)
4.QVBoxLayoutにボタンとラベルを配置します。
5.QVBoxLayoutを内包するためのQWidgetsを作成します。
6.作成したQWidgetsをQMainWindowに追加します。
7.ボタンを押した時の関数を作成してボタンを押したときに変化するように設定。

こちらのPythonファイルで行っていることは以上になります。

続いて呼び出す側の方の処理になります。

こちらの方のPythonファイルをUE上で実行する形になります。

中身のプログラムとしては下記の通りになります。
1.自分で作成したTestWindow(上で作ったプログラム)とQtWidgetsを宣言
2.QtWidgetsのインスタンスがあるかチェックしてなければ作る
3.最後にTestWindowを作成してWindow.showで呼び出す

以上がPythonの中身の説明になります。

実際に動かしてみましょう。

コマンドの「import pythonファイル名 as TA」で実行できます。

PySide6を追加

※as TA をつけているのは再度更新するために呼び出しを短縮するためです。

※コマンドで実行しています。

再度開く場合は下記のImportlibを活用します。

from Importlib import reload

reload(TA)

最後に

以上で説明は終了になりますが、

設定項目の部分の説明が多すぎたので、

別枠で説明を作っていこうと思います。

次は別でその次あたりにやれたら幸いです。

今年はこの記事で最後になります。

1年本当にありがとうございました!!

来年はもっと力を入れたいと思います。