Python
UE4

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

More than 1 year has passed since last update.

はじめに

前回の 導入編 の続き。
今回は主に Editor 拡張等で使用できる機能に関してテストコード書いてみる。

ダイアログ

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

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

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

ダイアログタイプは、UE4 における EAppMsgType と全く同じものがすべて用意されている。
また、同様に、返り値のタイプもUE4 における EAppReturnType と全く同じなので、UE4 での書き方さえ知っていれば直感的に書ける。

Slate

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

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

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

image.png