UE4 Pythonプラグイン(UnrealEnginePython)を試してみる

# 概要
UnrealEngineで使用可能なPythonプラグイン **UnrealEnginePython** についての記述です。
インストールとテストコードの実行を行っています。
バイナリ配布からのインストールはうまくいきませんでした。

## 環境
Windows10
Visual Studio 2017
UnrealEngine 4.22
[UnrealEnginePython](https://github.com/20tab/UnrealEnginePython)

## 参考
以下を参考にさせて頂きました。ありがとうございます。

[UnrealEnginePython プラグインを使ってみた (導入編)](https://qiita.com/negimochi/items/4eac2a6f6725d03f0cf1)
[UE4でPythonを使ってみる](https://qiita.com/simonritchie/items/58fe6d4d3c411c8c062f)
[プラグインをパッケージ化しよう！](http://historia.co.jp/archives/6717/)


# 準備
## プラグインインストール（バイナリ）
https://github.com/20tab/UnrealEnginePython から
UnrealEnginePython_20190508_4_22_python36_embedded_win64.zip
をダウンロードして[Plugin]フォルダに展開します。

uprojectを右クリック -> [Generate Visual Studio project files]を選択してソリューションを生成。

VisualStudioをビルドした結果、以下のようなエラーになりました。

```terminal:エラー表示(VisualStudio)
Could not find definition for module 'UnrealEnginePython' (reference via default plugins -> UnrealEnginePython.uplugin)
```

UEエディタでのエラー表示は以下の様に。

```terminal:エラー表示(Editor)
ERROR: Could not find definition for module 'UnrealEnginePython' (referenced via default plugins -> UnrealEnginePython.uplugin)
```
エラーがでて動きません。モジュールが見つからないようです。
.uprojectに追加してみたり、Build.csに追加してみたりを試したのですがダメでした。


## プラグインインストール（ソース）
https://github.com/20tab/UnrealEnginePython を
そのままダウンロード、[UnrealEnginePython]を[Plugin]フォルダに配置します。

"\Plugins\UnrealEnginePython\Source\UnrealEnginePython\UnrealEnginePython.Build.cs"
の11行目の **pythonHome** のパスをローカルのPythonがインストールされているパスに修正します。

```cs:UnrealEnginePython.Build.cs
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.IO;
using System.Collections.Generic;

public class UnrealEnginePython : ModuleRules
{

    // leave this string as empty for triggering auto-discovery of python installations...
    private string pythonHome = "C:/Python/Python37";　　// ←ローカル環境のパスにする
...
```

エディターだけでの使用なので、
"\Plugins\UnrealEnginePython\UnrealEnginePython.uplugin"
の **Type** を **Runtime** から **Editor** に書き換えます。

```json:UnrealEnginePython.uplugin
  "Modules": [
    {
      "Name": "UnrealEnginePython",
      "Type": "Editor",
      "LoadingPhase": "Default"
    },
```

uprojectを右クリック -> [Generate Visual Studio project files]を選択してソリューションを生成し、ビルド。

![plugin_window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/bf57acb0-fa8e-022a-df93-9ead966bc0e9.png)

プラグイン画面に追加されました。

## プラグインパッケージ化
ソースインストール後にプラグインパッケージ化を行い、バイナリインストール時と同じエラーで起動できませんでした。
ソースだとC++ソースが増えてビルドが遅くなってしまい都合が悪いですが、現在のところ解決方法がわかりません。:disappointed_relieved:


# 機能メモ
## Python Console
[ウィンドウ] -> [デベロッパーツール] -> [Python Console] から起動できます。

![python_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/a26cb243-3234-c918-50ba-b6909002dab4.png)

```python:PythonConsole
>>>import platform
>>>print(platform.python_version())
3.7.3
>>>print('1500 * 1.08 = ', 1500 * 1.08)
1500 * 1.08 = 

1620.0
```

対話モードのようにPythonが実行できます。


## Python Editor
[ウィンドウ] -> [Python Editor] から起動できます。

![PythonEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/2ea4411e-8402-5386-0281-5ae449c36ff0.png)

Pythonコードを書いて[Execute]で実行できます。
記述したPythonファイルは `Content/Scripts` フォルダ以下に保存されます。

Slate使ったファイルピッカーのテストです。

```python:TestScript.py
import unreal_engine as ue
from unreal_engine import SFilePathPicker, SWindow, FLinearColor
from unreal_engine.structs import ButtonStyle, SlateBrush, SlateColor

# ボタンスタイル用意
style = ButtonStyle(Normal=SlateBrush(TintColor=SlateColor(SpecifiedColor=FLinearColor(1.0, 0, 0))))

# ウィンドウ用意
window = SWindow(client_size=(600,400), title='TestWin', modal=True)

# パス表示＆ウィンドウ始末
def path_picked(path):
    print(path)            # 'Engine\Binaries\Win64'からの相対パス表示
    window.request_destroy()

# ファイルピッカー設定
picker = SFilePathPicker(browse_title='SelectFile', browse_button_style=style, on_path_picked=path_picked)
window.set_content(picker)

window.add_modal()
```

実行後のウィンドウ、右の赤いボタンが押せます。
![TestScript_Win.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/5db49e36-dff1-fd5f-367c-28941dbf0a64.png)


ピッカーボタンを押下してファイル選択後のアウトプットログ
![TestScript_OutputLog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/6c88abdf-0ca7-514c-055f-cd86f8e2557b.png)

Python でのログが出力されています。


## PythonAutomation
Python実行用のモジュールを管理するもの？


# まとめ
一応使えますがエディタなどは使いにくいので別で用意するほうが良さそうです。（コード補完がないとツラいです、特にメソッド名）
Actorクラス等も書けるようですが、Pythonに習熟していたとしても情報が少ないため、使い道としてはPythonライブラリを扱うものやエディター系の処理に限定したほうが良いかもしれません。
追加パッケージのインストールについては pip がついているのでできそうですが、調査できていません。
あとバイナリでのプラグイン追加がうまくいかない問題が解決できませんでした。:worried: