UnrealEnginePython プラグインを使ってみた2 (Slate編)

# はじめに

前回の [導入編](https://qiita.com/negimochi/items/4eac2a6f6725d03f0cf1) の続き。
今回は主に Editor 拡張等で使用できる機能に関してテストコード書いてみる。

# ダイアログ

まずは簡単なところでダイアログから。

```py3:TestDialog.py
import unreal_engine as ue

def popup_dialog():
    # ダイアログを開く(APP_MSG_TYPE_YES_NO: YES/NOダイアログ)
    result = ue.message_dialog_open(ue.APP_MSG_TYPE_YES_NO, 'Grayちゃんはかわいい？')
    if result == ue.APP_RETURN_TYPE_YES:
        # APP_RETURN_TYPE_YES: 「はい」を選択した場合
        ue.log('かわいい！')
    elif result == ue.APP_RETURN_TYPE_NO:
        # APP_RETURN_TYPE_NO: 「いいえ」を選択した場合
        ue.log('やり直し')
        popup_dialog()

popup_dialog()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138515/edd24fc0-cb88-b6ab-efbd-b3f9435ab9fe.png)

「はい」を肯定させるまで無限 Gray ちゃん。

ダイアログタイプは、UE4 における [EAppMsgType](https://docs.unrealengine.com/latest/INT/API/Runtime/Core/GenericPlatform/EAppMsgType__Type/index.html) と全く同じものがすべて用意されている。
また、同様に、返り値のタイプもUE4 における [EAppReturnType](https://docs.unrealengine.com/latest/INT/API/Runtime/Core/GenericPlatform/EAppReturnType__Type/index.html) と全く同じなので、UE4 での書き方さえ知っていれば直感的に書ける。

# Slate

比較的機能が充実している。
C++ で Slate を書く場合、結構面倒だったりするが、これが Python のみで書けるのは楽ちん。

```py3:TestSlate.py
import unreal_engine as ue
from unreal_engine import SWindow, SButton, STextBlock, SMultiLineEditableText, SVerticalBox, SHorizontalBox, SPythonEditorViewport
from unreal_engine.enums import EHorizontalAlignment, EVerticalAlignment, ECheckBoxState
from unreal_engine.classes import Actor, SceneComponent, StaticMeshComponent, StaticMesh
from unreal_engine import FVector

# EditableText 作成
editor = SMultiLineEditableText()
# TextBlock 作成
text = STextBlock()
# ボタン作成
button = SButton()

def clicked_button():
    ue.log('ボタンが押された')
    text.set_text(editor.get_text())
    return True

# HorizontalBox 作成
h_box = SHorizontalBox()
# VerticalBox 作成
v_box = SVerticalBox()

# エディタにデフォルトのテキストセットして、VerticalBox に追加
editor.set_text('自由に入力してね！')
v_box.add_slot(editor)

# ボタンのクリック時のコールバックに clicked_button を指定
# VerticalBox に追加
button.set_content(STextBlock().set_text('テキストをコピー'))
button.set_h_align(EHorizontalAlignment.HAlign_Center)
button.set_v_align(EVerticalAlignment.VAlign_Center)
button.bind_on_clicked(clicked_button)
v_box.add_slot(button)

# テキストボックスを VerticalBox に追加
v_box.add_slot(text)

# VirticalBox を HorizontalBox に追加
h_box.add_slot(v_box)

# ビューポートを HorizontalBox に追加
viewport = SPythonEditorViewport()
h_box.add_slot(viewport)

# ボールのメッシュをビューポートのワールドにスポーン
world = viewport.get_world()
actor = world.actor_spawn(Actor);
root_comp = actor.add_actor_root_component(SceneComponent, 'Root');
mesh_comp = actor.add_actor_component(StaticMeshComponent, 'StaticMesh', root_comp);
mesh_comp.StaticMesh = ue.load_object(StaticMesh, '/Engine/VREditor/BasicMeshes/SM_Ball_01');
actor.set_actor_location(FVector(200.0, 0.0, 0.0));

# ウインドウに HorizontalBox をセット
window = SWindow().resize(640, 480).set_title('すれーとてすと')
window.set_content(h_box)
```
実行結果。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138515/9cb578fa-5504-2d6a-9caa-344da622c045.png)

左側は、MultiLineEditableText のテキストを編集して真ん中のボタンを押すと、下の TextBox にコピーされる。
右側のビューポートは、ブループリントエディタやレベルエディタのビューポートと同じもの。
わずか数行の python コードで簡単に作れてしまう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138515/22b67f7d-3070-ec0a-be59-07af1394cd99.png)