凛(kagring)のUE4とUnityとQt勉強中ブログ

2016 年から UE4 を触り始めました。勉強したもののメモ用のブログです。C++ での Qt、Unity も少しあります。

≫ EDIT

UE4 エディタ拡張・ウィジェットを変数として扱う・格納する(SAssignNew)

ウィジェットを変数として扱えるようにして、ウィジェット同士の連携をとったりする方法です。
詳しい方法はロジカルビートさんの以下のブログを参考に!

・【UE4】エディタ拡張(インプットボックス編)
http://logicalbeat.jp/blog/875/

エディタで文字列や数値入力が出来るようになったので、
その入力値を使って他のウィジェットやゲーム内のパラメータに動的に反映できるようにしたいです。
そのためには、ウィジェットの値を取得・設定できる必要があります。
そこで、SAssignNewを使用してウィジェットを変数として保持し、
ウィジェットにアクセスできるように変更します。
使い方以下のような形で、今まで使用していたSNew()の部分を置き換えるだけです。

といった感じで、今まで 「SNew」を使っていた部分を「SAssignNew」に変更します。

SNew は「SNew(型名)」でしたが
SAssignNew は「SAssignNew(変数名、型名)」となります。

SNew(SSpinBox< float>)

といったものが

TWeakPtr< SSpinBox< float> > mSpinBoxWidget;
SAssignNew(mSpinBoxWidget, SSpinBox< float>)


といった記述になります。

TWeakPtr< SEditableTextBox> mEditableTextBox;
~省略
+SVerticalBox::Slot()
.AutoHeight()
[
SAssignNew(mEditableTextBox, SEditableTextBox)
.Text(LOCTEXT("EditText", "SEditableTextBox"))
]

こんな感じですね。

変数にしたウィジェットでのアクセスの方法はこんな感じになります。

変数.Pin()->関数()

TWeakPtr< SSpinBox< float> > mSpinBoxWidget;
mSpinBoxWidget.Pin()->SetValue(1234.5f);

こんな感じで関数にアクセスすることができます。

エディタ拡張するにあたっては必須になりそうですね。
スポンサーサイト

| UE4 | 16:23 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 配列変数の作成

配列の変数の作成方法です。
ちょっと触ってなかったらど忘れしまったのでメモ。

詳しい説明はこちらを。

・ブループリントの配列
https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Arrays/index.html

まず、普通に変数を作成します。こんな感じですね。
配列変数000
今回はActorクラスの変数を作ってみました。

そうしたら、作った変数を選択して詳細タブを確認します。
配列変数001
そうすると、「変数の種類」のところにクラス名と「3x3の格子状のアイコン」があります。
このアイコンをクリックすると配列の変数となります。

アイコンをクリックした結果がこちら。
配列変数002
変数の種類のクラス名の左にあるアイコンが、配列かそうでないかを示しています。

| UE4 | 17:03 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 オブジェクトがカメラ内におさまるようにフォーカスさせる(Fキー)

選択しているアクターやオブジェクトを
エディタのカメラ内にいい感じにフォーカスしておさめる方法です。

下記サイトを参考にメモ。

・UE4 エディタ⑥ オブジェクトを動かす
http://manabibeya.com/ue4tutorial/editor/editor6/

★オブジェクトをクローズアップする方法 (0:20)
スロー (たとえば、コンテンツ ブラウザからSM_Chairをビューポートにドラッグアンドドロップしてから) そのオブジェクトを選択(左クリック) → Fキーを押す


という感じで普通にオブジェクトを選択して「F」キーでオブジェクトにカメラをフォーカスすることができます。
ズームだけだと近寄れない場合があったりするのでかなり使う機能かなと思います。

まずはオブジェクトを選択します。
フォーカス000
この状態だとカメラからみて遠くの位置にオブジェクトがあります。

「F」キーを押すとカメラ内にオブジェクトの全体が収まるようにフォーカスされます。
フォーカス001
カメラがいい感じに近づきました。

これも結構使いそうな機能ですね。
上記サイトにのっているこの動画でいろいろ説明がされているようなので参考にするのがよいかもです。

| UE4 | 18:22 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 オブジェクトを地面に設置させる(Endキー)

アクターやオブジェクトをつかんでいる場合に、
現在いる上下の位置を地面に接地させる方法です。

下記サイトを参考にメモ。

・UE4 エディタ⑥ オブジェクトを動かす
http://manabibeya.com/ue4tutorial/editor/editor6/

★空中にあるオブジェクトをフロアに降ろす方法 (1:58)
スロー そのオブジェクトが選択されている状態でキーボードのEndキーを押す


という感じで普通にオブジェクトを選択して「End」キーでオブジェクトを接地することができます。

まずはオブジェクトを選択して
接地000

「End」キーを押すと地面に接地されます。
接地001

結構使いそうな機能ですね。
上記サイトにのっているこの動画でいろいろ説明がされているようなので参考にするのがよいかもです。

| UE4 | 17:18 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 エディタ拡張・ウィジェット共通アトリビュート(IsEnable、ToolTipText、Visibility)

ウィジェットについて調べていて、
どうも共通のアトリビュートがあるようなのでメモです。
エンジンのソースとにらめっこしてました…。

~省略
+ SVerticalBox::Slot()
.AutoHeight()
[
SNew(SButton)
.IsEnabled(false)
.Text(LOCTEXT("ButtonText", "SButton"))
.ToolTipText(LOCTEXT("ButtonToolTipText", "ツールチップテキスト"))
.Visibility(EVisibility::Hidden)
]
~省略


とりあえず普通に表示するとこんな感じに。
SCommon006.png
レイアウトを縦に並べてボタンを表示しています。
(ボタン・ボタン・チェックボックスの順に配置しています)

・IsEnable
ウィジェットの有効状態を切り替えます。bool 型で指定します。
表示はされるけどウィジェットの動作を無効にしたい場合に使います。
SCommon000.png

・ToolTipText
ツールチップによるヒントの表示をするためのテキストを指定します。
FText で指定します。
SCommon001.png
これはヘルプとして結構便利そうですね。

・Visibility
ウィジェットの表示・非表示関係の設定を行います。
EVisibility 型で指定をします。
ちょっとここはいくつかパターンがあるので少し詳しくメモ。

EVisibility::Visible
Default widget visibility - visible and can interactive with the cursor
普通の表示状態です。すべてのイベントを受け取ることができます。
SCommon006.png

EVisibility::Hidden
Not visible, but occupies layout space. Not interactive for obvious reasons.
ウィジェットを非表示状態にします。イベントを受け取ることができません。
非表示にした際、レイアウトは変更されずそのままになります(空白)
SCommon002Hidden.png

EVisibility::Collapsed
Not visible and takes up no space in the layout; can never be clicked on because it takes up no space.
ウィジェットを非表示状態にします。イベントを受け取ることができません。
非表示にした際、そのウィジェットの分詰めてレイアウトが変更されます。
SCommon003Corapse.png

EVisibility::HitTestInvisible
Visible to the user, but only as art. The cursors hit tests will never see this widget.
ウィジェットを表示されますが、イベントを受け取ることがありません。
SCommon004HitTestInvisible.png

EVisibility::SelfHitTestInvisible
Same as HitTestInvisible, but doesn't apply to child widgets.
HitTestInvisible と同じですが、自分自身にだけ適用され、子ウィジェットには適用されません。
SCommon005SelfHitTestInvisible.png

まだまだありそうですが、とりあえず使いそうなものをメモってみました。

| UE4 | 16:17 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 エディタ拡張・エディタブルテキストボックス(テキストボックス)ウィジェット(SEditableTextBox)

エディタブルテキストボックスウィジェットについてのメモです。
他ではよく「テキストボックス」と呼んでいるコントロールですね。
UE4ではラベルのことをテキストブロックと呼び
中身を変更できるものを「エディタブルテキストボックス」としているみたいですね。

ロジカルビートさんのこのページとエンジンのソースとにらめっこしていました。
ロジカルビートさんはインプットボックスと呼んでいるようです。

【UE4】エディタ拡張(インプットボックス編)
http://logicalbeat.jp/blog/875/

エディタブルテキストボックスを使うには「SEditableTextBox」クラスを使います。

~省略
+SVerticalBox::Slot()
.AutoHeight()
[
SNew(SEditableTextBox)
.Text(LOCTEXT("EditText", "SEditableTextBox。初期テキストだドン"))
.HintText(LOCTEXT("HintText", "ヒントテキスト"))
.Font(FSlateFontInfo("Veranda", 16))
.Padding(FMargin(8, 8, 8, 8))
.ForegroundColor(FSlateColor(FLinearColor(1.0f, 0.0f, 1.0f, 1.0f)))
.BackgroundColor(FSlateColor(FLinearColor(1.0f, 1.0f, 0.0f, 1.0f)))
//.IsReadOnly(true)
//.ReadOnlyForegroundColor(FSlateColor(FLinearColor(0.0f, 1.0f, 1.0f, 1.0f)))
//.IsPassword(true)
.SelectAllTextWhenFocused(true)
.RevertTextOnEscape(true)
.ClearKeyboardFocusOnCommit(false)
.IsCaretMovedWhenGainFocus(true)
.OnTextCommitted_Raw(this, &FUtilityModule::OnEditableTextBoxCommited)
.OnTextChanged_Raw(this, &FUtilityModule::OnEditableTextBoxCommited, ETextCommit::Default)
]
~省略
void FUtilityModule::OnEditableTextBoxCommited(const FText& InText, ETextCommit::Type InCommitType) const
{
switch(InCommitType){
case ETextCommit::Default:
break;
case ETextCommit::OnEnter:
UE_LOG(LogTemp, Log, TEXT("エンター"))
break;
case ETextCommit::OnUserMovedFocus:
UE_LOG(LogTemp, Log, TEXT("フォーカス移動"))
break;
case ETextCommit::OnCleared:
UE_LOG(LogTemp, Log, TEXT("クリア"))
break;
}
}


雑ですがこんな感じの記述になります。
結果はこんな感じに。
SEditableTextBox000.png

SEditableTextBox の各プロパティの機能はこんな感じになります。

・Text
エディタブルテキストボックスに最初に表示される文字列です。FText 型で指定します。
・HintText
エディタブルテキストボックスに何も文字列がない時に表示される文字列です。FText 型で指定します。
SEditableTextBox001.png
・Font
表示する文字列のフォントです。
FSlateFontInfo 型を使って、フォント名とフォントサイズを指定します。
・Padding
文字列を表示するときのマージン(スペース領域)を指定します。
FMargin 型で上下左右を指定します。
・ForegroundColor
表示する文字列の色です。
FSlateColor 型で指定します。
・BackgroundColor
文字列を表示するための背景の色です。
FSlateColor 型で指定します。
・IsReadOnly
読み取り専用にします。
SEditableTextBox003.png
・ReadOnlyForegroundColor
読み取り専用の時の文字の色を指定します。
と思ったのですが特に変わらず…。
・IsPassword
文字列をそのまま表示せず記号で表示します。
SEditableTextBox002.png
・SelectAllTextWhenFocused
エディタブルテキストボックスにフォーカスが移った時に
文字列を全選択状態にします。
・RevertTextOnEscape
編集中にエスケープキーを押した場合に編集前の状態に戻します。
・ClearKeyboardFocusOnCommit
デフォルトではエンターを押したときにETextCommit::OnClearedメッセージが投げられるようなのですが
false にすることで ETextCommit::OnCleared は投げられなくなります。
(ETextCommit::OnEnter のみの通知になる)
・IsCaretMovedWhenGainFocus
良くわからなかったので公式ドキュメント
・SEditableTextBox::FArguments::IsCaretMovedWhenGainFocus
https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Widgets/Input/SEditableTextBox/FArguments/IsCaretMovedWhen-/index.html
この内容を翻訳したところ

自動補完が終了したときにフォーカスを失うための回避策。

となりました。
デフォルトがtrueなのでそのままの方がよさそうです。
・OnTextCommitted
テキストが決定(キャンセル、フォーカス移動を含む)された時に通知される関数を登録します。
・OnTextChanged
テキストが変更された時に通知される関数を登録します。
OnTextCommitted と同じ関数を登録することできます。

通知の関数のコミットタイプは
・ETextCommit::Default
通常の通知。今回ではテキスト編集中に文字列を変更したタイミングごとに通知される。
・ETextCommit::OnEnter
エンターキーで決定したときに通知される。
・ETextCommit::OnUserMovedFocus
フォーカスが移動したときに通知される。
・ETextCommit::OnCleared
エスケープキーなどでクリアしたときに通知される。

といった感じでしょうか。
思ったより機能が盛りだくさんでしたが、入力系統の一つとして結構使うんじゃないでしょうか。

| UE4 | 15:46 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 エディタ上のビューポートをゲームビューに切り替えて実際のゲームに近い表示でみる(Gキー)

UE4のエディタ上でビューポートを実際に動かしたときと同じような見え方にする方法です。
これはゲームビューと呼ばれるようです。

・ゲーム ビュー
https://docs.unrealengine.com/latest/JPN/Engine/UI/LevelEditor/Viewports/Basics/index.html#ゲームビュー

ゲームビュー は、ゲーム内で表示されるのと同様にシーンをビューポートに表示させます。つまり、アクタ アイコンなどのエディタ固有の要素は、 全く表示されません。ゲームビューは、ゲーム内で実行した場合に、レベルがどのように見えるかを 確認する簡単な方法を提供します。


この切り替え自体はビューポートオプションで切り替えることができます。
ゲームビュー002

ショートカットキーとして「Gキー」を押すことでも切り替えることができます。

というわけでエディタ上のこういった表示が
ゲームビュー000

ゲームビューに切り替えることでこんな感じに表示されます。
ゲームビュー001

スクリーンショットを撮ったり、実際のゲームでの配置物とかみるのはこのビューの方がよさそうですね。

| UE4 | 16:56 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 エディタ拡張・ボタンウィジェット(SButton)

ボタンウィジェットについてのメモです。

ロジカルビートさんのこのページとエンジンのソースとにらめっこしていました。

・【UE4】エディタ拡張(ボタン編)
http://logicalbeat.jp/blog/805/

ボタンウィジェットを使うには「SButton」クラスを使います。

~省略
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.AutoHeight()
[
SNew(SButton)
//.IsEnabled(false)
.Text(LOCTEXT("ButtonText", "SButton。押したら何かが起きる"))
.ButtonColorAndOpacity(FSlateColor(FLinearColor(1.0f, 1.0f, 0.0f, 1.0f)))
.ForegroundColor(FSlateColor(FLinearColor(1.0f, 0.0f, 1.0f, 1.0f)))
.ContentPadding(FMargin(16, 16, 16, 16))
.OnClicked_Raw(this, &FUtilityModule::OnClickedButton)
]
~省略
FReply FUtilityModule::OnClickedButton()
{
return FReply::Handled();
}


雑ですがこんな感じの記述になります。
結果はこんな感じに。
SButton000.png

SButton の各プロパティの機能はこんな感じになります。

・Text
ボタンに表示される文字列です。FText 型で指定します。
・ButtonColorAndOpacity
ボタンの色です。
FSlateColor 型で指定します。
・ForegroundColor
表示する文字列の色です。
FSlateColor 型で指定します。
・ContentPadding
ボタンの文字列を表示するときのマージン(スペース領域)を指定します。
FMargin 型で上下左右を指定します。
・OnClicked
ボタンをクリックしたときの関数を指定します。
今回は自分自身を渡しているので Raw の名前の関数を使っています。

ボタンを無効にしたい場合は「IsEnable」のプロパティを使って下さい。

・IsEnabled
ボタンの有効無効を切り替えます。
bool 型で指定します。

だいたいこれぐらいのプロパティがあればやりたいことができるかなと。
他にも「Method」系のものがあるっぽいので、ここらへんはおいおいということで。

| UE4 | 14:15 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 エディタ拡張・テキストブロック(ラベル)ウィジェット(STextBlock)

テキストブロックウィジェットについてのメモです。
他ではよく「ラベル」と呼んでいるコントロールですね。

ロジカルビートさんのこのページとエンジンのソースとにらめっこしていました。

・【UE4】エディタ拡張(ラベル編)
http://logicalbeat.jp/blog/733/

テキストブロックウィジェットを使うには「STextBlock」クラスを使います。

FText WidgetText = FText::Format(
LOCTEXT("WidgetText", "STextBlock。コミケまであと {0}日と{1}時間{2}分\nどうもFText::Formatは引数が4つまでしかいけなさそう。\n文字列操作にはFStringを使おう!"),
FText::FromString(FString::FromInt(Days)),
FText::FromString(FString::FromInt(Hours24)),
FText::FromString(FString::FromInt(Minutes))
);
~省略
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.AutoHeight()
[
SNew(STextBlock)
.Text(WidgetText)
.Font(FSlateFontInfo("Veranda", 16))
.ColorAndOpacity(FSlateColor(FLinearColor(1.0f, 1.0f, 0.0f, 1.0f)))
.ShadowOffset(FVector2D(2.0f, 2.0f))
.HighlightColor(FLinearColor(0.0f, 1.0f, 1.0f))
.HighlightText(LOCTEXT("HighlightText", "FText::Format"))
.AutoWrapText(true)
.Margin(FMargin(16, 16, 16, 16))
.OnDoubleClicked_Raw(this, &FUtilityModule::OnDoubleClickedButtonLabel)
]
~省略
FReply FUtilityModule::OnDoubleClickedButtonLabel()
{
return FReply::Handled();
}

雑ですがこんな感じの記述になります。
結果はこんな感じに。
STextBlock000.png

STextBlock の各プロパティの機能はこんな感じになります。

・Text
表示文字列です。FText 型で指定します。
・Font
表示する文字列のフォントです。
FSlateFontInfo 型を使って、フォント名とフォントサイズを指定します。
・ColorAndOpacity
表示する文字列の色です。
FSlateColor 型で指定します。
・ShadowOffset
フォントにドロップシャドウを付ける場合のオフセット(xy)を指定します。
FVector2D 型で指定します。
・HighlightText
ハイライト扱いにする文字列を指定します。FText 型で指定します。
・HighlightColor
ハイライト時のカラーを指定します。FLinearColor 型で指定します。
・AutoWrapText
文字列がはみ出る時に自動で折り返すかの指定をします。
・Margin
文字列を表示するときのマージン(スペース領域)を指定します。
FMargin 型で上下左右を指定します。
・OnDoubleClicked
ダブルクリックしたときの関数を指定します。
今回は自分自身を渡しているので Raw の名前の関数を使っています。

何気にダブルクリックの反応を受け取れたのがよかったです。クリックは無理そうでしたが。
UE4のスレートでの文字列表示はほとんどこの STextBlock を使うので覚えると便利そうですね。

| UE4 | 15:34 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 カメラをエディタ操作中と同じように操作できるモードで実行する(Play In Editor と Simulate In Editor)

デフォルトのキャラクターコントローラーなどを使っていると、
カメラが付随してしまっているので、実行中にここを見たい!などをするのが難しくなります。
これをエディタ操作中と同じようなカメラで実行する方法です。

普通はこの「プレイ」ボタンで実行していると思います。
プレイボタン000
この状態を「Play In Editor」というみたいですね。

このプレイボタンの右にある三角ボタンを押します。
プレイボタン003

するとメニューが出てくるので「シミュレート」を押します。
プレイボタン001
これでエディタ操作時と同じカメラ操作で実行してみることができます。
これを「Simulate In Editor」というみたいです。
自由にカメラを動かせる代わりにプレイヤーの操作などはできなくなってしまうので注意です。

もとに戻す場合は「選択ビューポート」で実行します。
プレイボタン002
これがデフォルトの「Play In Editor」ですね。

この方法以外にも通常プレイ(Play In Editor)中に
エディタ操作プレイ(「Play In Editor)に変更する方法があります。

通常プレイ(Play In Editor)中に「イジェクト」ボタンを押します。
プレイボタン004
そうすると「Play In Editor」モードに変更されます。

この状態からもとの通常プレイ(Play In Editor)に戻す場合は
「乗っ取る」ボタンを押します。
プレイボタン005
これで「Play In Editor」モードに戻ります。

ここらへんは公式ドキュメントみるとよいかもです。

・エディタ内テスト (プレイ&シミュレート)
https://docs.unrealengine.com/latest/JPN/Engine/UI/LevelEditor/InEditorTesting/index.html

知らない機能とか結構まだまだありそうなので調べないとですね。

| UE4 | 16:24 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 実行(プレイ)中にマウスカーソルを表示してエディタを操作する(Shift + F1)

UE4で実行(プレイ)中にマウスカーソルを表示して
エディタを操作できるようにする方法です。

デフォルトのキャラクターコントローラーを使っている場合など、
実行(プレイ)をすると、プレイ中はマウスカーソルが消えます。
この状態だと、マウスの移動はカメラの回転などの機能に割り振られてしまい、
エディタを操作することができなくなってしまいます。

これを操作できるようにする方法です。

「Shift + F1」

これだけです!
これで、実行中の画面を動かしたまま
マウスカーソルが表示され、エディタが操作できるようになります。
もう一度ビューポートをクリックすると元通りのプレイ中に戻ります。

| UE4 | 15:49 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT | NEXT