はじめに
UnrealEngine5上でPytorchを使う方法を紹介します.
様々な方法ありますが,今回はUE5上でPythonコードが書ける方法を紹介します.
PyTorchに限らずPythonのサードパーティーパッケージ何でも可能だと思います(試してはない).
もちろんnumpyのような標準ライブラリもUE5上で利用可能です.
1.UnrealEnginePythonをダウンロードする
まずUE5上でPythonを実行するのに以下のGithubからUnrealEnginePythonをダウンロードします.
友人に頼んで5.3に対応してもらいました.
githubのリポジトリから緑のCodeボタンを押して
Download ZIPでダウンロードできます.
ダウンロード出来たら解凍しておいてください.
2.Python環境を構築するプロジェクトを作成する
新しいプロジェクトを作成します.この際C++を選んでください.
※余談ですがPathに日本語含まれるとエラー吐きますので全てアルファベットにするのが推奨です.
作成しましたらプロジェクトのフォルダに
Pluginsフォルダを作成し
先ほど解凍したUnrealEnginePythonをPluginsフォルダに移動します.
プロジェクトを起動するとリビルドを促してくるのでYesを押します.
3.PythonをUE5で実行する
リビルドが終わったらブループリントクラスを作成し,すべてのクラスから「PyActor」を選んでください.
今回は「BP_PyActor」と命名しました.
では,Pythonのコードを書くためにウィンドウからPythonEditorを開きます.
PythonEditorを開いたらNewから新しいPythonファイルを作成します.
今回は「PythonFunction」と命名しました.
右下に「再インポートを行いますか?」と表示されるので,インポートを押してください.
「PythonFunction」に今回のサンプルコードを書きます.
単にTickでZ軸移動しているだけのコードです.
import unreal_engine as ue
from unreal_engine.classes import KismetSystemLibrary
ue.log('Hello i am a Python module')
class PyActor:
# this is called on game start
def begin_play(self):
KismetSystemLibrary.PrintString(InString = "PyActor BeginPlay", Duration = 5.0)
# this is called at every 'tick'
def tick(self, delta_time):
# get current location
location = self.uobject.get_actor_location()
# increase Z honouring delta_time
location.z += 100 * delta_time
# set new location
self.uobject.set_actor_location(location)
では,「PythonFunction」で書いたコードを実行します.
先ほど作成した「BP_PyActor」を開きます.
今回わかりやすいように,Sphereを追加しておきます.
それではクラスのデフォルトから詳細タブのPythonタブが追加されていますので,
PythonModuleにPythonファイルの名前のPythonFunction,
PythonClassにPythonクラスの名前のPyActorを入力します.
では今作成した「BP_PyActor」をレベル上に置いてみましょう.
それでは実行しますと,SphereがZ軸に移動しました.
またPrintStringも実行したので,左上に文字が出力していることもわかります.
#PrintSting
KismetSystemLibrary.PrintString(InString = "PyActor BeginPlay", Duration = 5.0)
PrintStringではなくue.logの出力は左下の「出力ログ」を押すと
ログを確認することができます.
4.PyTorchをUE5で実行する
では最後にPyTorchを実行できるようにPyTorchをインポートします.
今回はこちらを参考にさせていただきました.同じようにするとnumpyをインポートできます.
まずUEのpython.exeのpathを確認します.
特に設定していなければ
C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\ThirdParty\Python3\Win64
にあると思われます.
ではcmdを立ち上げます.
Win+Rで検索画面がでるので「cmd」を入力しますと
cmdが立ち上がります.
これから,PyTorchをインポートをします.
PyTorchを使ったことがある人は知っていると思いますが,通常は以下の公式からインポートするコマンドをコピーします.
しかし,pip3はないとエラーを吐くので
今回のコマンドはpip3をpipに変えた以下のコマンドを使用します.
""内のpathは先ほど確認したpathです.
"C:\Program Files\Epic Games\UE_5.3\Engine\Binaries\ThirdParty\Python3\Win64\python.exe" -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
コマンドを入力すると,ダウンロードが始まります.
インポート終わったら「PythonFunction」を書き換えます.
ここでPyTorchが使えているかどうかを見るために
torch.device('cuda' if torch.cuda.is_available() else 'cpu')
を追加しPrintStringで出力しています.
import torch
import unreal_engine as ue
from unreal_engine.classes import KismetSystemLibrary
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
ue.log('Hello i am a Python module')
class PyActor:
# this is called on game start
def begin_play(self):
KismetSystemLibrary.PrintString(InString = str(DEVICE), Duration = 5.0)
# this is called at every 'tick'
def tick(self, delta_time):
# get current location
location = self.uobject.get_actor_location()
# increase Z honouring delta_time
location.z += 100 * delta_time
# set new location
self.uobject.set_actor_location(location)
それでは実行すると,左上に「cuda」と出力されればPyTorchが実行していることがわかります.
さらに具体的なコードを書くには
Pythonの部分はPythonですが,UEに関する関数はUnrealC++と少し異なるので他に関数など使いたい場合は
UE5.3改良前のGithubに具体的な手法が載っているのでこちらを参照してください.
Pythonで書いた関数を呼び出す方法など知ることが出来ると思います.