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

今回は、先日新しいバージョンが公開されたUE4.16の新機能をピックアップして紹介します。この記事は、ドキュメントのリリースノートにもとづいて作成しました。

ArrayGet(ref)ノードの追加

原文:New: 'Array Get' node.
・Can toggle between returning a reference or copy.
・Using a reference solves a longstanding issue with arrays of structs not being able to easily make changes to the items in the array.

図1左下部のような、配列要素のリファレンスを取得できるArrayGet(ref)ノードが追加されました。図1の例では、デフォルト値がfalseな要素を持つ構造体の配列に対して、ArrayGet(copy)とArray(ref)で配列要素を取得・変更した時、実際に配列内の要素が書き換わるか検証しています。ArrayGet(copy)では構造体のコピーが作成されるため、値を変更しても配列要素の値は変更されませんが、Array(ref)では構造体のリファレンスを変更しているため、配列要素の値が変更されます。
図1 ArrayGet(copy/ref)ノード

トグル ノード選択

原文:Updated marquee selection in graph editors. Ctrl dragging now inverts nodes' selection state, instead of only deselecting them (holding alt is now for pure deselection).

ノードが選択されているとき、Ctrlを押しながらマーキー選択をすると、範囲内にある選択済みノードは非選択ノードに、非選択ノードは選択済みノードにトグルされるようになりました。
図2 ノード選択のトグル

Blueprint関数内での引数のGetノード化

原文:New: Function inputs are now exposed as variable "Get" nodes via the right-click context menu in a Blueprint function graph context.
・To use: In a Blueprint Function graph, right-click to access the context menu. Any input parameters will be listed as additional "Get" actions.
・In this way, input parameters can be accessed like local variables from anywhere in the function graph; in other words, it's no longer necessary to drag wires all the way back to the Function Entry node in order to access these values.

Blueprint関数内で、その引数を取得できるGetノードが追加されました。これは関数内部でのみ使用できる「読み取り専用ローカル変数」のように振る舞います。主に関数入力からワイヤーを引く手間を省略し、可読性を上げるためのもののようです。
図3は引数をPrint Stringする関数の実装の違いを示したものです。4.15では、引数Argを関数入力ノードからワイヤーを伸ばさずに関数内のどこからでも使えるようにするには、一度ローカル変数にキャッシュする必要がありました。4.16ではそのようなことをする必要はなく、ノードの検索に「Get Arg」のように入力すれば引数の値を取得するGetノードがヒットし、それを初期化なしで使用することができます。
図3 引数Getノードを使った関数の実装の比較(上:UE4.16 下:UE4.15)

CallInEditorがActor以外のクラスでも利用可能に

原文:New: Overhauled "Call In Editor" support and promoted it so it can be used on functions in any class, not just Blueprints derived from AActor:
・"Call In Editor" can now be used on native UFUNCTION() declarations (e.g., UFUNCTION(Category=CoolCommands, CallInEditor)).
・Blueprint declared functions can also be marked as CallInEditor (in addition to custom events), which allows you to set the category and tooltip for the buttons.
・Now shows each function as a separate button, placed in the category associated with the function.
・Removed the duplicate copies of properties placed in the Blutility section.
・Prevented operating on functions that have parameters or return values, which could crash before.
・Added a scoped transaction around "Call In Editor" execution so changes made can be undone.
・The button strip entry is now searchable by function name or tooltip.

CallInEditorがActor以外のクラスでも利用可能になりました。図4はSceneComponentを継承したクラス内で実装した関数にCallInEditorをつけて、レベルエディタ上でボタンが現れることを示しています。また、UFUNCTIONでCallInEditorを設定するときは、
UFUNCTION(Category=CoolCommands, CallInEditor)
のように、CallInEditor指定子をつけます。
図4 SceneComponentの関数でCallInEditorを有効にする

ラーニングプロジェクト「ShooterGame」でDedicated Serverをサポート

原文:New: ShooterGame now supports dedicated servers on PC, Mac, and Linux!

ShooterGameはマルチプレイヤーゲームの作り方をまとめたサンプルプロジェクトですが、どうやらDedicated Serverをサポートしたようです。試しに立てたDedicated Server上でプロジェクトの動作を検証できれば、他のプロジェクトでの実装の参考にできそうです。これに関しては、いずれ時間があるときに調査してみようと思います。

UMGにおけるConstructionScript的なもの、PreConstructの追加

原文:New: Introduced PreConstruct and Native PreConstruct to the base User Widget. Users can now visualize non-binding based changes in the designer by evaluating a very limited amount of the blueprint code. In the event your user widget crashes on load, due to calling something unsafe, you can disable evaluation in the editor preferences under Widget Designer.

4.15以前でのUserWidgetは、Blueprintでのウィジェットの変更をDesignerに反映させるようなことはできませんでしたが、4.16ではPreConstructを使ってDesignerに変更を反映させることができるようになりました。これはUMG版ConstructionScriptのようなもので、動的なレイアウトの作成を支援します。
簡単な例を示します。まず図5のようにTextの値が「PreConstructTest」となっているようなTextBlockをもつUsewWidgetを作成します。
図5 PreConstructTestというテキストをもつUserWidget 

次に、図6のようにTextBlockのテキストを「ぷりこんすとらくと」に変更するような実装を持つPreConstructを作成します。ちなみに、PreConstructの引数IsDesignTimeはエディタ上ではTrueを返し、ランタイム上ではFalseを返す値です。
図6 PreConstructでテキストの値を変更する

このように実装した後で、再びDesignerタブを開いてみると、図7のようにTextBlockのテキストが「ぷりこんすとらくと」に変わります。これは手動でTextプロパティの値を変更したわけではなく、PreConstructが実行されて値が変わったことを示しています。また、試しにPreConstructの実装を消してみると、元の「PreConstructTest」というテキストに戻ります。
図7 デザイナーでPreConstructでの変更が反映されている

PreConstructは、CreateWidgetノードを使った動的なUserWidgetの追加も可能で、従来不可能だったDesigner上での動的レイアウトの構築・可視化ができる革新的な機能です。
ただ弱点もあり、エディタ上で「安全でない値(例えばランタイム時のみ確定する値とか?)」が使われるとエディタがクラッシュしてしまうそうです。もしエディタがクラッシュしてしまうような事象に遭遇した場合、一時的にPreConstructを無効化できるエディタ設定もあるようです。図8の[Editor Preferences]->[Content Editors]->[Widget Designer]->[Execute Pre Construct Event]のチェックをはずすと、PreConstructが呼ばれなくなります。
図8 Execute Pre Construct Event設定

おわりに

リリースノートのMajor Featuresには載っていない、けれど実際には便利な機能について紹介しました。個人的な感想としては、UMGのPreConstructは多くのUMGerが待望していた機能で、Major Featuresに載ってもおかしくない機能だと思いました。


この記事は次のバージョンで作成されました。
Unreal Editor(4.15.3-3450819+++UE4+Release-4.15)
Unreal Editor(4.16.0-3452394+++UE4+Release-4.16)
Microsoft Visual Studio Community 2017 Version 15.1 (26403.7)

コメント