[UE4] UE4.17リリースノートピックアップ

今回は、UE4.17の新機能をピックアップして紹介します。この記事は、ドキュメントのリリースノートにもとづいて作成しました。

[UnrealC++]UPROPERTYマークアップされた変数のGetterとSetterが定義可能に

・Native member variables can now make use of uproperty markup to be exposed to Blueprints via ufunction accessors even if the property had been previously exposed directly using BlueprintReadOnly or BlueprintReadWrite markup.

UPROPERTYでマークアップされたネイティブメンバ変数に対して、GetterとSetterを定義できるようになりました。単純なGetとSetでは、変数の値を取得や変更することしか行えませんが、GetterやSetterを使うことで、値の取得や変更の前処理をできるようになりました。例えば、不正な値をはじくといった処理をスマートに記述できるようになります。
GameModeBaseを継承したクラスで、次のようなコードを用意しました。
BlueprintGetterの作り方は、Getterの対象となる変数の型(ここではint32)を返す関数に、UFUNCTIONでBlueprintGetterを指定し、Getterの対象となる変数のUPROPERTYにBlueprintGetter=<Getter関数名>のように記述します。BlueprintSetterも同様に、Setterの対象となる変数の型を引数にもつ関数に対して、UFUNCTIONでBlueprintSetterを指定し、Setterの対象となる変数のUPROPERTYにBlueprintSetter=<Setter関数名>のように記述します。
NumのUPROPERTYにはBlueprintReadOnly/ReadWriteといった指定子がありませんが、指定したときのようにGet/Setノードが現れます。
図1 BlueprintGetter/SetterによるGet/Setノード

Get/Setノードが実行されると、Getter/Setter関数が呼び出され、0以上の値になるようなフィルタがかかります。
図2 Get/Setノードの実行結果(右下)

便利な機能ですが、いくつか不明な部分についてQ&A形式でまとめてみました。

Q:Setノードの返り値はNumをそのまま返しているのか?

A:そのまま返していない。Setノードの返り値は、Getノードの返り値である。Getter関数が定義されていれば、Setノードの返り値はGetter関数の返り値と一致する。

Q:DetailパネルでNumを変更した場合はどうなるか?

A:Numの値がそのまま変更される。変更過程でSetter関数は呼ばれない。例えば-3のような値を入力しても、0以上にするフィルタはかからず-3という値をもつ。Setter関数はSetノードからのみ呼び出される。

Q:GetClassDefaultsノードでNumを取得した場合はどうなるか?

A:クラスデフォルトのNumの値がそのまま取得される。取得過程でGetter関数は呼ばれない。例えば、クラスデフォルト値を-3にすれば、GetClassDefaultsノードはクラスデフォルト値として指定した-3の値を返す。Getter関数はGetノード(およびSetノードの返り値取得のとき)のみ呼び出される。

Q:BlueprintGetter/Setterを指定したネイティブメンバ変数を、C++コード上で取得・変更したときにGetter/Setter関数は呼ばれるか?

A:呼ばれない。もし呼ばれるならば、.cpp5行目のような記述は再帰呼び出しが無限に続くことになってしまう。BlueprintGetter/Setterは、Blueprint上でのみ有効である。

Q:BlueprintReadOnly/ReadWriteとBlueprintGetter/Setterを同時に指定した場合どうなるか?

同時に指定できるが、BlueprintGetter/Setterが優先されるので意味が無いことが多い。また、BlueprintReadOnlyとBlueprintSetterは同時に指定できない。BlueprintGetterのみを記述した場合は、Getノードのみ現れる(BlueprintReadOnlyと同じような公開方式)。しかしBlueprintSetterのみを記述した場合は、Get/Setノードが現れる(BlueprintReadWriteと同じような公開方式。Getノードを隠蔽し、Setノードのみを公開することはできない)。
すなわち、同時に指定して意味のある組み合わせはBlueprintReadWrite+BlueprintGetter(GetノードはGetter関数を呼び出し、Setノードはデフォルトのまま)のみである。
図3 BlueprintReadOnly/ReadWriteとBlueprintGetter/Setterを同時に指定した場合

[Blueprint]Execピンにドラッグ&ドロップで実行ピンを自動的に繋ぐように

・Blueprints: Allow non-readonly variables from the My Blueprints panel to be dropped onto exec pins, which creates a variable set node for them
・Added support for drag-dropping a function from My Blueprints directly onto a pin, which performs the same action as if they had been picked from the menu after dragging off of that pin
・Added support for drag-dropping from the palette onto a pin, which behaves the same as if you'd dragged off of the pin and picked the palette entry from the context menu (wiring the two nodes together if possible)

図4 実行ピンへドラッグ&ドロップ

イベント・関数・変数・パレットノードの、実行ピンへのドラッグ&ドロップにより、実行ピン同士を自動接続しつつノードが配置されるようになりました。この操作を変数に対して行うと、Setノードが配置されます。
マクロとイベントディスパッチャのみ、この操作に非対応です。

[Blueprint]デフォルト状態のノードのデフォルト値を一斉に変更可能に

・Changing default values for functions/macros will correctly update any existing calls, if the parameters were still set to their initial default value. If an instance had already been broken by a resave, it can be fixed by using the new "Reset to default value" option when right clicking a pin
・Fix many bugs with Blueprint pin default values, and add "Reset to Default Value" option to pin context menu

図5 デフォルト値の変更

ノードの引数ピンの値が、引数ピンのデフォルト値と同じ場合に、デフォルト値の変更を、配置済みのノードの引数ピンの値に伝播するようになりました。
また、引数ピンを右クリックすると、Reset to Default Valueという操作が新たに追加され、これを実行すると、引数ピンをデフォルト値に戻すことができます。
デフォルト値の変更を配置済みノードに伝播させたくない場合は、配置済みノードの引数ピンに何らかのノード(例えば変数ノードやリテラルノードなど)を繋ぐ必要があります。

[UMG]ウィジェットデザイナーにロック機能を追加

・UMG - Adding an option in the widget designer to control respecting the locked mode.

図6 ロック機能による背後のウィジェットの選択

Hierarchyパネルに、ウィジェットロック機能が追加されました。この機能を使ってウィジェットをロックすると、デザイナー上でロックされたウィジェットを選択できなくなります。デザイナー上で選択不可能になっているだけなので、例えばHierarchyパネルからウィジェットを選択して、Detailパネルの値を操作すれば、位置や大きさといったパラメータを変更することができます。
一見、あまり役に立たなさそうにも見えますが、ロックされたウィジェットより後ろにあるウィジェットの(デザイナー上での)選択が容易になるという点において、有用な機能です。背景などの「一度設置したらほとんど動かさないウィジェット」は、ロックしておくことで、デザイナー上でのウィジェット管理がしやすくなります。

[UMG]解像度をプリセットから視覚的に変更可能に

・該当する原文が不明
図7 解像度プリセットを視覚的に変更

UMGには、様々な解像度の端末に対応するために、解像度のプリセットが多数用意されています。今回追加されたこの機能では、プリセットの解像度を表示しつつ、解像度をウィンドウをリサイズするような操作で変更することができます。これにより、多くの端末に対応したレイアウトが正しく作られているかを、視覚的に確認しながら作れるようになりました。この機能は、ルートウィジェット右下に表示されている矢印をつまむことで利用できます。

[UMG]ScrollBoxのNavigation機能を拡張

・UMG - Improving the navigation options on the ScrollBox. You can now set the NavigationScrollPadding on the scrollbox to configure an amount of padding that's added to the scrollbox when navigating, so that extra space is put between the item and the edge of the view.

図8 NavigationDestinationsの違いによるスクロール挙動の違い

ScrollBoxウィジェットのNavigation機能(キーボード操作などによってウィジェットのフォーカスを切り替える機能)が拡張され、NavigationDestinations(スクロールを開始する起点)とNavigationScrollPadding(スクロール位置のオフセット)によって、スクロールを開始位置を調整できるようになりました。
図8はNavigationScrollPaddingが64のとき、NavigationDestinationsの違いによるスクロール挙動の違いを示したものです。
IntoViewは、下方向(または上方向)のスクロールを行うときに、下部(または上部)をNavigationScrollPaddingだけ空けた位置にフォーカスしたウィジェットがくるようにスクロールを行います(水平スクロールも、下方向が右に、上方向が左になるだけの違いです)。
Top or Leftは、スクロール方向に関係なく、上部(水平スクロールなら左部)を64だけ空けた位置にフォーカスしたウィジェットがくるようにスクロールを行います。
Centerは、NavigationScrollPaddingに関係なく、常にフォーカスしたウィジェットを中心に維持したままスクロールを行います。
この機能は、スクロール先の項目を見やすくするためにあります。基本的にはIntoViewかCenterを使うと、見やすく違和感のないスクロールを行えると思います。

おわりに

前回に引き続き、自分が得意・興味のある部分を重点的に紹介しました。書いた内容の中には、もう既に共有された知見もあったかと思います。
また、4.17からAssetRegistryがBlueprintで使えるようになったらしいのですが、そのあたりについての知識が疎いので、有効な使い方などをこれから調べられたら良いなと考えています。


この記事は次のバージョンで作成されました。
Unreal Editor(4.17.0-3573198+++UE4+Release-4.17)
Unreal Editor(4.16.3-3561208+++UE4+Release-4.16)
Microsoft Visual Studio Community 2015 Version 14.0.25425.01

コメント