新機能
Unreal Engine 5.8 のリリースには、UE5 ツールセットに改善が加えられています。 今回のリリースでは、レンダリング、キャラクターとアニメーション、ワールドビルディング、PCG など、さまざまな分野で改良を実施しています。
今回のリリースには、GitHub の Unreal Engine デベロッパーのコミュニティから寄せられた改善点が含まれています。 Unreal Engine 5.8 に貢献いただいた皆様に謝意を表します (以下、敬称略)。
AlexanderVeselov-arm, AlexBlackfrost, Almax27, andreibazi, az6667, Bit-Rot, Brian-PD, brpendle-ti, bturner, chrysos8201, ckendal3, ColinGulliver, CookiePLMonster, Darcy3000s, dasherman-ea, davidbaack, dmergele, DoubleDeez, DrewWeth, DTG-Will-Marshall, dyanikoglu, erebel55, Eric2-Praxinos, Erlandys, faisa-believer, foobit, gamethread, geordiemhall, glecko, GreenLightning, guansdu, H3mul, IngSubstance, iniside, jamesfAnet, jamespark-unreal, JasonCoombs, jdamdami, jerobarraco, jeysym, Jiboo, JohnJFarrow, Jordonbc, jorge-axiomvfx, jorgenpt, jpritchard1010, KaosSpectrum, KarimLUCCIN, KeithRare, kimkun07-k, kissSimple, klukule, KXOC, laurencei, lclara-BARB, LHG-JonAnderJimenez, ligazetom, LightKL, lsandersljungberg, LucaFranzo98, Maigo, MarcusSvensson92, Mario-Azcona, MartinWickhamFB, Mattiwatti, melku, michael-buschbeck-ms, Minus4-44, moumee, nickdarnell, phochstrasser, PICO-XR, QRare, r457-Ao2, rdunnington, reduf, redxdev, RiotJDebern, rohyunsang, sareali, serhanio, SilverWinter0511, slonopotamus, SoulSharer, sportbikerr1, ssutherland-riot, SukenderDontNod, Sythenz, teddemunnik, tioez326, tokyocplusplus, Tt-Wes, tustanivsky, Vaei, vladbelousoff, vogoltsov, WangKan, Wizzard033, wmiller, x157, yangskyboxlabs, yoonbigbear, zachlute-arenanet, ZeroEightSix, ZeroErrors, zhou-
レンダリング
Megalights
Megalights は現在、Unreal Engine 5.8 で実際の制作に使用できるステータスに移行しています。 ノイズを大幅に低減してビジュアル忠実度を最大化し、全体的なパフォーマンスも向上させて 60fps を達成しました。 また、シーンのデバッグと最適化に役立つ新しいツールも導入しました。
機能のサポート
透過サポート (サブサーフェス散乱)
新しいフロクセル ベース透過処理のサポート
高品質な前面レイヤー透過処理ライティング
ボリュメトリックと透過処理の IES サポート
ライティング チャンネルのサポート
クラウド シャドウ
一人称視点武器のサポート
ビジュアライゼーション ビュー
ライト ファインダー ツール (デバッグと最適化)
レイ ビジュアライザー ツール (レイ イテレーション数)
シャドウ キャスターとシャドウ キャスター不一致ビュー
この機能について詳しくは、MegaLights を参照してください。
Lumen Lite (ベータ)
Lumen Lite は、Lumen がサポートするプローブ オクルージョンを使用した放射フィールドによるグローバル イルミネーションの新しい中品質設定です。 その速度は PlayStation 5 で 60fps をターゲットにしている Lumen 高品質の 2 倍であり、グローバル イルミネーションに依存するゲームのアート ディレクションを維持します。 このパスは、現行世代のハンドヘルド コンソール用の新しいデフォルトであり、60fps で使用できます。PC でもサポートされています。
この機能について詳しくは、「Lumen Technical Details」および「Lumen Performance Guide」を参照してください。
Substrate としての X-Rite AxF マテリアル
Substrate マテリアル システムを使用して、計測マテリアルを X-Rite 社の AxF 形式から Unreal Engine にインポートするためのサポートが追加されました。
この機能を使用すると、自動車行や工業のビジュアライゼーション チームが、X-Rite Pantora からエクスポートされた忠実度の高い実際のスキャンされたマテリアルを Unreal Engine に直接取り込むことができます。
FSSS - フォグ画面空間散乱 (実験的機能)
Unreal Engine 5.8 では、指数関数的高さフォグ コンポーネントに実験的なフォグ画面空間散乱 (FSSS) 機能を導入しました。これは、参加メディア内の多重光散乱を近似し、ボリュメトリック エフェクトを通して光が散乱する様子をシミュレートすることで、濃いフォグ、煙、塵をよりぼかしてシーンに統合します。
ボリュメトリック フォグとローカル フォグ ボリュームを全てサポートしており、シーン カラー統合と散乱の広がりを制御する設定も可能です。ただし、ボリュメトリック クラウドと異種ボリュームはまだサポートされていません。 実験的機能として、現在、単一のぼかし品質レベルのみを提供しており、視覚的なアーティファクトが発生する可能性があります。
Substrate NPR シェーディング (実験的機能)
Unreal Engine 5.8 では、Substrate Blendable GBuffer (レガシ) モードに基づいて構築された、実験的な Substrate トゥーン シェーディングという、フォトリアルでないスタイライズされたレンダリング ソリューションを導入します。 ローカル ライト、スカイ ライト、Lumen グローバル イルミネーションを含む全てのライト タイプをサポートし、新しい Substrate トゥーン BSDF とトゥーン プロフィール アセットを通じてディフューズ応答とスペキュラ応答を正確に制御できます。
Substrate NPR シェーディング機能には、ディザリングによるランプ ベースのディフューズおよびスペキュラ制御、ハッチング パターンによるセルフシャドウの減衰、異方性スペキュラ ハイライト、およびグローバル イルミネーション スケール制御が含まれます。
キャラクターとアニメーション
モジュラー コントロール リグの改善
Unreal Engine 5.8 では、モジュラー コントロール リグの安定性と日常的な使いやすさの向上に注力しました。 これらのアップデートは、階層管理、モジュール作成、コネクター ワークフロー、ミラーリング動作における長年の問題に対処します。
表示
モジュールのドラッグ アンド ドロップを簡素化し、モジュールの上にソケットを構築できるようにする新しい [Show Empty Sockets Only (空のソケットのみ表示)] ビューポート オプション。
階層と状態の永続性
リグ階層とモジュール階層の信頼性と一貫性を向上させました。
リグ階層とモジュール階層は、コンパイル後も確実に状態を維持するようになりました。
リグ モジュールのクラス設定を操作すると、リグ階層が消える可能性があった不具合が修正されました。
リグ階層全体をクリアしてしまう可能性があった元に戻す/やり直すの不具合が修正されました。
モジュラー階層フィルター設定がセッション間で保持されるようになりました。
依存モジュールをコンパイルした後、選択されたコントロールがスタックしたままになることがあった不具合が修正されました。
設計図ビューポートの表示設定が、エディタ セッション間で保持されるようになりました。
モジュール リグ クラス フィールドに、アセット名とフル アセット パスの両方が表示されるようになりました。
Shift キーを押しながら中マウスボタンをクリックすることで、モジュール階層の子の展開または折りたたみを行えるようになりました。
モジュール階層ツリーがよりコンパクトになり、読みやすくなりました。
モジュール階層検索に、そのカラムが表示されている場合にモジュール クラスが含まれるようになりました。
コネクター カラムとモジュール クラス カラムを表示または非表示にするオプションを追加しました。
モジュール階層のオプション、セカンダリ、未解決のコネクターを表示/非表示にするホットキーを追加しました。
モジュールのオーサリングと作成のワークフロー
一般的なオーサリング タスクを効率化し、発見可能性を向上させました:
モジュール階層で右クリックを使用して、モジュールを複製できるようになりました。
モジュールを複製するためのホットキーを追加しました。
モジュールをドラッグ&ドロップすると、自動的に設計図ビューが有効になります。
[Create Control Rig Asset (コントロール リグ アセットを作成)] メニューにコントロール リグ モジュールを追加しました。
新しいソケットを作成するためのホットキーを追加しました。
コネクター システムの改善
コネクターの QoL とルール処理の大幅な改善:
モジュラー リグ エディタのドロップダウンから、形状タイプを選択できるようになりました。
コントロール リグ モジュールで定義されたコネクターの説明が、ツールチップとして表示されるようになりました。
配列コネクターの並べ替えハンドルが、デフォルトで表示されるようになりました。
ドラッグできないコネクターはプラグ アイコンを表示し、ツールチップを介して接続を表示します。
詳細パネルからコネクターのドラッグ&ドロップを直接有効にしました。
階層内でコネクターとモジュール クラスを表示/非表示にするサポートを追加しました。
[Delete all (全て削除)] で、詳細パネルの配列エントリが正しくクリアされるようになりました。
配列コネクターから全ての接続を削除できない不具合が修正されました。
配列以外のコネクターが [Details (詳細)] に配列として誤って表示される不具合が修正されました。
コネクター配列の最小/最大ルール サポートを追加しました。
コネクター配列に対する [Set Default Match (デフォルトのマッチを設定)] サポートを追加しました (単一コネクターとワイルドカード配列をサポートしています)。
空の配列コネクターにデフォルト ターゲットを追加できるようになりました。
配列コネクターを編集する際に、階層全体と詳細パネルがリフレッシュされないようにしました。
子モジュールを含むモジュールを複製する際のコネクターの解像度を改善しました。
コネクター選択が、モジュール詳細のコネクター ルールを正しく適用するようになりました。
コントロール リグ モジュールでコネクター ルールを編集する際に稀に発生するクラッシュが修正されました。
ミラーリングの改善
モジュラー リグは、ミラー入力設定を保持するようになりました。
ミラー モジュールは、サブ階層と複数選択を正しくミラーリングするようになりました。
スケルタルエディタ ブレンド形状リギング ツール
リギングおよびブレンド形状ツール
Unreal Engine 5.8 の拡張されたフェイス リギングおよびモーフ ターゲット編集ツールにより、スケルタルエディタとコントロール リグが拡張され、スカルプト制御のフェイシャル ワークフローをより適切にサポートできるようになりました。 これらの改善により、スタイライズされたキャラクター、カスタム スケルタル メッシュ、および MetaHuman のエンジン内ブレンド形状オーサリングが強化されます。
スキニング ワークフロー中の関節ロック サポート。
モーフ ターゲットのメッシュ要素の選択と編集 (ソフト選択のサポート付き)。
モーフ ターゲットをミラーリングする (対称にする) ホットキー。
モーフ ターゲットを反転するメニュー オプション。
頂点マップを使用してモーフ ターゲットを 2 つに分割する新しいツール。
モーフ ターゲット編集用のラティス デフォーマー。
LOD 生成用の後処理ジオメトリ スクリプト (簡素化されたサブディビジョン スタイルのワークフローを有効にします)。
移動ブラシの動作が一貫性を増しました。
サーフェス ベースのブラシ フォールオフ。
スケルタルエディタ ツール全体で QoL を向上させ、安定性、使いやすさ、制作ワークフローを改善しました。
選択内容
[Isolate Selected (選択を分離)] を終了する際に、頂点/コンポーネントの選択を維持します。
Ctrl キーを押しながらボタンをクリックすると、新しい選択モードに切り替わります。
既存の選択範囲を変更するには、Shift キーを押しながらボタンをクリックします。
ウェイト コンポーネント エディタからボーンを直接選択します。
アセット エディタ用の新しい統合ギズモ システムと統合しました。
スキンとウェイトの編集
ボーンにウェイトを追加してもスケルトン ツリーが適切にアップデートされない不具合が修正されました。
ウェイト ペイント ランプ ウィジェットをアップデートしました。
ブレンド形状ワークフローの開発に合わせた、重み付けツールの大幅な改善。
新しいスキン ウェイトのロック機能。
他の影響に干渉することなく、2 つの影響の間でウェイトを調整します。
ボーン編集
ミラー文字列は、ボーン名のどこでも機能するようになりました。
階層間でのジョイントのミラーリングのサポート。
ボーンの名前変更に関する不具合が修正されました。
階層を折りたたむとき、スケルトン ツリーの子選択の可視性を修正しました。
軸ドロップダウンで、誤って [None (なし)] を選択できることがなくなりました。
ローカル回転軸 (LRA) デバッグ表示を追加しました。
[Orient Selected Bones Only (選択したボーンのみをオリエント)]オプションを追加しました。
アセット間でジョイントを転送するための [Paste Special (特殊をペースト)] オプションを追加しました。
[Mesh and Bones (メッシュとボーン)] メニューをビューポート ツールバーの上部に移動しました。
メッシュとモーフの編集
ベース メッシュとモーフ ターゲット用の基本的なメッシュ要素編集を追加しました。
現在、選択した要素の移動をサポートしています。
編集機能を拡張するための基盤。
ボーン数削減ツール
スケルタル メッシュから未使用のボーンを削除する新しいオプション。
スキン ウェイトによって参照されていないボーンを削除します。
親階層をルートまで維持します。
コントロール リグ物理でアニメートする (ベータ)
コントロール リグ物理 がベータに移行し、このリリースでは、新しい力ベースの機能と拡張されたツールを導入し、物理駆動のアニメーション ワークフローをさらに有効にします。
物理リグはレイヤー化リグとして動作するようになり、明示的なレイヤー化リグ設定を必要とせずに、既存のアニメーションの上に自然に合成されます。
これらのアップデートにより、特にモジュラー コントロール リグ内で、リグ作成とアニメーター向けのユーザビリティの両方が向上します。
新機能:
コントロール リグ物理内で力を直接適用する機能のサポート。
ダイナミック リグの動作のために、時間の経過とともに力をアニメートする機能。
ランタイム パフォーマンスの向上。
シミュレーションとパススルーのブレンドにおける「アルファ」の機能の改善。
物理設定を簡素化するモジュラー コントロール リグ用の新しい物理モジュール。
物理駆動のリグを使用するアニメーターを支援するアニメーター キットの新しい物理ユーティリティ リグ。
これらの改善により、物理ベースのリギングのクリエイティブな範囲が広がります。
ダイナミクス - コントロール リグ用のパーティクル ベースの物理
コントロール リグ ダイナミクスは、高パフォーマンスのゲーム内キャラクター シミュレーションを実現するために、コントロール リグに直接組み込まれた新しい軽量のパーティクル ベースのソルバです。
このプラグインは、衣服、髪、アクセサリーなどのビジュアル要素に、完全な物理エンジン機能のオーバーヘッドなしで、高速でオーサリング可能な物理を実現するために設計されています。
新機能:
リアルタイム パフォーマンスのために構築された専用のパーティクル ベースのソルバーを備えた新しいコントロール リグ ダイナミクス プラグイン。
既存の物理ソリューションと比較して、ランタイム パフォーマンスの 5 倍の向上。
ノードを減らし、オーサリング ワークフローを簡素化することによるセットアップの複雑さの軽減。
ゲーム内のビジュアル アイテムや物理駆動のキャラクター アセットのために特別に作られています。
コントロール リグ ダイナミクスは、テクニカル アニメーターとリガーに、物理ベースのキャラクター シミュレーションへの迅速で実用的なパスを提供します。
直接メッシュ コントロールを使用してアニメート (実験的機能)
直接メッシュ コントロール (DMC) を使用すると、コントロール リグのコントロールをスケルタル メッシュのセクション上に直接表示できるため、アニメーターはコンテキスト内でキャラクター サーフェスとインタラクトすることでリグを操作できます。 これにより、従来の静的形状制御を補完する新しい制御パラダイムが導入されます。
コントロール リグ コントロールとして機能するメッシュ ベースのコントロール グループの作成。
ビューポートとシーケンサーでのメッシュ地域の直接選択と操作。
メッシュ コントロールが適切ではないリグ (例:テール、メカニカル リグ) の場合、従来型の静的形状コントロールとの共存。
オブジェクトとリグをより迅速に操作できるビューポート制御のクリックアンドドラッグ操作。
フィルターとリンク システム
シーケンサー、カーブ エディタ、ビューポート間で選択が同期されるようになりました。
選択は、ビューポート、シーケンサー、カーブ エディタ間で完全に同期されるようになりました。 ビューポートのキャラクターのコントロールをクリックし、シーケンサーアウトライナーでトラックを選択するか、カーブ エディタでカーブを選択すると、これら 3 つのパネルは全て、毎回瞬時に同時にアップデートされます。
全てのフィルターと検索が、デフォルトでリンクされるようになりました。 そのため、いずれかのエディタで行った操作は、もう一方のエディタに反映されます。
新しいリンク アイコンを使用すると、このリンクされた動作が必要かどうかを決定できます。 リンクが解除された状態では、いずれかのビューで何を見ているかを決定できます。
シーケンサーのシンプル ビュー
シーケンサーは、アニメーションの制作中にアーティストがビューポートの要素に集中できるよう、折りたたんで簡素化されたビューにすることができるようになりました。
シーケンサー ビューを、以下のキーを表示する簡素化されたタイムラインに折りたたむ:
選択済み/ピン留め済み (ピン留めされた任意のトラック + 選択されたアクタ/コントロール)
選択済み (選択されたアクタ/コントロール)
全て (シーケンサー内の全て)
簡素化された時系列をいつでも完全なシーケンサー ビューに展開できます
簡素化するホットキー (Ctrl+Backspace)
ツールバーを非表示にするホットキー (Shift+Backspace)
機能
複数のキーを選択
移動、スケール、コピー/貼り付け、削除
フレームへのスナップとスマート スナップのサポート
キャラクター アニメーション制作のためのキュレートされたツールバー
中間を追加/削除
オプション
グリッド色ブロック
ツールバーの表示/非表示、トランスポート コントロール、範囲スライダー
色、外観、スタイルをカスタマイズする
シーケンサーの AutoBake
アニメーション シーケンスへの自動ベイク、およびベイクされたデータとリアルタイム コントロール リグ データ間の切り替えのための新しいワークフローを追加しました。
右クリック メニューに新しい [Configure AutoBake (AutoBake を構成)] オプションを追加しました。
リンクされたアニメーション シーケンスのワークフローを活用します。
このオートベイクで設定されているもの全てにクイック切り替えアイコンを追加しました。
シーケンサーでのアニメーション ミキシング (実験的機能)
シネマティックのシームレスなゲームプレイ トランジションに関する 5.6 で行われた作業を拡張し、アニメーション ミキサーは、シーケンサー内で異なるアニメーション入力を直接ミックスするシネマティック アーティストの能力を向上させます。 これにより、シネマティック アーティストは、別のアニメーション ブループリントや特定のスロットを必要とせずに、シーケンスのキャラクター アニメーションをレイヤー化およびマスクできます。 アニメーション ミキサーは、新しい Unreal アニメーション フレームワークのワークフローもサポートしています。
これにより、次のことができます。
アニメーション ブループリント スロットまたはカスタム アニメーション インスタンスに割り当てるアニメーション ミキサーを作成します。
スケルタル アニメーション、コントロール リグ、またはスケルタル ポーズに影響を与える任意の入力を優先順位に従ってレイヤー化するミックス レイヤーを作成します。
任意のミックス レイヤーでブレンド マスク アセットを使用して、ボーンとカーブをマスクします。
任意のミキサー、レイヤー、またはセクションにモディファイアを追加して、ボーン マッチ、オフセット ルート モーション、ミラーリングなどを実行できます。
アニメーション間にクロス フェードやデッド ブレンディングなどのトランジションを追加します。
リターゲティング用の足の定義
Unreal Engine 5.8 では、IK リターゲッターの改善を続けており、足のアニメーションをさまざまなキャラクターに転送できるようにしています。 ランタイム リターゲティングとモーション キャプチャ ワークフローの両方に注目しているアーティストは、これらの新しい機能を使用して、異なるキャラクターにリターゲティングする際に自信を持って素晴らしい結果を得ることができます。
転送をより制御しやすくするために、ターゲット キャラクターの足の平面とつま先を定義します。
足の定義用にアップデートされたリターゲット チェーン用の自動リターゲティング テンプレート。
背の低いキャラクターの垂直方向の骨盤の動きの減衰を防ぐための追加コントロール
[Blend to Source (ソースにブレンド)]、[Scale Goals (スケール目標)]、[Offset Goals (オフセット目標)] は、順序の柔軟性を高めるために IK オペレーション スタックで分割されています。
リターゲット オーバーライド セット
ゲームプレイ リターゲティング ワークフローでは、[Retarget Override Sets (リターゲット オーバーライド セット)] を使用すると、追加のアセット作成や追加ブループリント ロジックなしに、1 つの IK リターゲッター アセットで複数のリターゲット関係を処理できるようになります。
リターゲッター アセットに、オペレーションとそのプロパティのコレクションを作成し、リターゲット オーバーライド セットとして保存します。
より柔軟なリターゲットを実現するため、既存のオーバーライド セットを追加し、そこから継承します。
オペレーションおよび/またはそのプロパティを、オーバーライド セット内のアニメーション カーブまたは変数にバインドします。
ランタイム リターゲティングまたはオフライン リターゲティングの場合に IK リターゲッターを実行する際に、どのオーバーライド セットを使用するかを設定します。
この機能について詳しくは、「IK Rig Retargeting」を参照してください。
RigMapper アニメーション リターゲティング ツール ((ベータ))
リグ マッパーは、より優れたノード グラフ作成機能を追加し、IK リターゲッターとの統合をさらに強化することで、より完成度の高いフェイシャル アニメーション転送を処理できるように、引き続き改善を進めています。 ARKit アニメーションを MetaHuman に適用したり、MetaHuman Animator (MHA) アニメーションを ARKit キャラクターに使用したりするなど、異なるキャラクター設定間でモーションを転送できます。
リマップ カーブをオペレーションのスタックに拡張して、全てのカーブ リターゲティング操作を優先順位に従って処理できるようにしました。
以前の 5.7 ワークフローは、配列順にリグ マッパー評価を処理するユーザー データ リグ マッパー操作を使用してサポートされるようになりました。
ユーザーがシングル リグ マッパー定義を割り当てられるように、新しいシングル リグ マッパー操作を実装しました。
リマップ カーブ スタックで複数のシングル リグ マッパー操作を作成し、評価の優先順位を決定します。
リグ マッパー定義エディタのノード グラフの動作を拡張し、ユーザー エクスペリエンスを向上させました。
コンテキスト メニューから、またはピンをドラッグ アンド ドロップして、新しいノードを作成します。
コンテキストと方向性を考慮して、ピンをノードからノードへドラッグして接続します。
ノードのグループを移動して配置します。
全てのノードの詳細パネルをアップデートし、グラフにリアルタイム編集が表示されるようにしました。
可変
可変は、UE 5.8 リリースで製品版に移行し、安定性、パフォーマンス、パイプラインが向上しました。
データレス カスタマイズ可能オブジェクトにより、ランタイム制御のパラメータ処理が可能になり、イテレーションの高速化、グラフの再利用性の向上、パッチ適用の改善が実現します。 メッシュ操作とシンプルなテクスチャ構成のため最適化されています。
データレス ワークフローを使用すると、パラメータ入力をコンパイル時ではなくランタイム時に評価できます。これにより、Unreal Engine のパッケージングおよび暗号化システムとの互換性を維持しながら、イテレーション コストを大幅に削減できます。
スケルタル メッシュ ピンは、ユーザーがメッシュ セクションではなくスケルタル メッシュ レベルで作業できるようにすることで、一般的なワークフローを簡素化します。
群衆の生成スループットをブーストするための同時アップデート、ゲーム スレッドのワークロードの削減、メッシュとテクスチャの操作の最適化を含め、全体的にパフォーマンスを向上させました。
この機能について詳しくは、「Mutable スケルタルメッシュの生成」を参照してください。
Live Link Face 動画ストリーミング
Live Link Face (iOS および Android) は、現在、動画をリアルタイムで Unreal Engine に直接ストリーミングします。これにより、オンセットのスーパーバイザーやディレクターは、アクタのパフォーマンスをリアルタイムで監視できます。 動画ストリームは Unreal Engine メディア プロフィールと統合され、これにより、キャプチャされたフッテージを解決済みアニメーションと並行してレビューできます。 新しいデバイスでは、動画ストリーミングとリアルタイム アニメーション解決が同時に実行されます。 ストリームは、低帯域幅、高遅延の Wi-Fi ネットワークでも信頼性の高い動作をするように設計されています。
MetaHuman
MetaHuman 群衆をあなたのワールドに取り込む
MetaHuman キャラクターの最適化されたインスタンスを組み立てて、Mass と互換性のある群衆を作成し、数十から数千のキャラクターにスケールします。 新しい実験的な MetaHuman 群衆プラグインは、カメラ距離に基づいて、高忠実度の個々のアクタと忠実度がより低いインスタンス化されたスケルタル メッシュの間でシームレスにトランジションする完全なアセンブリ パイプラインを提供します。
主要機能:
モジュール式のコンポーネント (頭、体、髪、服) のコレクションをビルドし、手動で、またはブループリントを使用してプロシージャルに構成します。
メモリ フットプリントを削減し、ビジュアルの忠実度を維持する、最適化された顔テクスチャ。
Unreal アニメーション フレームワークまたはシンプルなシーケンスを使用して、距離に応じて適用されるアニメーション。
Mass でシミュレートし、Nanite または動的 LOD システムを使用してレンダリングします。
サンプル プロジェクトのセットアップは別途利用可能であり、全ての Unreal Engine ターゲット プラットフォームで実行されます。
この機能について詳しくは、「MetaHuman 群衆」を参照してください。
MetaHuman Creator
フルボディ メッシュを MetaHuman キャラクターに変換し、アニメーション可能な状態にする
任意のトポロジがある人間キャラクター メッシュを、単一のワークフローで完全にリギングされた MetaHuman に変換します。 この改善された Mesh to MetaHuman プロセスは、頭と体の両方を同時に適合させ、任意のトポロジの入力メッシュを受け入れ、MetaHuman データベースに基づく結果を自動的に生成します。
主要機能:
頭と体の適合をワンステップで実行します。
任意のトポロジの頭部および/またはボディ メッシュを入力として受け入れます。
テクニカルな修正にはマニュアル制御も利用可能な人間キャラクターの自動結果。
スキャン、外部の GenAI/DCC ツール、または既存のキャラクター変換から作成されたキャラクターに最適です。
ヒューマノイド キャラクター専用です。結果として得られるキャラクターは、MetaHuman のトポロジとリグを採用します。
ベイクされていないテクスチャを完全に制御して、より高い忠実度や代替ビジュアル スタイルを実現する
ベイクされたマテリアルやテクスチャなしで MetaHuman キャラクターを組み立てます。 これにより、特定のルックに合わせたいアーティストのために、きめ細かなルックデブとテクスチャ制御が可能になります。 標準の Unreal Engine エディタを使用して、ベイクされていないテクスチャとマテリアル アセットを作成するか、テクスチャを外部 DCC ツールにエクスポートします。 MetaHuman Creator で、ユーザーがカスタマイズしたテクスチャとマテリアルでオーバーライドするためのオプションが提供されます。
主要機能:
カスタムのビジュアル忠実度や美的スタイルを実現するために、テクスチャとマテリアルを完全に制御できます。
修正された未ベイクのマテリアルとテクスチャを MetaHuman Creator でオーバーライドとして適用し、ユーザーがデフォルトのアセンブリを実行する際にマテリアル ベイクの恩恵を引き続き受けられるようにすることができます。
使い慣れたアセット エディタを使用した標準的な Unreal Engine ワークフロー。
外部 DCC オーサリングのエクスポート機能。
ユース ケース:パフォーマンス最適化を維持しながら、MetaHuman Creator のビルトイン機能を超えた外観を可能にします。
ライティング設定を使用して MetaHuman キャラクターをプレビューする
MetaHuman Creator でカスタム ライティング シーンを作成し、ターゲット環境のコンテキストでキャラクターをプレビューします。 空中ドーム半球、ポストプロセス ボリューム、ライト グループを含むテンプレートを使用してライティング設定を定義し、これらのカスタム シーンを使用してオーサリング中にビジュアル忠実度を検証します。
主要機能:
MetaHuman Creator で直接、ターゲットのライティング環境でキャラクターをプレビューできます。
MetaHuman Creator のプレビューとレベル内でのアピアランスの間のギャップを埋めます。
正確な制御のために、ビューポートのレンダリング設定を確認して修正します。
キャラクター アーティスト、ライティング アーティスト、ルックデブ チームに最適です。
MetaHuman Creator ビューポートは、Lumen も完全にサポートするようになりました。
カスタム シーンでは、完全なゲーム レベルをインポートするのではなくテンプレートを使用するため、結果は、正確なエンジン内のアピアランスに合わせるために、反復的なリファインがまだ必要になる場合があります。
MetaHuman Animator
単一のカメラからボディ アニメーションをキャプチャする
単一のカメラから、単一のアクタの体、または顔と体のパフォーマンスをキャプチャします。 この新しい実験的機能により、MetaHuman Animator のアクセシビリティが顔から体まで拡張され、コンテンツ クリエイターにとっての障壁となっていた光学モーション キャプチャの段階が不要になります。 Fab でスタンドアロン プラグインとして利用可能で、MetaHuman Animator に直接統合されています。Live Link Face モバイル アプリは、顔に加えてボディ キャプチャをサポートするようにアップデートされました。
主要機能:
オプションで顔も同時にキャプチャする 1 台のカメラからの 1 人のアクタのボディ キャプチャ。
高忠実度の結果を得るためのオフライン解決。
ウェブカメラやサポートされているスマートフォンを含む、幅広いコンシューマー ハードウェアに対応しています。
Fab を介してスタンドアロンの MetaHuman Animator マーカーレス モーション キャプチャ プラグインとして利用可能であり、Unreal Engine 内の MetaHuman Animator の機能として統合されています。
拡張されたキャプチャ ガイドラインがドキュメントに記載されています。
この機能について詳しくは、「MetaHuman Animator」を参照してください。
MetaHuman Animator の効率化されたバッチ処理
MetaHuman Animator は現在、大量のキャプチャされたパフォーマンス データをバッチ処理するための改善された API を提供しています。 アップデートされたワークフローは、解決からアニメーション レビューおよびエクスポートに至るまで、パイプライン全体をエンドツーエンドでカバーします。 参照ブループリントの例が含まれており、特定のパイプラインに合わせて拡張またはカスタマイズできます。
MetaHuman Animator が Linux および macOS で利用可能
MetaHuman Animator は、Linux および macOS をサポートし、プラットフォーム間での Unreal Engine エディタと MetaHuman Creator の可用性が拡大しました。 Linux および macOS で、Windows マシンへのアクセスを必要とせずに、パフォーマンス キャプチャからフェイシャル アニメーションを生成できます。 ただし、ボディ アニメーション機能は現在 Windows でのみ利用可能です。
主要機能:
オフラインおよびリアルタイム MetaHuman Animator 機能が Linux および macOS で利用可能です
Unreal Engine エディタおよび MetaHuman Creator とのプラットフォームのパリティ。
Linux でのリアルタイム フェイシャル アニメーションは、Live Link Face を使用した場合にのみ利用可能です。
エディタ専用のソリューションであり、ランタイム機能やプレイヤー向けの機能ではありません。
MetaHuman Animator の解決とカーブの品質が向上
新しいリアルタイムおよびオフライン アニメーション モデルにより、さまざまなカメラ アングル、レンズ歪み、赤外線ライティングなど、より広範なキャプチャ条件で解決の品質が向上します。 音声制御のアニメーションは、新しいリアルタイム モデルによって向上します。 カーブ出力は、キー ポーズでのアクティベーションがよりクリーンになったことで編集やリファインが容易になっているため、アニメーターにとってより使いやすくなっています。
ワールド構築
メッシュ テレイン (実験的機能)
3D モデリング、レイヤー化、仮想テクスチャ、汎用エディタ ツール、変数テッセレーション、および Nanite を使用して大規模なワールドをサポートする次世代のメッシュベースのテレイン ソリューション。 この機能の目的は、Unreal Engine における現在の高さフィールドのみのランドスケープ ソリューションの典型的な制約を置き換えて削除することです。
この機能について詳しくは、「メッシュ テレイン」を参照してください。
高速ジオメトリ ストリーミング (実験的機能)
高速ジオメトリ ストリーミング プラグインでは、初回の 5.6 リリースと比較して、速度、安定性、ユース ケースのサポートに関して、複数の新しい改善を実装しました。
デカール、ポイント、スポット、矩形ライト コンポーネントのサポートを追加しました。
スタティック メッシュ コンポーネントでのメッシュ ペイント テクスチャのサポートを追加しました。
IPhysicsBodyInstanceOwnerResolver に機能を追加しました:
GetCollisionObjectType
GetCollisionEnabled
トランスフォームを取得
GetPhysicsObjectById
GetAllPhysicsObjects
トランスフォーム プロセスから無視されていた非プリミティブ コンポーネントを修正しました。
FastGeoContainer が物理を含まない不具合が修正されました。
FastGeoStreaming.iniは、DefaultFastGeoStreaming.iniになりました。FastGeo ランタイム セル トランスフォーマーが、トランスフォームされたコンポーネントの新しい置換ルート コンポーネントを作成するときに、ルート コンポーネント可動性が維持されるようになりました。
PIE の実行時にプレイヤーが排出されると、プリミティブが誤って表示される不具合が修正されました。
エディタ内の MT の不具合が修正されました。
使用されていない EProxyCreationState::Pending および UFastGeoComponentEditorProxy を削除しました。
高速ジオメトリ コンポーネントのインターフェースを簡素化/明確化するためにリファクタリングしました。
WorldPartitionRuntimeCellTransformerISM が、完全にはトランスフォームできなかったブループリント アクタのインスタンスを複製していた不具合が修正されました。
この実験的リリースには、クラッシュ、スレッド化、デッドロック、初期化に対する複数の追加修正も含まれています。
World Partition インサイト
Unreal Insights と Unreal Editor に World Partition 配信デバッグ ツールを追加し、セルごとの分析とセッションの再生を可能にしました。
HLOD UX
ワールド パーティション階層詳細度 (HLOD) に対して、以下の改善を行いました。
機能:
ソース コントロール オーバーヘッドを削減するために、バッチ削除操作を追加しました。
同じサブワールド パーティション レベルの複数インスタンスを配置する際のスタンドアロン HLOD をサポートするようになりました。
必要な場合にのみ HLOD をアップデートする知覚差分ヒューリスティック オプションを追加しました。
エディタでレベルから直接 HLOD をビルドする際の新規および削除済みのアクタのサポートを追加しました。
UX:
選択のための HLOD をビルドします。
ワールド パーティション エディタを使用して、選択した地域のための HLOD をビルドします。
プロシージャル コンテンツ生成 (PCG)
手動編集
UE 5.8 では、選択、除外、変更、およびデータの復元のサポートによるPCG データとアーティファクトの非破壊的な手動編集を追加しました。
グラフ内の個々のノードは、手動編集用にマークしたり、一時的にオーバーライドしたりできます。 新しいデータ オーバーライド ウィンドウには、検査されたノードに適用された全てのオーバーライドが一覧表示されます。
複雑な属性
配列、構造体、セット、マップをメタデータ属性値およびオーバーライドとして使用できるようになりました。 これには、構造体と配列のデータを抽出するさまざまな操作や、配列操作が含まれます。
Create Complex Constant ノードと Add Complex Constant ノードが新しく追加され、複雑なタイプを持つグラフ パラメータに加えて PCG グラフで使用できるようになりました。
組み込み済みサブグラフ
PCG グラフ内で直接保存および編集できる、ブループリント関数に似たカスタム サブグラフを作成するサポートを追加しました。
グラフ パラメータ エディタ
新しいパラメータ階層エディタ ツールで、PCG パラメータを分類、ソート、グループ化、説明できるようになりました。
PCG パフォーマンス
ランタイム:
PCG GPU ランタイム散乱は、ランドスケープ GPU 草システムと同じパフォーマンス範囲内になり、全てのプラットフォームでストレス テストが行われました。
アクタ/コンポーネントなしのランタイム生成
エディタ:
グラフの実行時の CRC とキャッシングの改善を追加し、効率を向上させてキャッシュ無効化の可能性を低減しました。
大量のスタティック メッシュをスポーンする際の ISM 再利用ロジックを改善しました。
グラフ実行とスケジュールを改善し、競合やボトルネックを解消しました。
PCG UX
PCG の操作時の UX の継続的な改善として、最近、以下の変更を導入しました。
コンテキスト フィルター:任意のタイプのピンからドラッグして新しいノードを追加すると、ノード パレットはサポートされている操作に自動的にフィルターされます。変換を含めるオプションや、フィルターを完全に無効にするオプションがあります。
HLSL カーネル:ノード設定で作成するのではなく、HLSL カーネルから直接属性を作成できるようになりました。
HLSL エディタ:フォント サイズを設定できるようになりました。
データ ビューポート:PCG エディタのデータ ビューポートから手動オーバーライドを編集できるようになりました。
PCG ノードと演算子
Unreal Engine 5.8 では、以下を含む複数のネイティブ PCG 要素および新しいオプションも導入します。
メタデータ配列操作:配列に最も便利な演算 (make、add、add unique、contains など)。
ポイントを整列:任意の軸と空間参照で、別のポイントの境界に対してポイントの位置と回転をスナップします。
シーン キャプチャ:シーン キャプチャ ノードは、入力トランスフォームをサポートするようになりました。これにより、任意の方向からキャプチャを実行でき、GPU サンプリングの柔軟性が向上します。
Create / Add Complex Constant:これらのノードを使用して、任意の複雑な属性タイプをグラフに直接作成または追加します。
スプラインをコンポーネントに適用:PCG スプライン データを既存のスプライン コンポーネント参照に書き込みます。 エディタ内で既存のスプラインに変更を適用する際に役立ちます。
アクタとコンポーネントをテレポート:ワールド内の任意のアクタまたはコンポーネント参照にトランスフォームを適用できます。 エディタ内で即時操作を適用する新しいレベルベースの PCG ワークフローに役立ちます。
属性からクラスを取得:ソフト オブジェクト参照からクラスを取得し、それを属性として返します。
エディタ カメラを取得:現在表示されているエディタ ビューポート カメラを、さまざまなエディタ内操作で使用するためのポイントとして返します。
動的メッシュにマテリアルを設定:動的メッシュ データにマテリアルを適用します。
プロシージャル植生エディタ (実験的機能)
プロシージャル植生エディタは、Unreal Engine 内で直接、Nanite フォリッジをサポートし、植生メッシュを作成および編集するための実験的プラグインです。 UE 5.8 では、PVE の機能を大幅に拡張するいくつかの新しいコア機能を導入し、インポートされたレシピを必要とせずにエディタで直接成長を可能にするとともに、その他にも多数の改善が加えられています。
成長ノード
シード生成
3D メッシュまたは 2D 画像/アトラスからのスケルタル抽出
フォリッジ グラフティング
オブジェクト回避とカービング
トリミング - ブランチ ループ、ディスプレイスメント テッセレーション
メッシャーの改善
ビジュアライゼーション モード
メイン マテリアル コンポジター
この機能について詳しくは、「プロシージャル植生エディタ」を参照してください。
フレームワーク
StateTree 開始状態とコンパイラ拡張機能
State Tree は UE 5.8 で柔軟性ブーストを獲得します。
ワークフローのオーサリングを改善しました。ツリーで開始状態を定義できるようになりました。
新しいコンパイラ マネージャーにより、イテレーションが効率化され、エディタはツリーが古いかどうかを追跡するようになったため、再コンパイルが必要なタイミングがより明確になります。
プロパティ バインディングはより堅牢になり、バインディングを簡単に反転できるようになったため、完了したタスクから別のタスクにデータを簡単に移動できます。
この機能について詳しくは、「Statetree」を参照してください。
Mass フレームワーク:より高速、モジュール式、スケール対応
Mass (当社のデータ指向エンティティ システム) が大幅に改善されます。
Mass Signal はコア エンジンの一部となり、アーキタイプ ベースのロックフリー スケジューリングにより、エンティティはゲーム スレッドとは別に作成できます。 新しいスパース/仮想フラグメント システムにより、メモリ使用量が削減され、コストのかかるアーキタイプの変更をトリガーすることなく、オプションのフラグメントやタグを追加または削除できます。
Mass プロセッサの実行と依存関係の解決を完全に刷新し、マルチコア CPU をより有効に活用できるようにしました。その結果、最新のハードウェアでより安全かつ高速に実行できるようになりました。 これは、よりきめ細かいスケジューリングとスレッドセーフなオブザーバー通知によってサポートされています。
新しい MassCore モジュールは、コア エンティティ システムをより広範な MassGameplay スタックから分離することで、導入をさらに簡素化します。
この機能について詳しくは、「MassEntity」を参照してください。
ナビゲーション:歩行可能なサーフェスに対するメッシュごとの制御
スタティック メッシュは、ナビメッシュ生成中に独自の歩行可能エリアを定義できるようになったため、デザイナーは、AI がワールドをナビゲートする方法をより細かく制御できるようになりました。 スタティック ジオメトリにメッシュごとのエリア コストを割り当てることができます。たとえば、AI がソファの上を歩くのではなく、その周りを歩くことを優先するようにソファにマークを付けることができます。
これは、NavCollision のフラグとエリア クラス設定を通じてメッシュごとに有効になり、Recast 生成パイプライン全体でサポートされます。
Iris:製品版レプリケーション システム
Iris は、UE 5.8 のライセンシー向けに製品版として利用可能になりました。
そのマイルストーンに加えて、安定性と日常的な使いやすさに焦点を当てたさまざまな改善を追加しました。 プロトコル不一致の処理を改善し、クライアントがサーバーと同期していない場合に、より明確なエラーが表示されるようにしました。また、新しい警告により、オブジェクトのライフサイクルに関する問題をより早期に検出できるようになります。 シリアライズ、カリング距離の処理、診断は全て改善され、RPC DoS 検出が再度有効化されました。
Iris もエンジンのより広範な方向性に近づいており、シーン グラフ統合と RemoteObjects RPC ルーティングのサポートが追加されました。
この機能について詳しくは、「Iris レプリケーション システム」を参照してください。
Mover:物理、アニメーション、およびネットワーキングの改善
Mover は、コア移動、ネットワーキング、アニメーション、ChaosMover の分野で大幅なアップデートが行われます。
コア移動モードには、Detour 群衆の NavWalking サポート、移動プラットフォームや揺れるボートなどのシナリオに対応する、より適切なベース移動、ルート モーションとモンタージュ処理の改善など、幅広い修正と改善が行われました。
レイヤー化移動は、同期を向上させるために事前にスケジュールできるようになり、ロールバックと予測サポートが拡張されました。
ネットワークも、ネットワーク予測のオプションの Iris レプリケーション サポートと、クライアントの先行予測を削減する適応型の時間拡張によって改善されます。
ChaosMover は、モーションマッチング ワークフローの軌道予測、Chaos Visual Debuggerとのより深い統合、シミュレーション制御のモンタージュ、レイヤー化移動、ゲームプレイ タグ、即時移動エフェクトに対するより広範なサポートを追加します。
これらの変更により、Mover を実験的機能ステータスから外し、移動モード、予測、再シミュレーション、アニメーション駆動型のワークフロー全体の安定性を向上させるためのアーキテクチャ作業が継続されます。
統合入力システム:共通 UI と拡張入力
UE 5.8 では、拡張入力と共通入力/UI を統合することで、入力ワークフローを効率化しました。 これにより、クロス プラットフォーム入力処理が簡素化され、重複するデータ アセットの必要性がなくなり、デバッグをより簡単に行えるようになります。
このアップデートには、入力処理全体にわたるさまざまな改善が含まれています。具体的には、より信頼性の高いイベント処理、より優れたウィジェット バインディング動作、拡張された仮想キー サポート、およびトリガー エッジ ケースに対する修正が含まれます。
強化入力 UI 用の入力デバッガや拡張性の向上などの新しいツールにより、入力駆動の体験の構築とトラブルシューティングがより簡単になります。
デベロッパーのイテレーション
インクリメンタル クック (ベータ)
インクリメンタル クックは、UE 5.8 でも引き続きベータ機能となっています。 決定性の改善により、特に DDC と構造化データのバリエーションにおいて、未変更のアセットを再クックする必要性がさらに低減されます。
インクリメンタル クックを使用すると、全体的なクック時間を短縮することで、ターゲット デバイスをより高速に反復処理できます。 クック プロセスは自動的に Zen サーバーに保存された出力に対してアセットの変更を分析するため、プロジェクトのアセットに加えられた新しい更新のみがクックされます。 ブループリントや World Partition タイルを含む、すべてのネイティブ エンジン アセットで機能します。
クック済み出力ストアとしての Zenserver
クック済み出力ストアとしての Zenserver が、デフォルトで有効になりました。 これは、デバイスでゲーム / クライアントを起動する際に、Unreal Editor のワークフローによって Zenserver ストリーミングが自動的に使用されるという意味でもあり、コンテナ ファイル (pak / iostore) のステージングは、非イテレーション ワークフロー向けに引き続き利用可能であり、サポートされます。 リモート デバイスでこれが機能するように、Zenserver はリモート リクエストに応答します。ただし、これは、認証のために事前に生成されたキーが提供された場合に限ります。
プロジェクト設定で Zen ストアの使用が無効になっている既存のプロジェクトは、Zenserver をクック済み出力ストアとして使用しません。 それを有効にするには、プロジェクト設定で設定を手動で変更する必要があります。
プロフェッショナル開発のユース ケースでは、Zenserver が頻繁に起動および停止しないように、プロジェクトは DefaultEngine.ini 構成ファイルの Zen.AutoLaunch セクションで LimitProcessLifetime=false を設定する必要があります。 これは、Zenserver が自動化 / ビルド プロセスに干渉しない方法で実行され続けるようにするために、自動化 / ビルド プロセスからの考慮が必要です。
AllowRemoteNetworkService 構成キーは RemoteNetworkService に名前が変更され、true / false は受け入れず、代わりに次の値を使用します。
[None (なし)] は、ローカルの UE 起動 Zenserver へのリモート リクエストを許可します。
[Unsecured (保護なし)] は、UE が生成したキーと一致する認証キーがヘッダーに含まれている場合、ローカルの UE 起動 Zenserver へのリモート リクエストを受け入れます。
GeneratedStaticKey がデフォルト値です。
このトピックについて詳しくは、「クック済み出力ストアとしての Zenserver」および「Zenserver ストリーミング」を参照してください。
Horde - パフォーマンス レポート (実験的機能)
Horde 分析ツールの改善は、UE 5.8 で実験的機能として引き続き行われており、ジョブ ステップ (CPU、メモリ使用量) およびジョブ ヘルス監視機能のダッシュボード UX が改善されました。
Horde には、自動パフォーマンス テスト フレームワーク (APT) とパフォーマンス レポート ツール (csvprofilers) から出力されるランタイム トレンドを表示する新しいビューも導入され、GPU/CPU 時間、ピーク メモリ使用量、ヒッチ レポートなどの主要なメトリクスをハイライト表示して、回帰を特定できるようにしました。 これは現在、ユーザーが独自のデータベース ストア モデルを持つことに依存しています。
オーディオ
オーディオ インサイト (実際の制作に使用できる)
Audio Insights は、UE 5.8 で新機能と改善が追加され、数多くの安定性、UX、スタンドアロン アプリの改善とともに、ラウドネス メータリング、シグナル フロー ビジュアライゼーション、ライブ イベント モニタリング、データ プロットにわたる診断機能が拡張されました。
ラウドネス メータリング:専用のラウドネス メーターが、瞬間的ラウドネス、短時間ラウドネス、統合ラウドネスの値に加えて、ラウドネス範囲と true ピーク値、ターゲット最大値、クリッピング インジケータを追跡します。これらはエンジンで処理され、エディタとスタンドアロン アプリの両方にストリーミングされます。
信号フロー ビジュアライザー:瞬時オーディオ信号グラフをソースからサブミックスを経て出力デバイスまでトレースし、各段階のミキシング値を表示して、減衰やルーティングの問題を見つける新しいタブ。 オフラインのフォレンジック分析用にキャッシュされたデータも表示します。
時系列キャッシュ コントロール:表示再生ヘッドを動的に制御し、複数のデータのダッシュボード間で単一のタイムスタンプのデータ表示を同期します。
コントロール バスとモジュレーションの可視性:コントロール バス タブに、個々のバスに加えてコントロール バス ミックスがソースとして表示されるようになりました。モジュレーション タブでは、ノイズを低減するため、アクティブなコントロール バス カラムのみが表示されるようにフィルタリングされます。
ライブ モニタリング:オーディオ インサイトは、トレース ファイルを保存せずにトレース データをリアルタイムで表示できるようになり、長時間のモニタリング セッション中のディスク容量の懸念が解消されます。 エディタ版とスタンドアロン版の両方 (Unreal Insights 経由) がサポートされています。
イベント ログ:新しいドッキング可能なイベント タブは、サウンドの開始、停止、およびその他のオーディオ イベントのリアルタイムでスクロール可能な時系列ログを提供します。 イベントはテキストでフィルタリング可能で、他のビジュアライゼーションと同期するために時刻を選択でき、ダブルクリックすると、[Sounds (サウンド)] タブの対応するインスタンスに直接移動できます。
プロット:専用の [Plots (プロット)] タブにより、レンダリングの改善、トレースの一時停止間の色の連続性の修正、スタンドアロンでの表示アーティファクトの修正とともに、サウンドごとのパラメータ プロットが統合されます。
スタンドアロンとキャッシュの改善:データ キャッシュ マネージャーがスタンドアロン セッションで動作し、トレース データをダッシュボード キャッシュからファイルに直接保存でき、キャッシュ サイズは設定からユーザーが設定できるようになりました。
この機能について詳しくは、「Audio Insights」を参照してください。
オーディオ字幕 (ベータ)
アクセシビリティのために、音声の字幕は不可欠です。たとえば、会話システム、字幕、ボイス チャットなどで必要とされます。 プラグインを実験的機能からベータ ステータスに昇格させました。これは、安定性と機能の完成度が向上したことを反映したものです。
MetaSound グラフ内でトリガーされる全てのサウンド タイプ (ネスティングされている MetaSound 含む) で、字幕が正しく表示されるようになりました。
プラットフォームごとの字幕表示オーバーライドがサポートされ、画面レイアウトが異なるモバイルや Nintendo Switch などのプラットフォームで、さまざまなウィジェットの配置とスタイリングが可能になりました。
プレイインエディタ (PIE) を開始せずにエディタでレベル シーケンスの字幕を直接プレビューできるようになり、字幕のタイミングのイテレーションの効率が向上します。
字幕の持続時間はロケールごとにオーバーライドできるようになり、ローカライズされたアセットが存在する場合は、ロケール固有のサウンド ウェーブの持続時間を自動的に使用します。
新しい QueueSingleSubtitle ブループリントと C++ 機能は、古い QueueSingleSubtitle (現在は非推奨) に代わるものです。 コンパニオン関数 QueueSubtitlesFromAsset は、アセットに保存されている全ての字幕行を 1 回の呼び出しでキューに入れ、正しいタイミング オフセットが自動的に適用されるようにします。
サブタイトル アセットに、エディタで表示され、ランタイムでは表示されない内部メモ用のコメント フィールドを追加しました。
さまざまな UX の改善とバグ修正。
波形エディタ (ベータ)
サウンド デザイナーは、エンジンを離れることなく使用できる優れた編集ツールを必要としています。 引き続き、フェードの制御を強化し、ワークフローを改善して、外部オーディオ ツールへのラウンドトリップを減らすことで、波形エディタの改良を続けています。
フェードはトリムから分離されました。 新しいフェード変換により、それぞれに独自のフェードインとフェードアウトがある任意の数の独立したフェード領域を、TrimFade 領域とは完全に独立して波形のどこにでも配置できます。 トリムのフェードインおよびフェードアウト カーブ タイプも、ツールバーから直接設定できるようになりました。フェード ハンドルを右クリックすると、追加のカーブ形状オプションがあるコンテキスト メニューが表示されます。 フェード ハンドルをスクロールすると、カーブの傾きが調整されます。
再インポートが、エディタ ツールバーから利用できるようになりました。次の 3 つのモードがあります:再インポートしてトランスフォームを上書き (キューおよび smpl チャンクからのマーカーおよびループ領域データを含む)、既存のトランスフォームを維持して再インポート、またはまったく新しいファイルから再インポート。
新しい Launch Transformations (トランスフォームを起動) 設定を使用すると、トランスフォームがない SoundWave を開くときに、どのトランスフォームを自動的に適用するかを事前に調整できます。 これにより、標準的な編集ワークフローの繰り返しのセットアップ手順が省略されます。
トランスフォーム変更が適用されると、SoundWave の LUFS およびサンプル ピーク メタデータが自動的にアップデートされるようになりました。そのため、変換された波形が反映され、手動でリフレッシュしなくてもアセット メタデータを正確に保てるようになりました。
マーカー ナビゲーション用の追加のキーボード ショートカット:
G は、再生ヘッドを次のマーカーにスキップします
F/B で次の/前のループ マーカーを選択します。
H は再生ヘッドを最も近いゼロクロスにスナップします。
Enter キーを押すと、再生が停止し、先頭に巻き戻されます。
Shift+Space で、再生状態に影響を与えず、再生ヘッドをファイルの先頭にリセットします。
他にも、ユーザビリティ、UX、UI の改善が多数行われました。
この機能を使い始めるには、「波形エディタ クイックスタート」を参照してください。
MetaSound ノード構成 (実験的機能)
UE 5.7 で導入された MetaSound ノード構成は、UE 5.8 で拡張され、デベロッパーのボイラープレートを削減し、デザイナーの編集エクスペリエンスを向上させる新しいツールが追加されました。
動的インターフェース ノード構成:新しいビルトイン FMetaSoundDynamicInterfaceNodeConfiguration 構造体は、ノードの FClassInterface 定義に基づいて、サブインターフェース インスタンス数とバリアント タイプ選択を自動的に管理します。 デベロッパーは、サブインターフェースの数やバリアント ピン タイプを公開する一般的なケースにおいて、ノードごとのカスタム構成構造体を記述する必要がなくなりました。詳細パネルが、これらのコントロールをドロップダウンやカウント フィールドとして自動的に表示するようになりました。
ノード アップデート トランスフォーム API:ノード アップデート スクリプトを作成するための新しい、より構造的な API により、デベロッパーは、ノードのインターフェースがメジャー バージョン間で変更されたときに、ノードがどのように移行するかをきめ細かく制御できるようになります。 カスタム アップデート ロジックは、特定のメジャー バージョンに関連付けられ、マイナー バージョンとインターフェースのアップデートが適用された後に実行されるようになったため、順序を予測できます。 「新規配置ノードに対してバイクワッド フィルターのデフォルト帯域幅を 1.0 から 2.0 にアップデートし、既存コンテンツのレガシ デフォルトを維持する」という移行の例は、このパターンを示しています。
サブインターフェース レイアウト シリアライズ:MetaSound をデシリアライズする際、サブインターフェース レイアウト情報が正しく再構成されるようになり、特定のプラットフォームで発生していた頂点名のコリジョンやレイアウトの損失が解決されました。
API の安定性:FClassInterface は UE 5.8 で実験的指定を終了します。 FNodeClassMetadata::DefaultInterface が FClassInterface を直接受け入れるようになり (FVertexInterface に代わるもの)、また非推奨の入力/出力ノード作成ヘルパーが IDataTypeRegistry から削除されました。 ノード構成統合を構築するデベロッパーは今後、これを安定した公開 API サーフェスとして扱うことができます。
MetaSound テンプレート (実験的機能)
MetaSound テンプレートは、UE 5.8 の新しい実験的機能であり、オーディオ プログラマーが再利用可能なプロパティ制御のMetaSound 生成ロジックを作成できます。これにより、サウンド デザイナーはグラフに触れることなく迅速なイテレーションを行うことができます。
テンプレートは、デザイナーが公開されているプロパティのいずれかを変更するたびに、MetaSound グラフ、そのインターフェース、入力をプロシージャルに構成および再構築できる、C++ で定義された UStruct です。
テンプレートはデザイナーに対して表示されるものを、テンプレート作成者が公開することを選択したプロパティのみに制限できます。基になるグラフ、メンバー リスト、ページ オプションなどは、オプションで完全に非表示にできます。
プログラマーは、デザイナーに制御させたい少数のパラメータを定義します。具体的には、サウンドのリスト、ピッチ範囲、フィルター カットオフなどです。そして、テンプレートのコードは、指定されたオプションを有効な MetaSound グラフに構成する処理を行います。
[MetaSound Editor (MetaSound エディタ)] から、デザイナーは新しい [Template toolbar (テンプレート ツールバー] ドロップダウン)からテンプレートを選択し、[MetaSound Details (MetaSound の詳細)] パネルでそのプロパティを編集します。
(最後に生成されたグラフの状態を保持して) テンプレート化された MetaSound を標準の MetaSound に戻すこともサポートされています。
テンプレートはまた、Unreal の MVVM フレームワークに基づいて構築された、完全にカスタムの UMG ウィジェット タブを提供することもでき、デフォルトの MetaSound パネルの代わりに、またはその隣に、スライダー、プレビュー、配列エディタなどの専用インターフェースを提供します。
ランダマイザー テンプレートは、参照実装として UE 5.8 で提供されます。 デザイナーが指定したサウンド ウェーブのリストからランダムに選択して、設定可能なセミトーン範囲内でピッチ オフセットを適用し、ワンショット再生モードとループ再生モードの両方をサポートします。 UE 5.8 ではデフォルトで非表示になっていますが、テンプレート制作者向けの動作コード例として機能します。
フォーマット/チャンネル非依存タイプ (CAT) (実験的機能)
フル パイプライン統合:CAT 出力は MetaSoundSource を介して配線されるようになりました。つまり、MetaSound グラフは CAT シグナルを生成し、それをオーディオ エンジンに直接配信できます。 MetaSoundSource 入力に設定されているサウンド ウェーブを見て、チャンネル形式を自動的に決定できます。
データ定義オーディオ形式:カスタム チャンネル構成をファーストクラス オーディオ形式として宣言し、グラフ内で直接使用できるようになりました。 これによりチームは、エンジン コードをフォークすることなく、非標準または独自のスピーカー レイアウトを定義して操作できます。
アンビソニックスとトランスコーディング:1 次アンビソニックスは、CAT 形式にビルトインされるようになりました。 個別形式とアンビソニックス形式間のトランスコーディングはグラフ境界で自動的に処理されるため、空間オーディオ ワークフローで手動変換ノードは不要になりました。
実験用の新しいノード
Wave Player 2.0:実験的なサウンド アセット コンテナを利用し、CAT 基盤上に再実装された次世代のウェーブ プレイヤー。
CAT ミキサー:グラフ内でマルチチャンネル CAT シグナルを結合するための専用ミキシング ノード
グレイン プレイヤー:CAT パイプライン上に構築されたグレイン合成再生ノード
Multiply:Multiply ノードに、CAT 対応の新しいバリアントが追加されます。
CAT × 浮動小数
CAT × CAT
マルチチャンネル シグナルは、最初にモノラルに変換することなく、スケーリングおよびモジュレートできるようになり、マルチチャンネル バスでチャンネルごとのゲイン、リング モジュレーション、エンベロープ シェーピングを直接有効にできます。
ラダー フィルター: 標準の AudioBuffer シグナルと CAT シグナルの両方を処理するため、ラダー フィルターをポートしました。 既存のモノ フィルター パスは維持されます。CAT パスは、チャンネルごとの独立したフィルタリングでマルチチャンネル オーディオを処理します。 この変換は、追加の MetaSound DSP ノードを CAT にポートするための参照実装としても機能します。
シーケンサーの音声
サウンド デザイナーは、シネマティクス、ゲームプレイ シーケンス、レンダリングにシーケンサーを使用する際、オーディオ ミキシング コントロール、期待に沿わないデフォルト動作、エクスポートされたレンダリングでのオーディオ品質の問題に関して頻繁に問題に直面します。 UE 5.8 では、3 つの分野にわたる大幅な改善を実装します。
コントロール バスとコントロール バス ミックス トラック
2 つの新しい シーケンサー トラックにより、オーディオ モジュレーションを時系列に直接追加できるようになりました。
コントロール バス トラック を使用すると、ボリューム、ピッチ、フィルター カットオフ、または任意のカスタム モジュレーション パラメータなど、あらゆるオーディオ モジュレーション コントロール バスをシーケンス内で時間経過とともにキーフレーム設定してアニメートできます。
コントロール バス ミックス トラックによって、シーケンス内の特定のポイントで、事前定義されたコントロール バス ミックス (一緒に適用されるモジュレーション値のセット) を有効化および無効化できるため、シネマティック イベントに関連付けられた正確かつ反復可能なオーディオ ミックス ステートが可能になります。
再生とセクションの動作の改善
オーディオ セクションのループ動作を再定義し、典型的なサウンド デザイナーの意図にさらに近づけました。ユーザーは、セクションの終了時に KeepState や RestoreState の概念を再利用するのではなく、サウンドが完全に再生されるかどうかを定義します。また、ゲーム フレーム境界でのセクションとサンプル境界でのアセット ループを区別するために、「ループ」は「反復」に名称変更されました。
オーディオ セクションは、キーフレームが境界外に追加されたときに自動展開されなくなりました。
MetaSound 統合により、MetaSound ソースの再生の信頼性が向上します。
再生ヘッドのコンテキストがジャンプした際に不要な停止と再開を回避できるよう、音声評価システムが改善され、よりスムーズなスクラブと一時停止/再開の動作を実現しました。
ムービー レンダリング キューの音声の向上
MRQ は、オーディオ エクスポートのサブミックス選択を拡張し、デフォルト出力に制限されるのではなく、記録するサブミックスを直接制御できるようになりました。
以前カメラ カット境界で発生していた音声のポップ、ギャップ、繰り返しを修正しました。オーディオ コンポーネントは、停止してから再開されるのではなく、カット間で一時停止して再開されるようになり、レンダリングされた出力のサンプル レベルの不連続性が排除されます。
WASAPI
Unreal Engine 5.8 では、Windows のデフォルトのオーディオ バックエンドを XAudio2 から WASAPI に切り替えました。 新しい AudioMixerWasapi モジュールが自動的に選択されるようになりました。XAudio2 は、オプトイン フォールバックとして引き続き利用可能です。 同じバックエンドは Xbox でも使用されています。 デベロッパー側で変更は必要ありません。 全てのコンテンツは同じように動作するはずです — 変更されたのは、オペレーティング システムと通信するレイヤーのみです。
切り替えた理由:
将来への備え。 レガシ API の代わりに、サポートされ、活発にメンテナンスされている Windows API を利用したビルド。
レイテンシー機能の向上。 下位レベル API への直接アクセスにより、オーディオ ミキサーはバッファ スケジュールをより詳細に制御できるようになります。
より堅牢なデバイス処理。 WASAPI バックエンドには、現在、完全なデバイス交換サポートが含まれています:ヘッドホンの抜き差し、Windows のデフォルト デバイスの切り替え、またはオーディオ ドライバーによるデバイス変更の強制は、エンジンによって適切に処理されます。
品質と信頼性の向上。 5.8 サイクル中に、オーディオ チームは、制作で発見されたさまざまな現実世界のデバイス変更、形式ネゴシエーション、シャットダウン エッジ ケースに対して、バックエンドをハードニングしました。 その結果、より安定した Windows オーディオ パスがすぐに利用できるようになります。
知っておくべきこと:
これはモジュールであり、プラグインではありません。 WASAPI は、エンジン内の AudioMixerWasapi モジュールとして提供されます。 有効にしたり、インストールしたりするものは何もありません。
デバイスの交換はサポートされています。 ヘッドセットの接続/切断、デフォルト デバイスの変更、サンプル レートの変更は全て、バックエンドによって処理されます。
オプトアウト (XAudio2 にフォールバック)。 プロジェクト固有の問題が発生した場合、プロジェクトの
Config/Windows/WindowsEngine.iniに以下を追加することで、以前のバックエンドに戻すことができます。Config[Audio] AudioMixerModuleName=AudioMixerXAudio2発生した問題は報告することをお勧めします。そうすることで、XAudio2 が最終的に削除される前に問題に対処できます。
プラットフォーム
モバイル レンダラ
Unreal Engine 5.8 では、モバイル レンダラを強化し、サポート対象デバイスでより高品質なレンダリング機能へのアクセスを拡大します。
UE 5.8 で導入される要素:
モバイル プラットフォーム全体におけるデフォルト パスとしてのマルチパス遅延レンダリング (フォワード レンダリングはオプトインとして引き続き利用可能)。
GBuffer と深度データのより広範な使用。
SSAO、 SSR、 ディファード デカール、コンタクト シャドウ、およびより高品質の水レンダリングのモバイル サポート。
UE 5.8 では、また、半精度 (FP16) シェーダーの使用をターゲット マテリアルとグローバル シェーダー パスに導入し、パフォーマンスを向上させながらビジュアル品質を維持します。
これらの変更を組み合わせることで、ハイエンド モバイル ハードウェアでのビジュアル忠実度とスケーラビリティが向上し、パフォーマンスが維持され、チームが品質レベルを調整できる余地が大きくなります。
Android プラットフォーム サポート
Unreal Engine 5.8 では、入力サポートとイテレーション速度に焦点を当てたターゲット Android プラットフォームの改善を提供します。
UE 5.8 で導入される要素:
コントローラー マッピング サポートの改善。
ターンキーを使用したデベロッパー ワークステーションのよりシンプルな自動セットアップ。
これらの変更により、Android プロジェクトを構築およびテストするチームのデベロッパーの生産性とプラットフォームの堅牢性が向上します。
プレビュー プラットフォーム
Unreal Engine 5.8 では、プレビュー プラットフォーム機能のビジュアルの忠実度を向上させ、エディタに表示されるビジュアルがターゲット ハードウェアの外観と動作によりマッチするようにしました。
チームは視覚的な問題をより早く特定し、イテレーションのためにデバイスに切り替えるコストを削減できます。
この機能について詳しくは、「Using Preview Platform」を参照してください。
iOS および iPadOS 向けキーボードとマウスのサポート
Unreal Engine 5.8 では、iOS および iPadOS でキーボードとマウスを完全にサポートし、クリエイターとプレイヤーが標準的なデスクトップ入力デバイスを使用してプロジェクトを操作できるようにします。 これにより、iPad および iOS での入力動作が macOS と同等のレベルに近づき、キーボードとマウスが使用される開発、テスト、ゲームプレイのシナリオにおいて使いやすさが向上します。
iOS および iPadOS で実行されているプロジェクトは、適切な場合、一貫したデスクトップのような操作性で操作できるようになり、Apple エコシステムをターゲットとする際のプラットフォーム固有の問題が軽減されます。
iOS および Android 用ジェスチャ イベント (実験的機能)
Unreal Engine 5.8 では、iOS および Android のネイティブ ジェスチャ認識機能にブリッジし、そのイベントをエンジンに直接公開する実験的なジェスチャ イベント システムを導入します。 ピンチ、スワイプ、回転、パンは、ネイティブ アプリが実現するのと同じ精度、タイミング、開始/変更/終了状態のトランジションで認識され、プラットフォームごとのタッチ処理コードを削除し、モバイル全体でタッチ ベースのインタラクションを一貫して駆動する方法をデベロッパーに提供します。
iOS アプリケーション拡張機能
Unreal Engine 5.8 では、新しい .uappex 制御ファイルを通じて iOS アプリ拡張機能の最高クラスのサポートをを追加します。 プロジェクト制作者は、UE プロジェクトとともに通知サービスやバックグラウンド アセットなどの拡張機能を宣言できるようになり、UnrealBuildTool が対応する Xcode アプリ拡張機能ターゲットを自動的に生成します — 手動による生成後の Xcode 編集は不要です。
Unreal Engine Remote
Unreal Engine Remote は、デベロッパーが物理デバイスにビルドやデプロイを行わずにモバイル入力をプレビューおよびテストできるコンパニオン アプリです。 5.8 では、アプリを Android に対応させ (以前は iOS のみ)、ストリーミング バックエンドを Pixel Streaming 2 に切り替えたため、UE5 からのライブ プレイインエディタ セッションや Unreal Editor for Fortnite からのモバイル プレビュー セッションをモバイル デバイスにストリーミングできるようになりました。これにより、デバイスでのゲーム内体験がミラーリングされ、タッチ入力とジェスチャ入力がリアルタイムで報告されるようになりました。
これにより、チームは次のことが可能になります。
プレビュー セッションからモバイル入力動作を直接検証します。
完全なデバイス ビルドなしでタッチ コントロールをイテレートします。
iOS と Android の両方で、同じアプリを使用して UE5 ワークフローと UEFN ワークフローの両方をテストします。
UE Remote はモバイル開発ループを短縮し、デベロッパーはデバイスへのデプロイメントを繰り返すコストをかけずに、モバイル ハードウェアでの入力の感触を迅速かつ正確に把握できます。
この機能について詳しくは、「Using Unreal Engine Remote with Remote Session」を参照してください。
Steam フレーム サポート (実験的機能)
Valve と共同で、Valve の次世代 XR プラットフォームの実験的なサポートを実装しました:https://store.steampowered.com/sale/steamframe
bPackageForOpenXRImmersive は、VR テンプレートではデフォルトで true に設定される新しい設定です。
ステレオ レイヤー アンダーレイ
UE 5.8 では、OpenXR ステレオ レイヤーをメイン シーンの背後に描画できるようになりました。 これにより、以前はエンジンの変更やベンダー固有のプラグインが必須だった XR エフェクトを使用できます。
UE 5.8 以前は、Unreal Engine の OpenXR サポートは、常にプロジェクション レイヤー (レンダリングされた UE ワールド) の上にステレオ レイヤーを描画し、面固定レイヤーは常にワールド固定レイヤーの上に配置されていました。 OpenXR 仕様自体は、そのようなルールなしにレイヤーの順序付きリストを受け入れるだけであるにもかかわらず、この固定された順序により真の「アンダーレイ」(環境の背後に表示されるレイヤー) をすぐに使用できませんでした。
この変更により、固定された順序がレイヤー優先度によって調整される順序に置き換えられ、OpenXR の動作に一致するようになります。 2 つの新しい設定が追加されます:
xr.OpenXRProjectionLayerPriority(デフォルト = 0)。 投影レイヤーの優先度。 優先度が低いステレオ レイヤーほど、その背後に描画され、優先度が高いものほど、これまでと同様に前面に描画されます。xr.OpenXRSortFaceLockedLayersAboveOtherLayers(デフォルトでオフ) — オンにすると、面固定レイヤーは、優先度に関係なく、常に他の全てのレイヤーの上に描画されます。 これは以前の動作に一致します。
UE 5.8 より前の順序に戻すには、xr.OpenXRSortFaceLockedLayersAboveOtherLayers=1 を設定し、xr.OpenXRProjectionLayerPriority をプロジェクト内の全てのステレオ レイヤーの優先度よりも低い値に設定します (例:-2147483648、32 ビット整数の最小値)。 既存のプロジェクトは変更なしで動作し続けます。
詳しくは、GitHub 変更リストを参照してください (接続済みアカウントが必要です):https://github.com/EpicGames/UnrealEngine/commit/83641b6ac8b243d9858f54bafe1937f0accb4b6f
この機能について詳しくは、「OpenXR ステレオ レイヤー」を参照してください。
PICO コントローラー OpenXR プラグイン
PICO コントローラー プラグインは、PICO の OpenXR インタラクション プロフィール XR_BD_controller_interaction と XR_BD_ultra_controller_interaction のサポートを追加します。
このプラグインは VR テンプレートでデフォルトで有効になっており、PICO コントローラーのバインディングは入力マッピング コンテキスト用に構成されています。
iOS シェーダー モデル 6 (実験的機能)
Unreal Engine 5.8 では、iOS で実験的な Shader Model 6 (SM6) のサポートを追加し、Apple の Metal シェーダー コンバータ ライブラリを統合して、Apple Silicon で高度な GPU 機能を実装します。
UE 5.8 で導入される要素:
既存の Metal パスに加えて、専用の iOS SM6 シェーダー プラットフォーム バリアント
より効率的な GPU コンピューティング アルゴリズムのためのウェーブ組み込み関数 (SIMD グループ操作)
Apple Silicon で ALU スループットを向上させるためのネイティブ 16 ビット (FP16) シェーダー タイプ
A15 以降の Apple Silicon をサポートし、実験的機能として提供されます。より幅広いデバイスをカバーするために既存の Metal レンダリング パスも維持されます。 改善されたディファード テクニックや高品質のコンピューティング パスなど、SM6 で制御されるレンダリング機能の検証が進行中であり、今後のリリースで提供される予定です。
コンテンツ パイプライン
UI の再設計 - 交換インポート ダイアログ UI
Interchange フレームワークは高度にカスタマイズ可能であるため、Interchange を構成し、データをインポートするためのウィンドウ ダイアログには非常に多くのオプションがあります。
今後のリリースの目標は、UI を簡素化することです。 UE 5.8 では、アセット タイプ変換に関連する全てのオプションを再グループ化して名前を変更し、より分かりやすくました。また、マテリアル インポート オプションでは、マテリアルの作成と既存のマテリアルの使用のどちらを行うかをより明確に制御できるようになりました。
この機能について詳しくは、「Interchange フレームワーク」を参照してください。
FBX インポート パフォーマンス
glTF と USD の使用が増加していますが、まだ FBX は Unreal Engine で 3D モデルをインポートするための主要なデータ形式となっています。 そのため、この形式でのユーザーエクスペリエンスを向上させるために、代替ライブラリを導入しました。
UE 5.8 では、安定化作業を実施し、uFBX ライブラリ (実験的機能) をサポートしました。これにより、インポート時間が大幅に短縮されます。特に大きいメッシュを含む重い .fbxファイルで効果を発揮します。 マルチコア CPU を使用しているユーザーは、多数のメッシュを含むファイルでも改善を実感できます。
USD に合わせて、Unreal は、ファイルをレベルにインポートする際、.fbxからノードの可視性を保持し、それを [Hidden in Game (ゲーム内で非表示)] プロパティに適用するようになります。
USD アセットの事前生成
USD シーンは、複数の参照 USD ファイルから再帰的に構成されることがよくあります。 現在の USD Interchange インポート ワークフローでは、これらのコンポジションを個別に処理するため、インポートが平坦化され、アセット データが不必要に複製します。
新しい USD Pregen フレームワークは、参照される USD アセットとそれに対応する Unreal Engine 表現の間の関係を検出、追跡、永続化するための堅牢なシステムを導入します。
この機能は UE 5.8 では実験的です。 主な利点は次のとおりです。
アセットの複製の削減
コンポジションとアセットを認識する処理
きめ細かな処理
構成可能なフレームワーク
Interchange による USD インポート
USD は、3D 業界全体で採用が拡大している汎用性の高いシーン記述ファイル形式です。
USD は、5.5 で、Interchange フレームワークでサポートされているファイル形式のリストに追加済みです。 コンテンツ クリエイターは、FBX などの他の形式ですでに利用できる Interchange 機能と同様に、USD ファイルのアセット インポートでカスタム処理ステップを追加してインポート プロセスをより細かく制御できるようになりました。
UE 5.8 では、Interchange を介した USD のサポートは、アセットのインポートでは実際の制作に使用できるものであり、レベルのインポートでは実験的であると見なされています。 次のもののサポートが追加されています。
スキーマ ハンドラの順序付け。USD ファイルのロード時に使用されるスキーマ ハンドラの順序付きリストが公開され、編集可能になりました。
カスタム スキーマ トランスレータのサポート。また、USD トランスレータは、コードで拡張してカスタム スキーマをサポートできます。
新しいレンダリング コンテキストを追加するメカニズム。
Nanite ビルド設定スキーマ。
全てのグルーム属性。
統合 (レガシ USD インポートとのパリティ)。
Chaos クロス。
エディタ
エディタ ギズモ システム
Unreal Engine 5.8 では、エディタ全体でより一貫性があり柔軟なインタラクション エクスペリエンスを提供するために設計された、新しいエディタ ギズモ システムを導入します。 インタラクティブ ツール フレームワークの上に構築された新しいシステムは、複数のレガシ ギズモ実装を統合し、ビューポートとツール全体で使用される単一のフレームワークにまとめます。 この統合により、エディタ内でツールを構築するデベロッパーにとって、信頼性、インタラクションの一貫性、拡張性が向上します。
再設計されたギズモには、Maya や Blender などのツールからのアーティストやレベル デザイナーに馴染みのあるワークフローにインスパイアされた、さまざまなビジュアルとユーザビリティの改善も含まれています。 改善されたヒット ターゲット、より明確なビジュアル フィードバック、カスタマイズ可能なインタラクション プリセット、強化された精度制御により、新しいシステムはアクタとアセットを操作するためのより高速かつ予測可能なワークフローを提供します。
この機能について詳しくは、「アクタのトランスフォーム」を参照してください。
ビジュアルとインタラクションの改善
ギズモ デザインの洗練:ヒット ターゲットの改善により、より薄いビジュアル プロフィールを実現し、より正確な選択と操作を可能にします。
ホバーとインタラクション フィードバックの改善:軸と平面にカーソルを乗せるたとき、またはインタラクトしたときに明確にハイライト表示されるようになります。
平面ハンドルの位置調整:平面移動軸が中心からさらに離れた位置に配置され、アクセシビリティが向上し、誤った選択が減少します。
拡張されたスクリーン空間移動ハンドル:中心移動正方形がより大きくなるため、スクリーン空間での移動がより容易になります。
軸表示の改善:軸はインタラクション中に一時的に非表示になり、視認性が向上します。
スケーリング動作の改善:ギズモが全ての視点角度からより確実に動作するようになり、スケーリング インタラクションがより予測可能になりました。
精度と移動のフィードバック
数値デルタ オーバーレイ:リアルタイム オーバーレイは、インタラクション中に移動、回転、またはスケールのデルタを表示します。
デルタ ライン インジケータ:ビジュアル ラインは、オブジェクトが元の位置からどれだけ移動したかを示します。
回転デルタ ライン:回転インタラクションは、Blender に似た視覚的なデルタ ラインを表示し、遠距離からの回転時の精度を向上させます。
スナップとインタラクションの追加機能
スナップ状態インジケータ:ギズモの中心アイコンが、スナップが有効になっている状態に視覚的に表示するようになりました。
一時的なスナップ コントロール:モディファイア キーを押しながら、位置、回転、スケール、またはサーフェス スナップをすばやく切り替えます。
ビューポート境界インタラクション:カーソルがビューポートの境界外に移動しても、アクタの操作を続行します。
カスタマイズとワークフロー プリセット
インタラクション プリセット:以下に示す複数のインタラクション スタイルから選択できます。
デフォルト Unreal Engine インタラクション
クラシック Unreal インタラクション
Maya スタイル インタラクション
カスタマイズ可能なギズモ動作:チームが希望するワークフローに基づいてインタラクションを構成できる柔軟性が向上しました。
精度制御
精度モード:微調整のために一時的にトランスフォームを遅くします。
ナッジ モード:平行移動、回転、またはスケールを段階的に調整して、編集を制御します。
プレビュー シーンの改善
Unreal Engine 5.8 では、プレビュー シーン システムを拡張し、アセット エディタに新しいカスタマイズとワークフローの改善を追加しました。 これらのアップデートにより、ユーザーはプレビュー中にアセットの表示をより詳細に制御できるようになり、マテリアル、メッシュ、およびライティング条件をエディタ内で直接評価しやすくなります。
カスタマイズ機能の強化
カスタム フロア メッシュのサポート:プレビュー シーンでカスタム フロア メッシュを構成して、アセットが使用される環境によりマッチさせることができます。
カスタム フロア マテリアル:アセットのレビュー時にコンテキストを改善するために、プレビュー フロアにカスタム マテリアルを適用します。
ワークフローの改善
レイアウトの改善:プロフィール管理がタブの上部に移動され、アクセスしやすくなりました。
プレビュー プロフィール サイクリング:キーボード ショートカットを使用して、高度なプレビュー シーン プロフィールをすばやく切り替えます。これにより、ユーザーはアセットを評価する際に、ライティングと環境の設定をすばやく切り替えることができます。
マテリアル プレビュー エディタの改善
Unreal Engine 5.8 では、より迅速なルック開発とより柔軟なプレビュー ワークフローをサポートするために、マテリアル プレビュー エディタにいくつかの改善を導入しました。 これらのアップデートにより、使い慣れたプレビュー メッシュを使用してマテリアルを評価し、プレビュー環境内でアセットを直接テストすることがより容易になります。
プレビューの追加機能
シェーダー ボール プレビュー メッシュ:シェーダー ボールがネイティブのプレビュー メッシュ オプションとして利用可能になり、マテリアルとライティングの応答を評価するための使い慣れたサーフェスが提供されます。
ワークフローの改善
ドラッグ&ドロップ アセット サポート:コンテンツ ブラウザからアセットをプレビュー ウィンドウに直接ドラッグ&ドロップできるようになりました。これにより、メッシュやマテリアルをより迅速にテストできます。
カスタム メッシュのマテリアル スロット:カスタム プレビュー メッシュが選択されている場合、マテリアルを特定のスロットに適用できるようになりました。
ショートカット マネージャー
Unreal Engine 5.8 では、刷新されたショートカット マネージャー エクスペリエンスを導入し、エディタのキーバインディングをより迅速かつ簡単に発見、管理、カスタマイズできるようになります。 アップデートされたインターフェースは、改善された検索機能、コマンドのより明確なプレゼンテーション、およびショートカット構成を管理するための効率化されたツールを提供します。
アップデートされたショートカット マネージャーは、Unreal Engine の現在のエディタ スタイルに合わせた最新の UI と、マッピングされたコマンドやマッピングされていないコマンドをすばやく見つけるための強化された検索ツールを備えており、デベロッパーやアーティストがワークフローをより効率的に調整できるようになります。
インターフェースとユーザビリティの改善
ビジュアル UI のリフレッシュ:最新の Unreal Editor のダーク テーマに合うようにスタイルが調整されたインターフェース。
専用ウィンドウ:キーボード ショートカットに専用のウィンドウが追加され、よりコンパクトなレイアウトになりました。
よりすっきりとしたレイアウト:インライン ツールチップ テキストを削減し、可読性を向上させ、コマンドの説明をより明確にしました。
ショートカットに特化した検索:検索がキーボード ショートカットに特化されるようになりました。これにより、アクションやコマンド名でコマンドを簡単に検索でき、無関係な結果が表示されなくなります。
強化された検索と発見
ショートカット キー検索:特定のキーの組み合わせにマップされているコマンドをすばやく検索できます (例:Ctrl + S を検索すると、そのショートカットにバインドされている全てのコマンドが表示されます)。
キーバインド検索ボタン:キーの組み合わせを押して直接検索し、マップされている全てのコマンドを表示するための専用オプションです。
高度な検索構文:結果をフィルターして、バインドされていないコマンドなどの特定の状態を特定し、ワークフローをカスタマイズする機会を特定するのに役立ちます。
構成とワークフロー
インポートとエクスポートの改善:ショートカット構成をマシン間またはチーム間で共有および転送するための効率化されたツールです。
キーバインディング管理の効率の向上:コマンドとバインディングの発見可能性を向上させ、ユーザーがエディタの体験をすばやくカスタマイズできるようにします。
エディタの環境設定の改善
Unreal Engine 5.8 では、一貫性、発見可能性、使いやすさを向上させるために、エディタの環境設定システムにアップデートを導入します。 エディタの環境設定、プロジェクト設定、プラグイン設定は、より統一されたビジュアル スタイルとレイアウトを共有するようになり、エディタ全体での構成の操作性が向上します。
検索、キーボード ショートカット、リセット機能がさらに改善されたことで、必要な設定をより迅速に見つけて管理できるようになりました。
インターフェースとナビゲーションの改善
統一された設定のスタイル:エディタの環境設定、プロジェクト設定、およびプラグイン設定が、一貫したビジュアル デザインとレイアウトを共有するようになりました。
デフォルトの全ての設定ビュー:設定が、デフォルトで [All Settings (全ての設定)] カテゴリが選択された状態で開くようになりました。これにより、設定を見つけやすくなります。
カテゴリに絞った検索:ユーザーは特定のカテゴリを選択することで、そのカテゴリ内で検索できます。これにより、結果を絞り込みやすくなります。
検索と発見の追加機能
検索での CVar の可視性:設定がコンソール変数 (CVar) によって制御されるか、影響を受ける場合を簡単に特定できます。
ワークフローの改善
キーボード ショートカット アクセス:専用のホットキーを使用して、エディタの環境設定、プロジェクト設定、キーボード ショートカットをすばやく開きます。
デフォルトにリセット:ほとんどの設定をデフォルト値に簡単にリセットできるようになり、実験や構成変更からの復元が簡単になります。
正投影ビューポートの改善
Unreal Engine 5.8 では、上面ビュー、側面ビュー、前面ビューでの作業時の明瞭さと使いやすさを向上させることを目的とした、正投影ビューポートに対するいくつかの改善を導入します。 これらのアップデートにより、視覚的なノイズが低減され、インタラクション中に重要な編集ツールが明確に表示されるようになります。
この機能について詳しくは、「正投影カメラ」を参照してください。
視認性の改善
改善されたライティング ビュー レンダリング:正投影ビューでの大気フォグによる干渉を低減し、よりクリアで予測可能なライティング結果を実現します。
グリッド密度の低減:正投影グリッドはスケーリングされ、視覚的なノイズやごちゃつきを低減し、シーンの可読性を向上させました。
インタラクションの改善
オブジェクト上へのギズモ レンダリング:トランスフォーム ギズモが選択したオブジェクトの上にレンダリングされるようになりました。これにより、編集中にギズモが常に表示され、インタラクトしやすくなります。
コンテンツ ブラウザの右クリック メニュー
Unreal Engine 5.8 では、アセット作成ワークフローの手間を軽減することを目的とした、コンテンツ ブラウザ右クリック メニューの簡素化が含まれています。 この取り組みは、メニューの高さを減らし、アセット タイプをより論理的に整理し、一般的に使用されるアセットを見つけやすくすることに焦点を当てており、その結果、右クリック メニューのエクスペリエンスがよりクリーンで効率的になります。
メニュー構成の改善
トップレベル カテゴリの削減:右クリック メニューのカテゴリ数を減らして、高さを最小限に抑え、メニューをスキャンしやすくしました。
新しいオーディオとアニメーションのサブカテゴリ:オーディオとアニメーション専用のサブカテゴリを追加し、アセット カテゴリをより適切に整理し、リストが長くなりすぎるのを避けるようにしました。
新しいデータ セクション:データ指向のアセットをより簡単に特定し、アクセスできるようにするため、データ カテゴリを導入しました。
アセットの発見の改善
共通セクションのマテリアル インスタンス:マテリアル インスタンスを共通セクションに追加しました。これにより、最も頻繁に使用されるアセット カテゴリにすばやくアクセスできるようになります。
詳細パネルのお気に入り
Unreal Engine 5.8 では、詳細パネルのお気に入り システムを拡張して、重要なプロパティをより迅速かつ簡単に操作および追跡できるようにします。 これらのアップデートにより、ユーザーは一般的に使用される設定をすばやく見つけ、複雑なアクタやアセット内で変更されたプロパティを特定できます。
お気に入りの追加機能
お気に入り全体カテゴリ:ユーザーはプロパティ カテゴリ全体をお気に入りに追加できるようになりました。これにより、個々のプロパティをお気に入りに追加することなく、一般的に使用される設定のグループにアクセスしやすくなります。
ビジュアル フィードバックの改善
カテゴリ セクション フィルター バー:セクション バーで、オプションとして、詳細パネルをお気に入りカテゴリまたは変更されたプロパティにフィルターできるようになりました。これらは、詳細パネルの設定ドロップダウンで有効にできます。
ワークフローの利点
プロパティ ナビゲーションの効率向上:この改善により、頻繁に使用される設定を見つけやすくなり、詳細パネル内でどのプロパティが変更されたかをすばやく特定できます。
MCP サーバー (実験的機能)
Unreal Engine 5.8 では、Unreal Editor 向けに新しい実験的な MCP (モデル コンテキスト プロトコル) プラグインを提供します。 このプラグインを使用すると、エージェント AI システムを Unreal Editor に接続できます。 これにより、これらのシステムはエンジンとプロジェクトを理解できるとともに、ユーザーがアセットやシステムを構築するのを支援します。
この機能について詳しくは、「Unreal MCP」を参照してください。
サンドボックス
サンドボックスは、メイン プロジェクトに影響を与えることなく実験できる、分離されたワークスペースを提供します。 サンドボックスを開き、自由に作成および編集し、保持したいものだけを永続化します。
何かを試したいという理由だけで、サイド ブランチを立ち上げたり、アセットを WIP フォルダにコピーしたり、リビジョン コントロールを汚染する心配をしたりする必要がなくなります。
サンドボックスを作成し、プロジェクト コンテンツに影響を与えることなくその中で作業できます。専用ブラウザからサンドボックスを参照し、切り替え、変更を確認できます。
プロジェクトで残したい変更のみを保存できます
サンドボックスをエクスポートしてチームメイトと共有したり、サンドボックスをインポートしてチームメイトが中断したところから再開したりできます。
プロダクション レンダリング パイプライン
ムービー レンダリング グラフ (実際の制作に使用できる)
ムービー レンダリング グラフは、UE 5.8 リリース向けに実際の制作に使用できるステータスになります。
グラフ ベースの設定は、レガシ プリセットにある全ての主要な機能をサポートするようになりました。 ユーザーはプリセット ベースの構成を引き続き使用できますが、今後は新機能はグラフのみになります。
この機能の使用方法について詳しくは、「ムービー レンダリング グラフ」を参照してください。
ライト モディファイアー
ポスト コンポジット ワークフローを念頭に置いて、ライト モディファイアーを使用すると、アーティストはムービー レンダリング グラフでレンダリング レイヤーごとにライト アクタのプロパティ値を設定およびオーバーライドできます。 同じレベルとレベル シーケンスを使用して、アーティストは個々のライトまたはライトのグループを分離し、任意のタイプのライトの強度、色、および/または任意のカスタム プロパティに異なる値を使用してショットをレンダリングできます。
コレクション ノードの新しいライト アクタ タイプ条件により、レンダリング レイヤーごとの変更のためのライトのグループ化が簡単かつ便利になります。 プロパティをグラフ変数にして、クイック レンダリングとムービー レンダリング キューの両方のウィンドウでオーバーライドとして公開することもできます。
累積被写界深度
被写界深度レンダリングのリアルタイム パフォーマンスに関する考慮事項により、デザインでそれを強調するショットのビジュアル品質が制限されることがあります。 より「映画的」な被写界深度を実現するためには、アーティストはパス トレーサーに移行する必要があります。パス トレーサーはレンダリング時間においてコストが高くなりますが、一貫性を保つために、被写界深度に依存しないショットでも全てのショットでパス トレーサーに移行する必要があります。 パフォーマンスと品質の両面で良いところ取りができるオプションがあれば理想です。
累積被写界深度は、ムービー レンダリング グラフを使用して、複数の絞り値視点からの遅延レンダリングを蓄積することで被写界深度をレンダリングする新機能です。 これは、視差の欠如によるアーティファクトを大幅に軽減し、ディファード レンダリングのルック開発を維持します。 アーティストは、デフォルトの被写界深度で目的のビジュアル結果が得られない場合にこれを使用でき、必要のないショットではコストを回避できます。
レンダリング時間はサンプル数に比例して増加します。
グラフにおける nDisplay レンダリング
nDisplay デプロイメントはライブでリアルタイムに実行できる (そして、ほとんどの場合、実行される) のに対し、ムービー レンダー キューを使用してクラスターをレンダリングする機能は、事前にレンダリングされた再生や WIP コンテンツ レビューなどのユース ケースで非常に役立つことがあります。 UE 5.8 リリースでは、nDisplay をムービー レンダリング グラフと統合し、スケーラブルなレンダリング設定をより適切にサポートします。 UE 5.8 の機能セットには、以下が含まれます。
コレクション、モディファイア、およびレンダリング レイヤーのサポート。
ディファード レンダラーとパス トレーサーの両方のサポート。
シーケンサーで DCRA を制御するか、グラフ設定でオーバーライドを使用します。
DCRA、ノード、ビューポートなどの nDisplay の概念に対応するビルトイン ファイル命名トークン。
ステレオ レンダリングのサポート。
ICVFX カメラ サポートは今後のリリースで提供されます。
この機能の使用方法について詳しくは、「nDisplay の概要」を参照してください。
新規キュー ウィンドウ - 基本構成
Unreal Engine 5.8 では、新しい効率化された [Queue (キュー)] ウィンドウを導入します。このウィンドウには、シングル レイヤー レンダリングの名前、解像度、位置などの一般的なプロパティをパネル内で直接設定できる基本構成があります。 アーティストは、ディファード レンダラーとパス トレーサーのどちらかを選択でき、別のウィンドウを開いたり、アセットを保存したりすることなく、出力タイプを変更できます。
デフォルト値はカスタマイズして保存することで、キューが常に正しい希望の設定で開くようになります。 基本構成の現在の状態は、より複雑なレンダリング設定の開始点として使用するために、グラフ構成として保存することもできます。
バーチャル プロダクション
Mocap マネージャー (ベータ)
Unreal Engine 5.8 では、Mocap マネージャーを以下の点で改善しました。
オートカメラ:アクションを動的に追跡してフレームに収めるプロシージャル カメラを出現させて制御します。
ユーザー拡張性:ユーザーは独自のカスタム ワークフロー UI を作成できるようになりました。
専用の顔アニメーション プレビュー:ビューポート カメラを移動することなく、フェイシャル アニメーションをすばやく確認できます。
リターゲット調整の改善。
キャプチャ マネージャーの動画取り込みサポート:Mocap マネージャーは、フェイシャル アニメーション動画をパフォーマンス キャプチャ セッション データの残りのものとパイプライン化できるようになりました。
音声レコーディングの構成可能性:レコーディング トラックごとにオーディオ デバイスとチャンネル選択を定義する Take Recorder とのパリティ。
Live Link ハブ デバイス統合:Mocap マネージャーからの Control Hub レコーディング。
Composure (ベータ)
新しい Composure は、UE 5.8 リリース向けにベータ ステータスになります。 以下のようなライブ シナリオとポストビズ シナリオの両方で多数の改善が利用可能になります。
コンポジット アクタおよび参照カメラ アクタに対する完全なシーケンサー サポート (スポーン可能なものを含む)。
パフォーマンスを向上させるオプションとして、軽量な平面反射と単一ライト シャドウ レイヤー。
パスは、全てのレイヤー (プレート レイヤーだけでなく) で構成できるようになり、いくつかの新規のパスおよび改善されたパスがあります。
Blur
拡張
Masking
ポストプロセスマテリアル
入力して選択します
Translucency (透過処理)
Composure パネルの UX 改善:
アクタの選択を同期します。
コンポジット メッシュ マテリアルを管理します。
特定のコンポーネントをコンポジット メッシュおよび/またはシャドウ/反射キャッチャー コンテンツとして割り当てます。
Composure から直接メディア キャプチャを開始します。
現在のプレートを使用して天球アクタを作成する便利なオプション。
カラー グレーディング:エディタのカラーグレーディング パネルとのパス統合。
Composure キーヤー
高品質のキーは、あらゆるコンポジット ツールセットの基本的な機能であり、UE 5.8 リリース ビルドでは、Composure のオプションをいくつかの主要なエリアで拡張しました。
エディタ内でコンテキストを切り替えることなく、キー カラーを選択するときにメディア テクスチャのプレビューを表示します。
Composure パネルで 1 回クリックして、ライブ フィードからクリーン プレート テクスチャを取得し、簡単にアセットとして保存して、自動的にコンポジット アクタに設定します。
カラー キーヤー パスの代わりに、またはカラー キーヤー パスに加えて、Luma キーヤー パスを使用します。
レンダリング パイプラインを構成して正しい色精度を確保する専用パスを介して、Ultimatte を Composure とともに使用します。
新しい拡張パスを使用してエッジを調整します。
ビューポートでアルファを可視化
新しいビューポート ビジュアライゼーション オプションを使用して、赤、緑、青、またはアルファ チャンネルをエディタで直接確認します。 チャンネル メニューでは、ビューポート メニューにピン留めしてすばやくアクセスしたり、アルファをチェッカーボードとして可視化したりするための追加オプションが提供されます。
nDisplay 自動露出
Unreal Engine プロジェクトでは、自動露出が頻繁に使用されます。これは、シーン バッファ をサンプリングし、動的な EV 調整のために平均輝度ヒストグラムを計算します。 これまで、nDisplay ではビューポート間の連続性を確保するためにマニュアル EV が必要でした。 UE 5.8 では、nDisplay で自動露出のサポートを導入します。
メータリングは、nDisplay DCRA 全体を使用することも、クラスターの残りの部分に適用される特定のノードやビューポートを使用することもできます。 自動露出からアイテムを除外することもできます。
Linux 版 Rivermax
UE 5.8 リリースに含まれる Nvidia Rivermax プラグインは、Windows に加えて Linux オペレーティング システムもサポートし、nDisplay for ICVFX の検証済み機能も備えています。
Live Link ハブ - デバイス フレームワーク
パフォーマンス キャプチャ セッション中に複数のレコーディング デバイスの使用を必要とするチーム向けに、Live Link ハブは、Mocap スタジオ全体で IP 経由でデバイスを制御するデバイス フレームワークを現在提供しています。 Live Link データ、UE エディタ クライアント、レコーディング デバイスを全て 1 か所で監視し、制御できるようになりました。
Live Link ハブには、幅広い種類のデバイスが付属しています。
iOS および Android 向けの Live Link Face
AJA 動画デッキ
サウンド デバイス音声レコーダー
OBS 画面レコーダー
Optitrack や Vicon などのサードパーティのモーション キャプチャ ハードウェアおよびソフトウェア サプライヤーは、UE 5.8 リリース向けにプラグインのアップデートを提供する予定です。
Mocap マネージャーまたは Take Recorder を実行している Unreal Engine クライアントは、スレート名とテイク番号を Live Link ハブと接続されている全てのデバイスにプッシュできるだけでなく、レコーディングの開始と停止を制御することもできます。 必要なスレートとテイクを 1 つの場所に入力し、Mocap スタジオ全体で一貫性を保ちます。
Live Link ハブ - タイムコードとタイムステップ制御
ユーザーは、Live Link ハブ のメディア プロファイルを使用して、接続されている全ての UE クライアントのタイムコードとタイムステップをリモートで設定し、パフォーマンス キャプチャ ステージのセットアップとプロジェクト全体でレコーディングされたデータの一貫性を維持できます。
Live Link タイムコードとシステム タイムコード プロバイダがサポートされています。
タイムコード カスタム タイムステップと Live Link カスタム タイムステップがサポートされています。
Live Link ハブ - 動画監視
Live Link ハブは現在、UE の メディア プロファイルを使用して、アニメーションの解決および参照モニタリングで使用する動画データを表示および制御します。 新しい RTSP メディア ソースと、既存の AJA、BlackMagic、およびNDI メディア ソースを使用して、ユーザーはパフォーマンス キャプチャ セッション中に複数の動画ソースを監視できます。これには、Android および iOS の Live Link Face アプリからのストリーミングも含まれます。
MetaHuman ビデオ Live Link ソースは、メディア プロファイルからの動画ソースをフェイシャル アニメーション データとして使用できるようになり、フェイシャル キャプチャで使用できるカメラとキャプチャ デバイスの範囲が広がりました。
エディタ ユーティリティ命名トークン
ユーザーは、エディタ ユーティリティ命名トークンを作成できるようになりました。これにより、以前はランタイム命名トークンでは利用できなかったエディタ機能にアクセスできます。
命名トークン ブループリント内でエディタ ユーティリティ関数を直接呼び出します。
トークンを評価する際に Python ノードを実行し、データベースまたは外部プロセスからトークン値を取得します。
CAT スキーマの統合時系列テンプレート エディタ
スキーマ エディタから時系列テンプレートを直接作成できるようになりました。 シネマティック アーティストは、同じシーケンス レイアウトを何度も手作業で構築する必要がなくなりました。 スキーマは、将来のスキーマ タイムライン内でサブシーケンスとして参照できます。これにより、カメラ、FX、ライティングなどの再利用可能なテンプレートのネスティングされている階層を作成する機能が提供されます。
スキーマ テンプレートを一度デザインすれば、全てのアセンブリで再利用できます。
シネマティック アセンブリ ツールを終了せずに、スキーマ エディタでテンプレート構造を視覚的に作成します。
スキーマから作成された全てのアセンブリに含めるべきトラック、フォルダ、スポーン可能なもの、サブシーケンスを指定します。
管理しやすいチャンクで複雑な階層を作成するために、スキーマをサブシーケンスとしてネスティングします。
テイク レコーディング中のスポーン可能なものへの参照と親子付け
アクタは、テイク レコードを通じてスポーン可能なものへの参照を維持できるようになりました。 スポーン可能なものの下に親子関係があるアクタは、レコード全体を通して親子関係を維持し、結果のアタッチ トラックで正しくレコーディングされます。 レコーディングの開始時にスポーン可能なものが破損した場合に、ポゼッサブルのみに頼ったり、スポーン可能なものへの参照を置き換えるカスタム ツールを作成したりする必要がなくなりました。
セットアップとレコーディングのプロセス全体を通して、スポーン可能なものを安全に参照します。
同じアクタを上書きせずにスポーン可能なものに再記録します。
ワールド アウトライナーを使用して、スポーン可能なものにペアレンティングし、レコーディング全体でそのペアレンティングを維持します。
VCam アタッチ ブラウザーとコンストレイント
バーチャル カメラに、ペアレンティングとプラットフォーム専用のブラウザーが追加されました。
VCam UI 内から、アタッチ可能な全てのアクタとコンポーネントをブラウズします。
VCam を終了せずに、カメラをターゲットに接続/接続解除します。
キー アクタ タイプまたは自分に近いアクタのみでフィルターします。
VCam 軸ごとのアタッチメント
VCam がアニメーション コンストレイントを介して親にアタッチされるようになり、継承または無視する軸を選択して、よりきめ細やかな制御を実現できるようになりました。Composure Panel パネル の UX の改善。
メディア
タイリング済みミップマップビデオ (実験的機能)
EXR 再生にタイルとミップのサポートが追加されたことで、複雑なディスプレイ設定でも高解像度再生を実現しました。 UE 5.8 では、ユーザーに、よりバランスの取れた再生体験を提供するために、タイルとミップを圧縮する動画コンテナである TMV を追加しています。 これにより、EXR の過大なファイル サイズと、高パフォーマンスの動画再生の帯域幅の要件が軽減されます。
これは、ICVFX、ライブ イベント、およびゲーム エンジン用の堅牢な動画形式を必要とする全ての人を対象としています。
TMV は、ユーザーが以下のことを達成するのに役立ちます。
エンジン内で最高レベルの動画再生 (動画フレーム全体をデコードする代わりに、必須のピクセルのみをディスクからストリーミングします)
スムーズなスクラブ (Apple Pro Res のスクラブ パフォーマンスに相当します)
高画質でありながら、ストレージ フットプリントを適度に抑えます (可逆および非可逆圧縮アルゴリズム)
高ビット深度 HDR エンコーディングのサポート
視野角内に必要なもののみを表示するための低レイテンシーのサポート。 タイルは、リクエストされたタイルに基づいてストリームインおよびストリームアウトできます。
動画トランスコーダー (実験的機能)
プロ向けのビデオ編集ツールは、頻繁に、入力される動画アセットを一般的な最適化された動画形式にトランスコードし、スクラブや編集機能を強化します。 UE 5.8 では、業界で利用可能なほとんどの入力形式を、新しい TMV (タイリング済みミップマップ動画) 動画コンテナに取り込むことができる実験的な動画トランスコーディング ツールを追加しています。
トランスコードされると、動画アセットは他の形式と同様にエンジンで再生に利用可能になります。 主な違いは、TMV がゲーム エンジンと 3D レンダリングのコンテキストでの再生用に最適化されていることです。
これは、動画を EXR または TMV コンテナ (タイルおよび/またはミップの有無にかかわらず) にトランスコードする必要があるあらゆる業界のユーザーを対象としています。
今回のリリースでは、特に以下の機能を追加します。
ジョブ管理 (ジョブの追加、複製、削除)
コマンドレット (CLI) としてジョブを実行
ツール構成を JSON 形式でエクスポート
リアルタイム トランスコーディング進行状況プレビュー
画像シーケンス (EXR を含む) と動画ファイルの両方のサポート
タイルとミップのカスタマイズ
色管理とオーバーライド
品質設定
メディア ビューアー (ベータ)
アニメーターは多くの場合、作業するアニメーションと既存の参照フッテージを並べて確認することが必要になります。 5.6 では、アニメーション作業が行われている場所の隣にメディア (画像、メディア テクスチャ、動画ファイル、ライブ ビューポート) をドッキングする機能を追加しました。
水平または垂直構成の 2 つの AB バンクによりアセットの 2 セットを比較できます。 ズームとパン制御もコンテンツをさらに整列するのに使用できます。 ブックマークを使用すると、ホットキーでアセット構成をすばやく呼び出すことができます。 UE 5.8 ではメディア ビューアー プラグインが実際の制作に使用できるステータスに近づいており、以下のワークフローと使いやすさの改善が行われました。
シーケンサー メディア テクスチャにアクセスするためのワークフローの強化。
水平/垂直画像バンク反転。
ピクセル グリッド表示に対応したズーム レベル調整可能なフィルタリング モード。
TMV (タイリング済みミップマップ動画) のサポート。
この機能について詳しくは、「メディア ビューアー」を参照してください。
シミュレーションと VFX
Chaos Destruction
Chaos Destruction システムは、リアルタイムでシネマティック品質の破壊を実現するための強力なツール セットを提供し、高いビジュアル忠実度と強力なパフォーマンス最適化を組み合わせたものです。 UE 5.8 アップデートには以下の内容が含まれます。
エディタ
アセットを作成する際に、デフォルトのデータフロー テンプレートが利用可能になりました。
新しいアセットのサムネイルに、データフローが添付済みであることを示すアイコンが表示されるようになりました。
ジオメトリ コレクションのレンダリング可能なタイプにレンダリング設定を追加しました。
コンポーネント
トランスフォームごとにリニア減衰と角度減衰を設定する機能を追加しました。
現在のトランスフォームをクエリするための新しいブループリント関数を追加しました。
GetCurrentTransforms
GetCurrentTransformsFromIndices
Niagara Destruction データ インターフェースのインデックス化が不正確だった不具合が修正されました。これにより、一部のパーティクルが原点でスポーンしていました。
ジオメトリ コレクション コンポーネントのコリジョン応答の設定を修正しました。
ジオメトリ コレクションに GyroscopicTorque オプションのサポートを追加しました。
ゲーム スレッドから同期する際に、GT パーティクルで速度が適切に設定されない不具合が修正されました。
キャラクターの移動をアップデートし、リニア速度を取得する関数にボーン名を適切に渡すようにしました。
break/sleep で削除を使用した場合に、部分的なクラスタでトレースが機能しないことがある不具合が修正されました。
フィールド
フィールドが部分的なクラスタを処理する際にクラッシュすることがある不具合が修正されました。
この機能の使用方法について詳しくは、「Chaos 破壊」を参照してください。
Chaos データフロー エディタ
Dataflow は、物理ベースのアセットをプロシージャル生成するための Unreal Engine のノードベースのシステムです。 クロス、破壊、ヘアー、肉体、および MetaHuman のセットアップのワークフローで広く使用されています。 UE 5.8 アップデートには以下の内容が含まれます。
ランタイム グラフ評価。
強化された UI と UX (よりインタラクティブなツール、ギズモなど)。
スケルタル メッシュのオーサリング。
改善されたジオメトリ ツール (マージ)。
コンストレイントを作成するためのより完全なツールキット。
グラフ内キャッシング。
Chaos Visual Debugger
Chaos Visual Debugger (CVD) は、Unreal Engine ユーザーが、Unreal Editor で直接、またはスタンドアロン CVD インスタンスから、物理シミュレーションを効果的に観察およびデバッグするための方法を提供します。 UE 5.8 アップデートには以下の内容が含まれます。
カメラ追跡システム。
ジオメトリのビジュアライゼーション パネル。
複数選択のサポート。
三角形メッシュの複雑度ビュー。
Chaos Core
Unreal Engine の Chaos 物理システムに基礎的な改善を追加し、より応答性が高く、スケーラブルなシミュレーション ワークフローをサポートします。 UE 5.8 アップデートには以下の内容が含まれます。
スレッドセーフ島の生成が改善されました。
オブジェクトの感度とアイランド スリーピングのより細かい制御。
空間分離または色分離による島内並列化の改善。
保護されたソルバー API と新しい実行モデル。
モノリシックな物理スレッドを削除し、ジョブ グラフに移行する作業を継続しています。
拡張されたメタバース対応のフィルタリング モデル:
64 ビット チャンネル。
チャンネル マスク vs. 単一チャンネル選択。
64 チャンネル以上にフィルターを拡張しました。
データフローでのスケルタル メッシュのオーサリング
剛体および変形可能なソルバー内のスケールとクランプの改善。
ローカル空間シミュレーション。
速度クランプ。
形状ごとのスケールのため ImplicitObjectScaled を削除します。
ワールド ソルバーの外部にある初期 API を検証することを目的としてデータフローで使用するための Chaos++ ソルバー ノード。
Chaos Cache
キャッシング フレームワーク プロジェクトは、クロス、流体、破壊、肉体などの Chaos ベースの機能全体でシミュレーション データを効率的に保存および再生するために既存のシステムを拡張することに焦点を当てています。 UE 5.8 アップデートには以下の内容が含まれます。
シーケンサーでのコンポーネントごとのキャッシング。
エディタ側でのベイクとランタイム再生の両方をサポートします。
Chaos キャッシュ アセットを、より関連性の高い、最適化された形式を指すメタ アセットとして使用すること。
キャッシュのバージョン管理、トリミング、無効化のためのツールを追加しました。
シネマティック ワークフローの検証。
Sequencer でのクロス レスト ポージング。
Chaos Hair
Chaos ヘアについて、UE 5.8 アップデートには以下の内容が含まれます。
ペイント属性、スキンの重み付け、ガイドの交換のサポートの拡張。
Nanite 互換のレンダリングとシミュレーション。
カード生成からスケルタルメッシュに至るまで。
グルーム編集ツール (カット / カール)。
プロトタイプ ストランド レンダリング。
Chaos Flesh
このプロジェクトは、クロスと肉体用の Chaos ソルバーを 1 つの変形可能なシミュレーション フレームワークに統合することに焦点を当てています。 UE 5.8 アップデートには以下の内容が含まれます。
クロス ソルバーと肉体ソルバーを 1 つの変形可能なコアに統合しました。
レイヤー間 (スキン、筋肉、衣服) のプロシージャルなインタラクションを有効にしました。
共有メモリとソルバー ロジックによりパフォーマンスが改善しました。
データフロー ノードをアップデートし、新しいデータフロー レンダリング システムを使用するようにしました。
Chaos Cloth
UE 5.8 では、Chaos クロスが実際の制作に使用できるようになりました。 アップデートには以下の内容が含まれます。
CLO/Marvelous Designer を使用した非破壊的なアップデートとラウンドトリップ編集を有効にしました。
USD コンストレイントとクロス属性を Unreal Engine にインポートします。
パネル構造、スプリング、シミュレーション メタデータを保持します。
Dataflow でシミュレーション再生と再オーサリングをサポートします。
レイヤー間 (スキン、筋肉、衣服) のプロシージャルなインタラクションを有効にしました。
共有メモリとソルバー ロジックによりパフォーマンスが改善しました。
ブループリントからプロパティのグループ設定を管理するのに役立つクロス インタラクター アセット データ。
全速度スケール シミュレーションに慣性力を追加しました。
Chaos モジュラービークル
モジュラー ビークル システムは、固定されたスケルタルメッシュに依存するのではなく、動的シーン グラフ コンポーネントを使用して、ユーザーがリアルタイムでビークルをビルドする機能を提供します。 クライアント予測とサーバー権限の物理で設計されており、柔軟な構築をサポートします。 このシステムにより、クリエイターは Unreal Engine 内でモジュラー パーツを使用して、従来型とともに斬新な乗り物をクラフトできます。
スケルタル メッシュを使用してビークルを構築するためのサポートを追加し、ユーザーが同じフレームワークでシンプルなビークルを簡単に作成できるようにしました。
ビークルと地面の間の双方向のインタラクションを追加しました。
この機能について詳しくは、「Chaos モジュラービークル」を参照してください。
プラットフォーム SDK のアップグレード
Windows
Visual Studio 2022 v17.14 以降
Windows SDK 10.0.22621.0 以降
LLVM Clang
最低要件:18.1.8
推奨:20.1.8
Intel OneAPI
最低要件:2025.2.0
推奨: 2025.2.0
.NET 8.0
ビルド ファーム コンパイル対象の IDE バージョン
Visual Studio 2022 17.14 14.44.35207 ツールチェーンおよび Windows 10 SDK (10.0.22621.0)
Xcode 15.4
GDK
最小 Windows SDK:10.0.22000.0
GDK: April 2025
最新のリカバリ バージョン
サポートされている IDE:Visual Studio 2022
Linux
ネイティブの Linux での開発
推奨 OS:Ubuntu 22.04、Rocky Linux 8 以降、Redhat Linux 8 以降
コンパイラ:clang 20.1.8
クロスコンパイル ツールチェーン: v26 clang-20.1.8-based
注:Linux 上の Unreal Engine ユーザーが SDL3 を使用するには、OS をアップデートする必要があります。 詳しくは、「Updating Unreal Engine on Linux to SDL3」を参照してください。
macOS
推奨 OS:最新の macOS Sonoma 14
最小 OS:macOS Sonoma 14.0
推奨 Xcode:15.4 以降
最小 Xcode:15.2
サポート対象の macOS SDK:14 以降
注:最新バージョンを使用する際のコンパイルおよびリンクに関する問題のため、サポート対象の Xcode バージョンは UE 5.6 からダウングレードされました。
iOS / tvOS / iPadOS / visionOS
推奨 OS:最新の macOS 14 Sonoma
最小 OS:macOS Sonoma 14.5
推奨 Xcode:16.1 以降
最小 Xcode:15.4
サポート対象のターゲット SDK バージョン:
iOS SDK のバージョン:15 以降
iPadOS SDK のバージョン:15 以降
tvOS SDK のバージョン:15 以降
推奨される Xcode 16.3 を搭載した visionOS 2.4
注:v2.5 と x16.4 はごく限られたテストを通過しており、問題なく動作すると思われます。 v2 および x16 までのバージョンでも動作すると思われます。
iOS グラフィック API:Metal 2.4 ~ 3.1
その他の注意事項
シェーダー モデル6 (SM6) では macOS 15 が必要です。 このサポートはベータ版であり、現時点で実稼働環境での使用を推奨していません。
Android
Android Studio Koala 2024.1.22024年8月29日
Android NDK r27c
Android SDK
推奨:SDK 34
UE コンパイルのための最小要件:SDK 34
シッピング向けのデフォルト ターゲット SDK:SDK 34
最小インストール SDK レベル:SDK 26
AGDE v23.2.91 以上を推奨 (AGDE デバッグを使用している場合。このバージョンには SIGBUS エラーの修正が含まれるため)
ビルドツール:34.0.0
35.0.0 では、Windows で aidl を使用している場合に問題が発生することがあります。 この問題は 35.0.1 で修正されています。
Java ランタイム:
OpenJDK 21.0.3 2024-04-16
OpenJDK Runtime Environment (ビルド 21.0.3+-12282718-b509.11)
OpenJDK 64 ビット サーバー VM (ビルド 21.0.3+-12282718-b509.11、混合モード)
その他の注意事項
UE は Gradle 8.7 を使用するように更新され、使用する Android Gradle Plugin (AGP) バージョンはバージョン 8.5.2 に更新されました。 Android Studio をデバッグに使用している場合は、Android Studio Koala を使用することを推奨します。 Ladybug も動作しますが、Gradle や AGP を上記バージョンから更新しないでください。
NDK レベルを選択するときは、android-26 (Android 8.0 以上をサポート) をターゲットにする必要があります。
EOS
1.18.1.2-47370208
Steam
1.57
Switch
デフォルト SDK バージョン:20.5.6
デフォルト ファームウェア バージョン:20.1.0-2.2
最小 SDK バージョン:18.3.1
最小ファームウェア バージョン:18.1.0-1.0
Nintendo Package Manager:1.7.0
サポートされている IDE:Visual Studio 2022
Switch 2
デフォルト SDK バージョン:20.5.6
デフォルト ファームウェア バージョン:20.1.0-2.2
最小 SDK バージョン:19.3.5
最小ファームウェア バージョン:19.1.0-1.4
Nintendo Package Manager:1.7.0
サポートされている IDE:Visual Studio 2022
PS4
デフォルト Orbis SDK 12.508.001
最小 Orbis SDK 12.008.011
システム ソフトウェア 12.508.001
サポートされている IDE:Visual Studio 2022
PS5
デフォルト Prospero SDK 11.00.00.40
最小 Prospero SDK 10.00.00.48
システム ソフトウェア 11.00.00.43
サポートされている IDE:Visual Studio 2022
ARCore
1.48
ARKit
4.0
OpenXR
1.1.46
OpenXR 1.0 および 1.1 ランタイムがサポートされており、どちらもプロジェクト設定で無効にすることができます。
リリース ノート
AI/ML
New:
Learning Agents: Remove firing OnAgentsAdded and OnAgentsRemoved if they are empty.
LACombat: Split schemas into a separate map and make recordings filterable with tags.
Bug Fix:
Learning Agents: Fix memory leak in LearningAgentsRecorder.
MCP
New:
Added an assistant toolset for animation features.
Bug Fix:
Fixed boolean type parsing issue with ECA Bridge.
Neural Network Engine (NNE)
New:
Upgraded ONNX Runtime to 1.24.3 and DirectML to 1.15.4 in the NNERuntimeORT plugin.
Upgraded the NNERuntimeIREE third-party compiler, runtime, and tools to IREE 3.11.0.
Added per-model compiler flag settings for the NNERuntimeIREECpu runtime.
Added.mlpackage import support to the NNERuntimeCoreML runtime.
IREE runtime trace zones from NNERuntimeIREE are now captured by Unreal Insights in non-Shipping configurations.
Deprecated:
Removed: Dropped the NPU execution interface from the NNERuntimeORTDml runtime.
Animation
New:
Added accessors for Vector and Quaternion attribute types to SkeletalMeshComponent.
Marked UAnimNotify as EditInlineNew.
Added virtual Merge function to UAssetUserData.
Made the Animation Curve Debugger Widget read-only per default.
Added a remap (v, min_in, max_in, min_out, max_out) function to the Curve Expression plugin. This function remaps the input value such that its value within the in_min/max range is linearly mapped to the out_min/out_max range, much like the FMath::GetMappedRangeValueClamped C++ function.
Bug Fix:
Fix infinite loop in rich curve feature point search function.
Remove improper usage of FKeyHandle constructor Reduces unique key ID churn.
Fix for PoseableMeshComponent for when Skeleton changes during its lifetime.
Makes AnimationEditorPreviewScene and the EditableSkeleton (more) robust to the Skeleton being deleted.
Fixed restoring of animation position and play state in montage and animation editors after undo/redo actions.
Deprecated:
Cleaned deprecated methods from Animation.
Animating in Engine
New:
Curve Editor
The Curve Editor's frame hotkey now zooms to your selected keys' range, or falls back to the selection/playback range when nothing is selected, matching Sequencer's framing behavior.
Copy/pasting curves now applies the source curve to every selected target with a matching name, not just the first match.
The tree view now has an Organize and Sort menu which has options to Expand/Collapse Nodes, Expand/Collapse Nodes and Descendants, Expand All Nodes, Collapse All Nodes, and Sort All Nodes.
Added Middle Mouse Button Adds Key setting to enable or disable adding a key with the middle mouse button.
Ctrl-mouse wheel and alt-right mouse button now zoom horizontally even when there's no curves selected.
The selection range start/end shortcut binding now shares Sequencer's binding so the behavior stays consistent across both.
Toolbar cleanup by removing the unused All Edits button and the 'Curves' label from the pulldown.
Anim Details
Anim Details now shows an option to remove all keys in the right-click context menu of its properties.
Anim Details now groups Control Rig properties with identical names, regardless of their relation in the rig.
Control Rig Controls are now grouped per property name, ignoring their parent, while common Actor properties still show grouped per parent Actor Components as previously.
Groups now show the control name if multiple parents with identical name are multi-edited and "Multiple" only if controls of different short names are multi-edited.
Groups now show a tooltip listing up to 5 controls when multi edited.
Added Blueprint functions Open Pose Library Tab and Close Pose Library Tab.
Snapper settings are now saved as user preferences.
Bug Fix:
Curve Editor
Normalized and Stacked views no longer collapse all keys to the bottom when the curve values are nearly identical.
Improved interaction by not changing curve selection if there's nothing to change and not transacting key drags if there's no movement.
The Normalized view now respects the Frame Output Padding setting instead of using a hardcoded 10% margin.
The time offset filter now handles pre and post infinity extrapolation by wrapping around.
Tween slider now responds to both its primary and secondary keyboard shortcuts.
The Tween Slider no longer fails to show up if the mouse is too close to the left border of the viewport.
The pose browser now maintains its configuration and doesn't rebuild each time a pose is selected.
Anim Layers UI now follows add/remove/duplicate layers and undo/redo, regardless of whether controls are selected or not.
Enums now show their keyed status in Anim Details.
Changes to bool, float and int properties in Anim Details are now reflected in Sequencer.
Selecting plain Location Controls in Anim Details now filters channel curves correctly.
Control Rig and Sequencer: Fixed Control rigs recreated with "Recreate Control Rig with New Settings" reverting to default setting when entering PIE.
Character Customization
New:
Added support for Chaos ClothAssetSKMClothingAsset.
Renamed Passthrough nomenclature to Object. This new naming convention gives insights to the user when a UObject is created.
Merged Texture and Passthrough Texture nodes.
Added new Skeletal Mesh type and nodes. This new type allows users to work at Skeletal Mesh level without having to enumerate all Mesh Sections.
Converted Add To Component SKM node to Modifier Skeletal Mesh Merge.
Added Skeletal Mesh output pin to Skeletal Mesh Parameter node.
Added the "Skeletal Mesh Modify" node.
Removed one Game Thread tick when Updating. Updates now can take a minimum of two ticks.
Added Asset User Data type and nodes.
Added new UAssetUserData type and nodes.
Added the "Mesh Transform with Bone" node to serve as an inlined version of the modifier node with the same name.
Added the "Remove Mesh" node.
Implemented Parallel Updates. Now MIPs and LODs and Initial Updates can be generated in parallel.
Added support for Clothing in Skeletal Mesh parameters.
Components now can have the same name.
Added the option to taking the ownership of generated resources. Mutable will not modify or reuse them.
Added Material Override pin to components.
Added the "Skeletal Mesh Break" node.
Added Passthrough Skeletal Mesh pin to Node Passthrough Skeletal Mesh Component.
Added Passthrough Texture Parameter node.
Added custom External Operations. Allows users to create new operations. Very experimental!
Moved Modifier Skeletal Mesh Mesh LOD Pins to a Skeletal Mesh Make.
Marked Transform in Mesh nodes as deprecated.
Added an option to define the maximum UV layout size, in blocks, for the Mesh Section and Material Modify nodes. The size of runtime-generated textures is derived from the 'Max Layout Blocks' setting and the in-game size of the reference textures.
Hidden compile properties when a CO is a Child.
Removed Parameter Profiles.
Removed Node Copy Mesh Section.
Added support for SkinWeightProfiles in Skeletal Mesh Parameters.
Removed CO States tab.
Hidden Child Object properties when it is not the root.
Removed selector list from Mesh Morph. Now it is a simple string.
Optimized Skeletal Mesh merge operations.
Added Skeletal Mesh Break node.
Added NodeSwitch for Skeletal Mesh Objects.
Added Skeletal Mesh Merge node.
Added the "Skeletal Mesh Morph" node.
Improved usability of the debugger by adding the option to color the tree of operations using the operation data type.
Add Serialization Support for Material Params in LoadDescriptor.
Optimized mutable runtime performance by transforming chains of conditional ASTOps into switches.
Changed Group Type option names.
Allowed Reroute Node to have multiple outputs.
Refactored the Mutable system tick to reduce the time spent on game-thread.
Improved mutable runtime performance by the removal of the "Task_Game_LockCache" task from the Customizable Object Instance update.
Optimized Game Thread BuildOrCopyClothingData.
Image layer operation optimizations.
Added support for Skeletal Meshes with unlimited bone influences in Skeletal Mesh Parameters.
Added support for Skeletal Mesh sockets in Skeletal Mesh Parameters.
Improved the reporting of cyclical CO references.
Moved all functionality of the Passthrough Mesh Component" node into the "Skeletal Mesh Component" node. Removed "Passthrough Mesh Component" node.
Allow use of Skeletal Meshes without NeedsCPUAccess enabled in Skeletal Mesh Parameters.
Real-time morph generation optimizations.
Added support for PhysicsAssets in Skeletal Mesh Parameters.
Remove LOD limiters CVars.
Moved loading CO hierarchies from synchronous to asynchronous.
Make FCustomizableObjectInstanceDescriptor Load/Save functions safer.
Removed Share Projector Between LODs optimization.
Added backward compatibility support to Customizable Object Macro libraries to update nodes within macros.
Changed Break Skeletal Mesh node color.
Removed Low Priority Textures.
Removed Material references from Generated Textures in Texture Analyzer.
Added colors to Performance Analyzer.
Added 'Bone Pose Priority' property to object group nodes to resolve conflicts when merging meshes with different poses.
Added the option to define the output prefix for the assets generated by the mutable Customizable Object Instance Baking operation.
Bug Fix:
Fixed "Clip mesh with UV Mask" operation not loading the appropriate texture mask mip.
Fixed an issue with MinQualityLODLevels where the streamer would request Skeletal Mesh LODs below the platform MinLOD setting.
Fixed actor creating more components than it should.
Fixed high video memory usage when generating a lot of meshes in the CustomizableObject editor.
Fixed modifier nodes not being able to display the UVs of mesh section nodes that did not define at least one non-automatic tag.
Hair Strands Mutable: Fixed check failure when trying to create a new UObject from the PostLoad of the "Groom Constant" node.
Fixed OOM crash when moving a slider.
Fixed modifier nodes missing the input "RequiredTags" input pin on node refresh.
Fixed unable to save baked resources if they contain invalid characters.
Fixed multiple cases where the messages produced by mutable did not get exposed in the "Stats" Customizable Object editor tab.
Fixed "unable to remap pin" warning during the update of the "CONodeMeshMorphStackDefinition" backwards compatibility code execution.
Fixed compilations not using the root CO compile options.
Fixed multiple issues with Reshape nodes.
Fixed wrong order of the Customizable Object versions array making a backwards compatibility related fix for a missing pin be performed after it was required.
Fixed modifiers always applying when All Required + No Tags.
Fixed bake operation not re-compiling the Customizable Object when the compiled data is outdated.
Fixed an issue where Skeletal Mesh Component nodes added to child Customizable Objects were ignored.
Fixed crash when the RunCode operation was aborted when the material parameter could not be found.
Fix for automatic compilation in editor not picking up on changes from in a Customizable Object Macro Library. Now changes will be picked up on autocompilation and be represented in the output.
Fixed PrepareUnrealCompression Game Thread check.
Fixed ImagePixelFormat not being used in Bake.
Fixed crash when validating Customizable Objects.
Fixed Code Viewer stack overflow crash with large COs.
Fixed a memory leak when converting Skeletal Meshes from Skeletal Mesh Parameters at runtime.
Fixed ensure when registering to Movie Sequence Template actors using HairStrandsMutable.
Fixed Customizable Object being GC during package splitter.
Fixed an issue with Skeletal Mesh streaming where streamed LODs remained in memory until the Skeletal Mesh was destroyed.
Fixed Material Switches losing its type.
Fixed Extension Data not being applied when an Instance is already generated.
Fixed crash if the PinType is None.
Fixed modifier nodes not showing the custom tags explorer UI element.
Fixed morph-related error messages not having the node context set in them.
Fixed UVs changing precision when streaming.
Fixed crash when failing to stream an Image.
Fixed scaling issue with the Layout areas caused by the unrequired clamping of the layout areas when not really needed.
Fixed crash when removing all vertices of a cloth section.
Fixed cloth crash when streaming was enabled + using a Remove Mesh node.
Fixed the "FCustomizableObjectMeshStreamIn" tasks leaks that caused the "FLiveInstance" and "FCustomizableObjectMeshStreamIn" objects to be wrongfully kept in memory.
Fixed Callback check when Streaming in FCustomizableObjectMeshStreamIn.
Fixed PSO check with grooms.
Fixed crash when deserializing meshes with cloth.
Fixed CO always automatically compiling.
Fixed CO loading hang when a Child Object was not properly connected to a group.
Fixed loading incorrect CO hierarchies.
Fix Mutable compilation crash.
Fixed crash during the generation of a Mutable Mesh from a Static Mesh.
Fix crash when converting constants that had as a child an IM_REFERENCE.
Made the "Material Modify" editor node ignore the non-input pins during the node compilation.
Fixed case where an error during the COI update made it still eligible for being updated each time the ticker got ticked.
Fixed crash when opening an empty CO.
Fixed crash in ConvertSkeletalMeshToMutable when the SkeletalMesh is missing.
Fixed late initialization of the NeedsCPUAccess flag for FSkinWeightVertexBuffer.
Fixed crash when opening the Code / Graph Viewer without model.
Fixed parameter discoverability issue when multiple UVs require layout generation.
Fixed crash with Mesh and Image parameters being nullptr.
Fixed reported Task times in Performance Analyzer.
Fixed Dataless crash when streaming inline SKM LODs.
Fixed modifiers not being applied correctly with optimization None.
Fixed GetModelResources crash when cooking.
Deprecated:
Deprecated ComponentIndex in favor of ComponentName in CustomizableSkeletalComponents. Moved the remaining CustomizableSkeletalComponent properties to private.
Removed the option to generate 'Only manually created LODs' in favor of automatic LODs.
Control Rig
New:
Control Rig Physics
Implements the per-body PhysicsBlendWeight.
Setting the StepPhysicsSolver alpha value to 0, disables simulation, switches the node to a cheap pass-through mode, and prepares the simulation to restart if alpha is subsequently set > 0.
Add support for acceleration vs force mode (a simple toggle) in controls.
Add an option to scale damping by inverse mass. This is to allow users to choose whether damping acts to simply calm down the simulation, vs behaving more like drag (air resistance)
Support resetting the simulation if the absolute time between updates is above a threshold.
Improves the way that settings for the solver and simulation space motion etc are exposed.
Adds "GetPhysicsBodyExists" and similar Get calls for the other types of component.
Add cvars for debug visualization control.
Control Rig Physics now supports convex shapes. Note that this is especially useful when importing from a physics asset using convex shapes.
Control rig physics supports continuous collision detection (CCD) as an option on the solver and individual bodies.
Control Rig Physics plugin is now enabled by default.
Control Rig Physics optimisations/speedups.
Improve tooltips/help.
Rename BonesToUse to BoneMask in relevant nodes.
Improve instantiation from a physics assert, to let modular rigs work better. Now physics on the whole character can be instantiated limb by limb, and the junctions will not be missing joints/controls.
More get/set functions exposed to the control rig graph.
RigVM
Added new math node "Get Rotation from X Vector"
Added "Sphere Trace By Profile" and "FRigUnit_LineTraceByProfile"
Control Rig/RigVM: Add support for text rendering with DrawText().
Allow structs within RigVM to implement ImportText for cache management purposes.
Improve usability of the RigVM Print node - defaults to display for a single frame, and the duration is more clearly exposed.
Clarify RigVM help text for some trig functions.
Adds a maths "Wrap" function to RigVM.
Removed RigVM cached handles array from instances, as a memory saving optimization This also eliminates the need to patch handles for each instance initialization (it generates patched handles on the fly for each instruction).
RigVM now preprocess handles using offsets at CDO creation Added cvars to allo tweak / disable RigVM parallel_for on some platforms.
Add an option to directly edit redirector nodes.
New option in Editor Settings → Rig VM Editor → Direct Reroute Node Editing, disabled by default.
When enabled, reroute nodes are dragged by default, and create connections with Ctrl-Drag.
When enabled, when double clicking near a line, a reroute node is created and connected to the nearby line.
Control Rig Dynamics: This is a new experimental plugin that adds support for fast physically-based dynamics in Control Rig. This allows simple cosmetic dynamics to run significantly faster than the equivalent Control Rig Physics setup, making it better suited to gameplay scenarios.
Rework space editing, add multi-editing support.
When selecting multiple controls in a viewport, spaces can now be edited for all selected controls.
The add spaces menu now only shows valid spaces.
The bake spaces dialog now shows custom spaces.
Adding the default parent no longer adds a duplicate parent entry, the default parent is briefly highlighted instead.
Add an option to show only empty sockets in the schematic viewport, defaults to true.
Add cut, copy, paste and delete commands to the graph node's right click context menu.
Control rig physics and dynamics: Add debug UI for physics and dynamics, activated by buttons on the Control Rig editor toolbar. Also added to the Tools→Debug menu, as this can be used during PIE too.
Make baking to control rig procedurally equivalent to the UI codepath in terms of how we deal with pre-existing control rig tracks.
Allow physics control rig users to differentiate collision against world bodies by collision type (i.e. physics, query, probe). Also refactor ISM specific code to simplify implementation.
Improve settings.
Separate menu settings between level editor and asset editor.
Settings for the level editor are now stored where applicable.
Curves referenced in the graph are now highlighted in the Curve Container tab.
In a Control Rig Graph dragging from a node and pressing F now spawns a for each node.
Fix for CRP to correctly add world bodies that are owned by instanced static mesh components.
Add a new option "Compile Resets Solve Mode" in the Event Queue menu, default to true.
New hotkeys Editor Viewport:
Bones: Alt-B
Controls as Overlay: U
Nulls: G
Sockets: H
Axes on Selection: J
Graph:
Profiling: P
Next Event Queue: M
Prior Event Queue: Shift-M
Toggle Forwards and Construction: Ctrl-M
Rig Hierarchy:
New Socket: Ctrl-K
Module Hierarchy:
Show Secondary Connectors: Ctrl-Shift-1
Show Optional Connectors: Ctrl-Shift-2
Show Unresolved Connectors: Ctrl-Shift-3
Duplicate: Ctrl-D.
Add an option to duplicate Modules from the Module Hierarchy context menu.
Rig modules now can add an Array Size Rule for Connectors to express the expected number of connections.
Searching the Module Hierarchy in Modular Rigs now also finds entries by the Control Rig Module class when said column is visible.
Anim Outliner, Anim Details, Sequencer and Curve Editor now show Controls in the same order.
Set Default Match is now a template node that accepts both single connectors and an array of connectors.
The Modular Rig Hierarchy Tree View now supports recursively expanding/collapsing elements by Ctrl-clicking nodes.
Creating a Control Rig asset in the content browser now allows picking Rig Module in addition to Control Rig and Modular Rig.
Connectors in Modular Rigs can now also be dragged from the details panel.
Improved columns in the Modular Rig Hierarchy.
Columns can now be shown or hidden when right clicking the header.
Added new columns Module Class and Module Tag, both hidden by default.
Modular Rigs now show the Schematic Viewport when dragging modules.
The Modular Rig Editor now shows the class name and a browse to asset icon along with the class path in Details.
Mirror settings are now stored per project per user.
The Modular Rig Hierarchy editor now stores the connector visibility filters per project per user.
Views where Connectors could not be reordered now show a small icon to declutter the view.
Modules in Modular Rigs now show a combo box to select Control Shapes, including Shapes from the Shape Libraries of the Module's Control Rig, Shape Libraries of the Modular Rig and Direct Mesh Control Poly Groups.
Connectors in Rig Modules now have a description property which the Modular Rig Hierarchy displays as a tooltip.
Bug Fix:
Control Rig Physics
Clamp strength so that values < 0 don't cause unwanted behaviour.
Fix parent-space controls not finding the parent body when instantiating from a physics asset.
Fix serialization of shapes (name and ContributeToMass).
Ensures that world objects get initialised in the collision system properly: Fixes problems with objects not colliding unless they have moved.
Improves/fixes some automatic collision shape generation.
Collision fixes for when bodies have no shapes.
RigVM
Fix for inline edit conditions not getting updated when toggled.
Missing comma in python print for add_reroute_node_on_pin.
RigVMEdGraph call PostEditChange after calling modify in RemoveNode.
Update RigVM function reference nodes when adding or removing variable references to the contained graph.
Avoid RigVM crash when there is a function with a missing pin in the injection data.
Disabled RigVM function parameter customization on aggregate nodes.
Fixed RigVM NotEqual operand.
Fixed RigVM debug info use after delete leading to crashes.
Fixed RigVM equal dispatch node type check to allow comparing compatible types, like enums with uint8 encoded enums.
UAF
Fix for not being able to clear uobject references on rig vm properties via the details panel.
Crash fix for mixed usage of 16bit and 32bit pose indices in AnimNextControlRigPoseAdapter.
Fix incorrect accessor ControlRigPoseAdapter::GetGlobalPose() actually returning the local pose.
Control rig dynamics and physics: Clear arrays during initialisation. This has no effect in normal use, but when using the COntrol Rig Construction Event mode, it prevents these arrays from unbounded growth.
Fixed for some Control Rigs not correctly centered on asset editor start.
Move to using a struct for world object keys to avoid potential collisions within TMap when previously using hashes as keys.
U Rig Hierarchy::CanCauseCycle no longer ignores inactive parents, no longer ignores inactive parents, which previously could cause cyclic dependencies.
Ensure that all run once events are cleared at the end of Execute. This prevents any custom run once events from being run every frame.
Fix a crash in ControlRigParameterTrackEditor when Controls are selected outside of the game-thread, for example during undo/redo.
Fixed Control Rig copy hierarchy reallocate elements breaking the target elements subindex.
Fix for an issue where get user data was failing to find uobject types in the RigVM asset registry due to incorrect formatting on the type strings.
Control Rig crash fix for use after delete at control shape creation.
Fix issues with rendering bones and local rotation axes in level editor and asset editor.
Frame Selection (F) now works in the Control Rig Editor.
Modular Rig modules can now be rearranged within their parent after undo/redo.
Control rig assets are dirty upon re-opening.
Fixed Control Rig AST generation, to avoid function entry variables being included in scope blocks.
Adding the first bone to a Control Rig and undo/redo now restores the bone.
Fixed Control Rig function parameter type selection not allowing array types.
The Modular Rig Hierarchy now allows reordering Modules within the same parent as expected.
Connector Rules are now respected when selecting elements in Modular Rig Details.
Fix an issue in the Modular Rig Editor where the reorder handle for Array Connectors was not visible.
Fix various issues in Module Hierarchy's functionality.
Mirror modules now mirrors children and retains the mirrored sub-hierarchy.
Fix details are not refreshed when a connection array is cleared in the module hierarchy.
Fix clearing connector arrays with related button did not clear the array.
Fix the details view did not update when the connector array was cleared.
Fix the last connector in a connector array could not be removed.
Fix for the GetChainLength function to return the total chain length instead of the average.
Control Rig Modules Connector Details no longer show the connectors as array when the Is Array property is set to false.
The Rig Hierarchy and the Module Hierarchy now keep their selection and expansion after compiling.
Fix issues where the Module Hierarchy did not always allow scrolling. Issues where Connectors are displayed in the Module Hierarchy remain in certain cases.
Fixed debug draw smearing on Control Rig.
Fix an issue where Control Shapes remained partially selected in Modular Rigs when a Rig Module was compiled.
Fix Control Rig import from text heap use after free, due to the relocation of the element transforms after adding a new element.
Fixed Modular Rigs overrides causing an infinite recursion in the tagged property serialization.
Fixed a Control Rig crash adding a graph after renaming another newly added graph.
Deprecated:
Deprecate FRigControlElement::Settings direct Blueprint access -- adds deprecated UPROPERTY so existing BP graphs still work with warnings, and adds GetControlSettings(Key) BlueprintCallable as the migration target.
Cleaned deprecated methods from UAF (up to 5.6).
Cleaned deprecated methods from RigVM (up to 5.6).
Cleaned deprecated methods from Motion Warping (up to 5.6).
Deformer Graph
Bug Fix:
Deformer Graph
Fixed crash when using secondary skeletal mesh component binding in a deformer graph.
Fixed various crashes and assertions in Deformer Graph when it is used in a Control Rig while Asset Save is ongoing.
Fix issue where deformer settings were lost during bp component reinstancing process.
Gameplay
New:
Pose Search
PoseSearchDatabase editor multi selection improvements.
Pose Search databases created for Chooser Columns now default to BruteForce, since KD Tree usually fails with external filtering.
PoseSearchColumn support for unique PoseSearchDatabase per row.
PoseSearchColumn (motion matching integration with choosers) bug fixes.
PoseSearch plugin motion matching drawing bug fixes.
Added a project setting (Project Settings → Pose Search → MaxDatabaseEditorPreviewActors, default 50) that caps the number of actors spawned in PoseSearchDatabase editor.
U Pose Search Interaction Asset::CalculateWarpTransforms improvements.
Added Experimental BlueprintCallable UPoseSearchInteractionLibrary::MotionMatchMulti, new API to perform multi character motion matching searches without any frame delay.
New PoseSearch plugin Blueprint callable OverridePoseHistoryFromOwningMesh function to override the pose history pose with the mesh pose to enable, for example, motion matching physics poses.
Added UAnimNotifyState_PoseSearchSamplingRange notify state, used to to include animation segments into PoseSearchDatabases.
Strip out disabled PoseSearchDatabase animations during cook.
Fix montage trajectories not working when operating on pawns not characters.
Make montage prediction CVar `a.PoseSearchTrajectory.UseWarpedMontage` affect Mover / when using predictor as well.
Add support for experimental posesearch generation of warped montage trajectories.
Remove all direct actor transform references from root motion modifiers.
Add 'UMotionWarpingTrajectoryAdapter' which may optionally exist on a 'UMotionWarpingComponent' to predict trajectory.
Add `FRootMotionModifierSwapState` to store warping state pre-prediction and restore state post prediction.
Add "Prediction Mode" to 'UMotionWarpingComponent' where it uses the swap state / new adapter to predict warped trajectories.
Add Experimental `UPoseSearchTrajectoryLibrary::PoseSearchGenerateWarpedTransformTrajectory` to generate warped trajectories.
Add `GVarPoseSearchTrajectoryUseWarpedMontage` to enable warped montage trajectories by default.
Improved UPoseSearchInteractionAsset warping calculations.
Removed some UE 5.6 deprecations from PoseSearch plugin.
Optimized PoseSearchDatabase DDC key generation by removing template objects.
Renamed few motion matching stats from the PoseSearch stat group (Search Brute Force, Search PCA/KNN, Search VPTree, Search Event into PoseSearch Brute Force, PoseSearch PCA/KNN, PoseSearch VPTree, PoseSearch Event).
Account for mesh scale when calculating Motion Warping warp points. Enable with a.MotionWarping.UseMeshScale.
Exposed UMotionWarpingComponent::FindWarpTarget as BlueprintCallable.
Add handling for angular velocity to trajectory history tracking so that spinning platforms are handled properly.
Add Anim Node Functions to support applying a delta to the offset root bone's internal simulated transform.
Added UCurveFromSyncMarkersModifier to generate a curve from synch markers.
Added Blueprint-exposed ResetSync function to reset sync group information on Anim Graph.
Removed experimental MotionMatchingInteraction node.
Add a OnInputDeviceHardwareInfoAvailable delegate to the input device mapper, which allows for code to bind to connection events and be guaranteed to run before other systems like Common Input/User code. This makes it possible for the UInputDeviceSubsystem to query the FInputDeviceScope, and make the necessary associations of the known hardware device Id to the new FInputDeviceId.
Sync group support for follower blendstacks.
Optimized motion matching interactions performance with a custom hash grid.
Defaulted motion matching trajectory generation in mesh space rather than using the Character.View.Rotation.Yaw when the character is set to orienting the rotation to movement.
Added URootMotionModifier_Blueprintable, new MotionWarping URootMotionModifier blue print overridable.
Motion matching interaction performance improvements.
Bug Fix:
Pose Search
PoseSearchDatabase fix for not being able to copy paste in an empty database.
PoseSearchDatabase DDC key generation fix, to support objects with duplicated down dependencies.
Fixed a bug where for inconsistent past velocities in motion matching due to history points being offset by delta time, causing noise in past velocity when delta time is not constant.
Fixed PoseSearchDatabase editor preview of static mesh attachments.
Fixed PoseSearchSchema velocity channel debug visualization.
Fix for PoseSearchDatabase indexing looping animation assets.
Fixed crash in FAsyncPoseSearchDatabasesManagement::RequestAsyncBuildIndex when database dependent animation assets failed to compress.
Fix for missing PoseSearchDatabase indexing on reverting and reloading dependent assets.
Fix for UPoseSearchFeatureChannel::CanBeNormalizedWith.
Fix for missing FMemMark(s) in FPoseSearchColumn::Filter and FPoseSearchColumn::SetOutputs.
Fix for PoseSearchDatabase DDC key determinism when supporting Choosers PoseSearchColumns.
Making sure there're no flying animation tasks when on game thread by calling GetProxyOnAnyThread, so it's safe to access animinstance variables in UPoseSearchLibrary::MotionMatch.
Fix for UPoseSearchLibrary::MotionMatch crashing when reusing an invalid continuing pose from a previously evaluated schema.
Motion Warping
Add an "AdditionalRotationOffset" in the root motion modifier that allows rotational offset to be specified per animation. This avoids conflicting rotations when warp points are used by multiple different actions. Note that any setup using a rotational offset with facing mode will need to be manually adjusted (this was introduced in 5.7).
Deprecated EMotionWarpRotationType::OppositeFacing and EMotionWarpRotationType::OppositeDefault since they can be achieved with an additional rotational offset of 180 degrees (existing data will be automatically converted).
Stop using the warp point's rotation offset when in facing mode.
Fix for crash while changing levels because of invalid FRewindDebuggerTrajectory::WorldToVisualize.
Fix to allow the DisplayWorldId to be set while analyzing local sessions. Without this, the debugged mesh is lost after the PIE session ends.
Fix montages do not mark blending out sources as inactive.
Fix for previewing game generated pose search debugger data with the editor.
Fix for SearchThrottleTime not working properly in FAnimNode_MotionMatching::UpdateAssetPlayer and FMotionMatchingTrait::PreUpdate.
Fix for crash in USkeletalMeshComponent::ForEachBodyBelow when instantiated Bodies do not match the SkeletalBodySetups in the Reference Skeleton Mesh.
Fix for FAssetIndexer::Process crashing on schemas with roles improperly setup.
Fix issue where GetPoseIndex could return an invalid pose index when there are multiple sampling ranges on the same animation asset.
Deprecated:
Removed 5.6-deprecated PoseSearch methods.
Deprecated: UPoseSearchFeatureChannel_Curve::BP_GetCurveValue, UPoseSearchFeatureChannel_Heading::BP_GetWorldRotation, UPoseSearchFeatureChannel_Velocity::BP_GetWorldVelocity, UPoseSearchFeatureChannel_Position::BP_GetWorldPosition, in favor of UPoseSearchFeatureChannel_Curve::BP_GetCurveValueFromContext, UPoseSearchFeatureChannel_Heading::BP_GetWorldRotationFromContext, UPoseSearchFeatureChannel_Velocity::BP_GetWorldVelocityFromContext, UPoseSearchFeatureChannel_Position::BP_GetWorldPositionFromContext, taking the more versatile FChooserEvaluationContext as input.
IK and Retargeting
New:
IK Retargeter
Override Set editor: Add Child, Search Bar, Keyboard Shortcuts, Duplicate, Reordering
Added DuplicateRetargetOverrideSet() to the controller API (Blueprint/Python callable). Creates a new override set with a unique name, copying all property overrides, parent assignment, and active-by-default state from the source set.
Added "Duplicate" entry to the Override Set tree view context menu between Rename and Unparent.
Add Child: Context menu action to create a new override set parented under the selected set.
Search Bar: Enabled the built-in details panel search bar for the Override Set editor.
Reordering: Added ability to reorder override sets in override set tree.
Keyboard Shortcuts: Delete/Backspace deletes selected override set, F2 renames it.
Override Set Reordering: Fixed drag-drop to distinguish between reordering (AboveItem/BelowItem) and parenting (OntoItem). Added DisplayOrder field for persistent sort order. Reordering makes the dragged set a sibling of the target at the correct position.
Expose bRetainAdditiveFlags to RunBatchRetarget Blueprint/Python API.
Added bRetainAdditiveFlags to FIKRetargetBatchOperationInputs so that Blueprint and Python scripts can control whether additive animation attributes are preserved during batch retarget.
Updated all 17 biped templates to split the existing LeftLeg/RightLeg chains: LeftLeg/RightLeg chains now end at the ankle/foot bone (previously ended at ball/toe) New LeftFoot/RightFoot chains cover the ball/toe bone.
IK goals remain on the leg chains, now created at the ankle/foot bone.
Updated FBIK auto-setup defaults:
SubIterations: 0 → 10
Goal ChainDepth: 0 → 2
Updated Biped Templates,
Added new Templates for Blender Rigify and Meshcapade.
Add override set dropdown to Batch Retarget window When using a manually supplied IK Retargeter in the Batch/Auto Retarget window, there was no way to select override sets.
Added a dropdown (FName with GetOptions) that lists available override sets from the assigned retargeter asset. Selected override set is applied to both the live preview viewport and animation export. Dropdown is disabled when using auto-generated retargeter.
RigMapper Definition editor graph improvement: Made importing inputs/outputs from Control Rig optional through a check box in import dialogue in order to reduce clatter.
Improved RigMapper Definition editor graph Comment nodes to fully enclose selected nodes and to trigger on "C" key command.
Improved validation messages and notifications for RigMapper Definition editor graph. Notifications are now displayed in the graph header. Before they could be seen only in log.
Added Math Operations feature to RigMapper Definition with a corresponding node in RigMapper Definition editor graph. This op includes all unary, binary and N-array standard mathematical operations selected through the drop down box.
Improved zooming in/focusing a node and all connected nodes by lowering opacity to non selected nodes and zooming in/out to capture selected ones.
Implemented Comment node feature for RigMapper Definition graph.
RigMapper refactoring to include numerous quality of life changes:
Improved Undo/Redo system.
Persistent node positions between sessions (Graph is no longer recreated every time it is opened).
Added feature which imports Input curves from Skeletal Mesh.
Fixed a problem with RigMapper Definition cache not being cleared when modified.
Updated IKRetargeter Curve OP stack:
RigMapper Op is now a sub-operation of CurveRemap Op.
RigMapper divided into RetargetRigMapperUserDataOp which uses RigMapper Definition embedded in target mesh UserData, and RetargetRigMapperOp which contains single RigMapper Definition data asset.
Added possibility to select multiple RigMapper Ops in a single substack.
Implemented RigMapper Definition Graph pin interactions:
Added support for breaking links from a node.
Added support for moving links from one node to another.
Implemented support for adding new connections by dragging and dropping to a different node.
IK Rig: Allow enabling/disabling anim graph node w/ cvar a.animnode.IKRig.Enable.
Quality of Life improvements:
Allowed adding more pins to nodes and automatically generating connections to other nodes.
Fixed a bug with importing a Definition from JSON file.
Added constraints when removing pins so the minimal required number of pins are preserved depending on the feature.
Improved memory management and performance.
Reimplemented RigMapper Definition Graph to be interactive:
Nodes can be moved around, although position will not pre preserved on reopening.
Nodes can be created from a connection or standalone though a context menu.
Nodes can be updated through details panel on the right side.
Added a Context menu on right click on node or graph.
Nodes can be relinked and links can be removed.
Bug Fix:
Fixed and improved RigMapper Linked Definition validation to include NullOutputs which are subsequently used as inputs.
Relaxed validation of hanging inputs and outputs for RigMapper Linked and Baked Definitions to allow pass-through with a warning.
RigMapper definitions tongue fix on RM_CDH_FNM, RM_MHH_CDH and related Linked Definitions and Baked definitions.
Updated RM_CDH_FNM rig definition to address an issue with inverted corner sharpen and upper eyelid controls.
ML Deformer
Deprecated:
Cleaned deprecated methods from MLDeformer (up to 5.6).
Physics Control
New:
Physics Control Component
Add BP support for specifying collision ignore/include pairs - Enable/DisableCollisionBetweenBodies.
Enable/disable angular drives applies to slerp as well as twist/swing.
Make sure that limb-generated controls get automatically added to a set with the limb name.
Fixes for Physics Control Component names, so they're never called "". Note that this will change the names of some controls/modifiers, and if those are being referenced explicitly (by name) the assets will need to be patched up.
Functions added to log controls/modifiers.
Adds checks that controls/modifiers/sets that are passed in are valid (and optionally warns if not).
Drives now have a Join Limit Violation Response. The available options are: Clamp the skeletal animation drive targets to joint limits, or Widen limits to accommodate the target. In addition to either respecting the joint's limit or the animation, this prevents spurious forces and torques present when drive and limits are fighting (response 'None' option).
PhysicsControl plugin is now marked as ready for production use.
Support for applying forces in the control rig physics and RigidBodyWithControl animation graph nodes.
Bug Fix:
Physics Control Component: Addresses various problems with tick ordering/dependencies so that 1. it waits until the input pose is ready and 2. it ensures the tick is not pushed into PostPhysics by (for example) CharacterMovementComponent when on dynamic floors.
Guard against the RequiredBones container in RBAN and RBWC InitializeBoneReferences having an empty reference pose (to prevent a crash).
Fix for bad memory access when world collisions are enabled in RigidBodyWithControl or RBAN.
Prevent PhysicalAnimationComponent crash if physics blending is enabled mid-tick.
Runtime
New:
Anim Montage
Fixed montage forced position handling during advance if forced position gets updated multiple times without advancing the montage in-between e.g. on sequencer loops or with URO enabled Guarded by CVarUseForcedSequencerMontageLoopBehavior(a.Montage.UseForcedSequencerMontageLoopBehavior). Turned off by default.
Added additional safety checks in FAnimMontageInstance::Terminate().
Added guarding against negative blend times on montages.
Added CVar a.Montage.UseForcedFromPositionAsSubStepOrigin - if ForcedNextFromPosition is set, use it as the sub-stepping origin in FAnimMontageInstance::Advance instead of the previous internal position. Enabled by default.
UAF
Add OffsetRootBone anim node.
Add variable container name to variable trace.
Translational retargeting trait.
Added the option to display trajectory velocity in debug log.
Added new OverrideRootMotionTrait.
Add InputValue anim node/op.
Add FPoseValueBundle as a typed pose overlay for FValueBundle.
Implicit cross-skeleton remapping at graph input boundary. Remaps poses automatically when a foreign skeleton enters a graph via PushPose so node authors never deal with cross-skeleton concerns.
Add the ability in UAF to specify the end tick group for events.
RigVM
Add package path to some rigvm compile error reports.
Add CharacterMovementComponent to allowed class types in RigVM.
Add CVar to suppress duplicate anim node slot names warning.
Add CVar that allows for using MovieScene GUID rather than channel hashing for partial-UAnimSequencerDataModel hash (significant speed-up, downside is MovieScene GUID invalidation is non-deterministic).
Added additional pose validity checks when getting the target transform of a bone socket references.
Added additional pose validity checks to ConvertWidgetLocation in FAnimNodeEditMode.
Reimplementation of "Speed up UAnimSequence::CreateDerivedDataKeyHash" - drastically decreases time spend on Animation Sequence its DDC key generation.
Added ObjectsSelected delegate interface function to IAnimationEditor.
Added virtual keyword to FAnimInstanceProxy::UpdateCurvesPostEvaluation.
Allow Custom Widgets for AnimNotifies.
Rename
INodeObjectInterface → INotifyNodeObjectInterface.
ETimingElementType → ENotifyTimingElementType.
Allow Custom Widgets for AnimNotifies.
Rename
INodeObjectInterface → INotifyNodeObjectInterface.
ETimingElementType → ENotifyTimingElementType.
Expose certain solver collision settings to RBAN and RBWC nodes to allow for improved environmental collisions. This gives parity with functionality in control rig physics. Also added a new category for the details panels to clean up the UI.
Expose Set/Get Accumulated Time in BlendSpacePlayerLibrary.
Added experimental Animation Layering plugin containing:
Copy Bone Motion Anim Node.
Copy Bone Advanced Anim Node.
Bone Mask Anim Node.
Added Scoped Crash Data For Animations (Make animation crashes easy to debug).
Notify States: Added the option to not merge the lifetime of notify states on concurrent plays of the same animation asset.
Allow for notify event dispatch to be disabled on a per-mesh component basis. This doesn't prevent the notifies from being sampled but the associated events will not be dispatched at the end of animation update when the flag is set.
Allow priority to be set on transitions to conduits so it's possible to deprioritize them vs transitions to other states.
Marked GetCurveValueWithDefault() in AnimInstance as const.
Fixed description of BoneIsChildOf.
Enable animation frame stripping cvar support in editor Useful for debugging purposes.
Exposed AnimMontages track properties to BluePrint.
Offset Root Bone: Added support for teleporting.
Pose History: Added Blueprint library functions to get bone data from pose history.
Force property access pre-event graph update callsite to be invoked prior to InitializeRootNode being called. This prevents property access errors coming from anim nodes that call GetEvaluateGraphExposedInputs from Initialize_AnyThread.
Added standard blend for Anim Graph mirroring node.
Add user-exposed NotifyInstanceID to FAnimNotifyEventReference. This can be used in user events to tell notify instances apart.
Added populating the error log with names of missing skeleton bones, when a mesh has bones that do not exist in the skeleton yet.
Removed no longer used additive total bone weight array from the BlendProfileScratchData and SlotEvaluatePoseWithBlendProfiles.
Add 'Ignore Pose Asset Source Animation Curves' property to the pose blend node.
Marked UAnimInstance::GetCurrentStateName as const and added const correctness in function body.
Add filter for non-additive animations in the animation editor asset browser.
Removed deprecated functions in USkeleton (GetSkeletonRemapping, GetAssetRegistryTags, CollectAnimationNotifies, GetRawAnimationTrackIndex).
Bug Fix:
UAF
Fixed uninitialized variable ContentOnly in SRigVMFunctionPicker causing state tree function binding regression.
Fix: ExecuteBindings_GT not gated by external prereqs added via module dependency traits.
Fix for multiple copies of variable instances showing up in rewind debugger for graphs.
Fixed check failure on shutdown.
Fix for GetHostTransform not reporting the correct value until the actor has moved after spawn.
Add handling for rare cases where anim sequence memory mapping fails.
Ensure linked anim instances created by a post-process anim instance are not reset prematurely.
Fix ABP linked layers crash due to stale node references during cross-asset compilation.
Fix early check for derived anim Blueprints causing crashes when parent class skeletons were deleted Add update path for derived anim Blueprints when parent skeletons mismatch or are deleted.
Ensure anim instance functions wait for async animation updates to terminate when called from the game thread.
Improved Animation Notify track behavior when displayed and used at non-standard DPI level.
Fix for inaccurate root motion playback on first loop in persona editor.
Animation Modifiers: Fix for revert and removal when bReapplyPostOwnerChange=true.
Fixed ensure when opening Animation Sequence containing (additive) transform curve(s).
Addressed non-deterministic cooking behavior caused by Animation Graph Slot nodes.
Fix for Constraint AnimNode when initial weight is zero but in the future will be non-zero.
Fix for crash in Constraint AnimNode when changing setup while running.
Anim Montage: Fixed prematurely calling of AnimNotifyStates end events when the montage advance is driven by forced positions and their delta is zero (e.g. from a frame-locked Sequencer with unstable frame times).
Fix missing compatible skeleton conversion when retrieving attributes.
Get the correct compact pose bone index rather than mesh bone index.
Fix up missing calls to initialize FK control rig hierarchy when running in lazy init mode.
Avoid crashing when blend space sample uses a null animation sequence.
Always preload animation sequence dependencies as MT async loading requires manual handling.
Fixed crash when updating blend samples in a Blendspace while PIE is running in a separate window.
Fixed crashes caused by NaN bone transforms coming from AnimNode_StrideWarping.
Fix for potential NaN bone transforms generated inside AnimNode_FootPlacement if root is rotated exactly 90 degrees from expected approach direction.
Set anim group follower LeaderScore to always be less than any possible leader, to avoid selecting any follower as leader if there's any leader in the FAnimGroupInstance.
Fixed ensure in UAnimInstance::TriggerQueuedMontageEvents.
Skeletal mesh component now refreshes the skeletal mesh asset at PostEditImport, so the skeletal mesh is not lost after a duplicate.
Fixed crash in DebugDrawSkeleton when using 'show bones' command.
Validated that users are not trying to apply an anim BP preview overlay to self.
Move leader component test earlier in CopyPoseFromMesh to make sure our bone map is updated correctly.
Make SharedContext a unique ptr to force destruction when released in FAnimNode_SaveCachedPose::PostGraphUpdate.
Fixed issue where Additive and Blend components within an Animation Sharing setup were not locked to LOD0, causing artifacts on non-LOD-compatible target components.
Fix potential thread-unsafe access to skeleton remapping data. In that case of FReferenceSkeleton, limit when the remapping data is refreshed to only when it's a skeleton and not a mesh that is having it's ref skeleton rebuilt.
Fixed CopyBonesModifier for bones without pre-existing curves.
Fix issue with blended curve container not correctly tracking when it is sorted.
Fix to allow notifies that are sampled via AnimSingleNodeInstance to store the current playback time. This means that UAnimNotifyLibrary functions that rely on the current time can be used on these notifies.
Enable FBoneSocket Target Pickers in Contexts Outside Anim Montages.
Prevented crash loading into CitySample using -dpcvars=Editor.ObjectReverseLookupMode=2.
Deprecated:
Cleaned deprecated methods from animation runtime (up to 5.6).
Removed non-reflected UE_DEPRECATED items (5.0-5.6) spanning Engine/Source/Runtime/Engine/{Classes, Public}/Animation, Engine/Source/Runtime/AnimGraphRuntime (+ MovieSceneTracks anim nodes), and Engine/Source/Editor/AnimGraph compiler interfaces.
Cleaned deprecated methods from LiveLink (up to 5.6).
UAF: Fixed incorrect deprecation logic in AnimNextComponent when loading Blueprints with data inheritance on deprecated variables.
Deprecated CachedSoftObjectPtr in USkeleton.
Sequencer
New:
Sequencer
Delete Mark is now Delete Selected Marks which allows the selected marks to be deleted at once.
Add Mark is now Add Mark at Playhead which adds a mark at the current playhead as opposed to where the mouse was pressed.
Playing a sequence in the editor now honors the time bounds (selection range when set, otherwise playback range), matching rewind and key-jump behavior.
Playhead scrubbing can now be limited to the selection range, in addition to None and Playback Range.
Bake Transform is now available from the object binding right-click menu.
Added missing Convert to Spawnable command binding, and route Level Sequence conversions through Convert To Custom Binding so custom-binding spawnables work.
Bake Transform now disables the original track instead of toggling each section, matching the Bake to Control Rig behavior.
Add support for Material Slots Overlay Material switching and parameter animation. .
Assigning a spawnable to an object property now creates an Actor Reference Track automatically, so the reference doesn't go stale when the spawnable's path changes.
Component Attachment tracks now respect hierarchical bias, so a higher‑priority attachment section correctly overrides a lower‑priority one when they overlap.
The Actor Reference track now supports Completion Mode, so disabling or muting them properly restores the prior reference.
Jump to Next/Previous Key now respects looping. When looping is off, it no longer wraps past the first/last key.
Add Selection from Content Browser is now a bindable command, so you can assign it a keyboard shortcut in editor preferences.
The Actor Reference track (used for properties like the Cine Camera's Look At Target) has been upgraded to Sequencer's ECS evaluation system, aligning its performance and ordering with other tracks.
Lighting channels on primitive components are now animatable.
Dragging a marked frame now translates selected keys and sections along with it.
Pausing the game now pauses the Sequencer clock as well (opt out via Sequencer.AllowPausedClock 0).
The back/forward mouse buttons now navigate forwards/backwards through sequences, matching the Blueprint editor's tab navigation.
Snap to Markers while scrubbing now snap to the playback start/end and selection start/end frames.
Markers are now also selected with Select All in Selection Range, Select Forwards, and Select Backwards. Added a new option to Select Markers in Selection Range.
The Add Track button for Subsequences now allows creation of custom Level Sequence subclasses.
Remove DisplayName="Anim Sequence" for MovieSceneSkeletalAnimationSection because it conflicts with Anim Sequence assets.
Add a way for stitch track to work with Animation Blueprints. This is a bit of a workaround for the issue of pose history not being able to be both read from and written to easily via an attribute, which is necessary for the stitch track. Now, the user can add an 'OverridePoseHistoryName' which, in animation Blueprint mode, will look for a pose history node tagged with that name and pull the pose history from it for use in the stitch track. This allows the pose history node to be _after_ the sequencer target node, which is necessary for blending out to work correctly. In addition, we set up an example properly in the AnimSandbox to show this working.
Deselect marked frames when keys and sections are also deselected. Disallow marked frame movement when they are locked.
Limit Viewport Selection is now in the viewport menu whenever a sequence is active (was Animation-Mode-only); UMG and Actor Sequence get the button in their own toolbar.
Anim In Engine: Control Rig use ECS evaluation by default Users can fall back to legacy evaluation with: ControlRig.UseLegacySequencerTemplate true.
Add SequencerTools toolset for AI-driven sequence creation and editing.
Added call to Global Dependency Graph update cache in OnAllModuleLoadingPhasesComplete to prevent the graph's cache to update when the first sequence is played. In the event that a plugin/module that mutates this graph loads after OnAllModuleLoadingPhasesComplete, the cache will be invalidated and will be updated when the first sequence is played.
Sequence Validator: Fixed Whole Section Ranges rule reporting incorrect results.
Bug Fix:
Sequencer
Visibility Track keys are now correctly set with their current values. Visibility is inverted from their Hidden property and the setting of the key was not correctly inverted.
Fix FVector2f/3f/4f tracks dropping keys silently UnpackChannelsFromOperational(const FFloatIntermediateVectorand) was writing FMovieSceneDoubleChannel entries, but UMovieSceneFloatVectorSection stores FMovieSceneFloatChannel curves. When keying, the channel proxy lookup returned nullptr and the key was silently dropped.
Cooking a project that uses Time Warp tracks inside child Level Sequences no longer fails with an "illegal reference to private object" error.
The camera cut tracks which have preroll now take into account the instance transform data of a level sequence which is passed to the streaming manager.
Update the possessed object class when matching possessable GUIDs (including ones that bind to spawnables), so bindings no longer hold a stale class.
Conditional sections inside a subsequence now evaluate correctly when a parent sequence is conditionally disabled.
Sequences with camera rig rails are no longer incorrectly marked dirty on save. Spline components in these camera rig rails are just visualization components, and those don't need to be regenerated or have their physics state be recreated on save.
Fixed a RepLayout mismatch from an editor-only field in MovieSceneSequencePlaybackSettings.
The entity system threading model is now refreshed at each call site after ScheduleTasks, instead of inside ExecutePhase where it was computed too early.
Fix race condition in TEntityTaskComponents::Schedule_PerAllocation Schedule_PerAllocation on TEntityTaskComponents (the unfiltered path) was setting bSerialTasks = false, making it behave identically to Fork_PerAllocation and allowing multiple allocations to run in parallel on different threads. This violated the Schedule_ contract that guarantees serial execution of ForEachAllocation calls. The filtered variant (TFilteredEntityTask::Schedule_PerAllocation) and both Schedule_PerEntity overloads correctly set bSerialTasks = true.
Film overlay options menu commands no longer stop working because they were bound to a transient widget that could be destroyed when the toolbar refreshed.
Dragging the selection range end with the time slider now sets it as exclusive, matching the playback range behavior.
Fixed the inverse sequence transform calculation, correcting subsequence time mapping.
Setting the selection range start/end now respects the snap interval.
Hide Selected / Isolate Selected with no tracks selected no longer hides or isolates every track.
When importing an fbx, tangents are now negated when Force Front X-Axis is enabled, keeping curve shapes consistent under the flipped axis.
Spawn template creation now guards against a stale object of a different class occupying the same name under the same outer.
Material Parameter Collection tracks no longer lose their derived display name on PostLoad when the stored name was already empty.
Renaming a subsequence while viewing through it no longer crashes.
Fix bug in ECS Control Rig that left the anim instance in an incorrect state after baking an anim to control rig requiring clicking on the control rig track to get it to work correctly. This was caused by the skel anim system restore state triggering an anim instance reset after the control rig had set the new anim instance. .
Remove redundant RelevantComponent from UMovieSceneSkeletalAnimationSystem RelevantComponent was set to SkeletalAnimation in the constructor, which caused IsRelevant() to short-circuit to true whenever any entity had a SkeletalAnimation component, bypassing IsRelevantImpl. This meant the system would get linked even when all skeletal animation entities had the AnimMixerPoseProducer tag, which IsRelevantImpl correctly filters out. .
Generating a track/section/key from the keyframe button in the details panel now correctly resolves nested array properties (ie. MyArray[0].bVisible).
Bake Transform now gathers key times from all sections of a transform track, not just the first.
The Perlin noise menu now uses the display text instead of the raw channel name.
OnQueueSubtitles / OnAudioFinished / OnAudioPlaybackPercent delegates are re-bound (or cleared if unbound) when an AudioComponent is recycled across plays.
Clicking on the Render Movie button will now respect the Movie Render Queue job type (i.e. Movie Graph).
The object binding menu now only traverses bound objects, so spawnable template components aren't accidentally bound to new bindings.
Pinning a track no longer swaps the main track area's view model with the pinned area's, keeping the two views properly separated.
Removed ALevelSequenceActor dependency from FLevelSequencePlaybackContext.
Fixed a bug where conditions were not actually checked in subsequences.
Compiling a Blueprint while a sequence is open no longer triggers a pre‑animated state restore that could race with async loading.
Defer outliner reparenting that previously happened mid-iteration, fixing potential instability.
Toggling Net Addressable Name on a spawnable now sticks. It's no longer reset every time the object template saves.
Property bindings that resolve to a non‑existent array element are now flagged as invalid, instead of silently failing or evaluating against stale data.
Camera Cut tracks set to "Keep State" now restore to the correct view target on repeat playback, and Keep State sections following Restore State sections keep animating their properties instead of snapping back when the prior section ends.
Tracks that rely on cleanup callbacks (like Control Bus modulation on audio tracks) now release their resources correctly when you close Sequencer after a Play-In-Editor session.
Editing a property on a character's mesh component in Sequencer no longer snaps its animation pose back to the reference pose. The pose now updates correctly whether you select the actor or the mesh first.
Skeletal mesh animation pose no longer resets when you edit a property on a component (subobject) of the actor.
Fixed not being able to set just the X, Y, or Z channels of a transform for a skeletal mesh.
Camera Cut and Cinematic Shot thumbnails only update during PIE when the PIE world is the one bound to Sequencer, so MRG/MRQ runs don't spuriously refresh them.
Fix issue with baking code (and other code) that uses FindSpawnableObjectTemplate in the case that the guid passed in is a possessable that is possessing a spawnable in another sequence. We now check for that.
Fix crash when closing Sequencer during deferred modification flush We do this by suppressing the deferred modification flush events during the destructor.
Fix crash when compiling sequences with null tracks Runs 'RemoveNullTracks) before calling CompileTrack() to prevent crashes when a sequence contains null track references. We need to track down what is causing tracks to be null, but this should fix the crash as it currently exists.
Fix Control Rig ECS crash that happens with dynamic rigs that change the control rig channels mid evaluation. To fix this we hold a hash of the channel list in the control rig component data and if it changes we re-copy the channel pointers into the ecs component or unlink if channels no longer exist. .
Sections with no channels are again considered keyable (regression fix for keyable detection).
Fix crash when keying non-object properties in ObjectPropertyTrackEditor Adds a check to make sure the property is actually an FObjectPropertyBase before calling GetPropertyValue(). This prevents a crash when a non-object property is incorrectly routed to this track editor, as the type size assertion in GetPropertyValue would fail. fix animation/sequencer.
Delete Channel no longer fails to delete when only the first name in the path matches. It now matches the last name in the path which is the actual channel name.
Splitting or trimming a section now places boundary keys with the correct values and preserves each key's original interpolation type, so a linear curve stays linear instead of being forced into a cubic S‑curve.
Fixed crash when a level sequence has a null track.
Fixed a crash that could occur when evaluating sequences with transform origins gathered from multiple subscenes in parallel.
A Template Sequence section's Hierarchical Bias now initializes before config can overwrite it, so per-section overrides stick instead of inheriting the config default.
The viewport no longer jitters when the aspect ratio is animated.
Sequence players set to loop now remember their loop count after playback ends. Restarting a looping sequence plays as a loop instead of playing once and stopping.
Camera Cuts and other pinned tracks no longer disappear from the timeline when dragged into a folder. Sequencer now blocks drops into folders with a mismatched pinned state and shows no drop preview.
The time-display UI now refreshes after subsequence nested transforms update, so local time reflects the current context instead of the previous one.
Editing the Level Sequence Actor's Transform Origin now marks the sequence dirty so the editor re-evaluates it.
Whether using anim Blueprints or custom mode, the previous anim instance gets force re-initialized after sequence is over, potentially resetting data stored in the AnimInstance unnecessarily. Previously this would only occur if the skeleton changed, but we attempted to address an issue where if Custom Mode was used, the previous anim instance was getting uninitialized anyway, and would now be stuck in an uninitialized case. That fix was a bit overzealous however, as this forced re-initialization was even occurring for cases where animation Blueprints were used and we weren't switching anim mode or anim instances. This change only re-initializes if Sequencer changed (and is now restoring) the anim instance.
Fragment type strings for the Universal Object Locator are now encoded/decoded so characters that are illegal in object names survive serialization.
The audio track no longer crashes when its played from an Actor Sequence.
Dragging the time range slider now properly accounts for display scaling on the desktop.
Resolving setter functions for bool properties now strips off the leading 'b' (eg. SetVisible matches the bVisible property).
Sequencer no longer expands procedural channels (like Perlin noise) to the keying time when adding keys to neighboring channels. Noise tracks keep their original length.
Audio in Sequencer no longer restarts incorrectly when the playhead jumps, and audio that was paused or stopped stays paused instead of being restarted by a forced time‑sync.
Control Rig: Fix Sequencer space channel evaluation in ECS path , [at]benoit.gadreau.
Fixed crash on EndPlay when using a Sequencer that contains a Spawnable ChaosCacheManager.
Sequencer Media track: Drag/drop of media onto a track no longer crashes.
Sequencer ECS Control Rig: Fix issue where additive section weights were getting double-applied. The code didn't quite match the old eval template- we need to only apply weight to absolute sections since it already is getting applied to additive sections via the parameters themselves getting weight applied.
Sequencer Scripting: Add Key In Channel now honors the Sub Frame argument when Time Unit is Display Rate.
Sequencer Control Rig: Fix issue where if multiple parameters with different types have the same name it can prevent the right parameter from being keyed. [at]ue-sequencer
Re-added logic to handle Pasted Actors when pasting bindings.
Fix to ensure that control rig shape actor is parented to the root component of the actor it is driving. This prevents circular dependencies for actors that don't have the root component as the default attachment component when a control rig is then attached to them.
Movie Scene: Fixed issue where zero-scaled components would get their render state dirty called every time UE::MovieScene::SetComponentTransform is called.
Fix for when an animation instance is a post process anim instance that is being evaluated we would fail to verify if it has changed because we don't check that it is post process. This marks the sequence as dirty and triggers the spawning phase to happen every frame. Now we validate against post process animbps as well.
UAF Root Motion Extraction fix Move the same checks we do in the old code regarding 'Force Lock Root Bone' to allow root motion to still be extracted.
Fix various issues where the normalized view did not always draw its curves correctly.
Fixed visibility system to define implicit prerequisites only for the CDO. Additionally FSystemDependencyGraph::MakeRelationship only increments serial number if an edge was truly added to safeguard against situations where MakeRelationship gets called for the global dependency graph outside CDOs.
Fix an issue where some curve types failed to draw the curve line before the first visible key correctly.
Cine Camera: The Sensor Aspect Ratio is no longer animatable since its value is derived from Sensor Width and Height.
Skeletal Editing
New:
Skeletal Mesh Editor
Explicit Asset Save action also applies pending changes to the asset before saving to disk.
Ported Bake Vertex Color tool from Modeling Mode.
Changing from one tool to another no longer requires pressing the accept button, multiple tool changes are cached and bulk committed only when users explicitly press apply changes to asset.
Added various menu options in the Morph Target Viewer to edit and manage morph targets, including mirror/flip/merge/apply current weight and several others.
Added geometry selection support for Morph Target editing, which allows for vertex level transform, soft selection and geometry isolation.
Added support for bone weight locking to Edit Skin Weights Tool.
The Skeletal Mesh Editor now shows a linear color ramp instead of an array of colors.
The Skeletal Mesh Editor now has a dedicated menu in the asset editor viewport toolbar.
Skeletal Mesh Morph Target Editing Tools
Added Mask Morph Target Tool, which applies a custom mask to the editing morph target.
Improved Move brush in Sculpt Morph Target tool such that it is non-accumulating and easier to control.
Improve copy-pasting and duplicating bones.
Add new options to Paste Local and Paste Global.
Pasting bones now retains the hierarchy of pasted bones.
Pasting bones now pastes copied bones and their children.
Duplicate now retains the hierarchy of duplicated bones.
Added Dataflow based workflow to reimport a skeletal mesh from mesh and preserving all existing attribute and morph targets.
Added a Dataflow Template for Skeletal mesh that takes a static mesh, split it by its mesh islands and convert it to a skeletal mesh where each mesh island is rigidly skinned to a separate bone.
Skeletal Mesh Modeling Tool: Added "Import Bones from Assigned Skeleton" menu option to Edit Skeleton Tool.
Added two Dataflow templates for skeletal meshes : Skeletonizer and Subdivision.
New hotkey Alt-B to toggle draw bones.
Add Dataflow support for Skeletal mesh asset.
Skeletal Mesh Modeling Tools: Added support for cotan edge weighting in Edit Skin Weights tool.
Skeletal Mesh Editor and Modeling Mode: A new version of the paint maps tool is enabled by default, to revert to the old version, use cvar "ModelingTools.UseExperimentalMeshAttributePaintTool 0" and re-enter the editor mode.
Ctrl-clicking the selection mode buttons in the skin weight tool now converts selection from one mode to another.
Mirroring now replaces strings from the right, finds strings anywhere in the name and supports regular expressions.
Added a Clear() method to USkeletalMesh, to help prepare a USkeletalMesh for re-use w/ entirely new mesh/skeleton/etc data.
Added Blueprint functions to selectively remove morph targets and skin weight profiles from a skeletal mesh.
Orient bones now orients bones with multiple children in parent orientation.
Switching between the isolated and the full mesh no longer clears the selection when editing weights.
Selecting in the list of weighted Bones in the Weight Tool now selects the Bone in the Skeleton Tree.
Improve selecting affected vertices of a Bone when Shift- or Ctrl-clicking the Affected button when editing Weights.
Fix Shift- and Ctrl-clicking Affected sometimes had no effect.
Ctrl-clicking Affected now toggles the selection of the affected vertices of a bone.
Mirror and Orient no longer show an obsolete none axis option.
Bug Fix:
Skeletal Mesh Modeling Tools
Add accumulation support for Relax brush in Edit Skin Weights tool and Paint Maps tool.
Fixed data loss when making skin weight edits to vertices holding 12 bone influences.
Clear stale thumbnail scenes on asset reload.
Avoid crashing when skeletal mesh reference skeleton changes by invalidating mesh linkup cache.
Skeletal Mesh Editor: Fixed add support for previewing morph target curves in addition to bone pose in skeletal mesh editor when using the "Running Instance" preview controller in preview scene settings.
Fix a crash where transient meshes with no mesh description are opened.
Skeleton tree views now retain their selection and expansion state after edits.
Bones are now mirrored in global space instead of the first parent's space.
Collapsing nodes in the skeleton tree no longer deselects children of the collapsed node.
Fix an issue where the wrong bone was renamed when a name was committed by changing the selection and losing focus.
Audio
New:
Waveform Editor
Playhead refactor to use frame positions to allow better precision, along with handling offscreen playhead positions. Playhead is not rendered when offscreen.
Snap to zero crossing shortcut Integrated from 39.00.
Sequencer
Update audio sections to not auto expand to keyframes.
Control bus mix track.
Audio control bus track.
Adding db and Decibels to DefaultEngine.ini so it's possible to use UProperty markup for Units.
Unclamping the "VolumeBase" metasound input for both oneshot and looping metasounds exposed to UEFN.
Tooltip reads as "[-60, 12] - Base volume applied to the sound, in decibels. The default value of [0] results in no volume change. A value of [-60] results in silence. [12] is the maximum gain we can apply."
VolumeBase default input range now reflects the new clamp range.
The clamped range is now [-60, 12] to match the clamp of audio devices. Previously was [-60,0] Updated tooltip to reflect this change in clamp.
Unified property UX across Attenuation, AudioBus Sends, and Submix Sends.
Submixes are now ref-counted when using the register/unregister API. When no longer referenced, submixes will be removed from the root. This can be disabled by setting au.RemoveSubmixesFromRoot to 0.
Movie Render Queue: Expand ability to choose submix to export.
Added option in CommonButtonGroupBase to suppress button sounds when calling SelectNextButton or SelectPreviousButton.
Subtitles: Enable resizing of subtitle sections in sequencer.
Unified property UX across USoundBase/USoundWave/USoundCue/UMetaSoundSource.
Bug Fix:
Animation Editor
Animation Editor and Level Editor Viewports now call UpdateAudioListener when they receive focus and when the perspective camera moves. The Animation Editor has an additional call when we focus on the preview mesh. This fixes the requirement to move the camera in the viewport editor before the audio listener position updates.
Animation Editor windows request a new Audio Device so that we don't share the same Audio Device with Level Viewports.
Sequencer
Fix for input channels not resetting when a metasound is changed.
Fix MRQ non realtime render to render silence instead of disabling.
Fixed sequencer audio channel inputs updating when modifying a metasound asset.
Disabling Hardware Convolution Reverb on PS5.
Add CQTest coverage for SoundFieldRendering encode/decode/rotation.
New SoundFieldDecoderTests.cpp with 22 test methods across 6 test classes.
Tests FAmbisonicsSoundfieldBuffer (construction, reset, duplicate).
Tests FAmbisonicsSoundfieldSettings (unique ID, duplicate).
Tests FSoundFieldDecoder with both omnidirectional and directional FOA inputs.
Tests directional decode correctness: Verifies spatial energy distribution matches source azimuth for stereo and quad speaker layouts.
Tests FOA rotation: Energy preservation, W-channel invariance, Y/X channel shifting under yaw rotation, and decoded balance shift after bed rotation.
Tests FSoundFieldEncoder channel counts (FOA/2nd order) and directional content.
Tests encode/decode roundtrip: Energy preservation, directional bias retention, and silence passthrough.
Tests public API: Format name and default settings.
Updated AudioCQTests.Build.cs to add SoundFieldRendering and AudioExtensions module dependencies.
Waveform Editor
Fix for waveform editor playhead snapping to proper trim start or end bounds when editing
Fix playhead snapping when editing trims to snap to appropriate trim start or end bounds.
Fixed an issue in the Waveform Editor where wave files containing a partial final sample block were loaded with invalid trailing bytes, causing corrupted playback. The invalid bytes are now silently truncated at load time — the raw asset data is not modified.
Fix for MRQ to render silence when there is no audio to allow timing of sequences to line up
Architecture
New:
Change SubmixEffectReverb default Gain from 0.0 to 1.0 for new assets.
Adding optional Low pass and High pass filters to submix and audio bus sends.
Bug Fix:
Fixed issue where SoundBase→bEnableSubmixSends being false would ignore attenuation submix sends.
Crossfade dry signal against submix effect chain overrides when no base chain absorbs the gap.
Fix FDelay incorrect output for sub-1-sample delays.
Fix potential thread-safety races in vorbis DLL init and AudioFormatOgg singleton.
Deprecated:
FSoundWaveProxy now acts as a broker for FSoundWaveData so consumers can optionally update to latest data (i.e. post asset re-import). This requires the deprecation of FSoundWaveProxy that was just forwarding calls to the FSoundWaveData.
MetaSounds
New:
Adds the experimental MetaSound Channel Agnostic Types (CAT) Wave Player node and its supporting types under the MetasoundExperimental plugin.
Engine runtime
UCatSoundWaveContainer + FCatSoundWaveContainerEntry: a UObject container of weighted USoundWave entries, edit-time UI for designers.
FCatSoundWaveContainerProxy / FCatSoundWaveContainerData: audio- thread proxy snapshot of the container, doubles as Audio::ISoundWaveContainer.
Audio::TCatProxyView: lock-free linked-list base for the proxy, supports mid-render hot-swap of container state from the game thread to the audio render thread.
MetasoundCatExperimental::FSoundWaveContainerAsset: MetaSound data- type wrapper held by value on the audio thread; namespace-scoped to avoid collision with the Polyphony plugin's same-named asset type.
MetasoundCatWavePlayerNode: polyphonic Audio Wave Player. Outputs a polymorphic CAT audio reference resolved at bind time per the Format / Auto / SourceAuto chooser. Configurable max voices, Index / Sequence playback types, Standard / Random playback modes. Sequence mode supports start index, finite/infinite loops, and reset trigger plus per-stage trigger outputs. Random mode supports weighted selection, deterministic seed, and an avoid-recent-N window. Pitch shift via plain float input pin.
Editor
AssetDefinition_CatSoundWaveContainer + factory: New-asset and "Create Sound Wave Container" content-browser context menu on SoundWave selections.
Editor module wires the MetaSound graph-pin factory registration for the new data type. MetaSound Engine / Frontend prerequisite edits.
UMetaSoundSource::CalculateAutoSourceFormat: rewrite to walk RuntimeInputData parameters with InParams overrides and pick the greatest channel count among Object / ObjectArray inputs. Adds a checkf guard requiring RuntimeInputData to be cached before the call. Intentional behavior change in scope of this change.
MetasoundFrontendSourceInterface: removed the unused AudioMixerNumChannels extern. The API never shipped, so no deprecation shim is required.
Retain MetaSound input values on presets when parent graph inputs are renamed.
Make MetaSound preset reset to default use inherited parent values.
Improvements to the MetaSound node update transform API for C++ node developers New biquad node bandwidth default value for new nodes to avoid DSP edge cases.
MetaSound DynamicInterfaceNodeConfiguration: Built-in node configuration for sub-interfaces and variants.
Add FMetaSoundDynamicInterfaceNodeConfiguration, a generic FMetaSoundFrontendNodeConfiguration that automatically handles sub-interface instance counts and variant type selection based on a node's FClassInterface definition. This eliminates the need for custom per-node configuration structs for nodes that use sub-interfaces or variants.
Changes:
Add MetasoundDynamicInterfaceNodeConfiguration (Frontend) - core configuration struct that reads FSubInterfaceDescription and variant descriptions from the FClassInterface to drive the node's interface override.
Add MetasoundDynamicInterfaceNodeConfigurationCustomization (Editor) - details panel customization providing variant type dropdowns and sub-interface count controls.
Update MetasoundExampleWeightedSumNode to use the built-in base configuration, removing the custom FMetaSoundExperimentalExampleWeightedSumNodeConfiguration workaround.
Update node registration macros and graph builder for dynamic interface configuration integration.
Add engine tests for configuration logic and UI customization.
Added MetaSound Input Browser for bulk viewing and editing of MetaSound input values.
MetaSounds that are sent a StartTime input parameter but do not implement the UE.Source.StartTime interface will now only warn once instead of on every play.
Native MetaSound nodes can define a custom icon and color.
Enable relative render cost by default Add cvar for logging a sound's relative render cost exceeding a threshold.
Add MetaSound asset action for fixing up duplicate class name issues.
Improved MetaSound builder Blueprint API and editor builder listener support for pages.
Added various options for easy node creation when dragging assets into the MetaSound editor.
Bug Fix:
Fix MetaSound input widget settings getting overridden when set to a type other than editor preference default.
Fix crash when au.MetaSound.Experimental.OperatorPool.SetMaxNumOperators is set via Console Variables: In *.ini.
The cvar was registered as an FAutoConsoleCommand, but Console Variables: ini parsing creates placeholder IConsoleVariables for any name it encounters. When the MetasoundGenerator plugin later registered the command with the same name, FConsoleManager::AddConsoleObject hit a fatal log: 'Console object named... can'\''t be replaced with the new one of different type!'
Convert the registration to a TAutoConsoleVariable, default -1 (leave the pool default unchanged). An OnChanged callback forwards the value into the operator pool. StartupModule applies the current cvar value once the pool exists, so values set from the ini before the module loads still take effect.
Fix AD Envelope attack phase skipped when Attack Time driven by Value (Float) node with Init Value of 0.
Fix AB/BA potential deadlock between FOperatorPool::CriticalSection and OnAudioDeviceDestroyed.
Make trigger repeat node high precision so it doesn't drift compared to Quartz / DAWs.
Fix MetaSound preset input nodes not respecting sort order.
Fix crash when setting a MetaSound constructor input or output to an unsupported type (ex. Trigger).
Fix editor display issues when renaming MetaSound inputs or outputs.
Fix ensure when reloading MetaSound externally added and referenced by another asset.
Fix MetaSound patch details panel showing blank output format row.
Sequencer
New:
Audio Sequencer
Added a "Play Until Finished" option to Audio Sections in Sequencer. When enabled, the section's evaluation range extends past its visual end to the sound's natural duration, keeping volume and pitch keyframes, pause, and state-restore cleanup active throughout the tail. Enable it with the CVar Sequencer.Audio.UsePlayUntilFinished (defaults to off).
Note: Trimming or resizing a section to a shorter length automatically disables the option, SoundCues that contain Random or Branch nodes are not supported, and MetaSounds extend to the sequence's playback-range end and stop via their OnFinished callback.
Added a bRepeating property to UMovieSceneAudioSection to replace the semantically overloaded bLooping property. The new property accurately describes Sequencer behavior by restarting a one-shot sound at the section boundary when the section is longer than the sound, reserving the term “looping” for natively looping audio assets. The transition is controlled by the Sequencer.Audio.UseRepeating CVar (enabled by default), and existing assets are migrated automatically on load.
Fixed a bug where loop-divider lines in the Sequencer timeline stayed at their original screen positions instead of moving with the audio section when it was dragged.
Fixed an issue where audio sections defaulted to looping when added to a sequence, regardless of the source sound asset's loop setting. Audio sections now initialize their loop state from the source asset.
Batch editing and highlighting for stale actors in audio sections when right clicking on track to batch edit, or multi selecting audio sections. Enable highlighting with cvar au.OutlineAudioActorAttachments.
Bug Fix:
Fixed a bug where audio sections with a number of float parameter inputs that was an exact multiple of 9 silently dropped all float input data at runtime. Affected sections appeared to play correctly but none of their float parameter automation took effect.
Subtitles
New:
Waves with Subtitles attached as UserData will now automatically play and stop their subtitles when the Waves are played from inside another Wave, such as a MetaSound or SoundCue.
When scrubbing through a Sequence with subtitles, the subtitles will now display in the editor viewport.
Sequencer Subtitle sections initialized with a blank subtitle are now given a default duration of 3 seconds.
The Subtitles plugin will now warn if you try to replace the UMG widget with an invalid or missing asset.
Added an optional Border UI element to subtitle UMG widgets' TextBlocks.
SRT/SubripText files can now be used for bulk Subtitle import. A freshly-imported SRT file will create a Basic Overlay asset, which can be right-clicked to select Convert Basic Overlays To Subtitles.
Bug Fix:
When loading a Subtitle asset in the editor, it will now enable/disable editing its Duration parameters based on its DurationType.
WaveForm
New:
Waveform Editor
Changing the Fade handle icons and making the colors more colorblind friendly.
Decoupled fade in and fade out from the trim transformation. Fade behavior is now controlled by a standalone UWaveformTransformationFade sub-object on UWaveformTransformationTrimFade, making fades configurable independently of trimming in the Waveform Editor.
Bug Fix:
Waveform Editor
Fixed an issue where pressing Shift+Space to return the playhead to the start of a waveform did not reset the playback start position, causing the next playback to begin from a stale offset instead of the beginning of the active region.
Fix crash when deleting an open SoundWave asset with the editor open/minimized. Guard USoundWave modification in ~FWaveformEditor() when the editor is closed due to asset deletion.
Sound Wave: Fixed an issue where opening a Sound Wave asset in the Waveform Editor while the asset was playing in the editor stopped playback. Transformation edits now take a targeted path in USoundWave::PostEditChangeProperty() that rebuilds compressed data without freeing audio resources for in-flight sounds.
U Sound Wave: Adding LUFs and PeakLoudness to metadata in the content browser. When the Waveform Editor is enabled, audio analysis is triggered in 3 spots:
On asset import/reimport (per asset).
When opening an asset in the Waveform Editor (per asset).
Using the ResaveSoundWaveLoudness commandlet.
Editor
New:
PCG
Moved UPCGManagedResource management out of UPCGComponent and into FPCGManagedResourceContainer.
Reduces code duplication for new execution source types.
PCG Builder Volume.
Editor only actor used to limit the bounds of generation when using the PCG Builder commandlet.
Blueprint : Point loop functions can require game thread execution (single threaded).
This will cause errors if the Blueprint element itself is not 'bRequiresGameThread'
PCGGraphExecutionRegistry
Now possible to register execution source providers through a common registry.
Use this registry to gather execution sources to display in Graph debugger.
Implement a default provider for UPCGComponent and UPCGDefaultExecutionSource.
More work to move from UPCGComponent to IPCGGraphExecutionSource.
FPCGActorComponentMapping renamed to FPCGTrackingManager.
Move most of the API to IPCGGraphExecutionSource except for partitioning.
IPCGGraphExecutionState already supports partitioning in its interface but actual implementation is still very much APartitionActor dependant (needs to be abstracted away).
Some of the partitioning API was moved to IPCGGraphExecutionSource but implementers should not expect functional tracking for anything other than PCGComponents.
Added a batch processor framework for running functions on large datasets - typically of assets.
Results will be written to Saved/MultiprocessResults/results.txt, the location of results can be overridden with the `-resultsfile=` option. -numworkers= can be used to control the number of workers used to process the batch.
The Batch Process facilitates parallelism which is useful when invoking a function a large number of times (e.g. tens of thousands or millions). Batch jobs can also be started from script using `BatchProcessLibrary::RunBatch`.
Here's a complete example in python - note the final steps regarding registration ceremony:
Python# Save in /Game/Content/Python/snapshot_assets.py import json import os import unreal # Declare a uclass with a function that we want to run, this simple function just # takes an asset path, loads it, stringifies it, and writes the string to a file: @unreal.uclass() class SnapshotAsset(unreal.Object): @unreal.ufunction(params=[str]) def snapshot_asset(self, asset_path: str) → None: # Load the asset: asset = unreal.load_asset(asset_path) if asset is None: unreal.log_error(f"FAIL: {asset_path} (asset not found)") return json_str = unreal.JsonObjectGraphFunctionLibrary.stringify([asset.get_package()], unreal.JsonStringifyOptions(unreal.JsonStringifyFlags.FILTER_EDITOR_ONLY_DATA)) # Build a nested output path from the package path, stripping the leading '/'. # e.g. "/Game/Baz/Foo" → "Game/Baz/Foo.json" and write to that file: relative = asset_path.lstrip("/") out_path = os.path.join(unreal.Paths.project_saved_dir(), "SnapshotAsset", f"{relative}.json") os.makedirs(os.path.dirname(out_path), exist_ok=True) # Write out the stringified asset: with open(out_path, "w", encoding="utf-8") as f: f.write(json_str) unreal.log(f"PASS: {asset_path} → {out_path}") # Discover all assets of the specified type, run snapshot_asset def _run_snapshot(asset_class: str)→ None: registry = unreal.AssetRegistryHelpers.get_asset_registry() registry.wait_for_completion() asset_filter = unreal.ARFilter(class_names=[asset_class], recursive_paths=True, recursive_classes=True) asset_paths = [str(a.package_name) for a in registry.get_assets(asset_filter)] # Build the job description. job = { "function": "/Game/Python/snapshot_assets_PY.SnapshotAsset:snapshot_asset", "arguments": [{"asset_path": p} for p in asset_paths], } # Run the batch — blocks until all jobs complete. results_json = unreal.BatchProcessLibrary.run_batch(json.dumps(job), num_workers=8) results = json.loads(results_json) passed = [r for r in results if r["Passed"]] failed = [r for r in results if not r["Passed"]] print(f"{len(passed)}/{len(results)} passed") for r in failed: print(f" FAIL: {r['ArgumentSummary']}\n {r['Output']}") def run_blueprints_snapshot() → None: _run_snapshot("Blueprint") if __name__ == '__main__': # critical, prevents forkbomb if init_unreal is used to import this script run_blueprints_snapshot()The final step is to register the SnapshotAsset class with Unreal Engine. Typically this is done by adding `import snapshot_assets` to your project's init_unreal.py. Once that is complete you can run the script like any other python script:
Command LineUnrealEditor.exe "D:\Path\To\Your\ProjectName.uproject" -run=pythonscript -script="D:\Path\To\Your\Project\Content\Python\snapshot_assets.py"To launch a batch job from the command line use: `UnrealEditor ProjectName -run=BatchProcessCommandlet D:\Path\To\Jobs.json` where Jobs.json describes a function and list of arguments to invoke said function with, e.g.:
Shell{ "function": "/Script/Engine.KismetSystemLibrary:PrintString", "arguments": [ { "InString": "Hello World", "bPrintToLog": true }, { "InString": "Hello World2", "bPrintToLog": true } ] }
Added reset to default support for root properties of Editor Preferences, Project Settings, Keyboard shortcuts.
Added default value in the tooltip of the property/keybind name.
Added CVAR to refresh cached default values : SettingsEditor.ClearObjectDefaultPropertyValuesCache.
Limitations are the following:
It will not work for properties that are missing the Config specifier.
It will not work for custom added rows obviously.
It will not work for settings object with a customization since it overrides the default one.
It will not work on nested properties, only the root properties of a settings object are supported for performance to avoid having to parse the default stringify value recursively.
Added ability to search for CVAR, KEYBIND, CONTEXT in Editor, Project, Input Settings.
Added keybind button to start listening for key presses and search for these input chords.
Simplifying editor settings keybind list by removing description based on command tooltip, description is available in the tooltip now.
Added behavior selection for tabs navigation action in Editor Settings / Misc, before this change editor only navigates between assets and uses last access time to determine order, now browser style tab navigation is available, it uses window tab order (default is browser style behavior) CTRL+Tab goes forward, CTRL+SHIFT+Tab goes backward.
Added an option to hide tab navigation popup dialog widget and directly perform the action (default is showing this dialog).
Before this change navigation only worked on asset tabs, you can now navigate between any tabs (editor settings, project settings, logs...).
Reduced size of items in tab navigation dialog widget.
Fixed Scrollbar not working and Listview not scrolling into view.
Added UnrealAssetStringify: A standalone program to quickly print a.uasset or.umap to json. Use Engine\Source\Programs\UnrealAssetStringify\BuildScripts\UnrealAssetStringifyInstall.bat to build the tool and optionally associate it with the asset diff command in p4v. Once built the tool can be found at Engine\Binaries\${PLATFORM}\UnrealAssetStringify[.exe] Example usage:
`UnrealAssetStringify.exe "D:\Path\To\A.uasset"`: Prints the asset to stdout.
`UnrealAssetStringify.exe --save "D:\Path\To\A.uasset"`: Writes the json to Engine\Programs\UnrealAssetStringify\Saved
`UnrealAssetStringify.exe --save="D:\Output\A.json" "D:\Path\To\A.uasset"`: Writes the json to "D:\Output\A.json" instead of the default save location.
To open a.uasset for viewing in vs code use Engine\Source\Programs\UnrealAssetStringify\Scripts\UnrealAssetStringifyOpenAsset.bat.
To manually diff uassets using p4v use Engine\Source\Programs\UnrealAssetStringify\Scripts\UnrealAssetStringifyP4VDiff.py.
UnrealAssetStringify is a read-only tool that is useful for reviewing asset changes, post mortem analysis, and asset content indexing; it cannot be used to update uassets.
Added copy all info to clipboard in project badge context menu.
Improved material editor preview mesh material slot picker to persist user choice in config, default is material slot 0 active.
Migrated some common reference validation logic to UAssetReferencingPolicySubsystem::ValidateAssetReferences It now supports:
Denoting whether a missing reference is actually missing or only unsaved.
Optionally also validating references to C++ modules in plugins (when 'AssetReferencingPolicy.CheckForIllegalCppRefs' is enabled).
Ignoring missing references from a redirector, as they may redirect to unloaded plugins.
Promoted "Slate.bAllowThrottling" to Editor Preferences, which allows real-time property edits when disabled.
Make the "open source code" action async, so that the editor doesn't lock up every time you press it and wait for your IDE to open.
Downgraded error handling when a console variable was not found from fatal to error in DeveloperSettings::ImportConsoleVariableValues.
Added new grid floor material to newly created profile and engine profile as long as they don't have the floor material overridden.
Change the IOS preview options in order to mirror Android preview.
Added command with keyboard shortcut to Capture Thumbnail for asset in the Content Browser (CTRL+SHIFT+T).
Rename ToggleFeatureLevelPreview to TogglePreviewPlatform Rename IsFeatureLevelPreviewEnabled to IsPreviewPlatformEnabled Rename IsFeatureLevelPreviewActive to IsPreviewPlatformActive.
Merged ToggleFeatureLevelPreview into SetPreviewPlatform using a new bCompileShaders parameter that controls whether or not we compile the shaders.
Added bRestore parameter to device profile update to skip redundant RestorePreviewDeviceProfile during toggle.
Removed CachedEditorShaderPlatform member, using GMaxRHIShaderPlatform directly.
Removed toggle button restriction for GMaxRHIFeatureLevel.
Added in-editor validation for missing hard-refs This is disabled by default, but can be enabled by setting the CVar 'AssetReferencingPolicy.CheckForMissingHardRefs' to true.
Editor Preview Platform Optimizations Materials are already updated by SetPreviewPlatform, so disable the automatic per-texture material dependency update 8min →1min Preview transition.
Improved support for incremental validation in incremental cooks.
Incremental cooks already mostly handle incremental validation, as they skip loading the package if it hasn't changed (as validation runs via UCookOnTheFlyServer::LoadPackageInQueue), however changes to a world would still validate all their external objects. This can be quite slow for large worlds.
This change improves the incremental validation support so that it only validates the specific external objects that have changed in a world being re-cooked. It does this by comparing the hash of each external actor object against the previous version that was validated, and skipping any that haven't changed.
This feature is disabled by default, but can be enabled by setting the CVar 'cook.validation.IncrementalExternalPackageValidationEnabled' to true.
Note: It only currently works for single-process by-the-book cooks. You can also now trigger a full revalidation when running incremental validation against a new build version, by setting the CVar 'cook.validation.IncrementalValidationRequiresSameBuildVersion' to true. This is disabled by default.
Added ConfigureCookSession event, to allow registering extra artifacts and collectors to be used by the cooker.
Fixed level editor PlayFromHere action not working with keybinds (set to ALT+SHIFT+P).
Improved API to play from here based on click, selected actor or custom position.
Play mode (Floating window or in viewport) will be based on the selected user choice in Play Settings.
Play from here will first check selected actor (must set bCanPlayFromHere to true) then fallback to viewport last clicked location.
Selection: Typed Element Common actions now supports a CanDuplicate so asset editors can customize if they allow for duplicating of the selection.
Add support for capturing expansion state per custom built details view via ViewIdentifier's.
Initial usage example in SStateCentricViewMainStateNode.cpp.
Scene viewports can now compute correct mouse positions in cases where the underlying scene render is a different resolution from the Slate output of the viewport.
Make "new-process" PIE work like "Preview Platform"
Mobile "new-process" PIE now respects the Preview Platform set, the Device Profile and the Aspect ratio(flipped, unflipped) of the main editor viewport.
Add Aspect Ratio to IOS Preview Json.
Revision Control: Revision control helpers get status functions can now use the cached file state. This can be useful after operations that already update file state (i.e. saving files).
Minor Improvement of Log Categories performance in the OutputLog.
Add Preview json Versioning.
Add Flip Aspect Ratio for Preview Json.
Add ConfigRules to Android Preview Json Clean-up unnecessary usage of FName in AndroidDeviceSelector.
Preview Json Improvements.
Added IosPreviewDeviceProfileSelectorModule in order to enable Generate/Preview Json on IOS.
The DeviceSelectors will now return the PreviewPlatform from the DeviceProfile selected and the device properties.
Modified the way the Preview Json preview platform label name is shown. It now displays Preview Platform Name + Device Profile, instead of just Device profile.
Confirmation Dialog added when Generating Platform Json.
Add Editor Settings to configure default name with prefix and suffix for new assets.
Added shaderball as a mesh preview in the material editor.
Save the last used preview mesh in config to load it again on material and material instance editor opening.
Materials will use their own preview mesh property if set, otherwise fallback on the last used editor preview mesh, when the last used preview mesh can't be loaded, falling back to the sphere mesh.
Added keybind to toggle the grid in Asset Editor (ALT+SHIFT+G since ALT+G is used for perspective view and G is used for GameView).
Add Control + Shift + Z as an alternate InputChord for Redo.
Cook-time validation improvements.
Pre-load external objects prior to running validators. This is controlled by the CVar 'DataValidation.LoadExternalObjectsForCookValidation' and is enabled by default to match the default editor behavior.
Added support for reporting the total validation duration per-validator for cook-time validation. This is controlled by the CVar 'DataValidation.ReportCookValidationStats' and is enabled by default.
TextureFormatOodle is now a built-in Engine Module instead of a Plugin. It is used for texture encoding by default, regardless of config, even in no-Plugin minimal configurations. The only NVTT and ISPC fallback codecs are now deprecated.
DataTable export struct to string and file as objects.
Added more level of precision to editor spinboxes.
Shift = Deca (+10/-10)
Ctrl = Deci (+0.1/-0.1)
Shift + Alt = Hecto (+100/-100)
Ctrl + Alt = Centi (+0.01/-0.01)
Added editor project badge context menu with the ability to copy info to clipboard (project name, version, changelist, branch, build configuration, build date, RHI).
Added double click to project badge will copy changelist to clipboard (for QA).
Added Keyboard Shortcut menu entry in Edit menu.
Added Keybinds to access Editor, Project, Keyboard preferences directly.
Extend "Browse to Asset" capability for Editor Utility Widget.
Allow tab context menu actions without activating the tab (web browser style).
Display ticked objects in ActorPalette viewport, when realtime toggle is enabled.
Data Validation: The Data Validation Commandlet has been refactored to make custom behaviors via a child class implementation easier to do.
Add GetPreviewPlatformName Blueprint function.
Improved ortho view grid density logic when in a mode where view background is irrelevant.
Data Registry: Fixed "Find Row References" to view references with type FDataRegistryId::StaticStruct() using the name from FDataRegistryId.ToString().
Add support for filtering shown categories when creating a details view. Add support for hiding headers when creating a details view.
Added Filter by Selection capability in Content Browser and AssetPicker with keybind ALT+F, it uses the active selection in the context to set filters.
Added the ability to display specific RGBA color channels in the active editor viewports, as well as options to control how the alpha channel specifically is displayed. These options show up under the View Mode dropdown of the viewport toolbar.
Added support for -RpcClientNum to handle multiple clients with unique ports, and they just increment after the "client" port in the.ini, when using -RpcConfig=foo.
Added support for multiple listening ports for Rpcs.
Improved BP Editor's menu filtering with additional context options for show flags and view modes and camera settings.
Fixed cannot set camera clipping settings in the BP Editor's viewport.
Fixed cannot set other show flags in the BP Editor's viewport.
Allow Abstract classes Tagged Asset Browser Filter Allow Tagged Asset Browser searching for NativeParentClass Allow Tagged Asset Browser searching for Skeleton.
Bug Fix:
Property Editor
Fix struct array elements sharing expansion state after ForceRefresh.
Fix struct UPROPERTY rows losing expansion state across ForceRefresh.
PCG
Fix UPCGPointArrayData::GetTransformCopy not respecting inheritance.
Revert collapse to use GetTransformCopy again now that it is fixed.
PIE: Load as preview fix for managed components.
glTF Exporter
Supporting better primitive number calculations, supporting exports for meshes with unused Materials.
Out of bounds crash 'fix' for SourceModel export.
Fix BroadcastBeginObjectMovement/BroadcastEndObjectMovement pairing on click-only gizmo interaction. GEditor→BroadcastBeginObjectMovement was fired unconditionally in GizmoManipulationStarted, but the matching BroadcastEndObjectMovement was gated behind an early-return that only fires for actual drags. Clicking a gizmo handle without dragging left any listener of OnBeginObjectMovement/OnEndObjectMovement with a permanently-stuck is-moving state until the editor restarted. This was breaking root motion being applied to actors in the anim mixer, causing them to stop responding to root motion until another drag of the gizmo is attempted.
Scene Viewport: Fix issue when transitioning from the software cursor to the hardware cursor where clamping the cursor position: 1) incorrectly applied pixel scale resulting in incorrect positions; and 2) subsequent mouse movement updates caused a disconnect between the normal and unbounded cursor position.
Fixed ability to copy a property without any reference = "None" to clipboard to be able to paste it later in a details view row.
Fixed show flash animation on copy/paste when using context menu with custom actions.
Fixed blank project that fail to Quick Launch on Android devices with a Binary build.
ITF: Fixed some editor input freezing during static mesh async builds. In detail: Moved InteractiveToolsContext invalidation propagation out of throttle-gated Tick into a separate hook called before the viewport tick gate, so input-driven invalidations reach bNeedsRedraw during async asset compilation.
Fixed an issue that would wipe out instanced struct data when using JSON import and export of Data Tables.
Change world leak check in the editor to ensure instead of crashing, this fixes issues when transferring maps in Play in Editor with certain editor windows open.
Fix crash in Editor texture viewer due to preview platforms texture encodings when some platforms were not fully installed on the client system.
ResavePackagesCommandlet now loads default editor modules, which gives them a chance to bind to UPackage::OnTransferMetadataRequested. If the callbacks aren't bound, data stored in FMetaData is thrown out upon resave.
User Asset Tags: Fixed ResavePackagesCommandlet discarding User Asset Tags on resave due to UserAssetTagsEditor module not being loaded (metadata transfer wasn't bound).
Fixed crash saving levels with high actor counts.
Fixed content browser deleting folders with multiple assets contained in the same package would fail since there is a mismatch between assets count and loaded objects.
Fixed Launcher process and thread leaks, and memory corruption.
Fixed color picker would close and not transact any property change on any Blueprint classes, this is caused by the Blueprint rerun construction script and objects replacement happening in editor, the actor and its sub-objects are duplicated and replaced after a property change (value set), this would trigger a details panel refresh with the new objects and underlying property handle would change, old ones would be invalidated, and color picker would close immediately without processing transaction. This would not happen with C++ actor class since they are not getting replaced.
Fixed Editor Preferences: General Appearance application scale not updated after an import.
Fixed recursive call to FTargetPlatformManagerModule::ModulesChangesCallback during post Turnkey installation that causes a dead lock.
Fixed external environment variable changes during turnkey.
Skipped hit proxy invalidation when the user is controlling a viewport piloted camera, to minimize flush performance cost.
Fixed pressing a keybind like DELETE in content browser when nothing is selected would still trigger the command for the outliner selection even if it does not have the focus.
Added option in editor preferences to hide/show quick jump text (red/blue text) in the bottom right of the content browser (hidden by default).
Fixed tab location not saved and preserved for assets using workspace editor.
Fixed General Appearance - Editor Preference : Import values are not saved.
Modes - Gizmos: Update default mode manager implementation to use the asset editor default mode, and the level editor one uses the level editor default ed mode.
Removed swapping of modes - this wasn't having an effect on gizmo visibility in asset editors.
This fixes an issue where when legacy gizmos are toggled on globally, a selection must be active in the level editor for the gizmos to display in an asset editor that was using the default editor modes.
Fix Preview crash caused by copying over Flags when Platforms Cvar copy.
Give the RenderDoc, PixWin, and Xcode "CaptureFrame" toolbar entries each their own unique id.
Fixed restore open asset tab location on restart (docked or undocked) after a crash.
Fix Preview Platform in Editor could fail to show the textures with updated LOD settings for the chosen platform.
Fix VT thumbnails could appear too bright due to SRGB flag mismatch.
Fixed an issue where the Recently Executed Python Files menu included files that were run during editor startup.
Fixed configuration import by removing irrelevant sections for keybinds to avoid same section+key clash on merge.
Fixed configuration export by allowing duplicated keys in a section when merging files, this was causing keybinds to be lost.
Added notification hyperlink to navigate to exported file.
Selection: Fix a couple of crashes with ISM selection, and improve the traversal of actor, component, ISM with double clicks.
Fixed crash caused by the NotifyToolsOfObjectReplacement event being triggered on garbage collected assets.
Fixed ensure in CurveTableEditor when deleting a curve row.
Fixed memory leak in content browser when removing collection.
Fixed logging being delayed by 2 logs calling UAT with the Launcher.
Fixed possible crash when trying to open a new map.
Data Validation: Fixed an issue where the data validation fixers wouldn't always capture all the modified packages during the validation.
Fixed Scene Outliner base selection is lost when ctrl is held and a new search is made to select additional elements in the scene outliner.
Fix content browser favorites being lost when unmounting plugins.
Geometry Mode: Fixed erroneous usage of StaticClass in ShutdownModule.
Asset Rename Manager: Avoid reporting references from sub-objects of redirected path.
Fixed hotkeys do not work in the Outliner when undocked.
Fix crash when opening color picker during a hitch.
No longer moves a viewport-locked actor when input is disabled in that viewport.
The "picture-in-picture" preview for camera actors could sometimes rotate that actor as if piloted. This was because the viewport's camera controller was clamping the pitch angle to -90;+90 degrees, so when that came into effect, the output pitch differed from the input pitch.
This in turn was picked up by the viewport's camera movement handling as a difference that needed to be reproduced on the locked actor, something that happens when piloting an actor using a movement mode that has inertia for smoother movements.
This change just disables that part of the code when input is itself disabled (which is the case in the PiP viewports), since it makes little sense to move a locked actor if the user doesn't have input to pilot it.
Fix an issue on Mac where the traffic buttons showed up on the rename window.
Deprecated:
Gizmos
Remove experimental gizmo option from level editor viewport. This was rehomed to gizmo settings and profiles.
Remove outdated and experimental light gizmo plugin. These are no longer good representations of how we build gizmos in the editor, and have outlived their experimental status. We'll re-evaluate their UX in the future. For now, they needed to be manually activated via the mode manager on the level editor, and required for external teams to make code changes in order to use it. If there was usage of this, it can always be restored from the github history in the meantime.
Deprecate ChangeFeatureLevel/ChangePlatformLevel(ERHIFeatureLevel::Type) on UGroomBindingAsset and UGroomAsset, and HandlePlatformPreviewChanged/HandleFeatureLevelChanged(ERHIFeatureLevel::Type) on UGroomComponent.
Replace the two separate cached feature/platform level members into a single EShaderPlatform CachedResourceShaderPlatform.
Replace with ChangeShaderPlatform(EShaderPlatform) and HandlePlatformPreviewChanged(EShaderPlatform).
Deprecate PIEPreviewDeviceProfileSelector Remove all dependencies to the PIEPreviewDeviceProfileSelector from the Engine.
Deprecation: Remove deprecated AActor::EditorKeyPressed function.
Datasmith
Bug Fix:
Fix for crash building morph targets with legacy FBX importer when UseT0AsRefPose is set.
Fix crash when opening Dataprep Asset.
Framework
New:
TEDS
Cooperative Task Refinement
Wait a fixed amount of frames (default: 5) when there is no more time left, if the editor doesn't recover use a minimal processing time (default: 2ms).
Added additional stats.
Added tab to debug tables to the TEDS Debugger.
Refactored Query Capability forwarding to use explicit context environments.
Added the ability to put the compatibility layer in immediate mode.
Added Query Stack nodes that trigger delegates when a change is detected.
Added support for dynamic columns to the new query context.
Deprecated `CurrentRowHasColumns` and `CurrentBatchTableHasColumns` in favor of `CurrentTableHasColumns`.
Added functionality to retrieve the unique tag that's added to a table.
Made the actor table derive from the more general UObject table.
Context Capability mocks now have an explicit `Assign_*` function and overloaded functions now work by overloading those `Assign_*` functions.
Added additional logging to track the state of TEDS Core and Compatibility (de)initialization.
Removed ClearRow in the command buffer for a performance gain.
Added a new mapping key type "KeyIssue" to report errors. [TEDS] The type of a mapping key can not be retrieved. [TEDS] "GetAs" was added to the mapping key to be able to retrieve the content.
Reintroduced the `TEDS.Enable` CVar.
Updated the STedsSearchBbox to support the new query search node.
Added 2 new nodes to the Query Stack for searching.
Added the ability to calculate a hash of the topology of a table. Changes whenever a row/column is added/removed.
Marked more columns to searchable and sortable.
Added a utility class to collect row handles concurrently from multiple threads.
Cooperative task refinement: Exclude its own runtime from calculating the available time next frame.
Allow dynamic columns to be declared at compile time.
Added `RegisterHierarchies` to the factories to allow hierarchies to be registered on initialization.
Simplified Perforce TEDS data interaction.
Skein Perforce TEDS data interaction.
Replaced cvars by RevisionControlOverlaySettings to support the revision control overlay's options.
ITF Behaviors: Apply the "input complexity is priority" convention to appropriate base ITF behaviors.
Moved the binding complexity priority step definitions to FInputCapturePriority.
Mapped and active modifiers automatically count towards a behavior's priority. This can be disabled with the "ITF.UseITFWideBindingComplexityPriority 0" CVar.
Log a warning if an EditCondition involves a property that is marked deprecated.
Add ability to indent TokenizedMessage(s) when shown in Message Log(s) to allow for semi-visual grouping.
Bug Fix:
TEDS
Fixed incorrect pre-check before calling `AddCompositionToEntity_GetDelta`.
Fixed the result counter in FQueryResult not being atomic.
Fixed observers on occasion invalidating the list of pending UObjects in TEDS Compatibility. [TEDS] Fixed an off-by-one bug that could loose async loaded actors.
Fixed commands getting stuck in the command buffer.
Fixed RemoveColumns called from a query callback not being called on rows outside the active query context.
Fixed bug in BatchAddRemoveColumns where an assert could trigger if columns were added and removed in the same call.
Mapping performance significantly improved at large scale (100k+).
Explicitly flushing the command buffer internally when used in a direct API call to provide consistent behavior.
Fixed FNames sorted by the appended number instead of the internal ID.
Moved SccStatusUpdateTags queries out of PerforceSourceControlProvider to RevisionControlProcessors. This ensures proper tag cleanup even when perforce is not used/connected.
Fixed resave commandlet failing to find any asset when using the asset registry when the package has a path relative to the engine dir.
Added -ForceMaterialAutoUsageFlag command line option, to be used in conjunction with -onlymaterials, to force set the corresponding option on all processed materials.
Interchange
New:
USD Interchange
USD Interchange imports will now respect the UseWorldSpaceNormals material parameter that is produced by landscape exports to USD.
USD Interchange error handling will now also collect, deduplicate and display USD SDK errors as Interchange errors.
Added support for importing Chaos ClothAssets via USD Interchange via dedicated schemas.
Added support for skeletal mesh collapsing on USD Interchange imports. It is now possible to individually collapse Mesh prim hierarchies inside SkelRoots as separate SkeletalMeshes, by using the prim kinds and/or collapsing schemas, controlling the USD Translator's collapsing settings, and the Generic Assets Pipeline options for combining skeletal meshes.
Removed the extra sprite added to every spawned scene component on USD Interchange level imports.
The option to bCombineStaticMeshes for USD Interchange asset imports has been hidden, as it could conflict with the new collapsing support.
Allow specifying custom render contexts for USD Interchange Schema Handlers intended for parsing material schemas.
Added support for spawning lights with Nits units on Interchange imports. Imports via USD Interchange will prefer the new Nits units when possible for direct correspondence with USD.
Added support for point and spot light source radius when importing via USD Interchange.
The USD Interchange import option for filtering imported geometry purposes has moved back to the USD Translator settings (it temporarily became a USD Pipeline option).
Interchange USD now supports prim collapsing, both via prim kinds and the dedicated collapsing schemas. The collapsing settings can be configured on the USD Translator settings (the three dots on the top right of the USD Interchange import options dialog).
Improved support for camera parameters when importing via USD Interchange, expanding support for clip planes, exposure method, exposure compensation value, and exposure FStop, ISO and shutter speed attributes.
Actors, components and assets imported via USD Interchange will only have their properties set to any value if the corresponding source USD attribute had an actually authored opinion. In other words, fallback USD values will no longer be converted into Unreal property values.
Refactored the USD Translator to use Schema Handlers: These are classes meant to each describe the translation of a particular USD schema. Users can implement, override, disable, enable and reorder schema handlers from project-level code and plugins, and e.g. implement translation of their custom USD schemas for USD Interchange.
Added support for directional light source angle when importing USD stages via USD Interchange.
The top-level actor spawned by USD Interchange level imports will no longer display the file extension of the imported layer as part of its display label.
Added a GenericPayloadData class and an implementation of it on the USD Translator. This allows user code to describe brand new payload data, and to have schema handlers provide that data to user-provided Interchange factories.
Imports and exports from/to USD may now cause point and spot light source radius values to be clamped to a minimum value, to ensure that the intensity values don't explode to infinity when converting to and from Nits to other light intensity units.
Importing USD stages with light prims that contain "exposure" animations may now cause the intensity animation track to be baked frame by frame, as the intensity formula contains an exponential function that cannot be correctly interpolated with purely linear keyframes.
Added a fallback for parsing light attributes from USD prims without the "inputs:" prefix, allowing for backwards compatibility with older scenes.
Added support for exporting the Refraction channel when baking materials to USD. 1.0 will be used as the default for refraction when exporting translucent materials, to match the Unreal refraction value default.
Fix missing assets and components on USD imports when the USD prim names differ only by letter casing (e.g. "/Cube" and "/CUBE" on the same stage).
Added some feedback when the USD reimport fails due to the stage not having a valid prim at the same original prim path.
Spawn all camera actors as movable when opening or importing USD stages.
Fixed default refraction and displacement values on the USD preview surface reference materials to match the USD defaults of 1.5 and 0.0, respectively.
Fixed how the USD Stage transform would not be baked into the OpenVDB texture when importing volume textures into SVT assets via USD imports.
Interchange will now spawn all light actors with stationary mobility, following the behavior of the Place Actors window.
Added support for exporting mesh component Overlay Materials to USD as referenced copies of the original mesh prims, but with different material assignments.
Added support for Capsule_1 and Cylinder_1 primitive schemas when opening or importing USD Stages.
The DomeLight_1 schema is now supported as the DomeLight schema when opening and importing USD Stages. When exporting to USD, SkyLights will be converted to the new DomeLight_1 schema.
The USD Importer will now check that the provided reference materials configured on the USD project settings have the expected properties (e.g. the provided two-sided reference material must actually be two-sided).
On the USD Stage Editor, it should now be possible to author references and payloads on prims that don't yet have a spec on the current USD edit target.
Prevent the collapsing of prims with alternate draw modes when opening or importing USD stages.
The Interchange inspector dialog now sorts nodes by name and type.
Show an error toast when the Interchange import or reimport failed to produce any actor or asset.
Clamp the subdivision level to a minimum and maximum on the Interchange USD import options dialog.
Bug Fix:
Reset existing LODModels for reimport, so that Bone bindings and mappings are updated correctly. Also attempting to update SkeletalMeshEditor in case the re-import was triggered outside of the SkeletalMeshEditor.
Fix a crash when importing some scenes via Interchange if some of the scene's assets fail to import and are canceled mid-import (such as textures failing to parse).
glTF: Vulnerability fixes for glTF Reader.
Fixed internal USD errors being uncaught and propagating to Unreal when triggering Async USD Interchange imports in some edge case scenarios.
Fixed a crash when importing (via USD Interchange) stages with blend shape animation curves that happened to produce no valid curve data.
Fix level sequence export to USD missing animated attributes of SpotLight components.
Fixed how USD Interchange imports would produce duplicates of the same textures if the textures were used on different material inputs.
Fix how the Interchange texture factory would delete existing texture assets when reimporting in some scenarios.
Fixed how exporting levels to USD would not work with the traditional AssetExportTask Python snippet.
Fix old assets still being referenced by the level and other assets after reimporting USD Stages in some scenarios.
Fix texture assets imported via USD Interchange having names containing the source texture file extension.
Fix static mesh actors imported for collision meshes via Interchange sometimes ending up with the render mesh assigned.
Fix memory stomp on the stack in TiffImageWrapper. TIFFGetField expects a pointer to uint32 when using TIFFTAG_ROWSPERSTRIP but was passed a pointer to a uint16.
Fixed Interchange showing the "There were issues with the import" toast when the recorded issues were due to previous imports.
Fixed a crash when importing USD stages via Interchange and failing to find an existing material asset referenced by the stage via an Unreal Material prim.
Fixed the handling of nested geometry purpose opinions when opening or importing USD Stages.
Fix prim copy-paste behavior when selecting multiple prims at once on the USD Stage Editor.
Prevent valid UTF8 characters from being unnecessarily sanitized away to underscores in some operations on the USD Stage Editor.
Prevent loss of transform opinions in some edge cases when writing out attribute values to USD with a stage opened on the Stage Actor.
Fix logic issue on the Interchange Inspector UI preventing the selection checkboxes from affecting the top-level nodes.
Fix crashing when importing Geometry Cache assets from USD in some edge cases.
Scripting
New:
Added a FindReferencesByTag function to the Gameplay Tags Toolset.
Added a bOverwriteExisting option to CreateAsset, useful when automating/script object creation to not prompt.
Added EBatchCreateFontAsset::CreateIfNoFontExists to help with automated importing not creating Foo_Font1, Foo_Font2 unncessarily.
Exposed on option on UFontFileImportFactory to create a matching UFont for the UFontFace when programmatically/scripting importing a font.
Added exposure to Level Editor Subsystem to Get and Set a level editor viewport camera's location, rotation and FOV Clamps FOV between 5 and 170 degrees, in line with the Editor UI spinner box UI.
Require that SupportedClasses be filled out on UAssetActionUtility and UActorActionUtility Actions with no SupportedClasses filled out will now cause a data validation error.
Added Optional property support to Python.
Python can now read and write Optional properties from UObjects and UStructs, where None is treated as unset.
Note: This does mean that you can't distinguish between an unset Optional and an Optional set to a null UObject, but the latter is an unusual use of Optional.
Python generated types can create Optional properties via a tuple of two values, where one is None and the other is the value type of the Optional (in either order),
E.g.: ``` @unreal.uclass() class TestOptional(unreal.Object): prop = unreal.uproperty((str, None)) @unreal.ufunction(params=[(None, int)]) def func(self, opt): pass ```
Exposed utils to import/export a string table from CSV to BP/Python.
Scriptable Tools: Added MakeTransactional BP function to ScriptableInteractiveToolPropertySet so that tools can optionally enable transactions on a property set.
Bug Fix:
Scriptable Tools:
Fixed ScriptableToolsFramework dependency on non-redistributable ToolWidgets module.
Refactored SDraggableBoxOverlay usage to isolate ToolWidgets as a dependency to ScriptableToolsEditorMode rather than ScriptableToolsFramework.
The coupling of ScriptableToolsFramework on ToolWidgets prevented runtimes from shipping the framework due to ToolWidgets non-redistributable status as part of the Source/Developer modules.
Python-defined function return value fixes.
Fixed the order that packed return values are built, so they match the order that the types are defined (and match C++).
This was a bug previously fixed for the input arguments, but not the output arguments.
Fixed crashes that could occur when reinstancing classes generated via Python.
Fixed FPyWrapperSet::Intersection/IntersectionUpdate failing for builds where TSet was TCompactSet The updated implementation (iterating in reverse) works correctly for both TSparseSet and TCompactSet.
Generate the TraceType/ObjectType ScriptName from the CollisionChannel DisplayName, if the CollisionChannel ScriptName is empty The old broken names are still available as deprecated aliases.
Ensure the PythonScript commandlet enables source control prior to running the script Source control cannot be directly enabled in Python, so it's simpler to enable it from C++ before running the script.
UI
New:
Tool Widgets
Deprecate SDraggableBoxOverlay.IsDraggable for Draggable to conform with established naming conventions. Deprecate SDraggableBoxOverlay.RestoreFromDragBoxPosition for SetDragBoxPosition to conform with established naming conventions.
Added resizing support to SDraggableBoxOverlay.
Make DragBoxPosition properties visible to details panel.
Added DragOverridesCenterAlignment to SDraggableBoxOverlay to allow dragging to override center alignment on either axis. This is useful for when we want a DraggableBoxOverlay to start centered but still allow users to customize its position.
New experimental Semantic Search plugin: Changes content browser search to use a vector index-based search instead of the default keyword search.
Teds Table Viewer Column: Support column metadata to disable sorting for a specific column.
Added Gurmukhi to require full shaping.
Hierarchy Editor: Multi-selection generalization for drag-drop and details panel.
Activated
Added option to turn off multi-selection via view model.
Disabled for Niagara (details customizations don't play nice).
Enabled for property bags (caveat: Only works well for same-type selections).
Drag initiates from tree view selection, not just the row under cursor.
All-or-nothing: If any element can't be dragged, entire drag refused with toast.
Hierarchy-aware: Parent+child selections skip child during drop (comes with parent).
Drop order always matches tree display order regardless of selection order.
Drag decorator shows "(+N)" for multi-element drags.
Drop validation checks all elements against target; all must pass.
SetObjects() for multi-object editing when multiple elements selected.
Name area shows "(+N)" badge; tooltip lists all selected elements via OnGenerateCustomDetailsPanelNameWidget.
New SupportsMultiEditInDetailsPanel() virtual to opt out.
F Dragged Element Entry: Element wrapper with bIsContainedInAnotherDraggedElement flag.
F Data Hierarchy Drag Drop Context: Wraps entry array with GetTopLevelEntries/GetPrimaryElement.
FHierarchyDragDropOp takes FDataHierarchyDragDropContext; CreateDragDropOp signature updated.
CreateDragDropOp overrides updated for new signature.
Custom drag decorators render all elements vertically for multi-drag.
Multi-edit disabled via SupportsMultiEditInDetailsPanel.
FInstancedStructDataWithHeaderDetails uses EnumerateConstRawData instead of GetValueData.
Fixes missing category headers (e.g. "Numeric") during multi-object editing.
Added a Crash Diagnostics panel to the Editor Diagnostics window to view recent editor crashes.
Add button to enable/disable editor shortcuts when PIE is active.
Added Dynamic Invalidation to the Material Editor Graph.
Added Data Hierarchy Editor support to FInstancedPropertyBag:
PropertyBagSchema class can now direct the property bag details to an optional HierarchyRoot object.
PropertyBagSchema class also contains information about hierarchy types.
This can be used to subclass and add properties.
Moved some util functions around hash calculation into public
Replaced some UEdGraphSchema with UPropertyBagSchema.
Added more encapsulation so that FPropertyBagInstanceDataDetails is more standalone and can be subclassed.
Removed some of the construct params in favor of FPropertyBagInstanceDataDetails looking relevant data up via property handle.
Added InstanceMetaData support to allow forwarding metadata to an inner FInstancedPropertyBag.
S Subobject Editor::FindSlateNodeForHandle: find slate node for FSubobjectData that doesn't have a WeakObjectPtr but does have a corresponding teds row.
Project Launcher fixes for recent changes in Cooker behavior:
Zen Streaming content scheme is only used for new profiles when bUseZenStore and AllowRemoteNetworkService are set.
Add profile validation error when trying to use Zen Streaming to a remote device when AllowRemoteNetworkService is false.
Platforms menu Quick Launch disables unversioned cook when using LegacyIterative.
Added Dynamic Invalidation to the Place Actor Panel.
Added Dynamic Invalidation to the Content Browser.
Added Dynamic Invalidation to the Scene Outliner.
Added support for drag-and-dropping a texture onto an existing texture sample node to replace the texture.
Bug Fix:
UMG/Slate
Fixed SListView ScrollIntoView alignment math (local-space deltas and CenterAligned culled-target offset) so centered and partially clipped items scroll correctly at non-default DPI.
Fixed proximate intra-entry navigation to reject focus targets outside the list bounds when bEnableProximateEntryNavigation is enabled.
Fixed crash in PropertyPathHelpers::SetPropertyValueFromString when propagating properties to widget archetype instances.
S Draggable Box: Fix for single right-click entering drag mode.
Fixed selection outline of Nanite-enabled mesh components when selecting individual components below an actor. Previously, deselected components on the same actor would not render with the muted outline color.
Fixed the editor selection outline of Nanite-enabled Skeletal Mesh and Instanced Skinned Mesh components.
Fixed overlay colors not working with non-Nanite Instanced Static Meshes.
Fixed nullptr dereference when generating tooltip in widget reflector for native widget class types.
Tool Widgets: Fixed SDraggableBoxOverlay accumulating Padding when invoking SetBoxAlignmentOffset with center alignment.
Fixed crash when dismissing notifications after hot-reload.
Fixed right click crash on tagged asset browser sections.
Fixed incorrect transform handling of static meshes in the viewport.
Optimize select actors in statistics tab.
Fixed edit change conditions not correctly gathering the edited UObject if it's an instanced struct that was added to the UI, as a complex parent was found on the way up that was not the owning object node.
Fixed missing objects in property change event for edit condition toggling.
Fix an issue where Status Bar tool tips appeared in another screen (or overlapped the status bar if there was no monitor to the right).
Added IsAssetVisible check for tagged asset browser extension functionality.
UX
New:
Added new input settings tab containing keyboard shortcuts and future shortcuts.
Added sidebar to settings editor that shows left panel when more than one item (docked) and hides when it contains a single item.
Import/export (All) will only handle shortcuts instead of all editor settings now.
Updated autocompletion and suggestions to use new container.
Improved Settings Editor UI to match the rest of the editor (tree view, splitter, category, style).
Improved search to only apply to the selected section instead of showing all results.
Improved Filters and suggestions to be dynamic and (dis)allow specific sections (they only appear in the proper context).
Added keybind action button to search for specific keys pressed.
Allow partial search match from begin or end.
Added icons for keybind and cvar filters.
Added advanced preview scene options to customize floor, floor rotation, floor scale and floor material.
Added advanced preview scene option to clone a profile from existing ones.
Added advanced preview scene keyboard shortcuts to navigate to next/previous profile (SHIFT+ALT+Up/Down).
Reworked the preview scene settings tab UI.
Property AssetPicker can now be customized with additional metadata to set ViewType, ThumbnailSize, ThumbnailScale, SettingsName.
Deprecated "show grid" property since it's not relevant to all context.
Fixed preview scene not loaded properly on editor startup.
Property Editor: Add an option to add a color bar on every row in the category.
Persist import interpolation mode for reimporting CSV as curve table.
Interactive Tools Framework: Modified UInteractiveToolPropertySet::SaveRestoreProperties to only instantiate a property cache entry when saving. This permits successive calls to RestoreProperties to behave as expected, particularly in the case where a tool inherits from a base tool class, but wants to modify the defaults of an inherited property set. In that scenario, both the base class and derived class would issue RestoreProperties on the inherited property set.
Prior to this change, the first call to RestoreProperties would instantiate the property cache and detect that the property cache was just created to avoid the restore. The second call to RestoreProperties would incorrectly see the just created property cache as evidence that there is saved data to restore and copy the default CDO data to the tool.
By only instantiating the property cache on save operations, the behavior is more consistent and avoids tools having to create awkward workarounds using separate property cache IDs to workaround the issue.
Fixed combo box widget tooltips appear on dropdown list items across the editor making it hard to navigate across options.
Added a way to extend force repel zone on any widget with a slate attribute.
Added scale option in config for warning/error messages in texture editor viewports.
SSegmentedProgressBar is now available for displaying the progress of a multi-state workflow.
Replaced delete content browser popups by dialogs to attract user attention (folders, favorites, collections).
Improved delete dialog widget to include pending deletion folders.
If the folder is not empty and contains assets, a first dialog will be shown to avoid loading all assets recursively on a mis-click otherwise only the main delete dialog widget will be used.
Re-enabled delayed change notification on SceneOutliner search.
Added asset class icon with color to the save all dialog content table row.
Updated content browser suggestion filtering so only paths starting with the currently typed text are shown.
Open editor, project, input settings in "All settings" by default instead of "Appearances" and "General" since search is now localized.
Auto focus search box when opening settings.
Added drag and drop support from content browser to material editor viewport to change preview mesh.
Dropped preview mesh will become default preview mesh when reopening asset editor.
Added Material Instance to custom filter in content browser to search for these asset type.
Add recursive expansion/collapse on TreeViews when navigating with the arrow keys to match the shift-click expansion arrow behavior.
PCG Property Bag: Hierarchy Editor Support added.
The editor layout now properly restore the position and scale of the level editor window position and the other windows managed by the tab manager.
If CTRL is pressed and folder are dragged then copy/move folders is performed on drop.
If CTRL is not pressed and folders are dragged then add/reordering favorites is performed on drop.
If favorites folders are dragged then reordering is performed on drop.
If file assets are dragged then copy/move items is performed on drop.
Fixed ToolTip Override that was not working for FPropertyHandleBase::CreatePropertyNameWidget.
Show Favorites/Modified sections in details panel filter bar, use details settings and check "Show Helper Sections"
Add/Remove category items from favorites using context menu on a category.
Expand/Collapse details panel root categories using shortcuts : CTRL+SHIFT+X and CTRL+SHIFT+C, menu entries and commands actions are now using the same code path.
Fixed SHIFT+Click on expansion arrow do not recursively expand advanced category.
Grouping properties based on their original category in favorites and removing Advanced.
Enabled search in data table row editor.
Allow reordering of favorites list (above or after).
Disallow move or copy operations of folders in the favorite list.
Added edit favorite dialog to set an alias and shortcut to a favorite item (through context menu).
Content Browser - Column View : Added description of how many columns are displayed and from what asset type they are from. Without that information, it's hard for a user to understand there are some missing columns simply because they're not part of the columns of the asset type for which there's the most assets on display.
Added context menu entry in editor preference and project settings to copy associated CVar to the clipboard if any.
Added row extension button to quickly spot properties with a CVar and copy them to clipboard.
Improved "Keyboard Shortcuts" editable input UI to follow unreal theming.
Fixed ContentBrowserModule's "AssetClassesRequiringDynamicTags" feature. It now stores classes as FTopLevelAssetPath in order to properly detect them. Also, now, child classes of an asset class requiring dynamic tags are also considered requiring dynamic tags.
Added an option to sort the content browser filters in alphabetical order or insertion order.
Refactored loading filter code to restore filter in the correct order instead of the random type registration order.
Reordered all context menus in the content browser to be alphabetically sorted (Other filters, Custom filters, Common filters).
Added Open Screenshot Folder button to High Resolution Screenshot tool.
Added browse to asset when right clicking the tab of an editor asset tab, action is only enabled for assets (non transient).
Added browse to level when right clicking the tab of an editor level tab, action is only enabled for saved level.
Use the class display name when showing the asset type in the generic asset viewer (as we do in the Blueprint editor).
The tooltip now for the "go to source" hyperlink shows the native class name for both the Blueprint editor and asset viewer.
Bug Fix:
Fixed sidebar widget stays in an intermediate state when clicking multiple times on the sidebar button.
Asset thumbnail: Fixed color that was not updated to match the asset type color in some cases.
Fixed Blueprint Editor Drag and Drop of asset in tree hierarchy does not match user intent.
Fix an editor crash that could occur for reset to default on class reference values in the details view.
Fixed non-displayable references list is not interactable when deleting pending assets in dialog.
Fixed set and map property editors that would not show "Multiple Values" when editing multiple objects with a different number of items (they both behave like the array property editor now).
Fixed asset search box suggestion width should match search box width instead of changing based on in view content.
Fixed content browser search suggestions should appear above to avoid obfuscating filtered results.
Content Browser: Fixed an issue where the previous opened path would not always be restored properly when rebooting the editor.
Add missing support for instanced struct value edit propagation and some fixes for its reset to default UX.
Fix for stomping an annotation that has already been set during edit change propagation.
(Example) This was (incorrectly) marking child BP assets as needing to be saved if they happened to be open for edit alongside their parent in the BP editor, in cases where they would (correctly) not be dirtied if not also open for edit.
Fixed the AI assistant tab label centering in the Panel Drawer.
Foundation
New:
Optimized FSplineMeshSceneProxyDesc::CalculateShaderParams to skip calculating the MeshDeformScaleMinMax if the mesh isn't nanite enabled. MeshDeformScaleMinMax is only used for nanite LOD calculations and computing it is very expensive.
Bug Fix:
Based on, fixed two issues in primitive drawing utilities:
DrawFlatArrow now correctly applies the thickness parameter, which was previously unused.
F Batched Elements::AddReserveLines no longer reserves twice the required number of line entries, reducing unnecessary memory allocation.
Fix FCompression initialization could occur on first use on a thread, causing a crash.
Quote path of PerfreportTool.dll when calling it from AutomatedPerfTestNode.
Build
New:
Update Intel OneAPI supported version to 2026.0.0.
Add UE_PLATFORM_* definitions to mirror existing PLATFORM_* definitions.
SN-DBS now uses per-platform tool template directories to avoid rare cases of ambiguity when compiling for several platforms at once.
Requires SN-DBS 2.6.10.1020 or later to utilize the new code path. Support for older versions of SN-DBS remains, but UBT will emit an error if it encounters a situation that requires the upgrade.
Added -SkipEncryption support for IoStore containers.
Remove 2GB limitation when generating psym files by never storing the output as a string.
UhtSpecifierValueType.Legacy is now obsolete. UhtSpecifierValueType.None should be used in its place.
Added packaging option to allow specifying alphabetical-cluster-sort and alphabetical fallback ordering for a specific prefix match of container names.
Added support for patterns such as "FString()" for default values in UFUNCTIONs.
Build Graph: Added option ErrorIfNotFound to RetrieveArtifactTask to control if an error is thrown when an artifact cannot be found.
Bug Fix:
Add support for UStructs in namespaces for TInstancedStruct properties.
Set DefaultBuildSettings for the BlankProgram template. This prevents compilation errors when the template is used outside the engine folder.
Add support for UStructs in namespaces within RigUnit.
Fixing an issue where types wrapped in WITH_EDITORONLY_DATA would not have that definition reflected in the generated code.
SNDBS: Prevent exception when there is no explicit_input_files key.
`class IFoo {... }; UCLASS() class UFoo : UObject {... };` no longer results in an error claiming that IFoo is missing GENERATED_BODY().
Fixing issue where delegates were not properly bound by #if/#endif pairs in their definitions. Added "Editor" as a distinct defined scope separate from EditorOnly.
Compile Time Improvements
New:
Reduced linking time on clang with LTO by disabling debug info upgrading, sice we build everything with the same toolchain.
Core
New:
DDC
Added record/value to cache put responses to give callers a copy of what ended up stored in the cache.
Added ApplySkipPolicy to apply ECachePolicy::Skip to values and records.
Added a constructor for FCacheRecord from FCacheKey.
Added TryLexFromString for FCacheKey and FCacheBucket.
Added support for natively-async cache stores to skip creation of an async wrapper.
Added cache store tests.
Added custom cache graph support with, e.g., -DDC=(EnginePak,Cloud), or in the same format with the DDC.Graph CVar. Any configuration that is valid in a graph is supported, such as -DDC=(ZenLocal,Cloud(ReadOnly=true)) to create a graph with ZenLocal and a read-only Cloud.
Added BuildLegacyCacheKey to support migration from the legacy API.
Removed unused short key and legacy mode functionality.
Updated graph creation to use the new config API.
Require that RawHash matches when present in GetChunks(). It was a hint and now it is a requirement to avoid callers receiving different data than they anticipate.
Added ECachePolicy::NonDeterministic to flag known-non-deterministic data to avoid noise in -DDC-Verify mode.
Serialize put requests into replays and replay them as gets.
Improved DDC graph selection. Consider every -DDC=... command line argument as a candidate. Removed broken -DDC=None functionality. Fixed DDC.Graph CVar overriding the installed default by making it empty by default. Added -DDC-NoDefaultGraph command line argument to remove the default graph from consideration.
Added a linear-probing hash table for internal use by DDC and DerivedDataTool.
Added a concurrent chunked sparse array for internal use by DDC and DerivedDataTool.
Removed obsolete DDC WaitForQuiescence from AppPreExit.
Compact Sets: Resolved remaining issues to allow compact sets to be enabled safely:
Re-added key storage to ensure full compatibility with GC and object relocation.
Fixed natvis and GDB printers for sets and compact sets.
Removed unused feature auto relax map.
Reworked compact set lookup algorithm to account for some specific edge cases.
Improved run-time detection of broken lookup, usually due to external memory changes.
Added BuildConfiguration option bUseSparseSetStrictMode that, when enabled, will cause spare sets to be more strict in their usage so compile issues can be fixed to allow switching over to compact sets.
Added BuildConfiguration option bUseCompactSetAsDefault that, when enabled, will swap the implementation of TSet and TMap to use compact sets instead of sparse sets. TCompact[Map|Set] and TSparse[Map|Set] still exist for explitic usages, but explicit forms cannot be used as UPROPERTY's.
Perf: Enabling compact sets in Fortnite saw 40-90MB of memory savings, depending on platform, as well as overall improved performance in most CPU threads.
Add TSubScriptStructOf. Similar to TSubClassOf but for UScriptStruct. Add an editor picker that works with NoClear and the metadata.
Meta Struct: The struct path of the base struct displayed in the picker.
Show Tree View: The picker uses a tree view or a list view to display the available struct.
Show Display Names: Uses the DisplayName of the selectable struct.
Hide View Options: Hides the options menu in the picker.
Struct Utils: FInstancedPropertyBag serializes with the default values. With tagged serialization, the full instance will be skipped if the descriptions and the values are the same. If the descriptions are the same, only the values that are modified will be serialized. If the descriptions changed, then the default is not used. When using FInstancedPropertyBag in a BP, it might appear that it works without this changelist. This is due to the reinitialization process during compilation. Without this change list, it might not work depending on the loading order.
Added "UObject Count" trace counter.
Introduce indirection for AssetRegistry cache files, so we don't need to overwrite them.
Introduced UE_JSONOBJECT_LEGACY_STRING_KEYS which defaults to 0, set to 1 to revert FJsonObject to its FString-based interface.
Replaced the hash for FNameEntryId to avoid extremely poor worst-case distribution.
Added asset chunks deduplication option in UnrealPak for IoStore containers, accessible via [/Script/UnrealEd.ProjectPackagingSettings] bDeduplicateChunks=true.
Added C++ Concept for pointer convertibility.
Added support for non-power-of-two FName pool shard counts, to allow alleviating hash table load without needing to double the capacity.
`TVariantPtr` no longer requires non-UObject type to be `TSharedFromThis`, accepts `TSharedPtr`.
Added the concept of auto-loading non-plugin modules based on.ini settings (see Auto Load Modules By Phase: And [AutoLoadModulesByPhase_Editor] in BaseEngine.ini).
Making use of it to load TargetPlatformManagerModule earlier to kick off the async UBT process.
Prevent LexToString(bool) from hijacking types that implicitly cast to bool. This makes missing or unresolvable LexToString overloads fail at compile time instead of being hidden by a bool conversion.
Added UE::CInsertable as a proper concept and UE::CInsertableInto that reverses the parameters.
Added FText::AsMemory overload accepting a specific EMemoryUnit.
Fix json library to use actual object class instead of static class from templated class type.
GC: Add the option to GC based on pending actors to unload (in addition to existing mechanism that uses number of levels) for finer control (disabled by default). Number of levels can be inaccurate given the discrepancies between level counts and memory impact. across main grid / data layers Add the option to GC based on pending actors to unload (in addition to existing mechanism that uses number of levels) for finer control (disabled by default). Controlled via `s.ContinuouslyIncrementalGCWhileActorsPendingPurge`/ `s.LevelStreamingLowMemoryActorsPendingPurgeCount` and `wp.Runtime.LevelStreamingContinuouslyIncrementalGCWhileActorsPendingPurgeForWP` (for partitioned worlds).
Added the frame counter (when present) to structured log output.
Oodle updated to 2.9.16.
Added natvis visualizers for Compact Binary.
Added MoveAssignScriptStruct to UScriptStruct for move-semantic support in type-erased struct operations. Introduced the WithMoveAssign trait on TStructOpsTypeTraitsBase2 (following the pattern of WithCopy), the STRUCT_MoveAssignNative flag, the FCapabilities::HasMoveAssign capability, a MoveAssign fake-vtable entry, and ICppStructOps::HasMoveAssign() / MoveAssign(). STRUCT_MoveAssignNative dispatches to C++ operator=(T&&); STRUCT_IsPlainOldData uses memcpy; the fallback calls CopyScriptStruct for zero regression on non-opted types.
Parking Lot: Use low-level virtual memory API for allocations to allow our allocators to depend on ParkingLot.
Rename some private stats types to avoid collision with platform SDKs.
Deprecate and remove the FField virtual functions Bind(), PostLoad() and BeginDestroy() that are implemented but never called.
Added && TShared/Weak... constructors and StaticCastShared/Weak... helpers. Removed WeakPtr from TSharedFromThis.
Changed MallocBinned3 max small bin config to 14kb by default as it offers better performance\memory in our testing.
Added filtering by key to the derived data cache key filter used for simulated misses, verification, and replay.
Added IsLockedByCurrentThread() to the recursive mutex types.
Implemented an easy-to-use mechanism for deprecating existing cvars.
Asset registry cache will now memory-map its tag data storage, reducing RAM footprint by GBs in large projects.
Made TSharedString transactionally safe by using TTransactionalAtomicRefCount.
Converted UE_LOG to use log records internally. This adds file, line, and context to every UE_LOG even though they are inherently unstructured.
Simplify serialization of ClassFlags in UClass::Serialize by updating and always using CLASS_ShouldNeverBeLoaded.
Reduced the stack cost of a failed ensure from ~32 KiB to ~2 KiB.
Added packaging of Derived Data Build Workers and updated DerivedDataTool to work with them.
Made UTF8TEXTVIEW constexpr.
Added -CookPackageDir= to the cooker to allow cooking a directory, and when combined with -cooksinglepackagenorefs, then only that directory will be cooked.
Added a DerivedDataBuildController to support compiling shaders through the Derived Data Build API.
Improved to the Derived Data Build Worker startup time. Fixed directory deletion in the local executor for the Derived Data Build Worker.
Runtime: Add: WebRTC initialization on Android.
Optimized variable-length integer encoding in VarInt.h.
Allow an IInstallBundleSource implementation to override the default PAK mount priority via its FInstallBundleSourceUpdateContentResultInfo.
Added OnHDRScreenshotCaptured delegate to UGameViewportClient, fired when an HDR screenshot is captured. OnScreenshotCaptured does not fire when HDR is enabled. A separate delegate is needed to allow returning the HDR bitmap as TArray<FLinearColor> rather than TArray<FColor>.
Removed unnecessary dependencies from LauncherServices, RenderCore, ShaderCompilerCommon, and TargetPlatform Reduces the size of programs like ShaderCompileWorker that do not otherwise depend on some of the removed dependencies.
Added TargetRules.bEnableConfigSystem to allow disabling loading config.
Enable range-based for loop support for `TFilterCollection`.
Commandlets will now print peak used memory at the end of their execution.
Added option in UnrealPak to keep unchanged assets at the same file offsets in IoStore containers as they were in the previous build, accessible via [/Script/UnrealEd.ProjectPackagingSettings] bUsePatchInPlaceLayout=true.
No longer performs a normal config save if the PreSaveConfigFileDelegate returns that it saved the file. This can reduce some slow unnecessary disk operations on some platforms. Can revert to original behavior by either setting ini.SkipSaveIfPreSaveSucceeded to 0, or by not incrementing SavedCount from your delegate implementation.
Add cvar, core.EnsureBreakEnabled (default:True), to disable debugger breaking when ensure statements are hit to allow skipping unrelated ensures while debugging longer processes.
Added a DerivedDataTool Copy command to copy data between caches.
TLruCache: Add SetMaxNumElements / Declare default move constructor/assignment and define proper copy/assignment as they are currently broken (with unittest) [PCG] Cache: optimize cache grow and use SetMaxNumElements instead of the previous full copy that was happening.
Streamable Manager:
Added a mechanism to just-in-time trickle async load requests on a streamable handle.
Added a mechanism to batch/trickle async load requests on a streamable handle.
Opt-in (enabled via UE_ENABLE_STREAMABLE_JIT_ASYNC_LOADING=1) and by setting bUseJustInTimeAsyncLoader=true or if batching is enabled globally (s.StreamableEnableJITAsyncLoadingGlobally).
The initial batch size is set as per s.StreamableJITAsyncLoadingInitialBatchingFactor which is a factor of the total number of requests queued for a streamable handle (default is 0.25).
This can be used to cancel or queue subsequent async load requests at updated priorities (see FStreamableHandle::SetPriority) which would get picked up when subsequent requests are queued.
Opt-in by setting bUseJustInTimeAsyncLoader=true or if batching is enabled globally (s.StreamableEnableJITAsyncLoadingGlobally).
Optimized FMath::RoundUpToPowerOfTwo[64] for Clang.
Used MPSC queue instead of MPMC queue for log output.
Added && to Value and operator* in TOptional.
Refactored UObject::LoadConfig into some Context objets to break up the wall of code and also be able to more easily add functionality (like passing a preloaded FConfigFile to LoadConfig).
Added TAutoConsoleVariableDeprecated_NoReplace CVar type that is used to deprecate a cvar without replacing it with another one. The value can still be queried, but it will ensure (or warn or assert depending on setting). Similarly, FAutoConsoleCommandDeprecated_NoReplace was added for deprecating a command without pointing at another.
Added support for an optional.ini file that is applied after engine/project plugins and before GFPs and Hotfixes. This allows a project to override plugin settings if needed (likely to be rare, but there is a use case for it). It is called PluginOverride.ini (ie PluginOverrideEngine.ini) and is stored in Project/Config. There is no per-platform version.
Added bool return type to FConfigCacheIni::Flush to know if the information was actually written to disk.
Added parameters to TGuardConsoleVariable to be able to specify priority when setting cvars from testcode.
Added FrameNum and UTC time to stat unit so we have a way to match up video captures with logs, etc. Requires setting "stats.UnitTimestamp" cvar to enable.
Use UTF-8 for structured logging format strings.
Added the UE_LOGF family of macros for unstructured logging with UTF-8 format strings.
Added FPlatformString::FormatV and TCString::FormatV to provide GetVarArgs with a usable return value.
Add EAllowShrinking arg to TIndexedContainerIterator::RemoveCurrent and TIndexedContainerIterator::RemoveCurrentSwap.
Added concept UE::CContiguousRangeOrRef.
Moved GetDataHelper to UnrealTemplate.h.
Assert on re-entrant calls in ParkingLot to catch invalid usage by callers.
Added WaitFor and WaitUntil to FConditionVariable.
Added console command to reload a package in the editor, including in -game obj reloadpkg package=/Game/Foo.
Added the OptStreamGotTo optional param to most of the FParse::Value() functions (it was only on string versions before). Didn't add to FText version because it uses a different parsing code that doesn't return the end of the value.
Added trait TIsCharEncodingCompatibleWithUTF8CHAR.
Add error detection for SQLiteSupport.
Moved log category macros to LogCategory.h.
Fixed WarnFilterScope for structured logging and added CHECK_LOG_SCOPE for common cases.
Cleaned up the unused FConfigFileHierarchy::DynamicKey code.
Allow plugins to have PluginName.ini along with Base/DefaultPluginName.ini (but deprecated).
Also deprecated BasePluginName.ini so we can eventually look for fewer ini files during plugin mounting.
Show a message with GFP old style names as well.
Removed unnecessary confighierarchy entries, and plugin config branches that have no static layers.
Removed the "config xxxx" console commands in SHIPPING.
For GameFeaturePlugins, renamed Conole Variables: And [ConsoleVariables_HighPriority] to [PluginCVars_LowPriority] and [PluginCVars_HighPriority]
Added initial support for them in Preview, although it only works if in Engine.ini files, a future change will work to address this.
GFP Hotfixes still use Console Variables: Because they set at Hotfix priority, not Plugin.
Bug Fix:
DDC
Allow records with no values in the Memory cache store. DDC: Report an error when the memory cache store exceeds its size limit. DDC: Verify that content exists in the FileSystem cache for differing values even if they are expected to be non-deterministic.
Fixed Zen client support for out-of-bounds chunk reads.
Fixed out-of-bounds chunk reads in the memory cache store.
Validate RawHash in compressed buffer headers to mitigate invalid data being returned by Zen.
Fixed a dangling string view in TryFindCacheGraphConfig.
Fixed a file system cache store race with initialization of FRandomStream relative to starting the maintenance thread.
Fixed a crash in FTimeAveragedStat and added tests.
Fixed use of ',' as a delimiter in unquoted arguments for simulated miss types and keys in DDC.
Fixed a DDC crash when recovering from a failure to create a non-default graph containing a pak store.
Fixed Cloud DDC reauthentication during shutdown by ensuring that DesktopPlatform unloads after DDC.
Add a CVar named "Serialization.EnforceLinkerObjectBounds" (default true) to bounds check object data reads from.uasset in editor - this makes loading data after changing a variable type safer.
F Instanced Struct Container: Fix missing default initialization of items prior to serialization on load causing invalid values if delta serialized.
In FMonitoredProcess::TickInternal(), set bIsRunning = false _before_ calling OnCompleted(), so a Completed delegate can call GetFullOutputWithoutDelegate() without asserting. (Same change to OnCanceled())
Fixed a dangling pointer in FConfigContext when using TemporaryBranch.
Fix FName::CompareSensitive not always comparing case-sensitively.
Allow newly created packages with a file on disk to be reloaded.
Updated "stat fps" frame time indicator to use the same smoothing factor as "stat unit".
Windows Platform File: Fix IterateDirectory to honor the contract to return false if the input directory does not exist. Keep the behavior that it returns true for directories that exist but are hidden or otherwise uniterateable.
Updated FObjectPropertyBase::ParseObjectPropertyValue and FSoftObjectPath::ImportTextItem to handle parsing object paths with spaces in them.
GameFeaturePlugins can now work from locations listed in AdditionalPluginDirectories (in a.uproject).
Do not reset external package when renaming actor changing outer in PIE packages, fixing the asymmetry.
Core/HAL: Fix: FSharedEventRef not respecting EEventMode passed in to the constructor.
DiagnosticCheckNaN functions in various math library types no longer change the object being tested to a non-0 default value. This will increase the number of log messages but the old behavior involves mutation in a const member function and was a potential data race.
Adjust CheckObjectValidBasedOnItsFlags to be consistent with other validity check such as TWeakObjectPtr::Get.
Ignored SetColor verbosity in FOutputDeviceDebug.
Fix for CrashReportClient reading project settings when bAllowNonUFSIniWhenCooked is set.
Log an error if the class import doesn't have an outer (i.e reported as a package) when calling GetExportClassPackage.
Fix multiple bugs where object flags and properties were not correctly copied over during reinstancing.
Fixed a potential FPropertyTag issue when saving a static array with a property guid.
Disabled the logging backlog at the end of PreInit for program targets to avoid unbounded backlog growth for programs that do not call GEngineLoop.Init().
Fixed restarting workers with the incorrect number of task workers if the platform has a thread config. Changed the code to reinitialize with the existing number of workers.
Fix for CriticallyDampedSmoothing when using target velocity.
Correctly set ETaskTag::GameThread for the lifetime of the LowLevelTests test runner.
Fixed initialization of the static thread ID in FTaskTagScope.
Added a compiler flag to allow the work-stealing task queue to explicitly yield the thread if it fails to steal a job after a certain number of iterations (to avoid a deadlock).
Fix for a rare memory stomp inside ServerMoveClientError. It is possible for the ServerPredictionData to be nullified part way through this logic (through a delegate fired in MoveComponent), which would mean the ServerData pointer is pointing to stale data. Reacquiring the ServerPredictionData guarantees the data is valid. Fixed a rare memory stomp inside ServerMoveClientError if MoveComponent causes a call to Unpossess.
Adding FMA intrinsics when compiling with MinimumCpuArchitectureX64.AVX2 on Clang.
This fixes a compile error in the Eigen library when compiling AVX2 on Dedicated Servers using Clang.
This is because when compiling using the VCToolChain using Clang, we still define _MSC_VER so the Eigen library assumes FMA is included because MSVC always includes those intrinsics when using /arch:Avx2.
This change brings our Clang configuration in line with MSVC when using AVX2.
Note that this does not change the ffp-contract behaviour, so will not allow the compiler to optimise multiply add operations automatically.
Added FMA intrinsics when compiling with MinimumCpuArchitectureX64.AVX2 on Clang.
No longer reconstructs a subobject after instancing its missing outer if it already constructed the subobject from the source archetype (optimization).
Fix TPagedArray not forwarding allocator to internal Pages array.
Remove the IniKeyDenylist and IniSectionDenylist from all layers of the BinaryConfig, instead of just the final InMemoryFile.
Fixed TFunctionWithContext to support function pointers.
Added some thread safety to FConfigCacheIni::ReadString (which the others like GetInt go through), SafeReload, and AddDynamicLayersToHierarchy.
Apply FObjectInitializer instancing exclusions only to the object being constructed/initialized.
Fixed TFunctionWithContext to support assignment from a const lambda.
Disable editor-only data for non-editor platforms in FoundationTests.
Fix duplicate warnings when LoadObject fails and improve the messages.
Fixed access violation in libcurl 8.12.1 when under heavy load from during cook commandlet. The curl team has already fixed the issue in 8.16 and later.
Fixed FHashTable buffer overrun on shrinking.
No longer loads plugin ini files from subdirs (like Tags).
T Compact Set: Ensure that elements are rehashed after being serialized during reference replacement.
Fixed a HybridPackageStore init issue when no zen snapshot exists.
Fixed some issues with getting PackageStore info when we don't have a package name (in ImportPackagesRecursiveInner sets bHasImportedPackageNames to false).
Updated UE_LOG_CONTEXT to be safe for use in transactions.
Task Graph: Fix TGraphTask execute scopes not being emitted to Insights when using lightweight stats. Fix TGraphTask execute scopes not being emitted to Insights when using lightweight stats.
Removing an unneeded CheckSlow in TCircularBuffer(uint32 Capacity) constructor that was checking for a capacity of 0. FMath::RoundUpToPowerOfTwo returns 1 for both a value of 0 and 1 so the buffer is established with a valid capacity regardless of what's passed in so the check isn't needed.
When writing out the config file in FConfigFile::UpdateSections, don't write out the file if it matches the current file. This will make it so files like DefaultEngine.ini don't get marked as "changed" by some source control.
Slightly changed the COnfigModificationTracker class to be able to use bTrackLoadedFiles more often with worrying about tripping the code to not load a file that was already loaded (reducing side effects of using bTrackLoadedFiles).
Now added context in the Console Variables:/[COnsoleVariables_HighPriority] deprecation ensures.
Fixed missing assignment of OutObjectId in MakeReferenceIds in FObjectHandle.
Fixed console command arg parsing to support ""
Added loop break in EarlyPlayFrameTick if engine exit has been requested to fix related hangs.
F Tick Function Task::DoTask and FBatchTickFunctionTask::DoTask functions' TickContext parameter have the proper TickGroup set (instead of always being TG_PrePhysics).
Fixed conversion from TArray in FArrayProperty.
Fix for decltype on angle delta functions.
Fix bug with FUnitConversion converting values that did not need converting. Resulted in values that were slightly off due to conversion precision limits.
Fixed an incorrect optimization in FString::MatchesWIldcard and related funcs. It would flag matches incorrectly in certain rare cases.
Deprecated:
Deprecated functionality in the UE4 API DDC that is no longer supported.
Deprecated FCoreDelegates::OnPostEngineInit in favor of FCoreDelegates::GetOnPostEngineInit() to fix missing registrations that occur during static initialization.
Deprecated PLATFORM_ENABLE_POPCNT_INTRINSIC and the associated FPlatformMisc::HasNonoptionalCPUFeatures() and FPlatformMisc::NeedsNonoptionalCPUFeaturesCheck().
The UObject::Rename flag REN_ForceNoResetLoaders has been deprecated as UObject::Rename will no longer call ResetLoaders or flush loading during renaming as this was the cause of unnecessary loading stalls, and could introduce hard to diagnose bugs due to the sync load in the middle of a possible temporarily, intentionally incorrect UObject state such as during Blueprint reinstancing.
Rename will still attempt to maintain a package's Linker export mapping as renames occur unless the flag REN_AllowPackageLinkerMismatch is provided. As a result without specifying REN_AllowPackageLinkerMismatch, Rename will detach the linker from a loaded object whenever the object is moved to a new package.
Similarly, renaming a loaded object without specifying REN_AllowPackageLinkerMismatch will detach the export object from the linker that loaded it allowing future package requests for the same package to load a new object instance using the original object name if no object redirector was created during renaming (i.e. REN_DontCreateRedirectors).
If an object is being renamed and future package reloads should not create a new instance of original object name, InvalidateExport() should be called on the object before renaming. In cases where one wants to temporarily rename a loaded object and then rename it back to its original name, (REN_AllowPackageLinkerMismatch | REN_DontCreateRedirectors) should be provided as your rename flags to ensure the export is not detached.
Deprecated PLATFORM_TCHAR_IS_4_BYTES.
Dev Tools
New:
Unreal Build Tool
Support for APX for x64 architecture.
Implement.pvsconfig support for PVSToolchain.
Added TraceQuery, a CLI tool for querying.utrace files as JSONL.
TraceQuery is a lightweight standalone UBT program that reads Unreal Engine.utrace binary trace files and outputs structured JSONL to stdout, enabling scripted performance analysis without UnrealInsights or the editor.
It depends only on Core, TraceAnalysis, and TraceServices, and decodes named stats, named counter time series, session diagnostics, frame boundaries, and CPU profiler scope events.
CPU scope events are buffered per (thread, specId) and flushed as grouped arrays to avoid per-event output for high-frequency scopes. The CLI supports filtering by logger, event name, stat/counter substring, and time range (--start-time / --end-time in seconds).
Bump preferred MSVC to 14.50.
Linux HWPGO support.
Add Raw Pairs to TMap natvis.
Expose a unique session identifier for each UBT invocation.
Implement the UAT "-CompileOnly" command line option already documented in the usage info. It will compile all out-of-date script modules before exiting without running any command.
Bug Fix:
Unreal Build Tool
Fix Dynamic Debugging LiveCoding Interaction.
Fix sln icon in the shell not displaying vs version, by removing empty first line in sln file.
Fix ambiguous call converting method group to string.
Fix RPC InputKey not processing Tapped inputs The Tapped parameter was previously omitted from the RPC arguments dictionary. Created conversion method "AsRpcArgs()" to automatically include all properties decorated with JsonPropertyName, eliminating the possibility of forgetting parameters.
Make UpdateLocalVersion commandlet write P4 CompatibleChangelist into Build.version.
UHT: Fix format string when usage in member declaration detected without an alternative, in UhtIssueBehavior.AllowAndLog case.
Make UAT and UBT out-of-date DotnetDepends checks more robust when launching multiple instances on Windows. The tools themselves check a mutex, but the bat files could previously try to rebuild a tool by before that point.
Mitigate race condition in ImmediateActionQueue.
Fixed C# P4 BatchedCommand helper calculating the wrong length and overflowing the 32,699 character limit It wasn't taking into account the length of the base Command or GlobalOptions, which are also added to the arguments when running p4.exe.
Horde
New:
Horde
TokenConfig ClientId and ClientSecret can be read from a Horde secret during configuration load.
Added OptionalRequires attribute for BuildGraph nodes. Allow nodes to declare dependencies using the new OptionalRequires attribute, which allow a dependent node's execution to continue if the artifacts failed to be created.
When assigning a job lease to an agent check if the required free disk space is available, otherwise assign a conform lease to the agent instead.
Bug Fix:
Horde
Normalize IPv6-mapped IPv4 addresses to plain IPv4 for compute IP comparison.
Fixed shelved changelists not being deleted during an agent conform.
Dispose the Perforce PoolConnectionHandle when there is an exception during login.
Fixed when an agent lease is cancelled by a user the step will complete and upload the logs.
Insights
New:
Unreal Insights
Added keyboard shortcuts for "Find [Max Duration/Prev/Next] Instance" of a timing event in Timing view and Timers view. By default: /,. for [Max/Prev/Next] in selected time range and Shift + /,. for global search.
Unreal Insights users can now create time, time range, and event-based annotations in Unreal Insight traces. The annotation data is saved in a sidecar.ini file that can be shared. This feature is to help individuals and teams with the performance analysis of trace files.
Added "Go to Frame" (Ctrl+G) and "Go to Time" (Ctrl + T) modals to timing insights. Allows navigation to Render Frame, Game Frame and time stamp.
Sort the analysis modules by name when displaying them in the session tab.
Send OnConnect events on it's own thread. Refactored how events emitted during OnConnect is handled. Events can now be marked as "MaybeImportant" to treat events as important (without retaining in memory) when emitted during OnConnect, but as regular events when emitted elsewhere.
Added support for tracing through a secured SSL socket. This works slightly differently from the standard socket connection, as the receiving side is expected to connect to the tracing application. The secure connection supports three modes:
Self signed certificate and authorization code.
Known certificate authority and authorization code.
Pre shared key (PSK). Methods of making certificates and authorization codes available on the connecting application is not provided by TraceLog. This needs to be transferred out-of-band.
Update UnrealTraceServer to v1.24. This adds basic crash handling, and fixes memory leaks and crashes.
Added API to UE::Trace to expose IsTailing, which allows game code to know if the tail buffer is in use. #[review] [at]fn-perfdev-server Added API call UE::Trace::IsTailing which returns true if the Trace Tail Buffer is active.
Added "snapshot hitches" feature. This feature relies on the stats system to detect hitches. When a hitch is detected a trace snapshot and screenshot is written to the Saved/Profiling/Hitches directory. Frames are dumped into a directory for each process instance. Start tracking hitches by using in-game console command `snapshothitches -start` and disable by using `snapshothitches -stop`. Requires some stat group to be active, like `stat default`.
Allow for crashes to contain a trace snapshot. Use cvar "CrashContext.TraceSnapshotOnCrash" to enable and "CrashContext.TraceSnapshotOnCrashTailSize" to set size of tail data to be written. Currently only supported on Windows.
Add support for controlling max size when writing the tail buffer.
TraceController now exposes target capabilities.
Small increase to the time resolution timing shown in insights (without this, values near the low end of the automatic range have almost no precision - e.g. appearing as 1.2s).
Added OnClose event for when a trace connection is severed.
Added a MessagingInsights plugin, enabling visualization of UdpMessaging message summaries and lifecycles within Timing Insights.
TraceLog now automatically emits regular statistics about Trace performance. This can help to analyze problems with Trace performance. They are visualized as counters in Timing Insights.
Add bandwidth and percent value types for graphs and counter stats.
Add a "panic mode" for TraceLog. This is triggered if the block pool is full and the TraceLog (worker thread or end frame pump) cannot process data fast enough. When panic occurs the process can continue without being affected, but tracing is no longer reliable and cannot be used for the remainder of the process lifetime.
Bug Fix:
Addressing several UI/UX bug fixes in the new annotation feature.
Module names may not contain network names.
Fix flickering for channel tooltips in the trace control widget.
Unicast trace status and channel status messages to reduce Trace Control network usage.
Removed trace started notification from the Editor that affected the trace data.
Add base file for Insights settings to enable settings persistent in Editor.
Framework
New:
Level Streaming Persistence (Experimental): Added opt-in support for persisting actor states in a map's persistent level, persisting actor destruction by re-destroying, basic actor respawning (non-time-sliced), and game code hooks. These new features are opt-in and configurable through Project Settings > Level Streaming Persistence.
Add * and -> operators to TInstancedStruct for convenience.
ITF: Drop any active mouse hover capture prior to calling `BeginCapture()`. Fix issue where terminating hover cleared the wrong owner field.
JsonObjectGraph now properly encodes Enums that are being used as Flags.
Dynamic Loading Range Scaling option in World Settings leading to quicker PIE startup on large maps.
Add support for interfaces in FWorldConditionContextDataRef binding.
Bug Fix:
Apply const to query functions that do not perform mutating operations, so they can be used on a const UPrimitiveComponent.
Added tick unregistration logic to ULevel::ClearLevelComponents to make sure that when incremental unregister is not permitted, tick functions are still unregistered from actors.
Fixed crash in UBT when reporting Engine Files error.
Fixed a crash when editing an actor when instances of that actor exist in cleaned up UWorlds.
Deprecated:
LigthWeightInstances code marked as deprecated.
AI Debugging
New:
Trace Based Debuggers
Refactored and moved TraceSessionsManager from ChaosVD Main changes:
Settings are now Attributes to assign/bind when creating the manager.
Sessions manager creation now requires explicit references since this is no longer setup as a group of related singletons:
Debugger trace runtime module.
Engine-editor bridge.
Trace module (TraceServices::IModule modular feature)
FChaosVDTraceSessionDescriptor replaced by UE::TraceBasedDebuggers::FTraceSessionDescriptor.
Moved DataStream related types to (FSessionStreamStatsUpdater, IRemoteSessionDataStream, FDirectSocketStream, FRelayDataStream, etc.) under namespace UE::TraceBasedDebuggers.
Replaced recording flag by the ID of the application instance that requested the active recording.
Allow recording controls to filter out sessions from the dropdown.
Fix message traffic issue by sending the Pong message only to the sender of the Ping (i.e., no broadcast)
RewindDebugger controls now filters out other Editor sessions.
Fix session naming issue with multiple local editor instances: The session name can only be replaced by "Local Editor" by the process handling the Pong message and not when generating that message since multiple editors can handle it.
Rewind Debugger
Updated FRewindDebuggerTrack::GetStepFrameTimeInternal to use a scrub info struct providing more information to derived classes in order to select the best scrub time to use when using the stepping forward/backward buttons. VisualLogger track now allow users to jump directly to frames with events (i.e., skipping empty frames).
Added settings to control the desired transport mode for remote connections.
Added a new button to open the folder containing analysis files and one to delete all utrace files in that folder.
Added new virtual methods for runtime extensions to register new message types and handlers for remote connections.
Added new log categories widget to enable/disable verbosity filtering during recording and control the verbosity of each category (note that the initial implementation populates the "known" categories from the analyzed data of an active recording)
Added explicit methods to handle the local session recording and made sure that this functionality doesn't interfere with the other active sessions.
When auto-record on PIE is used we make sure to select the local session in case multiple remote sessions are available. Same when resuming or advancing one frame in PIE.
Fixed issue where users are not able to start recording while PIE is paused.
Added Auto-Scroll functionality.
Playback controls are now always available and will disable auto-scroll.
Manual scrubbing will disable auto-scroll.
Recording started on PIE will activate auto-scroll.
Resuming recorded PIE session will reactivate auto-scroll.
Added analysis opened/closed notification for editor extensions.
Updated some editor extensions to use RuntimeExtension instead when it was the intent (e.g., controlling traces)
Added support for remote sessions provided by TracedBasedDebugger/Analysis modules.
Updated toolbar to use RecordingControls.
Removed SaveTrace command since analyzed sessions are saved to disk by default.
Converted VLog filters from checkbox to toggles to allow users to set multiple ones without closing the menu.
GameplayProvider no longer filters out Server worlds.
Restore previous VLOG recording state when stopping traces.
Implement per-provider locking for RewindDebugger trace providers and migrate all call sites from session-level locks to provider-level locks to prevent deadlocks.
Add FProviderLock implementation to FAnimationProvider, FVisualLoggerProvider, FPoseSearch::FTraceProvider, FUAFProvider, FAnimNextAnimGraphProvider, FUAFAnimNodeProvider, FChooserProvider, and FStateTreeTraceProvider.
Replace FAnalysisSessionReadScope with FProviderReadScopeLock at all RewindDebugger track call sites (~60 files).
Replace FAnalysisSessionEditScope with FProviderEditScopeLock in all trace analyzers.
Replace Session.ReadAccessCheck()/WriteAccessCheck() with provider-level ReadAccessCheck()/EditAccessCheck().
Add missing ReadAccessCheck/EditAccessCheck to provider methods that were unprotected.
Optimize lock scopes to minimize hold time (cache data inside tight locks, move widget creation/asset loading outside).
Wrap Session.UpdateDurationSeconds() calls in FAnalysisSessionEditScope where needed.
Add configurable allowed class types filter to the Rewind Debugger target selector Replaces the hardcoded ULevel/UWorld child filter in the object selector dropdown with a configurable allowlist of class types.
Adds a new URewindDebuggerProjectSettings class (project-scoped, saved to RewindDebugger.ini) with a SelectorAllowedTypes array, defaulting to AActor.
Extends URewindDebuggerSettings (user-scoped) with a matching SelectorAllowedTypes array that can add types on top of the project settings but not override them.
The selector now filters by checking IsSubClassOf against the combined allowed types; an empty list falls back to allowing everything.
Renames URewindDebuggerSettings display name to 'Rewind Debugger (user preferences)' and fixes VLog settings to use its own localization namespace to avoid collision.
Visual Logger
Introducing new defines to split functionalities: Recording, Rendering and Visualizer Tool.
UE_DEBUG_RECORDING_ENABLED: Indicates whether the UE_DEBUG_* macros will record the element (VisualLogger and/or insight traces).
UE_DEBUG_RECORDING_USING_VLOG: Indicates whether the UE_DEBUG_* macros will use the VisualLogger recording process to store entries and write to all registered output devices. Otherwise only insight traces are used.
UE_DEBUG_RENDERING_ENABLED: Indicates whether the UE_DEBUG_* macros will use immediate debug draw visualization.
UE_DEBUG_VISUALIZER_TOOL_ENABLED: Indicates whether the analysis of the recorded data is active and dedicated UI and tools should be compiled.
To maintain compatibility ENABLE_VISUAL_LOG will enable all three functionalities. Without UE_DEBUG_RECORDING_USING_VLOG we bypass most VisualLogger functionalities to log to the trace directly. Examples of disabled features:
CategoryAllowList
NavigationDataDump
DebugSnapshot
ClassAllowList
ObjectAllowList
Output devices.
Added opt-in functionality to apply LogCategories verbosity filter when recording. Can be controlled by:
Console commands: Vislog.ActivateVerbosityFilterWhenRecording and vislog.DeactivateVerbosityFilterWhenRecording.
Config Property `bUseVerbosityFilterWhenRecording` in VisualLoggerSettings.
IMessageBridge
Add IsSubscribed(FTopLevelAssetPath) pure virtual to the base IMessageBridge interface so any bridge implementation can report whether it forwards a given message type.
FMessageBridge (standard) returns true unconditionally (PATHNAME_All).
Add FOnSupportedMessageTypesChanged multicast delegate, broadcast whenever the supported message types list changes (from RegisterExternalSupportedMessageType, InitializeMessagingSystem, or any path through ReInitializeMessagingSystem).
Add SetMessageBridge() to store an external bridge reference for per-type reachability queries.
Add CanPublishToNetwork that checks for a standard bridge (INetworkMessagingExtension modular feature) or queries the custom bridge's IsSubscribed for the specific type.
Gate SendPong on CanPublishToNetwork<FSessionPong>() to prevent ghost sessions when no bridge can forward Published messages back to the controller.
SmartObjectComponent Uses GetActorDescProperties.
Bug Fix:
Rewind Debugger
RecordingStarted is now called immediately once the connection gets established (not deferred to game thread) since the channels need to be enabled before the next game thread frame to not miss events.
Made sure that world times got reset before enabling trace channels from OnEnableRequiredTraceChannelsInternal virtual method.
AI Blueprint Helper: Updated CreateMoveToProxyObject to make sure the controller is still a valid Actor that can be stored in a weak pointer.
Visual Logger: Updated trace output device to handle entries larger than the maximum trace event size.
Fix: GetSmartObjectBounds was getting the owner actor transform instead of the component one.
Gameplay Debugger Replicator fixes to work with the MultiServerProxy. Gameplay Debugger Replicator used indices to replicate (which wouldn't necessarily match the other server). Now using names when available, Extensions are still by index.
Config: Added ensure and recovery code when a config is created and the 'config' specifier is missing on the UProperty.
AI EQS
New:
Added the bStripFromClientBuilds option to UEnvQuery, mirroring the pattern on UDataTable. This allows EQS assets to be excluded from client builds, since they are server-only AI queries.
AI Navigation
New:
Mass Navigation
Added OffsetCornersFromBoundaries parameter to FMassNavMeshPathFollowTask to push wall-hugging corners away from walls.
Improved Mass navmesh path-follow end-of-path detection with combined distance and projection checks; also fixes a division-by-zero.
Added FAgentHeightFragment to additional Mass StateTree tasks (FindSmartObjectTarget, NavMeshPathFollow) that need a height to query the navmesh.
Added FAgentHeightFragment requirement to FMassNavMeshFindReachablePointTask so it can build a valid FNavAgentProperties for queries.
Nav Mesh
Optimized Detour navmesh link memory by sizing the base link pool to actual usage (~30 MB savings on large maps); exposed bMinimizeLinkPoolSize and added link utilization stats to DumpNavMeshMemory.
Optimized navmesh vertex storage by packing vertices as tile-local float offsets (~50% memory reduction on vertex data); navmesh version bumped to 28 with automatic legacy-format upgrade on load.
Fixed misleading description and tooltip on ARecastNavMesh::bForceRebuildOnLoad.
Exposed ARecastNavMesh::AverageLayersPerTile and reduced its default value, saving memory in the tile pool allocation.
Skipped BVTree creation for navmesh tiles with very low polygon counts to save memory.
Added bDrawOnScreenInformation on ARecastNavMesh to toggle on-screen detailed navmesh information.
Optimized FRecastNavMeshGenerator::RemoveTiles to reduce a hang when many tiles are dirty simultaneously.
Nav Area:Nav Mesh: Added per-mesh custom NavArea support on UNavCollision (bUseSurfaceArea + AreaClass) so static meshes can apply custom walkable area costs during rasterization.
Navigation System
Change to how Pawns without a PreferredNavData set work. This makes it so, if unset, that the Pawn will now only find and use NavData with matching CanFly values. This prevents ground-based Pawns from trying to use flying navigation data.
General navigation log improvements (clearer messages, better contexts).
Added diagnostic logs on AddNavigationSystemToWorld, OnWorldInitDone, GetWorldBounds, PerformNavigationBoundsUpdate, OnLevelAddedToWorld and ANavigationData bound changes.
Avoidance: Added configurable side-bias threshold and right-side passing bias to Detour crowd avoidance.
Added logs that record AsyncLoadLock state and increased verbosity in navigation tests to help diagnose intermittent failures.
Added the navdata name to navdata registration logs. Added a log when navigation building is prevented by a navigation lock.
Navigation: Exposed GetLengthFromPosition to Blueprints.
Removed UE 5.5-era deprecated navigation code.
Mass Avoidance: Mass avoidance gameplay debugger can now display entity radius when no collider is present.
UEFN now dirties the package on navigation generation completion so changes can be saved.
Bug Fix:
Navigation System
Fix data race in RegisterNavRelevantObjectInternal when using async nav data gathering. When bDoFullyAsyncNavDataGathering is enabled, FRecastTileGenerator::DoWork() runs on a worker thread and reads FNavigationElement fields via FNavigationRelevantData::SourceElement (a TSharedRef<const FNavigationElement>). Concurrently, the game thread can call RegisterNavRelevantObjectInternal (e.g. when a component is registered a second time) which overwrites the same FNavigationElement in-place through a mutable TSharedPtr. The root cause is that the repository stores TSharedPtr<FNavigationElement> (mutable) and overwrites in-place, while all other holders (navigation octree, pending updates, tile generator) hold TSharedRef<const FNavigationElement> to the same heap object, assuming immutability. Fix:
RegisterNavRelevantObjectInternal now allocates a new FNavigationElement and replaces the map entry via Emplace, instead of overwriting *ExistingElement. The old instance remains alive and unchanged as long as the octree or an in-flight tile generator holds a reference to it via SourceElement.
F Navigation Octree Controller::RemoveChild now compares children by FNavigationElementHandle (UObject + SubElementId) instead of TSharedRef pointer identity. This ensures that passing a newly-allocated element for the same navigation object correctly finds and removes the old entry from OctreeParentChildNodesMap.
Fixed reentrance in UNavigationSystemV1::RegisterNavData that could trigger when registration callbacks spawned new nav data.
Now waits for initial async loading to complete before triggering an automatic rebuild; new bWaitForAsyncLoadingBeforeBuildingNavigationAutomatically property controls the behavior (enabled by default).
Navigation
Fixed an intermittent issue where off-mesh connections could be missing after navmesh generation, depending on the order tiles were processed.
Fixed an issue where deleting the last NavMeshBoundsVolume in a level could leave the navmesh in a null state, causing subsequent property edits to trigger an ensure. The navmesh is now preserved when there is no longer anywhere to build navigation, and any stale tile data is cleared instead.
Fixed an issue where traveling to a level that had a navigation bounds volume but no saved navigation data would leave the navmesh empty, preventing NPCs from pathfinding. The navigation system now correctly triggers an async rebuild when it spawns fresh navigation data at runtime.
Fixed an issue where NavLinkProxy actors used by Child Actors did not work correctly on startup in Play in Editor.
Fixed an issue where area costs were not set before NavLinks were snapped during level serialization.
Fixed an issue where a NavLink Proxy could fail to register when the navigation system was not yet initialized.
Fixed several issues with directional generated NavLinks:
Fixed an issue where generated NavLinks were not applied to the correct layers when directional links with different areas were present.
Fixed an issue where directional NavLinks were not height tested.
Fixed an issue where reversed NavLinks were stored incorrectly. Directional up links are now stored in reversed order to keep them with their associated down link, and the owner position is now correctly validated to be contained by the tile when handling asymmetric border sizes.
Fixed an issue where the AllowLinkGeneration console variable was not enforced uniformly across all navmesh generation paths.
Fixed an issue in Recast where generated data was not placed where the caller expected it.
Fixed an issue where EncompassesPoint did not work correctly on ANavMeshBoundsVolume.
Fixed an issue where spline points were generated in world space instead of local space, causing the world transform to be applied twice.
Fixed an issue where a component could remain in the navigation octree after being unregistered.
Fixed an issue where navigation bounds were not cached correctly before being registered, which could trigger an ensure.
Fixed an issue where undoing or redoing changes that required a navmesh rebuild were not being detected correctly. The navmesh now responds to PostTransacted notifications to catch these changes.
Fixed crash in AddNavigationSystemToWorld during Sequencer undo/redo on transient worlds.
Crash Fix: [Navigation] Fixed a crash that occurred when an extreme JumpLength value was set in a NavLinkJumpConfig. The inflated tile border size could cause an allocation failure or integer overflow during navmesh generation. A warning is now logged when the border size exceeds the tile size, and tile generation is safely aborted if the heightfield size would overflow.
Fixed ensure when editing NavigationSystem config properties in Project Settings by skipping CDOs in FEditorViewportClient::OnObjectTransacted.
Nav Link
Fixed multi-config registration for generated navigation links.
Fixed an ensure in ComputeCustomLinkBounds.
Fixed crash in ANavLinkProxy::GetComponentsBoundingBox.
Fixed an ensure that triggered when undoing a NavLinkJumpConfig change that had a LinkProxyClass set.
Nav Mesh
Fixed navmesh loading quantization factors not matching newly-updated CellSize settings (occurred when settings were changed via config files outside the editor).
Detour dtNavMeshQuery::queryPolygons now handles out-of-memory conditions gracefully.
Newly created Blueprint NavArea classes are now registered via PostCDOCompiled so they take effect without a reload.
Automated Testing: Fixed an issue where AutomationLoadMap started Play in Editor immediately after loading a map, copying an empty navmesh into the PIE world before the async editor rebuild could finish. PIE startup is now deferred until the editor navmesh finishes building.
Fixed multithreaded access on FLandscapeHeightfieldCollisionComponent::CachedHeightFieldSamples reachable through INavRelevantInterface::GatherGeometrySlice.
Prevented a crash when exporting geometry containing too many triangles for navmesh generation.
Fixed navigation data not being removed when using One File Per Actor (external actors).
Fixed "Build > Build All Levels" leaving the navigation system in a broken state.
Fixed navmesh being out of sync with unloaded objects in World Partition maps when Build Paths is run.
Ensured the map package name is known before building a World Partition navmesh in the editor so the map can be reloaded afterwards.
Fix FCompositeNavModifier::CreateAreaModifiers not taking into account FKSphylElem internal rotation Fix FCompositeNavModifier::CreateAreaModifiers not using the proper length for a FKSphylElem Fix FAreaNavModifier cylinder constructor not handling non vertical cylinders. This will now fallback to a box if the cylinder is not vertical.
Fixed ai.debug.nav.DirtyAreaAroundPlayer debug command not working on the server.
AI State Tree
New:
State Tree
Property Binding Utils:
Added a cvar to control automatically removing failed-to-resolve source binding path bindings or not for State Tree. Default true(old behavior). Missing target struct binding path bindings or failed-to-resolve invalid target binding path bindings will always be removed automatically. Missing source struct binding path bindings will never be removed automatically.
Fix up State Tree Editor Bindings when UserDefinedStruct, Blueprint, or UObject gets reinstanced from live coding. Cache dependency to filter out state tree assets.
Correctly gather dependent structs for compiled property bindings.
Use struct's authoraritive version when resolving indirections.
Bindings display friendly name for UserDefinedStruct properties.
Added option to override start state by gameplay tag when starting running the tree. States corresponding to the same gameplay tag will be searched through in breadth first order.
Do not create an instance data storage for shared instance data when no shared data exists. It reduces the runtime memory footprint. Each thread that access state tree increments a counter. That counter is static and is valid for all state tree assets. That means each state tree asset uses a ?number of threads? amount of storage, even if the state tree asset is not intended for threading.
Add a queue and asynchronous state tree compilation. The compilation is always on the game thread. The state tree asset is compiled "just in time" the first time it is used by the game. The features are disabled by default.
With cvar StateTree.Compiler.EnableQueuedCompilationOnAssetLoad, the public step will be compiled synchronously when the asset loads, and the internal steps will be queued for later. Without the cvar enabled, the previous behavior is maintained. The compilation of the public and internal steps are compiled synchronously.
With cvar StateTree.Compiler.EnableQueuedCompilationWhenAssetDirty, the asset is queued for compilation as soon as it is modified in the editor.
With cvar StateTree.Compiler.EnableCompileSynchronouslyInPIESession, all queued assets are compiled synchronously before a PIE session starts. While in PIE, assets will not be queued. They are compiled synchronously.
With cvar StateTree.Compiler.NumberOfQueuedCompilationPerBatch, you control how many state tree assets compile per ticking loop. To deactivate, set to 0. Every tick, the engine will compile NumberOfQueuedCompilationPerBatch queued state tree assets, including the dependencies.
Refactored and fixed incorrectly accessing subtree parameter, global parameter and global instance when it exists in a parent frame multiple levels above.
Now we cache corresponding Parent Frame IDs for accessing global parameter and global instance in temporary data, and cache corresponding index base for accessing global parameter and global instance in active instance data.
No longer sets Subtree and Global Parameters in UpdateInstanceData because they have already been set when creating the frames and they don't change. We update ActiveInstanceIndex, GlobalInstanceIndex and GlobalParameterIndex in UpdateInstanceData.
Enable evaluation scope by default. Tell the cooker about the cvar that can affect the compilation result.
Implement EvaluationScopeInstanceData for condition's EnterState/ExitState/StateCompleted.
Remove STATETREE_POD_INSTANCEDATA in favor of UE_STATETREE_CONSTRUCTED_TRIVIALLY_COPIED_NO_DESTRUCTOR_INSTANCEDATA or UE_STATETREE_ZEROED_TRIVIALLY_COPIED_NO_DESTRUCTOR_INSTANCEDATA. Properties that are initialized in-place need the constructor. ScriptStruct instances constructed from script (BP or StateTree instance data) are memset to 0 by default. The POD has a different meaning in C and CPP (pre 2020). It is preferable to use the more descriptive term "trivial" to identify types that can be trivially constructed and copied.
Allow creating new StateTree assets from linked asset dropdown.
Create UE::StateTree::EComparisonOperator to replace EGenericAICheck from the AIModule. This is an effort to make StateTree not depend on AI modules and make it generic for everyone to use.
Implement drag and drop for state tree state nodes Extending the existing drag and drop structure to support dragging state's nodes around. By default, dragging a node moves it to another state (literally moving) keeping the bindings valid if any other node references it's properties. By holding Ctrl key while dragging, the behavior alternates to copy instead move.
Added FStateTreeExecutionContext::GetCurrentlyProcessedStateSelection.
Prevent linked state override when bindings could use invalid data.
Hide utility consideration when they are not usable. The parent needs to have a selection behavior that uses them.
Access ExecutionRuntimeData from async task.
Add a color bar that matches the category color.
Chained Property Ref from multiple parent frames above can now correctly fetch source data. Now we fetch the associated parent frame that stores GlobalParameter or SubtreeParameter by FrameID.
Disabled using PropertyRef in ExternalGlobalParameterData.
Deprecated and refactored FindFrame.
Deprecated and refactored FStateTreePropertyRef::GetMutablePtr.
Deprecated StateTreePropertyRefExternalHandle.
Execution context uses a view instead of the property bag. Deprecated the property bag version. This is a step to use a permanent script struct instead of the transient property bag.
Add menu action to select the transition's target state.
Add new transition targets. Parent, NextParent, and NextSelectableParent. They are reconciled at compile time and work similar to NextState and NextSelectableState.
Added a button to remove all elements from the tasks, evaluator, condition, transition lists.
Added a button to remove all properties from the property bag.
Move the temporaries before it is used in EnterState. Previously, they were all moved in UpdateInstanceData. It caused a problem if an async task requested the instance data before the state was added to the Frame. Usually, that could not happen, but global nodes (task and evaluator) can be started temporarily. Their EnterState is called, and they will only be added to the frame when the linked state is added.
Add a global callback and a callback on the editor extension to validate the state tree asset. The validation occurs when the asset loads, and before it compiles. The user can use the callback to modify the editor data before the asset compiles.
Add a condition to compare a single Gameplay Tag against another.
Capture condition / task / utility names in ST rewind debugger.
Add IStateTreeDebugInfoProvider to provide editor data driven debug info when possible, with default runtime only debug info as fallback.
Add ability to mark a transition for reselection.
Added Experimental State Centric View.
Disabled by default. Enable via `StateTree.Editor.Experimental.EnableStateCentricView`
Show number of enter conditions / tasks / transitions / considerations / parameters in details header.
Also show utility weight if it's just a weight.
Bug Fix:
State Tree
Recursively Trigger transitions from parent frame when a subtree completes. This solved issues caused by When hit the max iteration, the execution context will lose track of info in the next frame when continuing transition processing from the subtree completion.
Added unit test to verify this.
Fixed an issue where events are not visible to the state required event to enter from on completion transition. Fixed an issue when a subtree completes, broadcasted delegates and events will be incorrectly cleared.
Remap state event IDs when cut/paste states Preserve and remap state event IDs during copy/paste to fix compilation failures when a pasted state has nodes that bind to required events on the state's enter conditions.
Fix crash in Enum Compare Condition when resetting right field default value.
Events added during TriggerTransitions will be queued and only reset in the next TriggerTransitions. This allows multiple parallel trees to share event with each other, and fixes events sent in task on enter won't be accessible in the next tick in parallel trees.
Prevent Linked Asset override at runtime when the Linked State Parameter is binding source or binding target. This includes the parameter is bound to something else, a node is bound to the parameter or a node's appended property function is bound to the parameter.
Use an additional flag for override. Cache the flag during Compile for runtime check.
Disabled Promote to linked state parameter option.
Fixed an issue where property cannot be promoted to state parameter if state parameter is empty.
Disable promoting to state parameters if the state is a linked state.
Correctly Scope Start and Stop global tasks debug phase. Global tasks are entered/exited hierarchically and each frame should have its own scope to reflect the correct ordering.
Fixed an issue where transition delegates weren't triggered if the delegate was broadcasted during the transition tick.
False positive circular reference while compiling state tree asset async. This occurs when A refers to B and C. And B also refer to C.
Fix issue with override linked asset when the state needs reentrance. It used to pick the new override for sustained transition instead of picking the previous override. Add unit test for 2 repro of that same bug.
Make status not trivially copiable. The inner pointer might point to itself. Unreal container do use trivially allocated structure. They do not call the move or copy constructor.
Fixed states order is reversed when inserting before another state in the editor.
Remove the temporary instance data once it has been consumed. Previously, all temporary instance data was moved in UpdateInstanceData. Now, they are only moved when the task starts.
Only append temporaries when they will not be copied later in Enter. This fix issue introduced with.
Add callback to get the asset registry tags from the editor data. Use the editor schema to always have a valid schema in case the compilation fails.
State Tree Debugger: Added support for breakpoints in statically linked assets (i.e., not dynamic overrides).
Asset no longer get dirty when adding/removing breakpoint.
Select the first available instance in the debugger view when analysis starts.
Property Binding Utils:[State Tree] BindingView rework.
Added error icon for Missing struct.
Added error icon for binding path failed to resolve.
Click on Binding struct will traverse to the corresponding struct property row.
Click on Binding path will traverse to the corresponding property property row.
Fix issue where we use stale linked state tree override whenever there is a change overrides in the middle of the current context's execution Since we are only allowed to set linked state tree overrides before we start context's execution, it is not possible to update it when an override changes sometime between the start and the end. To fix this we use a delegate to fetch current state tree overrides from external source.
Fix rename failing on to be discarded ST editordata schema object.
Blueprint
New:
Blueprint "enable/disable" node submenu options moved out of experimental. Right-clicking on a node with exec pins will now present options to enable or disable the node, without having to opt-in to this behavior.
Blueprints: Make FVector2D default values work when exposed on spawn on the Construct Object BP node.
Added simple counter to ensure if too many Blueprint async actions are created. The number of allowed actions can be set using the console variable `bp.MaxAsyncActionCount`. Set the number to <= 0 to disable the ensure.
The Blueprint editor scripting API has been greatly expanded. For editing Blueprint graphs use the new BlueprintGraphEditor. For general Blueprint editing see the new functions in BlueprintEditorLibrary. If you're unfamiliar with these APIs consider running help(unreal.BlueprintGraphEditor) or help(unreal.BlueprintEditorLibrary) in your python console.
Expose FPerPlatformBool to Blueprints to match Int and Float.
Find in Blueprint: Will now search keys in the default key-value pairs in Blueprint Map variables. Previously only Map values were searchable.
Struct Utils: Add helper functions to generate a UserDefinedStruct from a property bag. Property Bag are great when used internally the same package. It can cause issue when there's a reference outside the package. UserDefinedStruct are better at handling those.
Bug Fix:
Fixed Blueprint function local variables being allowed to have the same name as member variables, which led to default value inheritance problems. Name validation is properly applied now when naming local variables. Name collision was already properly checked for member variables.
Fixed crash when loading Blueprints with ComponentClass overrides.
Fixed crash when deleting a character Blueprint and anim Blueprint at the same time.
Fixed crash when pasting a component into a Blueprint.
Fixed ensure when changing the class of a scene component.
Structure assets will no longer causes crashes if deleted when they are used as member variables in Blueprints.
Change K2Node::GetBlueprint to possibly return null (expected by most callers), and add GetBlueprintChecked for the old behavior.
Fix several Blueprint editor crashes that would happen when recompiling at an unexpected time.
Fix crashes when trying to reparent a Blueprint to a temporary class like a python wrapper, these are no longer shown as an option.
Fields and properties associated with transient, non-native uclasses are no longer shown in the Blueprint context menu, as when placed in a graph they will not be able to resolve themselves when the asset is loaded.
Fixed issue looking up default values for the root component when it is named DefaultSceneRoot.
Fixed crashes in FBlueprintActionFilter::IsFilteredByThis.
Component reference picker improvements: Allows picking components in the Blueprint editor.
Fixed one cause of the prolific "PinHelpers::UnresolvedPins.Num() == 0" warning message.
Fix bug where drag and drop could create an invalid floating point node.
Nested split pins no longer cause data loss or assertion failure when their backing schema (Struct or Function) is changed.
Correctly warn about trying to delete in-use local variables.
U Subobject Data Subsystem::AddNewComponent will no longer crash when adding components without an explicit Blueprint context.
Component subobjects tagged as RF_ArchetypeObject now have their subobject flags conformed, forcing RF_Public and consequently preventing 'linked to private object' error.
U Blueprint Editor Library::GetBlueprintAsset now looks for adjacent UBlueprint objects, e.g. if a Level asset is provided as the object to get the UBlueprint from.
Fix issue where properties like skeletal mesh would be reset after Blueprint duplication.
Fix several editor crashes when trying to load invalid Blueprint assets.
Fix crash when trying to set a local variable named the same as a replicated property.
Fix issue where copy-pasted Blueprint nodes would no longer be pure.
Fix bug where data assets made from Blueprints had the NativeClass asset registry tag set to the Blueprint instead of the parent native class. This will be fixed the next time those assets are resaved.
Fix bug where undoing a child actor component deletion could create duplicate actors.
Fixed a bug where changing a UUserDefinedStruct used in an FInstancedStruct property of a UDataTable row, would not re-instance the structs (as they do in non-UDataTable cases), causing data table details panels to crash trying to read new fields in the now-outdated instance memory.
Fix missing native/instanced struct value data on runtime-spawned BP actor types with "Generate optimized Blueprint component data" enabled.
Fix bug where Child Actor Class could not be set back to none in child actor components.
Fixed Blueprint default properties with custom property customization not using the correct IsEnabled value in certain cases.
Fix crash trying to compile a variable set mode pasted from another class.
Struct Utils: Fix dirtying and recompile property bags when a UserDefinedStruct is modified.
Fix Set Fields Blueprint node to accept non-const reference parameters.
Output pins on Blueprint result nodes are once again validated for uniqueness when being edited.
Blueprint Compiler
Bug Fix:
Blueprints are now compiled in the order their class taxonomy will define, rather than the one they currently define - this fixes crashes when compiling Blueprints after changing their parent class.
Macro nodes no longer raise unsupported Blueprint changed notifications during compile, fixing crashes when compiling some Blueprints with complicated macros.
Blueprints loaded for diffing will no longer attempt to compile before PIE, even if they have been marked as dirty.
Guard against potential attempts to reinstance non-Actor objects with an invalid outer.
Fixed rare non-determinism in Blueprint generated bytecode caused by text values that matched their default string.
Blueprints that are in a dirty state because they are using a Struct that has been modified are now automatically recompiled on save.
Fixed rare crash when compiling Blueprints with invalid functions.
Blueprint Runtime
Bug Fix:
TScriptInterface now only produces a valid value if the provided object implements the specified interface (either as a Blueprint class or natively).
Fix race condition between UPrimitiveComponent::Postload and FObjectInitializer::InitProperties when instantiating a BP while its CDO is completing its initialization on the Gamethread.
Gameplay
New:
Input
FInputDeviceScope refactor and deprecation.
Deprecation the FInputDeviceScope type. Instead, you should use the new FInputDeviceRegistry type instead. This registry is thread safe and removes the need for Input API's to wrap every event with a FInputDeviceScope, which is very error prone and confusing.
The FInputDeviceRegistry should be populated any time a new device is *connected*, and has an assigned FInputDeviceId. This way, the device name/type is evaluated once, upon connection, instead of every single tick.
Effectively make the FInputDeviceScope no-op unless the UE_USE_LEGACY_INPUT_DEVICE_SCOPE define is set to 1. Users can define this in their Target.cs file if you still depend on FInputDeviceScope.
For forward compatibility, when a device is connected (IPlatformInputDeviceMapper::Internal_MapInputDeviceToUser is called) if there is not already a new device registry entry available, we will attempt to populate it from a device scope that is available.
Enforces a better contract for the FInputDeviceId to each platform and makes them all consistent.
Linux and Mac were completely missing FInputDeviceScopes, and they now have a FInputDeviceRegistry call to resolve that.
In CommonInput and the Input Device Subsystem, utilize this new FInputDeviceRegistry instead of FInputDeviceScope's. The names of the types for common input should be the same, and do not require asset updates. Same with the hardware device identifiers.
Add some debug data to player input available in non-shipping and test builds behind the UE_PLAYER_INPUT_INCLUDE_DEBUG define.
Mover
Updated README documentation, accounting for bugfixes and feature set changes.
Populating/refreshing shared settings in OnRegister of a Mover component so we guaranteed have valid shared settings.
Reworked kinematic simulation to be separate from MoverComponent, as a stepping stone towards using Mover with non-Actors.
Removed unsupported PhysicsMover / NetworkPhysicsLiaison code from Mover plugin, in favor of ChaosMover plugin.
Support perching radius threshold so characters can be configured to fall off ledges if they're only partially supported.
Add MixMode parameter to Play Mover Montage BP node, for control of how the root motion mixes with other movement sources.
Added a BP-friendly method of querying for the floor so it's easier to include in Blueprinted movement modes.
Exposing the movement base's transform deltas through an update event, in support of motion matching while on a moving platform.
Implementing MovementInterface on UMoverComponent and using the interface in encroaching checks so we also use the movementcomponent path and properly check encroachment when using a mover component.
Evaluating Mover instant effects after modifiers are added/removed. This helps crouch apply properly without any depenetration. Also adjusting the stance modifier to always adjust capsule location when modifying capsule size.
Add residual velocity when leaving a movement base.
Reworked kinematic based movement to eliminate drift on rotating, tilting platforms similar to heaving boats.
Adding a projection setting to nav walking modes that allows users to specify what geometry to project to in relation to the navmesh. Also adding proper support for move off navmesh option for NavWalkingMode.
Adding an ensure to navwalking modes noting that the bAllowClientSideNavigation navigation system setting needs to be true if nav walking mode is running on a client so a navmesh is available for nav walking to use. This is the case when running a pawn in nav walking mode with Fixed Tick Forward Predicted Network prediction simulation.
Added helpers for common rollback blackboard entry creation cases, and current-frame-only persistence option.
Added simulation context as a parameter to core Movement Mode functions.
Added query for the next anticipated movement mode.
Adding RVO interface to NavMoverComponent to support detour crowd avoidance. Note, this is not force based RVO avoidance. Also adding some example content to mover examples to show this functionality.
Remove unnecessary falling check that will never get hit in movement utils.
Added prediction mode support for the rollback blackboard, so trajectory prediction flows can read/write with it without affecting the true simulation state.
Add USimpleFlyingMode to simplify the process of making a Blueprint driven flying mode.
Made all default movement modes function with non-capsule shapes as long as they're reasonably symmetric within the movement plane.
Added support for single-entry values in the rollback blackboard, along with a policy to ignore rollbacks.
Mover, ChaosMover: Added more time step information to event data, allowing differentiation on factors like whether a resimulation is occurring.
Mover, ChaosMover: Added more contextual information to time steps and events.
Network Prediction and Mover: Expanded ShouldReconcile to allow the option of deferring to a simulation driver function.
Mover Examples: Adding example map to help test scaling to larger NPC counts.
Add Mover Methods to query if a tag exists. Add Mover FSM nullptr checks.
Level Streaming Persistence Plugin
Exposed persisted property configuration to editor as DeveloperSettings.
Exposed the LevelStreamingPersistenceManager's SerializeTo and InitializeFrom functions to Blueprint. SerializeTo now updates persistence data for visible levels, ensuring that the in-memory cache is up to date for all levels of the map before serializing to a binary blob.
Now shows warning in editor when a persisted property is missing editable specifiers.
GAS
Add RemovalPolicy to OnApplicationGameplayEffects, incorporated in AdditionalEffectsGameplayEffectComponent.
Use case: Control life time of external applied GE through GE that applies it conditionally. I myself have noticed this before, and I've seen bugs in the past from designers not understanding that a GE applied through a GE controls its own lifetime by default, they implicitly assume it will be removed when the effect which applies ends.
Added support for removal policy, following a very similar pattern to Granting GAs through a gameplay effect component (You can cancel / end the GA when the GE granting the ability is removed).
Added EGameplayEffectGrantedEffectRemovalPolicy enum (GrantedEffectControlsOwnLifetime, RemoveGrantedEffectOnEnd).
Added stack count to remove field to conditional gameplay effect.
OnActiveGameplayEffectRemoved removes any on-application effects whose policy is RemoveGrantedEffectOnEnd.
Added content validation: Error if RemoveGrantedEffectOnEnd is used with an Instant owning GE or an Instant granted GE Updated AdditionalEffectsGameplayEffectComponent to support controlling lifetime of granted GEs.
FActiveGameplayEffectHandle now holds a reference to its Owning AbilitySystemComponent rather than using a Global Map.
Remote Objects
Introduced AActor::GetPreferredRemoteServer to allow Actors to migrate together (e.g. Controller depends on Pawn's Location).
Fixes that allow parts of the AbilitySystemComponent to work with object migrations and multi-server proxy.
Cameras
Make playback mode only affect whether a GPC component writes to the output component Don't make it affect whether a standalone camera system is created or not. This makes it easier to manage, and easier to understand for the user.
Some errors and warnings shouldn't be reported when running editor previews.
Rename AutoActivateForPlayer to DefaultPlayer, and simply always use that unless anything else is specified.
Add "playback mode" to the GPC components This allows GPC components to be recorded by Take Recorder. The output camera component is also recorded, and upon playback, the new "playback mode" option can be enabled (similar to how physics should be disabled on recorded actors). This lets the output camera component be animated by the recorded keyframes, without the GPC system interfering.
Add a sprite icon to GPC components This makes it easier to locate the GPC component in the scene when the output camera is offset from it. The sprite is hidden when the output camera is close or on top of the root location.
Allow using an "output" camera component created in the parent actor.
Actor components cannot create visible/editor-friendly children components themselves. Component hierarchies need to be created by the actor. This change moves the creation of the "output" camera component to the parent actor.
The GPC component only creates it if they can't find one created by the actor, which can happen if the GPC is inside another actor who doesn't know about all this, such as a character pawn or any other Blueprint. The user can still get this output camera component to be visible by creating it themselves and parenting it under the GPC component.
Since this effectively changes the output camera component from a "hidden" implementation detail to an "official" component of the actor, it would now show up in the Details View of the actor by default, cluttering up the UI with irrelevant properties that get overridden by the camera system evaluation. So this change also tweaks the categories and metadata on a few properties to make sure this component is hidden from the actor's Details View.
Expand documentation and add UI min/max settings to the field of view node.
Add explicit checkboxes to the lens parameters node Instead of specifying zero or negative values to indicate that some property should be ignored, there are now explicit checkboxes to enable/disable each lens parameter.
Add support for first person view.
Add new properties to the camera pose for 1P views.
Add a new 1P node to set those properties.
The node parameter detail customization now supports several property metadata like min/max values or units.
Add option to run camera directors and Blueprint camera nodes in editor.
Add action that aims at an actor with optional bone/socket.
Add a time-out property to camera actions Also simplify a bit how actions get cleaned-up, and the properties that need serialization.
Extract most of the "Aim At" action logic into a base class to make it easy to create other types of aiming actions.
No longer finds referenced objects from too many packages when gathering director usage The StateTree and Blueprint directors figure out what camera rigs and proxies they use by simply looking at referenced objects up to a certain distance.
However, this reference gathering was a bit too heavy handed. This change skips compiled packages, and adds an option to not explore objects of certain classes. This helps drive down the amount of referenced rigs and proxies shown in the "family shortcuts" in the editor (which showed seemingly unrelated assets).
It also fixes a bug with camera assets being dirtied on PIE because they would find new rigs to add to the default parameters when upgrading old data to the new interface.
Improve debug info for player controller/view target setups Add information about viewport size and aspect ratio.
Add screen-space framing option on the Aim-At camera action.
Adds a Target Framing property for where to frame the target on screen.
Use the new 2-bone IK function that takes into account an offset from the centre camera aim.
Improve the debug rendering a bit with extra information about the aiming.
Change the default lock-on tolerance to be a bit looser.
Remove GetTargetAngles and use proper projection/unprojection for all of the framing nodes' logic.
Make the dolly and panning nodes use projection/unprojection for computing how to recompose their shots.
Add more utility functions for projection/unprojection.
Make the projection/unprojection functions handle non-default aspect-ratio axis constraints.
Fix some issues in GetEffectiveFieldsOfView where it didn't correctly account for non-ideal aspect ratios.
Remove FCameraFramingMath which isn't used anymore.
Move the CameraPose-to-MinimalViewInfo code for easy re-use.
Add icons for Camera Rig Actor and Component.
Remove extra root node event API Reimplement the evaluation service's `OnRootCameraNodeEvent()` API in terms of the existing event that exists on the root node evaluator. This removes a bit of core API that wasn't needed.
Make the easing blend type a BlueprintType.
Update unit tests following changes to camera assets.
Fixes and improvements to the interface parameter panels.
Better default names for newly added parameters.
Support keyboard shortcuts for renaming and deleting parameters.
Add a button to delete selected parameters.
Properly refresh the list of parameters when undoing/redoing an add or delete.
Clean-up and improve handling of driven camera node parameters and multi-level prefabs.
Unify a bunch of code handling reflection-based node parameters vs custom node parameters (those obtained through the `ICustomCameraNodeParameterProvider` interface). Now there's the `FCameraNodeParameters` class that can build a list of available parameters on a camera node. This dramatically reduces the code in the Camera Rig builder class.
Fix some issues with multi-level parameter overriding, such as when an exposed parameter is re-exposed a level higher. Also, automatically flag connected prefab parameters as "overriden" on the prefab camera node to make sure those overrides are taken into account.
Rename some properties on custom parameter infos and interface parameter objects to be a bit clearer: "ParameterType" should be only for the parameter definitions, to specify if a parameter is "blendable" or "data". We should use "VariableType" for the type of variable to use in the variable table.
Simplify some of the parameter override helper code and remove unnecessary helper methods.
Add some unit tests for multi-level prefabs.
Add ways to parameterize post-process settings.
New "aim-at" camera action This action aims the current active camera rig instance towards a given target. It has options for keeping the lock on the target indefinitely until the action is stopped. The code for IK-aiming and other rotational corrections has been refactored so it can be used in the new action too.
New "lock user input" operation This operation locks user input for one frame.
Make value interpolators into constructable objects in Blueprints.
When a Boom Arm or Spline Orbit node doesn't have an input node, use a Driven Control Rotation node Before, these nodes were handling input themselves by querying the Control Rotation themselves. Now they use the seemingly better Driven Control Rotation logic. Also implement missing serialization of the boom arm length interpolator in the Boom Arm node.
New camera action service Camera actions are ways to execute operations on one or more running camera rig instances. They effectively "wrap" the root node evaluator for a camera rig, allowing arbitrary logic to be run before and after a camera rig evaluates. Camera actions also come with a few built-in options, such as the ability to clone themselves when a new camera rig activates, allowing a particular operation to persist over a long time.
Expose the blend type as a data pin on the easing blend node.
Make separate "getter" nodes for camera parameters, describe their connections in more general way.
Camera parameters were previously objects that doubled as their own node. This prevented driving two or more camera properties with the same parameter. This change removes the "node" aspects from camera parameters and adds a new "getter" node for that. The "getter" nodes point bac to the parameter they represent.
Previous data is gracefully upgraded for camera parameters that were present as nodes.
Since parameters may be connected to multiple pins, we can't determine their default value from that anymore, so the parameter has its own value now, a bit like variables in Blueprint. This changes a few things regarding the build process. A new customization class allows showing that default value in Details View for the user to set. Other parameter options (like "pre-blended") are removed from the list-view in the parameters panel: Parameters are now meant to be tweaked in the Details View.
Parameters can be added in transition graphs, for driving properties on blend nodes and such. A new base schema class provides support for this (a lot of its code is moved from the the camera node tree graph schema).
Actions for adding or auto-wiring parameters are changed accordingly (they now deal with the "getter" node mainly).
Make the search feature in camera editors based on the edited graphs and not the underlying object model Previously, searching through camera node or transition graphs was done based on the underlying object trees. Now, we more simply search the graphs that have been created out of these objects (thanks to UObjectTreeGraph). This makes it possible to get search results that are only indirectly related to the underlying data model, such as extra nodes and pins that show up in the editor.
No longer renders two debug infos when a GPC camera manager is running with a nested standalone GPC camera component Since the camera manager and the view target were both considered as the site for the "default" camera system, the camera debugger would end up drawing them on top of each other. Now we only consider the view target as default if the camera manager doesn't already run a camera system itself.
Activate and deactivate the output camera component along with its parent This fixes problems where a deactivated Gameplay Camera/Camera Rig component is still picked up by the engine when its owning actor is set as the view target, even though there's another active camera component on that actor.
Add option for freezing previous camera rigs when activating a new one.
Unify how Guids are generated for various assets.
Occlusion material node now supports skinned meshes and attached components.
Make sure components' parameter overrides are up-to-date with the referenced asset Update parameter overrides struct when starting evaluation, and on cook.
Add parameter GUIDs as tool-tips in the interface parameters panel.
Auto-rotate input node now supports going towards a zero rotation.
Boom arm node now supports additive rotation mode.
Improve how we apply parameter overrides from asset references Remove the need to keep the cached copy of the parameter overrides to detect changes: instead, just compare the new override values to the values found in the variable and data tables.
Add basic natvis support for the context data table.
Add easing blend node.
Make the boom arm and collision push node evaluators extensible.
Clean-up how components and player managers interact Simplify the camera component:
It now has an option to either run its own camera system ("standalone" mode, which is the default) or only run a camera evaluation context.
Remove some of the old code that attempted to handle a mix of both cases (such as with the non-immediate deactivation code) Simply the player camera manager:
Now anything that is set as the view target is run as a "blackbox", whether it's an arbitrary actor or vanilla camera actor or procedural camera (in which case it's better to use the aforementioned "standalone" mode).
To use fancier features such as blending or children directors, the procedural camera must be activated using dedicated new methods such as "Activate Gameplay Camera". Other clean-ups:
Move and improve on all the methods to activate/deactivate rigs and rig modifiers, and start/stop shakes.
Add Blueprint function for checking the validity of a shake instance ID.
Cleanup live-edit node listeners after a GC pass.
Make perlin noise use cubic splines by default This fixes undesirable "mini-pauses" in the middle of some curve segments when using a standard smooth-step interpolation.
Add more Blueprint methods to the components for managing persistent rigs and shakes.
Change how auto-build for PIE works to prevent packages from being modified at the wrong time.
Building a camera asset may change its data and dirty its package, but the previous method was doing when we were already inside the PIE world.
This change uses the same method as Blueprints, StateTrees, and so on, by using the BeginPIE delegate along with typed object iterators to gather objects to process just before PIE starts.
Add output return value pin to BP parameter setter node.
Add BP node function to get the owning rig.
Network Prediction Plugin
Integrated time dilation feature to shrink input buffer size once network conditions improve.
Removed code related to physics integration that has been unsupported for a long time.
Added Iris replication support to the Network Prediction Plugin, while maintaining compatibility with non-Iris replication.
Chaos Mover
Add optional server inputs for server side launch and other effects.
Stop applying angular velocity to target if the character should not remain upright and add option to never apply angular velocity to target in a falling mode.
Added some improvements for pushing into small, low objects.
Game Input: Add haptic audio endpoint support via WASAPI and audio submix endpoints, just like the WinDualShock plugin.
Add a new "Input Device Registry" (FInputDeviceRegistry) FInputDeviceRegistry is a thread safe registry to keep track of a FInputDeviceId to its name and type. This will make FInputDeviceScope obsolete. The registry is populated upon device connection and FInputDeviceId assignment, opposed to FInputDeviceScope's requirement of an actual input event call on the message handler being necessary.
Adding MovementInterface meant to be used by various movement systems. By design it is very simplistic and helps with broad and common uses like gathering velocity, location and updated uobjects.
Allowed conversation task nodes to choose branches in a specific order when advancing the conversation instead of always choosing a random branch. This makes it easier to set up progressive dialogue branches, e.g. a different branch based upon quest progress. Previously, each branch would need to have mutually exclusive conditions otherwise multiple branches would be possible and one would be randomly selected.
In the Game Input plugin, make it possible to ignore or filter out devices from game input based on a VID/PID combo or their device family.
Add a "preferred input API" setting to the engine. This will allow games to slowly roll out a change from an older input APIs like XInput to a more modern one like GameInput. The intent is that you could have a setting in your game, similar to a rendering setting for choosing which API to use, where players can enable/disable different input APIs to achieve the best compatibility for their setup. This has the added benefit of being able to "upgrade" a live project to use a newer input API with a fallback option via the config system.
Spline Optimizations + Early out of SetClosed if it's already true. + Avoid re-constructing the TSet of normalized knot values in GetNearestAvailableKnotValue as this was being done repeatedly in GenerateDistanceKnotsForBezier. Reduces cost of GenerateDistanceKnotsForBezier by 90%. + Update FNewSpline::RebuildLegacyCurves to cache the attribute channels as these lookups were expensive. Also replace insertion sort of the rotation/scale points with a final sort at the end. + Add nullchecks when accessing scale/rotation attribute channels to prevent crashing when those channels are removed.
Deprecate the Raw Input plugin in favor of the newer Game Input experimental plugin.
Added support for dynamic (added at run-time) ability triggers to be used with abilities.
Game Features: Made UGameFeatureData::GetDisallowedClasses() virtual so game project subclasses can prevent some Game Feature Action classes from being selectable.
Converted Characters, Character Movement and dependent functionality to use a UObject representation of Movement Bases instead of UPrimitiveComponents. This opens up movement bases to non-actor objects such as FastGeoStreaming objects or Scenegraph objects.
ACharacter, UCharacterMovementComponent and other classes listed above have multiple examples of how to network and use this new struct, as well as examples of converting existing functions to use the new struct. See any function in the CharacterMovementComponent (such as UCharacterMovementComponent::RevertMove) as a good example of the new functionality.
ACharacter::OnRep_ReplicatedBasedMovement() shows a decent example of how to network and create this new struct from a UObject using MovementBaseUtility::GetMovementBaseDataFromPhysicsOwner.
FMovementBaseInterfaceData houses a UObject PhysicsObjectOwner and IPhysicsBodyOwnerInterface that implements necessary functions for basic movement base functionality.
FMovementBaseInterfaceData replaces UPrimitiveComponent as how code interacts with movement bases but a UPrimitiveComponent can be used to make a FMovementBaseInterfaceData easily as UPrimitiveComponent implements the IPhysicsBodyOwnerInterface interface and is a UObject so it is both the PhysicsObjectOwner and BodyInstanceOwner.
This change modified important classes/structs such as ACharacter, UCharacterMovementComponent, FBasedMovementInfo, FCharacterNetworkMoveData, FClientAdjustment and MovementBaseUtility with deprecation and fixup so they properly use new FMovementBaseInterfaceData struct. So any code extending the CharacterMovementComponent or code dealing with FBasedMovementInfo will likely need to be fixed up to support the new struct.
Bug Fix:
Mover
Fix bug where skipping vertical anim root motion was not being respected in all montage cases.
Fixed inconsistent behavior during mode-changed events and the possibility of a queued mode getting ignored.
Fixed bug where sim proxy movement resulted in poor motion of any attached rigid bodies, such as ragdoll.
Fixed bug where activation of scheduled layered moves and instant effects would occur 1 frame late on variable-tick configurations.
Fix bug where a montage's RateScale was not respected during root motion layered moves.
Fixed issue with stale floor information causing teleportation-like behavior.
Disallow more than one active root motion montage layered move at a time.
Fixes crashes that can occur when compiling a MoverComponent BP while PIE is running with an instance of it.
Fixed sim proxy montage time drift that was causing divergence with root motion animation playback.
UMovementUtils::ComputeVelocity now limits velocity input to max speed properly.
Fixed issue where residual spring state persisted after interruption, such as during a root motion montage.
Fixed issue where sim frame counts in trajectory prediction were always starting from zero, and added optional start time/frame to the prediction params.
Fixed crash that could occur if there was a rollback before BeginPlay completed.
Fixed bug where an invalid up-direction would result in any gravity override being turned off.
Step Up/Over functions now track and return movement time so we can properly keep track of it in movement modes. This fixed an issue in walking transitioning to falling that launched the character.
Initializing some FollowPathMode data in mode Activate so we guaranteed run it on servers and clients. This fixes a bug where control points sometimes never get initialized in forward predicted movement.
Fixed crash when using User-Defined Structs in a Mover data collection when Iris networking is enabled.
Fixed crash that could occur when dragging and dropping an asset into an already-running PIE session.
Fixed crashes that could occur when editing properties of a MoverComponent at runtime through the editor Details panel.
Fixed bug where the Play Montage BP node would find the first mesh component instead of the primary visual component.
Adding read write lock when Queueing LayeredMoveInstances.
Fixed issues when trajectory prediction was queried before MoverComponent was finished initializing.
Fix UNavMoverComponent::GetFeetLocationBased nullptr MovementBase access and invalid supplied data causing occasional EPathFollowingResult::Blocked for AI agents due to bad samples.
Fixed up incorrect UE_REQUIRES arguments in GetMoverComponent and GetMoverComponentChecked functions in MovementModes.
Fixed bug where a tag cancellation request would cancel a layered move that was queued later during the same frame.
Fixed bug where continuous corrections could occur when transitioning from a skeletal mesh base with a valid bone to a static mesh.
Fixed bug where simulation events with timestamps close to each other could be processed out of order.
Enhanced Input
Prevent triggers from re-firing after FlushPressedKeys while key is held.
Fix a long standing Enhanced Input issue around input triggers and modifiers not correctly maintaining their state when RebuildControlMappings is called.
Now when control mappings are rebuilt, if a key mapping already existed and its modifiers/triggers have not changed, each UInputTrigger and UInputModifier will call a "OnReinstanced" function (OnTriggerReinstanced and OnModifierReinstanced respectively).
This provides triggers and modifiers the chance to copy over any state that needs to be preserved across key mapping rebuilds. You can also implement these functions in custom Blueprint trigger or modifier classes by overriding the "Receive Reinstanced" functions.
This fixes bugs such as "Down" triggers having their input events re-fired every time the control mappings are rebuilt, even though you have not yet released the key.
This also fixes some issues with input modifiers which maintain state over time, like smoothing modifiers that want to keep track of the last used input value. This also fixes an issue with key mappings which _are_ actually new, and did not respect the bIgnoreAllPressedKeysUntilRelease flag. Now, new mappings will correctly be ignored if they are down when an IMC gets added and has a mapping to them.
Fix a bug where key mappings would not correctly be ignored if the input was just flushed (for example, by changing input modes between Game and UI for the player controller).
Fix mappings to AnyKey getting into a broken state when mouse scroll wheel up/down were used.
Enhanced Input: For boolean input actions mapped to touch Fkeys (FKey::IsTouch), the X,Y values of the keys will be the screen coordinate position. This means that a boolean input action will always evaluate to true, even after the touch has been released. To fix this, have Enhanced Input check the key state's bPressed value instead of the raw X,Y value in UEnhancedPlayerInput::PrepareInputDelegatesForEvaluation. This will ensure that touch FKey values have the expected trigger state flow and are calculated correctly in the IsActuated function of UInputTrigger.
Mover Examples
Fixed crash that could occur if FollowSplineMode had a bad/missing spline actor during setup time.
Improving handling of orientation intent when not orienting to the movement direction.
GAS
When marking abilities as garbage, also mark any SubObjects of those Abilities as Garbage. LyraGameplayAbilities can have SubObjects that must be MarkAsGarbage with their Outer.
Fix for GEComponents accessing other UObjects during PostInitProperties while AsyncLoading is enabled.
Using Generic Replication, the GameplayTagCountContainer could get stuck in a state where it constantly replicates a None tag if any of the tags were set to non-replicated.
Cameras
Detail customizations for CineCameraComponent presets were not correctly checking IsEditable on the properties, and missing applying some new properties.
Fix rewind debugger crash when recording post-process settings with weighted blendables.
Fix missing pin on nodes in camera shake graphs.
Fix DPI scaling issue in debug renderer.
No longer asserts when (re)activating a Gameplay Camera component that is already active.
Fix issues with camera actions started on the same frame camera rigs are activated When a camera rig instance is pushed on the main blend stack on the same frame that a camera action is started, that action could be created on the previously active camera rig, resulting in incorrect behaviour as the action only affected the camera rig that was blending out. This change therefore starts actions in a "pending" state where we don't create the action evaluator until after the camera director has run. To make this possible, evaluation services have a new callback for evaluating between the camera director update and the root node update. Added new unit tests for camera actions.
More fixes for not modifying assets during load/build unless warranted.
The code that upgrades old Camera Asset parameters to the new interface needs to reproduce the old bug that even non-visible parameters were included :(.
Non-visible parameters don't have the CPF_Edit property flag, so also patch that when loading data in the version of the engine that didn't handle property flags in property bags.
Fix regression bug about camera node parameters being incorrectly built when they use a camera variable asset.
Make sure the "aim at" action uses the shorter rotation to accomplish its goal.
Fix assert sometimes firing after rebuilding a camera rig When a Camera Rig Component is selected in the level editor, it shows up in the Details View and the customization for the Camera Rig reference is active. When the referenced Camera Rig is rebuilt, that customization automatically updates the reference's parameters property bag. So when the component itself ends up receiving the build notification, the reference's parameters are up to date. This prevented the component from reinitializing the evaluation context, and could lead to asserts if new parameters were added, since those entries wouldn't exist in the variable or context data tables.
Fix missing code path for connecting to struct data properties.
Remove calls to Modify() from PostLoad()
Fix incorrect pragmas.
Fix assert on running a Camera Rig component This is a fallout of a previous change -- the generated Camera Asset in a Camera Rig component didn't have the correct allocation info anymore for initializing the evaluation context's variable and data tables.
Fix unity builds potentially leading to symbol redefinition.
Fix asset dirtying problems between camera rigs and camera assets The first problem is that camera rigs build all the allocation information they need, including the memory needed for their evaluator tree, and the entries they need in the variables/data tables.
This can easily mark a camera rig asset as modified, when:
(1) evaluator classes change (e.g. a new field is added) or
(2) when a referenced camera rig, such as a prefab rig, changes in a way that affects its own allocation info.
This ends up prompting the user to re-save assets that they haven't touched, with no obvious reason why. So the solution to this is easy: only build allocation info during cooking. In non-cooked builds, we just allocate things as we go, which is less performant, but much better for the user.
The second problem is that camera assets were automatically gathering all the exposed parameters from all their referenced camera rigs, and using that as their own exposed parameters. This was simple and functional at first, but it also created the same problem: the camera asset would get flagged as modified when any referenced camera rig had new/changed/deleted parameters. This again prompted the user to re-save the camera asset for no good reason.
In addition to that, as camera assets grew in scope, they could start getting a lot of parameters that the user didn't necessarily want. Solving this problem requires a new workflow: the camera asset editor now has an "Interface Parameters" panel, similar to the camera rig editor. It lets the user add/remove parameters on the camera asset itself, and specify how each of these parameters binds to which camera rig's parameter. It effectively removes the automatic step of gathering all referenced camera rigs' parameters, and replaces it by a manual step where the user can pick and choose which parameters to expose on the camera asset. This way, modifying a referenced camera rig doesn't modify the camera asset: the user has to explicitly modify the camera asset if they want its interface to change. Other notes about this change:
All the builder classes and methods now pass around a base "build context", which contains information about whether we're cooking or not.
Camera assets are upgraded on build or open to get a default list of interface parameters that reproduces what was automatically built before.
When initializing a new camera rig instance, we now ensure that the variable/data tables have all the entries needed. This makes uncooked builds work by lazily allocated memory when we don't have the allocation info.
The camera director's GatherUsageRigInfo now does extra stuff out of the box, such as looking into the proxy redirect table, and removing unwanted things from the output.
The code that converts a variable/data entry info a graph editor pin type has been moved into a common place for reuse.
Move easing blend node to the correct directory.
Fix some edge cases with the context data table.
Prevent access to some template functions for enum types when it can return pointers to incorrect underlying int size.
Add some extra checks to array setters.
Continue recording debug info even when a camera system doesn't have any evaluation context active.
Fix bugs related to enums in the data table.
Store enums with an int32 for handling large flags enums.
Fix a bug where we have to convert the value (not the pointer) of a data table entry in the case of enums, which may have different backing types.
Also fix incorrect data traits for strings.
Fix incorrect FOV when using a vanilla camera component or actor as the view target inside a GPC camera manager When setting the FOV or focal length on a camera pose, we always need to invalidate the other so that both aren't defined at the same time.
Ensure we continue handling collision results events when we don't hit anything This fixes a regression where absence of collision would lack updating the damper to return back to the "rest" position.
Fixup default parameters on load as a workaround for a bug in FInstancedPropertyBags.
Fix possible crash when clearing the camera asset or camera rig asset on a component.
Protect panning framing node from introducing NaN rotations.
Fix some problems with the screen-space framing nodes.
No longer stops reframing once the target is in the dead-zone, keep following it if it's still moving.
Modulate the reframing based on the disengagement time to get a semi-random rest position inside the dead-zone.
Get rid of the debug info if we don't need it anymore This fixes a bug where editor visualization stops working if the user activated debug display once.
No longer offers to create graph nodes when going "up-stream".
Also, it caused an undo bug since, after creating a node of the same type, the schema was trying to connect that to the dragged pin (the "self" pin on the first node). Which isn't possible. So it would fail, which would cancel the connection transaction, which would cancel the creation transaction. But the creation happened, so it made the creation of the (useless) node non-undoable. Now we just don't offer to create it anymore.
The ObjectTreeGraph model is mostly meant to go from "left to right", i.e. from an object to its properties to the objects connected to these properties. Dragging the "self" pin to the left only offered to create the exact same node type because that's the only node type compatible with itself generally (unless there are subclasses in existence). So it's mostly useless.
Fix how the output camera component is created.
Fix possibly incorrect evaluation layer when starting a modifier rig.
Fix logging formatting.
Fix missing sub-object destruction in gameplay camera component.
Look for rigs and rig proxies used by directors more than one package away This fixes the issue of, say, a Blueprint director using some data table or chooser asset for selecting rigs, which meant that the "family shortcuts" and other things using the UsageInfo API had incomplete info.
Fix crash when opening the Blueprint palette The palette creates "template nodes" that aren't actually fully initialized, and are prevented from loading any data.
Fix double-negation and incorrect comment.
Fix GetActiveCameraRigEvaluationInfo returning the wrong information when rigs are blending.
Fix camera variable overrides not working in PIE In editor/PIE builds, the camera asset's AllocationInfo (variable and context data tables) is only populated at cook time, so it is empty when running in-editor. This caused GameplayCameras component overrides to silently fall back to default values. When AllocationInfo is empty, we now gather it transiently from the camera rigs at runtime, mirroring what CameraAssetBuilder does during cooking. Cooked builds are unaffected and continue to use the pre-computed AllocationInfo as before.
Chaos Mover
Fixed the calculation of inverse inertia when applying jump reaction impulse. This ensures the correct impulse is applied when jumping from dynamic objects.
Fixed bug in pathed movement mode where looping could behave incorrectly.
Updated the ground check query sweep in falling mode to account for the updated velocity. This prevents fast moving characters falling through the ground.
CMC: Prevent unexpected upwards velocity boost when jumping/falling upwards into an acute angle corner of steep walls.
Level Streaming Persistence plugin: Fixed crash when persisting properties on a map placed actor that got destroyed but is part of a reused level instance.
Fix an operator discrepancy in UEnhancedPlayerInput::AddMapping. Use the.Equals function instead of operator== on FEnhancedActionKeyMapping when adding mapping to enhanced input.
Fix crashes when game feature plugins caused a garbage collection at a bad time, it now always performs the garbage collection at the end of the frame.
Fix issue where trying to unregister an asset from a temporarily-unregistered DataRegistry would fail, causing GC leaks when the data registry is reinitialized later.
Upon device connection, populate data in the UInputDeviceSubsystem about the given device if a valid FInputDeviceScope is available. This makes it a bit easier for gameplay code to query the input device subsystem when connection events happen instead of needing to wait for the user to actually press an input for it to be populated.
Circular buffer: Reduced checked capacity limit that was too high.
Multi Server: FPredictionKeys should always send full data when communicating with a proxy.
Fixed assertion in FVisualLogger::CleanupRedirects.
Fixed bug that would propagate stale CurrentEventData to future ability calls that received a nullptr CurrentEventData during activation.
Fix bug where the tick manager could get deadlocked in EndPhysics because it failed to properly flush the manual dispatches.
Fix issue where AsyncSaveGameToSlotForLocalPlayer would ensure if called twice in a row. It now sets the LastSuccessfulSaveRequest to the request that actually completed instead of the last requested.
Fix ScalableFloats to correctly reset cached curve when serializing or copying. This fixes issues when used in inherited Blueprints.
Fix several issues with C++ defined gameplay tags when a game feature dll is loaded after startup. Fast tag replication cannot support this case but Dynamic tag replication should now work correctly with late dll loads.
Deprecated:
Improve comments for tick functions to correctly indicate thread safety, and deprecate GetLastTickGameTime because it was confusing.
Enhanced Input: Deprecate the combo trigger. This trigger type is unreliable and can cause mapping contexts to be corrupted in the editor.
Mass
New:
Mass Trace
Add missing trace events for archetype creation and entity moves during archetype splitting in MassEntity Introduce a batch UE_TRACE_MASS_ENTITIES_MOVED macro to trace multiple entity handles in a single call.
Extract MassInsights trace provider and analyzer to new MassDeveloper runtime module. Move FMassTraceProvider, FMassTraceAnalyzer, IMassTraceProvider, IEditableMassTraceProvider, and all supporting data types (FFragmentInfo, FArchetypeInfo, FEntityEventRecord, FRegion, FRegionLane, etc.) from MassInsightsAnalysis plugin to Engine/Source/Runtime/Mass/MassDeveloper under the UE::Mass::Trace namespace. Port all MassInsightsUI consumers to the new types. Simplify module entry point via SetupMassTraceAnalysis() factory function.
Add Sparse, ConstShared, and SparseTag fragment types to MassInsights and MassEntity tracing Include shared and sparse elements in archetype registration trace output Check derived types before base types in fragment type classification to avoid incorrect matches.
Mass Commands
Extend fragment instance and build commands to support mixed element types in a single entity move New commands:
Add FMassCommandAddElementsWithSharedFragments<TTypes...> for composition-only changes + shared fragment values in one move.
Add FMassCommandAddFragmentInstancesWithSharedFragments<TShared, T...> for fragment values + shared values in one move.
Add convenience methods on FMassCommandBuffer: AddElementsWithSharedFragments, AddFragmentInstancesWithSharedFragments Extend existing commands to accept tags and sparse types:
FMassCommandAddFragmentInstances<T...> now accepts FMassTag, FMassSparseTag, FMassSparseFragment alongside FMassFragment.
FMassCommandBuildEntity<T...> same mixed-type support.
FMassCommandBuildEntityWithSharedFragments<TShared, T...> same mixed-type support.
Tags included in composition, excluded from value payload (GetAsNonTagGenericMultiArray).
Sparse types handled in-place via BatchAddSparseElementToEntities before composition changes EntityManager API additions:
BatchChangeCompositionForEntities overload with FMassArchetypeSharedFragmentValues.
BatchAddFragmentInstancesForEntities overloads with FMassTagBitSet and/or FMassArchetypeSharedFragmentValues.
Unify Add/Remove commands with FMassCommandAddElements and FMassCommandRemoveElements.
Add FMassCommandAddElements<TTypes...> (PushCommand batching) and FMassCommandAddElementList (PushUniqueCommand) for adding any mix of fragments, tags, and sparse elements in a single entity move.
Add AddElements convenience methods on FMassCommandBuffer (templated and runtime).
Redirect AddFragment, AddTag convenience methods to FMassCommandAddElements.
Deprecate FMassCommandAddFragmentsInternal and FMassCommandAddTagsInternal.
Add sparse element support to FMassCommandAddFragmentsInternal and FMassCommandAddTagsInternal by splitting sparse types to BatchAddSparseElementToEntities.
Add check in BatchChangeCompositionForEntities rejecting shared/chunk/sparse on Add side.
Add chunk fragment rejection in BatchAddElementToEntities and AddElementToEntity.
Fix CheckBreakpoints signature on AddElements and RemoveElements to match composition-only usage (entity-only, no fragment instances).
Add unit tests for chunk/shared/sparse Add-side gaps.
Add bitset-level and runtime type validation for Mass element composition.
Shadow GetTypeBitSet<T>() in DECLARE_NEWTYPEBITSET to static_assert that T matches the expected element subtype, not just FMassElement (root cause fix for typed bitset accepting wrong element types).
Add testableCheckf guards in BatchChangeCompositionForEntities to validate that ElementsToAdd and ElementsToRemove contain only tags and fragments, catching misuse before it reaches InitializeWithSimilar.
Extend BatchRemoveElement to support shared fragments and add unit tests.
Extend IsElement() to accept shared and const shared fragment types.
Extend BatchRemoveElementFromEntities and RemoveElementFromEntity to dispatch shared and const shared fragment removal via new InternalBatchRemoveSharedFragmentsFromEntities.
Add testableCheckf to Add element APIs rejecting shared fragments with clear message.
Add unit tests for FMassCommandAddElement/FMassCommandRemoveElement covering tags, fragments, shared fragments, const shared fragments, mixed types, and negative cases.
Additional archetype information (list of elements, list of entities) retrieval.
Added a single call to check fragments or tags or in an archetype.
Mass trait validation errors now highlight the trait net mode to help pinpoint the issue.
Queries can now return a topology hash for their archetypes.
Added UMassRepresentationActorManagement::IsActorReadyForRepresentation, a virtual hook (default returns true) used to wait for actor readiness before switching off ISM. While the hook returns false the processor keeps the ISM/SkinnedMesh visible and the spawned actor disabled; game-side subclasses can override it to gate the transition on async asset streaming. The wait is bounded by the ai.massrepresentation.MaxActorVisualReadinessWaitFrames cvar (default 255), after which the actor is force-enabled and a warning is logged.
Added trajectory generation and spring movement code to MassGameplay (experimental) Mass Traits:
U Spring Movement Trait: Adds spring-damped movement.
U Trajectory Trait: Adds trajectory generation.
U Trajectory Movement Trait: Overrides movement to follow trajectory.
Removed MassEntity's dependency on AITestSuite. The testable-ensure mechanism (global counter + 3 macros) was moved into MassCore itself, so it no longer pulls in AIModule and GameplayTasks through a Developer module.
Mass Debugger: Added SparseElement bitset to the archetype details Note that the information exposed is the aggregated info from all chunks; it doesn't mean that all entities have the element.
Modified UE::Mass::Utils::CreateEntityCollections to handle the common single-entity input case, and to perform better when multiple entities of the same archetype are processed.
API Change: Made the FMassArchetypeCompositionDescriptor(const FMassElementBitSetand) constructor non-explicit, in preparation for the near-future removal of FMassArchetypeCompositionDescriptor.
Mass Gameplay Debug: Made AssignDebugVisProcessor editor only to prevent useless registrations on non-editor builds Also made sure it is properly setup for registration when WITH_MASSGAMEPLAY_DEBUG i s0.
Mass Entity: Add observer support for shared fragments and swaptag.
Added the missing FMassCommandRemoveElement command.
API Change: Renamed FMassEntityManager::AddElementToEntities and RemoveElementFromEntities to BatchAddElementToEntities and BatchRemoveElementFromEntities respectively, for consistency with the rest of the API.
Extended the MassEntityManager and Archetype API to support the use of struct views.
Added a flag to EntityBuilder to force-committing always through Mass commands. Added the mass.EntityBuilder.ForceDeferredCommit cvar to set this behavior project-wide.
Added a way to configure MassEntityTraits to be valid for a specific target configuration (Standalone, Client, Server, etc).
Move Actors for entities spawned by AMassSpawner into an Outliner folder that matches the name of the spawner.
Added Sparse Elements, along with support in queries, commands, and entity builder. Sparse Elements are Mass elements (tags and fragments) that can be added to entities without causing them to change archetypes — they are not part of an archetype's composition and are handled individually per entity.
Renamed GetOrSpawnActorFromTemplate to GetOrRequestSpawnActorFromTemplate to reflect that the function requests a spawn rather than spawning synchronously. Declaration, definition, and all callers were updated.
Exposed mass processing phase tick functions in public API to allow for setup of tick dependencies.
TStructTypeBitSet changes to support "single element bitsets":
Alternative implementations of bitwise operators.
Default to 8 elements as bitarray's initial allocation size.
Modified some functions' signatures to support more flexibility.
Bug Fix:
Fixed matches queries with Any fragments and tags to archetypes with only one or the other.
Mass entity world subsystem now flushes remaining commands on deinitialization. This is required to cleanup any elements registered to other subsystems or rendering scene.
Improvement: [Mass Representation] Switched two manually calculated bDoKeepActorExtraFrame branches to use the new UE::Mass::Representation::ShouldKeepActorExtraFrame helper. Bug Fix: [Mass Representation] Fixed the issue where the original conditions weren't respecting the value of FMassRepresentationParameters.bKeepActorExtraFrame.
Mass Debugger fix: Struct redirects are now applied when pasting query JSON, mirroring the pattern in FInstancedStruct::ImportTextItem.
Fixed an overzealous check in UMassAgentComponent::PausePuppet that crashed the function when called on a non-puppet. Switched the check to an ensure.
Fixed: The Mass debugger running with an invalid entity.
Fixed an issue in UMassSpawnerSubsystem::DoSpawning's BatchSetEntityFragmentValues when called in a loop with a single CreationContext — by iteration N the context included archetypes from prior spawns with different fragments. The call now builds a fresh local collection from just the current call's spawned entities.
Fixed infinite recursion in FMassEntityConfig::FindTrait when the parent config chain contains a cycle.
Fixed a MassAgentComponent assert when Iris destroys a puppet in the PuppetPendingReplication state. UnregisterAgentComponent previously had no handler for this state, so when Iris destroyed a replicated actor before its NetID replicated (e.g. on relevancy change) the component was stuck with no entity handle and no NetID. Added PuppetReplicationAborted() to cleanly bail out to None.
Mass Debugger: Fixed wrong hierarchy representation of unnamed archetypes in MassDebugger by adding a composition hash identifier for unnamed archetypes and filtering out the None entry from debug names.
Fixed `FMassCommandAddFragmentInstances` ignoring its `OperationType` parameter. The constructor accepted the argument but its initializer list hardcoded EMassCommandOperationType::Set, causing FMassCommandBuildEntity (which passes Create) to sort as Set during command buffer flush and hit a checkf on `entity state == Reserved`.
Add stale model check to entity list refresh guard condition in Mass Entity Debugger.
Fixed warning messages regarding undeclared subsystem access via FMassSubsystemAccess.
Allow multiple registration of types with Mass, which avoids an ensure when using Mass from Game Feature Plugins.
Removing CDOs from Mass settings on modules' unload.
Fixed an off-by-one in CacheSubsystem where Subsystems.AddZeroed computed the wrong resize delta (Num() - SystemIndex instead of SystemIndex - Num()). The array is pre-sized in the constructor so this had not blown up in practice.
World Condition: Fixed case where world condition queries would not be properly linked when embedded in a struct.
Made naming spawned actors with the entity's GUID (when available) optional, and changed the default to false, since the previous behavior could cause unexpected issues.
Fix for exporting struct array properties as json.
AI Controller: We now end all tasks owned by the controller before calling OnUnPossess on the base class since those tasks might require access to the pawn's associated controller to exit properly.
Networking
New:
Iris
Allow users to subclass UNetObjectPrioritizer easily.
Allow options to be passed to UE_NET_IMPLEMENT_NAMED_STRUCT_LASTRESORT_NETSERIALIZER_INFO and UE_NET_IMPLEMENT_NAMED_STRUCT_LASTRESORT_NETSERIALIZER_AND_REGISTRY_DELEGATES. Current options are to set the max quantized size, exclude from default state hash and custom fragment registration.
Added FInstancedStructNetSerializer delta serialization support.
Added the LogIrisCreationFlow log category to trace server-to-client root object creation timing across key Iris replication events, making it easier to correlate server and client logs and measure end-to-end object initialisation latency.
Fixing NetTrace to work with TailBuffer.
When active, the TailBuffer is constantly caching trace packets for the duration of a session. This means we need to ensure that each NameId is unique for the whole session, and also included in Important events to make sure there's no missing data.
It also means we may see multiple ConnectionCreated events with the same ConnectionId, as Traces aren't started/stopped in the same way when outputting a TailBuffer, so in the NetTraceAnalyzer we only update the ConnectionState the first time.
ResetLifetimeConditionDebugNames and OnResetPersistentNetDebugNames removed from the API as they are no longer required and would break the Trace Tail Buffer Fixing NetTrace to work with TailBuffer by keeping DebugNameIds consistent.
ResetLifetimeConditionDebugNames and OnResetPersistentNetDebugNames removed from Iris Net Trace API as they cause broken traces if Trace Tail Buffer is in use.
Added optional parameter to control if a subobjects child subobjects replicate before or after their parent.
ActorComponents still defaults to replicate their SubObjects before the components to not cause any unexpected divergences.
Clarified documentation.
Deprecated ESubObjectInsertionOrder::ReplicateWith in favour of explicitly specifying root and parent when adding a subobject.
Fixed bug where using ESubObjectInsertionOrder::InsertAtStart would shift conditionals around and apply them to the wrong subobject.
Added ensure if reliable attachementqueue is overcommited.
Implemented support to allow start and StopReplication being called multiple times for static objects including support for flush.
Refactored FlushLogic to be more robust and behaves closer to normal destroy.
Fixes issue where the same static NetRefHandle/Object could end up being replicated as multiple NetObjects/Channels causing bugs on client.
Fixed case where flush was not propagated properly to new connections.
Fix for ObjectPoller using the parent net stats rather than the passed in child net stats. Fixed a small chance of incorrect stats being generated when using NetStats with Multithreaded Iris Polling.
Replicated objects with creation links to other objects will replicate after creation dependencies before they replicate to reduce reordering on clients.
Implemented debug write pass for ReplicationWriter that writes NetObjects marked as debugobjects using separate packets not counting against bandwidth limit.
Added API for marking an object as a DebugObject.
Added API for allowing DataStreams to write DebugData that does not count against bandwidth limits.
Add a PreferredReplicationSystem setting to FIrisNetDriverConfig that can override the net.Iris.UseIrisReplication cvar for specific NetDriverDefinitions.
Multi Server
Adding OnAllServersConnectedEvent as a potential Event to listen to.
LaunchMultiServer now supports -BotCount=XX which allows you to specify an overall number of bots which works in both -client=proxy and -client=direct mode.
Iris Parallelization
Added API for network HandlerComponents to indicate support for being run in parallel. Enabled NET_ANALYTICS_MULTITHREADING so that OodleNetworkAnalytics can run in parallel Network HandlerComponents can indicate support for running in parallel per-connection. Enabled NET_ANALYTICS_MULTITHREADING by default.
Added API for network HandlerComponents to indicate support for being run in parallel. Enabled NET_ANALYTICS_MULTITHREADING so that OodleNetworkAnalytics can run in parallel Network HandlerComponents can indicate support for running in parallel per-connection. Enabled NET_ANALYTICS_MULTITHREADING by default.
Adding thread safety to NetworkMetricsDatabase and the related stats in NetDriver Added thread safety to NetworkMetricsDatabase and the related stats in NetDriver.
Make Net Tracing existing objects and object creation threadsafe. Added a SharedNewObjects list to temporarily store newly created objects in parallel net connection tick and then merge them with the full list after NetConnection Tick has completed. Net Tracing for object creation has been made thread safe for Iris Parallelization.
Make Net Tracing existing objects and object creation threadsafe. Added a SharedNewObjects list to temporarily store newly created objects in parallel net connection tick and then merge them with the full list after NetConnection Tick has completed. Net Tracing for object creation has been made thread safe for Iris Parallelization.
Added thread safety functionality to DeltaCompressionBaselineManager. Added FScopedBaselineAccess which guards parallel access to the BaselineManager, which is used in the ReplicationWriter in preparation for running it in parallel. Also renamed GetIsInParallelPhase to IsInParallelPhase to align with Iris Beta naming conventions. Added thread safety to DeltaCompressionBaselineManager.
Added thread safety to NetBlob, NetTokenStore, NameTokenStore, StringTokenStore and StructNetTokenDataStore
Added ExcludeParallelIrisSupport to TargetRules.cs so that licensees can remove these mutexes if they intend to run the server in single threaded and want a few nanoseconds of perf back.
Can be removed from compilation using ExcludeParallelIrisSupport.
Added UE_SUPPORT_PARALLEL_IRIS define which includes multithreading logic only on Server and Editor builds by default. Client only builds do not need the mutexes included as they will not run the replication logic in parallel.
NetConnection::Tick can be run in parallel on the server by setting net.iris.AllowParallelNetTick to true. UChannels can indicate support for parallelism in SupportsParallelTick Implemented thread safety for ObjectReferenceCache Iris replication supports parallel NetConnection Tick to run the write phase across multiple threads.
Improved connection startup latency for numeric IPv4 addresses by sending the initial handshake packet in the same frame instead of waiting for the next-frame async resolution path. The net.NumericIPSyncResolve CVar can be used to disable synchronous resolution and restore the previous behavior.
Added experimental NetworkServiceDiscovery plugin providing Windows/Mac/iOS/Android mDNS/Bonjour service announcement and discovery.
Added a runtime CVar, HTTP.Curl.MaxHostConnections, to control libcurl's per-host HTTP connection limit and allow the concurrent request limit to be modified on demand.
Add FScopedNetEmulationOverride class for easy, temporary network emulation overrides in test cases.
FNetBitArray's ForAllSetBitsInRange is now handling invalid StartBit and EndBit parameters more gracefully.
Net: Bumped default ServerDesiredSocketReceiveBufferBytes and ClientDesiredSocketReceiveBufferBytes to 262144 bytes to avoid dropping data if user does not override settings.
Bug Fix:
Iris
Output the entire default state of replication state descriptors when encountering protocol mismatch errors.
Fix issue with destroyed object with destruction info being mistaken for a destruction info. Allow destroyed object with destruction info to be replicated if it needs flushing for example due to a reliable RPC being called the same frame it's added for replication.
Fixed memory leak in PolymorphicStructNetSerializer.
PlayerStates are now prioritized using the NetObjectCountLimiter with the PlayerStateCountLimiterConfig by default and as intended.
Fixed replication issues when connecting a standalone client to a PIE server.
Fixed internal leaks of subobjects being torned off.
Fixed filtering hysteresis bugs for late joining connections.
No longer stores instanced struct type in the InstancedStructNetSerializer default state as the client is not being able to resolve the type.
Fixed rare crash when enabling parallel polling.
Fix issue with newly created dependent object entering hysteresis despite parent being filtered out already.
Fixed issue with dependent objects potentially getting replicated when they shouldn't and vice versa.
Fixed bug where new objects assigned to a previously used internal index could end up not being properly polled on empty servers.
Fixed issue where out of scope objects being created and destroyed the same frame requiring flush would be destroyed using the wrong code path.
Only call SetActorIsPendingPostNetInit for actors that are expected to call PostNetInit.
Fixed issue where a static actor would skip their call to BeginPlay if they are in pending dispatch list and BeginPlay was issues on world triggered from OnRep of another actor.
Fixed issue with ObjectPoller not force polling ObjectReferences for pushbased fragments in mixed protocols after GC.
Fixed scheduling of dependent objects to not be reversed if spilling over to next packet.
Fixed bug where unicast rpcs did not respect RPCSendPolicy.
Fixed bug where replicated objects overcomiiting reliable attachment send queue was not properly marked dirty when queue could accept send more data.
Addressed issues with PacketNotification getting stuck in deadlock if both ends overshoots ack sequence history.
Multi Server: Multi-Server Proxy uses GetLocalRole rather than GetRemoteRole as we are executing in the context of a Client (GetLocalRole is what the Server assigned us and GetRemoteRole is always ROLE_Authority).
Corrected inconsistent initial conditionals in void AActor::GetReplicatedCustomConditionState() reversed compared to what is later set in AActor::PreReplication.
Fix for DemoNetDriver crashes due to accessing memory in destroyed actors.
Fix for issue where replayout did not respect net.ReplicateCustomDeltaPropertiesInRepIndexOrder and always replicated CustomDeltaProperties in RepIndexOrder.
Fix StaticMeshActor instances not replicating when setting are applied on the instance instead of the Blueprint asset.
Learning Resources
Sample Content
New:
Enabled HDR display support and added HDR display settings to Lyra.
Level Design and Art Tools
New:
Hide RayTracing, Navigation, LOD, HLOD categories from SplineComponent : The spline component inherits them from the primitive component but is not renderable or navigable itself.
Bug Fix:
Preventive fix for water brush against OnLevelAdded/Removed callbacks that can get called while the actor is unreachable.
Fix GetDynamicWaterInfoCenter output Fix missing implementation of GetDynamicWaterInfoBounds.
Fixed edit condition for water nav area class.
Geometry Core
New:
Extended the FSubdividePoly Dynamic Mesh OpenSubdiv wrapper to interpolate all standard mesh attributes. Now e.g. UVs, skin weights, colors, etc will be interpolated when using Catmull-Clark or Loop subdivision in modeling tools or Geometry Script.
General attribute support for FMeshSimplification.
Generalize SkinWeightBinding operation to support 'constrained' binding, where vertices can only bind to a known subset of bones.
Added a point-triangle distances connection method to vertex connected components, to help optionally join nearly-connected islands when computing mesh islands.
Added vertex-based region of interest update paths to DynamicMeshComponent, matching the Triangle ROI paths + exposed these update paths to UPreviewMesh also.
Added option for sparse point octree ParallelRangeQuery to also use a custom TFunctionRef to filter which bounds are relevant to the query.
Added vertex and triangle selection versions of FDynamicMesh3's bounding box compute method (with similar logic to compute in parallel chunks).
Added option for dynamic mesh overlay's per-vertex build to make the elements exactly 1:1 with vertices, so caller doesn't need to worry about the vertex to element ID mapping.
The dynamic mesh's attribute set generic attribute accessor now returns nullptr if the attribute is not found, rather than failing a check(), to match how most of the other accessors work when requesting an attrib that doesn't exist.
We now fill colors from hole boundaries in most hole fill operations (except smooth hole fill).
Made DDC cache put responses return the record/value that the cache contains This can be used to detect conflicts between new and existing data, when not overwriting existing data.
Added medial skeleton → hierarchical / animation skeleton conversion via minimum spanning tree.
Added medial-axis sampling/skeletonization to GeometryAlgorithms.
Added a method for VertexConnectedComponents to merge only the close vertices that pass some other filter, so e.g. one can only do this merge step for boundary vertices (which can be much faster than doing it for all vertices, and also can avoid connecting some intentionally-separated-but-nearby vertices) Added a thread-safe method for getting the cluster ID of vertex-connected components.
Added a MeshVertexNormals method that can account for implicit welding -- i.e. a known mapping of some vertices to common weld vertices.
Added a Sort() method to FIndex3i, to change the indices to a sorted order (ala the one already on FIndex2i).
Improved the dynamic mesh simplification algorithm to be smarter about what edges can collapse. Added an edge constraint tolerance distance to optionally limit how far constrained edges can move during simplification.
Added mult-label version of mesh iso curves cutting, via adapters to support arbitrary mesh types.
Geometry Script and Modeling Mode mesh to convex hull nodes and tools now have a geometric tolerance for hull simplification, to allow simplification below the target triangle count when it will not introduce more error above the geometric tolerance threshold.
AABB tree now supports meshes with FVector3f vertex storage.
Added optional regularization to the QEM simplifier.
Added optional scaling functions for the QEM simplifier metrics (quadric error, target length, and geometry error).
F Sparse Dynamic Point Octree3: Export FindKClosestPoints function.
Bug Fix:
Fixed a crash that could occur due to an edge case in the AABB Tree building logic.
Fixed performance issue with MeshSelfUnion on meshes with many open boundaries by using pointhashgrid to filter potential edge matches in self union by midpoint. Also now check for edge vertex position matches in either ordering.
Fixed issues with sparse dynamic point octree.
Fixed queries hanging on very large query bounds (by refactoring IterateRootsInRadius's logic to clamp query ranges and fall back to all-root iterations into a general root iteration helper)
Fixed points very near cell bounds crashing on insert due to floating point error making CellContains() not agreeing with the cell assignment. Now CellContains directly uses the cell assignment logic. Fixed issue w/ octree range iteration methods where we could potentially overflow the large-range test by casting to double too late.
Fixed minimal hole filler accidentally passing the input mesh by value to the CheckIfEdgeFlipCreatesFlip helper function.
Fixed crash in hole fill op where it could use reference a triangle with unset UVs.
Improved edge collapse parameter interpolation for dynamic mesh's mesh simplification method.
Fixed DynamicMesh CompactCopy checking the wrong mesh's attribute set for compactness. Fixed const correctness of IsCompact on attribute set.
Fixed mesh simplifier's bad placement of boundary vertices (e.g. rounding off corners) -- it now considers error when picking boundary vertex position instead of always just picking the midpoint.
Fixed the FModuloIterator struct ignoring StartIndex.
Deprecated:
Deprecated the version of SplitMeshes that takes a TArray<FDynamicMesh3>, to move code away from unsafe usage of FDynamicMesh3/TArray.
Geometry Script
New:
Added more material management to the copy mesh to static mesh / copy mesh to skeletal mesh options.
Optionally use New Materials to only set materials on the currently updated LOD.
Add option to clean material IDs, so invalid material IDs will be set to reference a valid material instead.
Default Mesh Simplify settings now apply a small regularization weight.
Added regularization controls to the geometry script simplification options.
Added more methods for managing weight maps.
Added geometry script support for driving simplification error tolerance or edge lengths via weight maps.
Add weight map support to Remesh node.
Added a Perlin Noise method that computes noise scale from positions.
Bug Fix:
Fixed crash on using geometryscript ChannelPack method on texture that lacks sources.
Fixed crash on converting dynamic mesh to static mesh or skeletal mesh when the mesh contains invalid material IDs.
Fixed crash in Geometry Script's AppendBuffersToMesh when buffer contains triangles with invalid indices.
Fixed a double-free crash for the Geometry Script global mesh pool.
Guarded against divide-by-zero in the UE standard simplifier when given an empty mesh.
The GetWeightMapHandle node now takes weightmap Name by value, so it is settable on the node.
Fixed spaced point sampling methods not using the random seed for down-sample ordering, which produced highly correlated results across runs.
Landscape
New:
Landscape brush optimization.
Improvements to landscape (legacy) foliage snapping setting : It's now possible :
Not to snap.
Snap only where the landscape brush tool is used.
Snap on every landscape change (including procedural ones, like water/splines/etc.).
Fixed water and landscape collisions display not working in shipping editor config.
Optimization for duplicating landscape in Linux.
Changed DebugColor of the default physical material to something darker, to better convey the fact that it's a debug material. This is only used by landscape collision ATM.
Changed landscape grass weight shader from per-RGBA channel grass weight layout to per-grass weight channel layout. This allows the shader compiler to de-duplicate the code paths for the 4 channels. This saves on shader code size and also makes it sligthly more efficient (3%) on some targets.
Added customization for landscape grass types overrides TMap property in landscape streaming proxies : This allows to display an editable combo box, showing the user the existing grass names available on the landscape or entering his/her own grass name ahead of time With this, the grass map remapping feature is now complete.
Overridable landscape grass types.
Landscape grass types are now addressed by their declared (input) name in the landscape material.
This allows to specify grass types overrides within a landscape proxy.
This also allows to export a certain grass map without specifying a landscape grass type (e.g. meant for PCG).
This also allows multiple grass maps to be associated withe same landscape grass type, if needed.
Improved/standardized formatting of debug landscape files (for grass.grassmap.dump, landscape.DumpHeightmapDiff and landscape.DumpWeightmapDiff), it now shows the component's key (index in the overall landscape) and its section base (which is visible in landscape mode, when in Select mode).
Removed remnant from landscape XY offset feature.
Landscape grass map exporter can now export an arbitrary amount of grass types, instead of always exporting all of those declared in the material.
Removed restriction that all landscape components must use the same list of grass types when generating grass map data for PCG.
Fixed invalid grass map being sampled when setting up a material with more than 1 null grass types.
Exposed landscape edit layers and their names to BP.
Added BP function to LandscapePatchComponent to assign both the landscape actor and edit layer (by name). This avoids the burden of dealing with edit layer FGuids on the BP side.
Deprecated CVar landscape.ForceLayersUpdate : It's a debug feature that was not well supported and was very inefficient anyway. The landscape.ForceLayersFullUpdate console command should be used instead to trigger a single global update Also used the new deprecated CVar feature to properly deprecate some other already deprecated landscape CVars.
Landscape editor :
Adjusted tooltip for Exclusive Paint Mode to better explain how it works.
Made "Don't Hold Ctrl" the default, since it's how it used to work in UE5.6.
Landscape mode Paint tools: New exclusive paint mode for weight-blended layers.
Added alternate modifier behavior to let the user "exclusive-paint" weight-blended layers from the same blend group, that is, paint a given (set of) target layer and "invert-paint" the other target layers from the same blend group, similar to the behavior in prior UE versions, except it's now possible to turn it on or off with a keybind, in order to let users tweak target layers individually.
Erasing paint now doesn't re-balance other layers anymore, it simply erases the currently painted layer, which is much more natural.
By default, exclusive paint mode is triggered by having the Ctrl key *not* held (i.e. same behavior as UE5.5) but it can also be changed by the user in order to have it triggered only when the Ctrl key is held or forced as active or inactive (i.e. no Ctrl key bind), which can be useful when the user uses another Landscape Editor Control Type editor preference than the default, which reserves usage of the Ctrl key for other purposes.
There's now an icon on the target layer thumbnail indicating the type of action performed by the current tool : Normal or inverse. For example, shift-painting (i.e. erasing) will be considered as "inverse". This helps the user understand the exclusive paint mode behavior, since the affected layer is marked as normals while the other weight-blended layers from the same blend group are marked "inverse"
There's now a color strip on the target layer thumbnails (similar-looking to the actual asset thumbnails, with a random color, associated with the blend method and group name, i.e. consistent from one run to another) that gives a hint about the layer's blend group (if any). This helps the user understand which of the target layers will be affected by exclusive painting Misc:
Fixed bug with landscape component allow list addition/removal ('=' / '-' shortcut when using the paint tools) where removal was incorrectly bypassed, leading to the tool being basically useless.
Fixed landscape target layer list not updating when changing the blend method or group.
Fixed weird-looking tooltip on target layer (because it was using the preview material MIC's "asset" tooltip).
Fixed a bunch of local landscape settings that were incorrectly serialized in the.ini file, leading to a loss of settings.
Various fixes for landscape UX.
Added support for custom thumbnail for landscape layer info assets (if present, it will be used, regardless of the bDisplayTargetLayerThumbnails project setting). This allows users to generate custom thumbnails even when the automatic target layer thumbnail generation is failing (for example if the landscape material outputs to RVT) Also, fixed missing fallback icon when not displaying target layer thumbnails.
Bug Fix:
Fixed crash when reporting landscape edit layer data changes when a sub-property changes.
Fixed race condition when creating ALandscapeProxy actors on the async loading thread : We only register to UWorld's FOnFeatureLevelChanged in PostLoad (guaranteed to run on GameThread) and in PostInitProperties, but only when not on the async loading thread).
Removed invalid assert for landscape batched merge.
Fixed ensure + (almost) infinite loop when deleting landscape components.
Fixed issue with landscape batched merge, when performing a partial updates (i.e. only certain components updated) : On the upper and leftmost borders, the top-left, top and left components are favored by deterministic rasterization, except that it wrongly assumed the components were being rendered in the batch. But for weightmaps, this was not the case, so we ended up with a missing row/column of pixels on partial renders.
Added a warning in the (almost impossible) case where too many components are rendered in a given batch.
Changed landscape.ForceLayersFullUpdate console command so that in case a landscape name is specified and it fully matches one of the landscapes' names, we only update this one landscape and skip those whose name only partially matches (e.g. if there are 2 landscape actors BlaBla and BlaBlaBla, landscape.ForceLayersFullUpdate BlaBla will only update the former, while landscape.ForceLayersFullUpdate Bla will update both).
Fix a problem with invalid water bodies that would prevent the user from getting rid of the "water body is dirty" (viewport) warning.
Fixed landscape patch crash when changing BP properties.
Fixed Nanite landscape not getting updated as it should after a component deletion.
Fix for assert when using the flatten tool with some landscape renderers that do not support the landscape merge's requested target type(s).
Fixup incorrect landscape splines connection data on load. It's still unclear what led to this situation but this allows the user to reconnect the faulty spline points.
Fixed landscape file cache's file monitoring ability that got broken at some point because of relative/absolute paths.
Hotfix for landscape grass crash : Landscape components can get registered to the grass builder and have their grass map start to be rendered. But time-slicing may prevent the other landscape components from the proxy to be all registered, leading to the landscape proxy not being fully registered, i.e. not having its landscape info object created. By the time the grass maps get read back, they assume the landscape info was valid, which is not the case. We now prevent grass maps from being generated until all components from the proxy have been registered.
Fixed landscape batched merge generating useless mips when generating a given weightmap in several batches.
Prevent crash when trying to call one of the landscape's RenderHeightmap/Weightmap(s) functions from an application without a valid rendering device.
Cleaned up detection of valid rendering devices in landscape code.
UX fixes for landscape overridable properties, so that they appear properly disabled when not overridden.
Added tooltips for some landscape proxy properties.
Fixed Ctrl-E not retrieving landscape materials on a given proxy when those come from a per-component material override.
Fixed Nanite landscape not being enabled in editor standalone mode (-game).
Prevent crash when ULandscapeComponent::GetCurrentRuntimeMaterialInstanceCount, etc. gets called on a component without a World, which is currently possible if a level gets streamed out and the material quality settings get changed shorly after.
Change landscape group log to verbose since this can happen during Undo of a proxy deletion.
Speculative crash fix for when the Slate callback for allowing the deletion of actors gets called on landscape actors after they have been deleted.
Landscape Patch : Fixed AssignToLandscape BP function so that it can be used to unassign a landscape too and so that it resets the edit layer when the provided name is invalid.
Fixed for crash when using ALandscape::RenderWeightmap on mobile.
Fixed potential crash when a user modifies the user settings by hand with invalid landscape enum values.
Fixed a couple of landscape settings that were not saved in the config.
Landscape streaming proxies : Removed fallback to ALandscape when Landscape(Hole)Material are nullptr. This is a remnant from the time where there was no LandscapeOverridable property system. This is now reported as a MapCheck warning (or info, if landscape.SilenceInvalidPropertyOverridesMapCheckWarnings is 1) and the editor returns an invalid material in such a case. This avoids cook-only errors when a user overrides the property but sets it to null : now the editor shows the default material, which is much better than relying on the parent ALandscape's material, since its presence is not guaranteed on cook.
Fixed landscape spline modulation texture rasterization crashes (out of bounds sampling, wrong channel count).
Added support for all known texture format types.
Fixed off-by-one bounds computation when rastering landscape splines, which could lead to inconsistent results when a spline segment was located exactly at the border of 2 landscape streaming proxies (indeterminism).
Changed landscape overridable properties UX : Reset to Default now affects the overridden state instead of the property value. Supports multi-select.
Scalability: Made LandscapeQuality API consistent with other quality levels. It can now be get/set via Blueprint and is considered in GetSingleQualityLevel.
Fixed potential issue sorting layer info assets.
Fixed crash when auto-filling target layers from material.
Modeling Tools
New:
Modeling Tools
Added GetPropertyCacheIdentifier support to MeshSculptToolBase to allow subclassed tools to not share common Brush properties.
Added GetPropertyCacheIdentifier virtual to MeshAttributePaintTool to allow subclasses to avoid collisions of saved property set data between the base and derived class.
Add tooltips for the BrushAction and BrushValue properties. Simplify the display names for BrushAction and BrushValue properties.
Bind expand/contract selection actions to double click in ISM Editor tool, and make shift and ctrl behave the same way in clicking and marquee (shift alone adds, ctrl alone removes, and shift+ctrl toggles).
Make various ISM Editor tool improvements:
Fix ctrl not removing from selection in single clicks.
Add extra selection manipulation methods: Expand/contract last, select all, and expand all.
Add ability to extract/duplicate items to a new actor.
Fix selectable boxes not being hidden while dragging.
Remesh Tool
Set maximum initial triangle count to 100k.
Add relative density weight map attribute.
Mesh Vertex Sculpt Tool: Add user-controllable opacity for the on-surface brush stamp indicator + default to less opacity.
Added option for smooth brush to favor polygroup edges, so that meshes with quads will better preserve the quad shape on smoothing.
The Paint Maps tool is now significantly faster when operating on meshes with high triangle counts.
Vertex Sculpt tool is now significantly faster when operating on meshes with high triangle counts. Optimizations include using a vertex octree (rather than the triangle octree) for vertex ROI queries, and caching mesh connectivity.
Added option to lock boundary vertices in the vertex sculpt tool, and auto-enable it for height sculpt tools.
Added an option in the Simplify tool to drive simplification using a weight map. New: Exposed the quadric error tolerance as a simplification target in the Simplify tool.
Draw Spline Tool: Add option to fit spline onto an existing surface. Update the ProjectSplineToSurface function to use absolute distance threshold rather than scaling by spline segment length.
Bug Fix:
Modeling Tools
Fixed Move brush not applying when sculpting in the negative frame with symmetry enabled.
Fixed crash on mesh element gizmo release when slow-task dialog steals focus UGeometrySelectionManager::EndTransformation could re-enter when the transformer's EndTransform synchronously caused a slow-task dialog to pump focus-loss messages, routing through InputRouter::ForceTerminateAll back into OnEndGizmoTransform. The reentrant call dereferenced an already-reset FMeshVertexChangeBuilder and crashed in SaveVertexFinal.
Disable WASD hotkeys in Sculpt tools. Some camera navigation usage during sculpt tools could result in inadvertent brush size/strength changes due to these hotkeys.
Fixed incorrect material slot assignments when creating a StaticMesh from a SkeletalMesh. Use UniqueMaterialIndex as index into MaterialIndexToImportIndex Use Polygon Section for PolygonID instead of MaterialIndex.
Fixed crash that could occur in multi-select operation on static meshes from some tools: Fixed thread safety of empty mesh init for static mesh tool target.
Modeling Mode AutoLOD: Defend against a crash when a MeshDescription's PolygonGroupID does not correspond to a valid MaterialID.
Sculpting: Removed Depth property from sculpting brushes where it doesn't affect the result (flatten, fixed-plane), or where the effect is undesirable (move, grab, grabsharp -- where it just caused the selection to 'jump' on click).
Fixed open/close transaction mismatch bug in attribute paint tool after attempting to paint on a mesh with no attribute channels.
Fixed crash in simplify tool on attempting to simplify a dynamic mesh with the UE standard simplifier.
Fixed an issue where it was impossible to see what was being painted in mesh paint mode when painting on a geometry collection with a proxy static mesh configured. Now the non-proxy geometry will be rendered while painting vertex colors.
Fix flatten brush speed having extra radius factor, which caused flattening speed to be very sensitive to the scale of the brush / target sculpted object.
Draw Spline Tool: Don't check() if the selected target is non-null (we allow Target = nullptr for this tool).
Procedural
New:
PCG
Added GPU execution time for nodes to the Profiling window.
Added GPU memory created for GPU nodes to Profiling window.
Added parsing of created attributes directly from Custom HLSL source, so that attributes no longer need manual configuration on output pin properties.
Fix ISM Reuse issues : Missing or extra instances depending on situations.
ISM Reuse code was blindly reusing without validating the expected number of resources to be reused.
We now keep track of the number of ISM resources we need to find in order to consider reusing.
Applies to global reuse (when all dependencies crc match) or per input reuse.
This means that any resource that is shared between spawner execution can't reuse instance, only the component itself (MarkAsUsed).
Reset the different Crcs in MarkAsUsed.
Embedded Subgraphs support.
PCGEditor workflow support.
Add a default application mode (FPCGEditorDefaultMode).
Add a new FPCGGenericTabFactory class to implement tabs.
Add a FDocumentTracker which will be used to add document tab factories (sub graphs).
Deprecate: EPCGEditorPanel enum.
Added support for varying landscape materials and grass types to grass map generation.
Refactor change tracking.
Move execution source tracking into FPCGChangeTracker which can be reused across execution source impls.
Add FPCGTrackingRegistry in FPCGModule which allows registering custom trackers.
Moved most specific code in FPCGTrackingManager to custom trackers (FPCGActorTracker, FPCGLandscapeTracker, FPCGMiscTracker).
Moved handling of changes to custom handlers (FPCGComponentChangeHandler).
Optimized runtime generation scheduler to reduce per frame game thread cost by up to 30%.
Added new 'Primitive Data' static mesh spawner mode that takes a primitive table and allows overriding primitive properties when executing on GPU.
Enabled PCG plugin by default.
Generalized 'standalone graphs' to the concept of 'graph usage' to support both asset (previously - standalone graphs) and level (which runs on the currently loaded level) and of course, the standard usage case on a PCG component. Both asset and level graphs can be run in the contextual menu of the graph asset (and optionally can be configured if the graph has graph parameters).
Added type filtering in the context menu of the PCG Editor. There are options to control what is filtered out - only compatible types / also include filters / also include conversions.
Added query and isolate editor toolmode in PCG tools. The Query mode returns data in the logs about the clicked object, while the Isolate mode allows partial 'detach from PCG' on a matching tag basis.
Fixed large number of combined samplers being produced by texture pins on CustomHLSL kernels by stripping the extra ones out when Allow Multiple Data is disabled in the pin properties.
Added list of console variable names to PCG graph settings that will trigger refreshes when graph is used in runtime generation.
Optimized GPU cost of Custom HLSL Processor and Generator nodes, by adding an auto-initialize output data option to the primary output pin which allows opting out of pre-initialization and saving memory bandwidth.
Optimized CPU cost of PCG graph editor window to improve responsiveness of editing.
Added unit test support code for PCG GPU graphs.
Add text diff support for PCGComputeSource assets.
Level to Asset: Add a project setting to exclude some actor classes from the export.
Subgraph drag on node support.
From Content browser or Embedded subgraph view.
PCGBasePointData Octree move to lazy allocated unique ptr (Empty octree is ~4kb).
PCGBasePointData can easily be in the hundreds of thousands meaning ~400mb per 100k point data saved.
Optimization: Add 'pcg.RuntimeGeneration.TimeBetweenRuntimeGenSchedulerTicks' CVar to sleep scheduling and reduce Game Thread cost of runtime generation.
Generalize previous grid scale exponent graph setting to be any multiplier. Allows scaling of the generation grid to conform to other grids in level such as landscape components.
Added experimental support for passing bounds data for subranges of instances in a primitive to the renderer which can save substantial memory allocated for draw calls on low end.
Give access to execution cache to other execution sources + rename Actor methods to Self.
PCG.Cache.ResetStats/PCG.Cache.LogStats cvar commands.
Prints Stores/Hits/Gets/Grow count.
Editor: Move toolbar extension to application mode.
Added support for time-slicing generation of landscape height map and grass maps, to spread GPU cost across frames.
Optimized per-frame runtime generation scheduler game thread cost by only scanning components for cleanup when generation sources change.
Added a setting on Generate Landscape Textures and Generate Grass Maps nodes to output texture data for every grass type in the inclusion list regardless of whether it is present on the landscape or not. Helps produce consistent output to allow easy indexing into the resulting data.
Change checks to compare metadata domain roots to checkSlow (was consuming 15% of total execution time in test map ~20 seconds / 140 seconds).
Add Developer Editor Settings to force Viewport generation mode (Always, Never, default=PCGWorldActor).
Also added the possibility to change this setting through Show Flags viewport menu.
Added Downsample Texture node to generate mips for textures.
DebugDisplay extended to different execution sources.
If the execution source isn't actor based, spawn a transient debug actor to handle the debug primitives.
Add support for outputting texture arrays from the Generate Landscape Textures and Generate Grass Maps nodes.
Added Attribute Set Generator mode to Custom HLSL node.
Split some CVars between Editor/Runtime.
Added support for Texture 2D Array data, including Texture Array Generator and Processor Custom HLSL nodes.
Move Hit/Overlap result handling to Physics Registry.
DataFromActor/ActorSelector support for IPCGGraphExecutionSource.
Enable tag operations on GPU data without readback to CPU.
Enable tag operations on GPU data without readback to CPU.
Add unique generation source list to runtime generation debug overlay.
Optimized GPU Static Mesh Spawner to not generate output point data if output pin is not connected, matching similar logic in CPU path.
Optimized data packing for upload to GPU by moving it onto an async task.
Added Max Shader Feature Level switch node.
Optimized memory usage for GPU graphs by proactively freeing memory used in compute graph execution.
Replace FRWLock by FSharedMutex to reduce native sync primitive usage.
Declare TUniqueScopeLock/TSharedScopeLock to be used with PCG::FSharedLock.
Define PCG::FLock/FRecursiveLock as UE::FMutex/FRecursiveMutex.
Replace usage of FSpinLock by FMutex (avoid spinlock potential issues).
Replace non recursive usages of FCriticalSection by PCG::FLock (reduce native platform lock).
Replace recursive usages of FCriticalSection by PCG::FRecursiveLock (reduce native platform lock).
PCGGraph : ChangeTrackingIgnoredClasses.
Tracked changes to the specified classes will be ignored and will not trigger a refresh.
Apply Spline to Component node (new): Updates a spline component's with the provided PCG Spline Data. Used in level graphs only.
PCG Toolmode: Added option to hit on ground plane for splines and volumes.
Actors (and their data) isolated from the PCG isolation mode can be gathered 'as-if' they were still part of the original actor, when the actor queries specify this.
Get Actor Data Node
Added explicit bounding shape query for get actor data, which can be useful for cases where the bounds are bigger or different from the source volume.
Added 'get point data' mode that behaves similarly to the level-to-asset data on a per actor basis. This, for example, will return one point per instance if the actor has an ISM, for all ISMs on the actor.
Added an "Extract from Image" node which allows the user to extract the shape of a plant from a pre-existing image.
Added an "Extract from Mesh" node which allows the user to extract the shape of a plant from a pre-existing mesh.
Instanced Skinned Mesh Spawner node: Added comma-separated tag option, similar to the one in the Static Mesh Spawner node.
Procedural Vegetation Editor: Added option to change background color via Preview Scene Settings Tab in the Window menu.
Remove Actors From World node (new): Removes actors from the level. Used in level graphs only.
Align Points node (new): Aligns points with other points' bounds, useful for some precise alignment work.
Get Editor Cameras node (new): Returns viewport cameras data from the editor, can be used only in level-asset graphs.
Get Editor Selection node (new): Returns the list of currently selected actors as a point data. Can be used only in level-asset graphs.
Teleport Actors and Components node (new): Teleports objects, to be used in level-asset graphs only.
Spline To Mesh: Polygon 2D now supports and accounts for holes.
Spline Intersection node: Significant improvements in intersection quality (shape/size/robustness) with PCA or box aligned intersections and a complex mode that returns start/end or point intersections. Node also preserves segment types.
Spawn Actor node: Added ability to specify actor labels.
Improved spline point type management across multiple nodes (Create Spline; Get Spline Control Points, Clean Spline). Clean Spline: also support polygons 2D.
Create Polygon 2D node: Added some controls on how normal is determined when parsing input data.
Delete Tags node: Made the node tag:value aware. Get Tags node: Added option to return full tag string.
Merge Points and Merge Attributes node: Added tag merge options.
Replace Data By Tag node (new): Simple tag-based data replacement/filtering node, useful for isolation workflows.
Create Polygon 2D and Offset Polygon 2D nodes: Added polygon end/join controls.
Write Data Index node (new): Adds an index-based value to tags and/or attributes, useful for loops and data wrangling.
Spline To Mesh node: Added an optional vector mode for extrusion, and made thickness overridable.
Added platform switch node to enable/disable parts of graph based on target platform.
Bug Fix:
PCG
Fixed CustomHLSL nodes with edited titles breaking when containing leading digits or non-ASCII characters.
Fixed crash and warnings/errors if PCG automated tests ran multiple times in one Editor session.
Fixed undefined behaviour in BiomeCore runtime scattering kernels that could cause missing instances or GPU crashes.
Fixed culling of GPU nodes so that their execution is subject to control flow such as Branch nodes.
Fixed crash when using GPU primitive spawning due to primitive proxy being null.
Fixed GPU-instanced primitives flushed when the game viewport resized.
Blueprint: Fix desync between TrackingManager and BP PCG Component tracking keys.
ActorTracker: Handle actor deleted through undo/redo.
SplineData: Add missing fast crc path.
Fix InspectionData thread safety.
Replace GetInspectionData() api which was returning an unsafe raw pointer to a FPCGDataCollection by 2 options:
Inspect Data: Thread safe in place inspection (using function ref under lock).
Get Inspection Data Ptr: FGCObject which guarantees UPCGData held by shared data collection is kept alive (without depending on inspection cache).
Inspection data is stored as TSharedPtr<FPCGDataCollection> to handle collections outliving the inspection cache.
Fix Cache result raw stack ptr outliving its source Task. Use FPCGStackHandle instead (ref counted).
Fix warning about data types on projection node when projecting a spline onto a surface.
Fix ISM Component reuse in Preview mode.
Demote an error that occurred when generating landscape scattering in unloaded areas of the world in editor to verbose.
Fix undo bug : Remove MarkSubObjectsAsGarbage() as this was causing issues and reason for this change was to avoid some references being reported when creating a level instance of a PCG Actor that had actor references in its output. (This was properly fixed in).
Fix for incorrectly transacting the reference to the scheduling policy when a PCG component is instanced by a BP class.
Sampling node now passes through the sampling method version.
Tentative fix for reroute node creation sometimes crashing.
Fixed hierarchical generation graph execution never finishing when an upstream (bigger grid cell) node was dynamically culled.
Fixed spawning of volume objects in the spawn actor nodes.
Added spline and polygon 2d memory size reporting (in the profiling window).
Added metadata memory counting (seen in the profiling tab).
Split Spline node: Improved behavior on closed splines. Fixed bad memory access.
Create Polygon 2D node: Improved 'close to line' test and added axis to default to if this happens.
Added selection refresh after generate/cleanup and tool apply to make sure new splines are properly visible.
World Building
New:
PCG
Add Bake Mesh Terrain Section Mesh node.
Add Get Mesh Terrain Section Actor node.
Add texture array generator/processor kernel types to Custom HLSL node.
Add slice selector widget for texture array data viewport.
Add font-size setting to the code editor.
Add 'Upload to GPU' nodes.
Added a new Manual Edit tool in the PCG Edit Mode Toolkit.
Updated PCG's Sort By Attributes node to also sort by multiple attributes.
Added a new PCG Python Data Processor Node to allow python scripting with access to incoming PCG Data and assigning output data.
Added Data Overrides Panel for monitoring Manual Editing changes in PCG.
Add persistent UV cache for PCG inline ray tracing.
Optimized PCG Attribute Partition with Mixed Radix Composite Key Hash Map.
Added basic thumbnail support to PCG Nodes.
Created new Generalized Component Data Storage for PCG Components.
Fast Geo
Mark UAnimSequenceTransformProviderData as GPU-only.
Support GPU animated instanced skinned meshes.
Added support for Custom HLOD actors.
World Partition - HLOD
Compare wipe overlay tool for comparing HLOD vs source actors Adds an interactive wipe/overlay comparison window for HLOD actors. A draggable vertical line separates source actors (left) from HLOD (right), both rendered at the same camera position with synced navigation.
Wipe overlay layout using SOverlay + SHLODClipWrapper (PushClip/PopClip).
Draggable wipe handle (SHLODWipeHandle) with resize cursor.
Source actor loading directly into preview scene world (no temp world).
View mode toolbar with buffer visualization support.
Camera and view mode sync between both viewports.
Lighting duplicated from the main editor world.
Initial camera matches the active editor viewport.
Distance ruler to help understand at which distance the HLOD is usually seen.
Progress dialog while loading source actors.
"Compare vs Source" button in HLOD details panel.
"Compare HLOD vs Source" entry in viewport right-click context menu.
Allow wp.Runtime.HLOD.ForceDisableShadows to be toggled anytime Idea adapted from pr 14233.
Added option to choose the editor loading behavior of HLOD actors belonging to a given HLOD Layer Add EHLODLayerEditorLoadingBehavior enum to UHLODLayer with three options:
Default: Use existing behavior (Instancing not loaded except if non-spatial, others loaded).
Always Loaded: Force load HLODs from this layer in editor.
Never Loaded: Force not load HLODs from this layer in editor This preserves backward compatibility while giving users explicit control.
Optimized HLOD in editor visibility updates For large worlds containing lots of HLOD, the HLOD visibility update in the editor was very costly. This update is only triggered on editor camera movements, but this still means moving around the world was not as smooth as it should have been. Cost during camera movement, before vs after: → CitySample - BigCity (6061 HLOD actors): 25.1ms vs. 0.18ms (139x) → Engine Test - Test Scene (32161 HLOD actors): 144ms vs 1.06ms (136x)
Added option to force inclusion in the ray tracing far field.
Added bForceRayTracingFarField to UHLODLayer. When enabled, static mesh components generated for this HLOD layer will be included in the ray tracing far field, even if the HLOD is spatially loaded. This is useful for cases where the last HLOD level is spatially loaded but should still contribute to ray traced reflections and global illumination.
New perceptual diff feature to avoid HLOD rebuilds when no significant visual changes are detected.
Added concept of HLOD Rebuild Policies → Policies can either approve, reject, or take no decision when evaluating whether a build is required → Policies store their own data (editor only) in the HLOD actor, which is then used as the basis in subsequent evaluations. → Multiple policies can be specified.
HLOD Rebuild Policy Hash Compare: Contains previous HLOD hash logic → Code migrated, logic mostly untouched → This HLOD rebuild policy computes a hash of various elements in order to detect any change that might impact the resulting HLODs. It is, in effect, extremely sensitive. → APPROVE a rebuild - if the old hash differs from the new hash → REJECT a rebuild - if the old hash equals the new hash.
HLOD Rebuild Policy Image Compare: Fuzzy image comparison (using SSIM) → Takes screen captures of the SOURCE actors of an HLOD, over multiple angles (and for different GBuffer properties) → It will then perform an SSIM evaluation in order to assess if there is a significant visual change between the old and new data set. → APPROVE a rebuild - if the difference between old vs new images is greater than the configured threshold → REJECT a rebuild - if the difference between old vs new images is less than the configured threshold Current default behavior is unchanged as HLODRebuildPolicyHashCompare is the only specified policy.
Allow spline components to override their HLOD layer during the partitioning performed by the landscape spline mesh builder.
HLOD
HLOD Setup and actor-deletion steps now batch their source control operations, significantly reducing source-control overhead during HLOD builds.
Exposed BuildHLODForActors and BuildHLODForVolume as Editor Utility Blueprint functions, allowing region-scoped HLOD builds to be driven from Editor Utility Blueprints and Widgets.
Added the ability to run HLOD setup and build for part of a world from the editor. New context-menu actions in the World Partition minimap, viewport, and outliner let you scope the build to selected regions, a filter-volume selection, or the bounds of selected actors. New and modified actors are marked dirty rather than auto-saved.
Standalone HLOD
Added support for using the same level as a Sub-World Partition multiple times within the same parent world.
Added an experimental option to externalize HLOD assets into a separate package instead of embedding them in the HLOD Actor's package. This prevents data duplication when the same Level is reused as a Standalone HLOD via LevelInstance or HLODOnlyLevelInstance across multiple other levels.
Experimental: New Data Override System.
Enables Manual Editing of PCG Data directly on top of generated data.
PCG nodes can be marked for Manual Edit in the graph.
Includes a Viewport Manual Edit UI Panel for quick access.
Celestial Vault: Added support for multi-day correct Moon motion across midnight [Celestial Vault] Added automatic Daylight Saving Time computation with dynamic vault updates [Celestial Vault] Added a Global North Offset Property to support non-North-aligned environments, and Geocentric environments [Celestial Vault] Added new energy-conserving star shader and improved star rendering using physical Magnitudes for brightness. [Celestial Vault] Added adaptive SkyAtmosphere radius for globe-scale applications with a WGS84 Ellipsoid. [Celestial Vault] Added runtime controls with dynamic sequence updates. [Celestial Vault] Added a new custom cloud material driven by time-of-day (timelapse support) [Celestial Vault] Added Sample Blueprints and Widgets (Planetary Body Tracker, Star/Planets Queries, Runtime controls) [Celestial Vault] Deep Sky brightness is now captured by indirect lighting, with proper velocity vectors.
SimpleStreamableAssetManager - SSAM is now fully thread-safe.
World Streaming Insights (Experimental): Added an Unreal Insights workflow for analyzing World Partition streaming behavior over time.
A new Spatial Profiler tab in Unreal Insights - a 2D spatial view that scrubs along with the timeline. Pan/zoom, load an optional minimap background image, and right-click Copy BugItGo Command to jump back into the editor at the clicked world position.
A new WorldStreamingInsights plugin that overlays your World Partition cells on the Spatial Profiler, colored by:
State: Current streaming stage of each cell.
Priority: How the streaming system is prioritizing each cell.
Memory: Per-container memory estimate, in three modes: Total; Unique (packages referenced only by this container among containers currently loaded at the timeline cursor); and Shared (packages referenced by multiple containers currently loaded at the timeline cursor).
Memory Profiler drill-down: Right-click a container in the spatial view to jump into the Memory Profiler filtered to its All, Unique, or Shared packages.
Filter panel: Search the container hierarchy with tri-state checkboxes, group by tags (including Data Layers), switch visualization modes, and pick color palettes.
Timing view track: World and streaming-source lifetime lanes shown alongside your existing CPU traces.
A new wp.Editor.ExportMinimapForInsights editor console command - exports the current World Partition minimap as a PNG plus sidecar JSON of world bounds. Load the PNG as the Spatial Profiler background to give the spatial view geographic context. The plugin is experimental and disabled by default. To enable it, add WorldStreamingInsights to ProgramEnabledPlugins in Engine/Programs/UnrealInsights/Config/DefaultEngine.ini, then run your app with -trace=WorldStreaming (add +WorldStreamingPriority for priority data and +WorldStreamingDependencies for memory estimates).
Add grid names to runtime gen streaming query.
Add Download From GPU node.
Lazy on-demand GPU→CPU readback for texture data.
Add Warning when generating a Minimap with infinite bounds.
Added a new Dynamic Pins Framework to support Output Pins and renaming.
F World Partition Streaming Query Source: Add new parameter to allow for querying Cells that have Datalayer only.
Hierarchical view for Debug Object Tree.
Auto-create KernelParamsDataInterface per kernel.
Expose Raw Buffer data type in pin dropdowns, Custom HLSL declarations, and inspection.
Add Get Texture Info node.
Add configurable font size to HLSL Code Editor.
Add UWorldPartitionRuntimeHashSet::ContainsRuntimeHash() to allow filtering the display of grids using wp.Runtime.DebugFilterByRuntimeHashGridName.
Add GPU override support to TransformPoints.
Broaden GPU override type support.
Asset Streaming: Added debug view modes Colors primitives by their streaming state on a green-to-red scale. Deficit modes show the gap between what the streamer wants loaded vs what's resident (streaming health). Residency modes show the gap between max possible vs what's resident (absolute state). Add four streaming debug viewmodes, which work with both the "legacy" asset streaming and the Simple Streamable Asset Manager (SSAM):
Streaming Texture Deficit: How many texture mips behind the streamer's target each primitive is (green = streamer got what it wanted).
Streaming Texture Residency: How many texture mips are missing from fully loaded (green = all mips in memory).
Streaming Mesh LOD Deficit: How many mesh LODs behind the streamer's target each primitive is (green = streamer got what it wanted).
Streaming Mesh LOD Residency: How many mesh LODs are missing from fully loaded (green = all LODs in memory) Works with both Nanite and non-Nanite meshes. Nanite support uses a per-primitive GPU buffer built each frame. Accessible via console (viewmode StreamingTextureDeficit, etc.) and the editor viewport menu under "Streaming Deficit". Mirrors WantedMips from the streaming manager to UStreamableRenderAsset::CachedNumWantedLODs for deficit computation. Extends the LODColoration legend with title and endpoint labels. All code guarded by #if !UE_BUILD_SHIPPING / SHOWFLAG_FIXED_IN_SHIPPING.
Support GPU compute nodes in standalone graphs.
Add GPU backend for World Raycast node.
Added Inline Constant Widgets for Transform, Quaternion, SoftObjectPath, and SoftClassPath.
Asset Size Map: Added support for displaying external packages (editor) and generated packages (cook).
For editor data, assets now show their external actor/object packages grouped by class as drillable children in the tree map.
For cooked data, assets show generated packages in a "Generated Packages" container.
Mesh Merge: Replace bPivotPointAtZero with EMeshMergePivotType enum Replaced the binary bPivotPointAtZero setting with a more flexible pivot type option that supports custom pivot locations.
Added EMeshMergePivotType enum with WorldOrigin, Automatic, and Custom options.
Added PivotType and CustomPivotLocation members to FMeshMergingSettings.
Deprecated bPivotPointAtZero with migration in PostSerialize.
Support PerQualityLevelFloat for HiGen generation radii.
Refresh when scalability quality levels change.
Adding export macros so UWorldPartitionNavigationDataBuilder can be used as a base class in project code.
Expose texture settings in GPU pin properties.
WorldPartitionBuilder Commandlet: Collect Garbage between each worlds to avoid issues related to Level reuse.
Added a new Data View concept and Save Data View node for selecting or exporting selected attributes.
Allow LocalFogVolume to be spatially loaded (default: False).
Support overriding NumElements in CustomHLSL node.
Copy to Render Target node.
Bug Fix:
HLOD
Fixed an issue where dirty (unsaved) source HLOD actors did not contribute to parent HLOD builds in the editor; previously, sources had to be saved before the parent was rebuilt.
Fixed an editor crash that could occur when unchecking Spatially Loaded on an HLOD Layer asset.
Fixed a crash that could occur when building HLODs if the HLOD Layer could not be found.
Fixed an issue where the main editor world's package could be marked transient while building HLODs.
Fixed an issue where building HLODs could leave the levels containing source actors marked dirty in the editor.
Fixed an issue where an HLOD Actor could remain hidden in the editor when its child HLOD Actors were loaded but had been removed from the world. The visibility check now considers whether the child HLODs' components are registered, not just whether the actors are loaded.
Fixed an issue where, after building HLODs from the Build HLOD button in an HLOD Actor's Details panel, that HLOD Actor's source actors could no longer be saved in the editor.
World Partition - HLOD: Make sure that HLOD partitions that contains destructible HLODs are not flagged as only client visible.
HLOD destruction requires HLOD actors data to be replicated, so they must be loaded on the server too.
The bClientOnlyVisible option on HLOD partitions used to be visible to the users in the World Partition settings, but that setting was hidden in the UX refactor.
This flag is now programatically set depending on the HLOD layers settings.
World Asset Streaming: Fixed cell GUID collisions that could occur when an always-loaded HLOD cell was injected and its runtime partition resolved to the main partition. The legacy cell-hash behavior can be restored by setting wp.Runtime.HashSet.WorldAssetStreaming.IncludeHLODFlagInCellHash to false.
Standalone HLOD
Fixed an issue where DataLayer-tagged HLOD0 actors from HLOD-only Level Instances tracked the wrong streaming cell, so their visibility didn't match the load state of the content they represent.
Fixed an issue where Standalone HLOD scanning rejected all maps when the workspace path contained a. character.
Fixed a garbage-collection crash that could occur during the HLOD Setup step.
Fixed an issue where HLOD0 actors from HLOD-only Level Instances would never hide when the containing map's content cells loaded.
Each Standalone HLOD actor now keeps the runtime grid it was assigned at creation, fixing incorrect grid assignment when Standalone HLOD and Custom HLOD actors with different runtime grids share a container.
Fixed an issue where the HLOD index could be parsed incorrectly when resolving Standalone HLOD actors.
Fixed an issue where non-map packages in the HLOD directory were considered when scanning for Standalone HLODs.
World Partition
Fixed an issue where cross-cell external actor references in Level Instance containers could fail to map to the correct instanced package, causing unmapped-package warnings during load.
Fixed a crash that could occur when a world was destroyed during an async actor load.
Fixed a crash that could occur when querying a runtime cell's level package name before the World Partition was initialized.
Fixed incorrect runtime positioning of actors using absolute location, rotation, or scale when attached to editor-only parent actors.
Fixed an assertion during streaming generation when an actor was attached to a parent whose non-external data layers were forced empty.
Fixed a crash that could occur when loading a World Partition region in the editor.
Prevent running the "wp.Editor.DumpStreamingGenerationLog" console command while in PIE.
U World Partition Runtime Cell Transformer ISM: Reparent child components when the RootComponent is being transformed.
Custom HLOD
Fixed an issue where Custom HLOD Actors assigned to an always-loaded HLOD layer were not included in the persistent level's actor set.
Fixed IsStreamingCompleted reporting incorrect results in worlds using Custom HLODs by excluding Custom HLOD Placeholder cells, which have no Level Streaming object.
Celestial Vault
Improved celestial accuracy using RA/DEC of date, with Precession and Nutation corrections, and various minor fixes.
Improved runtime performance through optimized celestial motion, state caching, bounds optimization.
Fixed incorrect Sun light direction computation.
Fixed DeepSky positioning to remove star parallax artifacts.
Fixed Topocentric vs Geocentric frame issues; corrected Sun and Moon alignment during eclipses. (Sunlight dimming and moon shadowing are not yet supported).
Fixed precision issues in VSOP87 calculations.
Improved star mask textures and added new variants.
Sun and Moon lighting now updates dynamically when properties change.
Ensure the UWorld::PostGC callback is registered for streamed levels to prevent leaking in the ParameterCollectionInstances array.
Fixed crash in Determinism Test Framework when running a test on UPCGUserParametersData.
Data Validation: Fixed a crash that could occur during cook validation when unloading actors with child actor components.
Disable the behavior to load maps to check for broken references when deleting an actor as it does not work well with modern maps and causes performance issues. It can be re-enabled with bValidateUnloadedSoftActorReferences if a project wants it.
Make sure the GC isn't running when we update the streaming state asynchronously.
ULevelInstancePropertyOverridePolicy : Add missing exports and constructor so it can be derived from in project code.
Fixed an issue where actors could be incorrectly detached from their parents in cooked builds when removed and later recycled.
Level Instances: Fixed a crash that could occur when editing Level Instances.
Child Actor Component: Actors that are spawned by a ChildActorComponent should return their parent actor GetLevelInstanceType()/GetLevelInstanceFlags() as those flags are not updated on the child actors and need to match.
Localization
Bug Fix:
Fixed FPackageLocalizationCultureCache::RemoveRootSourcePath being too aggressive when removing path matches.
Sync the flow direction in the UMG preview from the game preview language (if any).
Respect bSkipSourceCheck for chunked LocRes generated during cook.
Fixed disabling the game preview failing to reload the native localization data for plugins.
Fixed being unable to select "None" as the Game Preview Language.
Media
New:
Img Media
Extensible Tile Visibility Resolver Refactor allowing more engine systems (Slate, Umg, etc) to provide visibility information to the Tmv/Img media players. With this refactor, it is now possible to visualize up to 16K Tiled Exr or Tmv (Apv) sequences smoothly in the media source editor or media viewer.
Adding a CVar "ImgMedia.EnableMipMapTileDebugDraw" for mipmap info debug spheres to help troubleshoot tile update issues. This works in game mode. It can be used to test on nDisplay nodes.
Rivermax
Added support for ST2110-40 ANC Timecode streams. New: [Rivermax] Added ATC LTC timecode based stream synchronization.
Added a console variable to set the CPU core affinity of Rivermax's internal thread. Pinning the thread to a specific core can reduce scheduling jitter.
Permanently locked the shared memory buffer removing one copy and improving the performance. Linux only: Updated the supported Rivermax SDK version to 1.80; the 1.7 SDK is no longer compatible due to Dynamic Header Data Split API breakage.
Migrated the Rivermax Output's `PresentationQueueSize` property to the shared Media Output `NumberOfTextureBuffers` property.
Added Linux support for Rivermax Output and Input. (SMPTE 2110-20 video streaming, ANC). Without GPUDirect support yet.
Added HDR input support to NDI media sources with correct (HLG, PQ) detection and color transformations.
Added multi-Layer EXR image sequence reader support (CPU only).
Added HLG support (ITU-R BT.2100-3) for image sequences, media i/o sources and texture assets.
ImgMedia Player: Refresh paused player's tiles and mips when visibility changes. Previously, paused players would not update tile or mip visibility, leading to rendering stale mips on visibility changes (ex: on camera movements while player is paused). This feature can be disabled with the cvar "ImgMedia.PausedRefresh" in case previous behavior is desired.
Media Profile Editor: Show runtime stream info in the detail panel for auto-negotiating sources.
Added yellow warning on sequencer media track when the level sequence display rate differs from the media source's effective frame rate.
Sequencer Media Track: Displaying Media Source Asset Thumbnail for the Media Track Thumbnail Section.
Media Player Editor: Adding an option to display playback timer in either timecodes or frame numbers.
Img Media - DDS Reader: Adding support for full mip chain when block compression is not used. Also, fixing incorrect sRGB flag for float format.
Allow NDI media sources to be opened even though the configured source is not yet available on the network. There may be a delay during the startup sequence where the NDI finder doesn't detect sources. We allow the media plate to open the NDI media source any way. The NDI receiver handles this internally and will remain in "streaming" mode (not ready) until the source becomes available.
ImgMedia Settings: Adding Sliding Time Interval pre-caching strategy to alleviate global cache contention. The primary workflow target is meta human editor.
Refactored and unified color management settings for ImgMedia and Media I/O sources.
Bug Fix:
Rivermax
Fixed an issue where the last packet was forced into OneSRD mode even when its payload still crossed a video line.
Fixed GPUDirect CUDA context switching. Bug Fix: [Rivermax] Fixed a payload weak pointer that was incorrectly allocated on the stack and destroyed when the scope exited. Bug Fix: [Rivermax] Added GPUDirect stream synchronization at deinitialization. Bug Fix: [Rivermax] Fixed a CUDA external memory handle leak.
Fixed Blackmagic auto-detect misinterpreting interlaced signals as progressive.
Fixed media configuration information display when using auto for Blackmagic and Aja cards.
Use ConvertToTimescale for overflow-safe milliFPS computation Replace double+round milliFPS encoding with MP4Utilities::ConvertToTimescale(), which uses TBigInt<128> internally, consistent with other MP4 time conversions in the codebase and overflow-safe for arbitrarily long videos. Rounding bias (TotalDuration/2000) accounts for the internal 1000 multiplication, matching round-to-nearest behavior exactly.
Fix Invalid Frame Rate for Android HEVC ingest without Third Party Encoder Android HEVC (H.265) recordings typically omit VUI timing parameters in the SPS, which is optional per spec. ElectraPlayer's codec format utility unconditionally overwrote the container-derived frame rate (from STTS/MDHD) with VUI timing from the SPS ? clobbering a valid rate with {0,0} when VUI is absent. Additionally, the STTS-based frame rate derivation used the first entry's sample_delta, which is unrepresentative for B-frame content where decode-order deltas vary. This produced ~30.97fps instead of the intended 30fps. Changes:
Guard VUI frame rate overwrite in DetermineCodecTypeFromDCR_hvcc() to only apply when VUI timing was actually found in the SPS.
Improve STTS frame rate derivation: Use constant duration fast-path when available, otherwise compute average rate from totals and snap to nearest integer rate within 0.05% tolerance (safely below NTSC 1/1001 boundary).
Use overflow-safe milliFPS encoding for non-integer rates Tested with Samsung Android 16 HEVC.mp4 (hvc1, 30fps, B-frames, no VUI). Frame rate now correctly reports 30fps. No "Invalid Frame Rate Error" in MH Performance.
ImgMedia Player: Natively-tiled / multi-mip compressed files will be supported by the cpu-only reader path. Currently limited to reading mip 0 only. For full mip chain support, either convert to uncompressed or use Tmv/Apv conversion (using Tmv Transcoder).
Fixed chroma interpolation for the 10-bit v210 conversion used by AJA, Blackmagic and Electra.
Fixed HDR normalization factor across media causing incorrect brightness levels going from/to the UE scene.
Fixed materials using SAMPLERTYPE_LinearColor with media textures showing as invalid on initial load.
Fixed missing source conversion with a matching color gamut but variable HDR normalization factor.
Sequencer Media Plate Integration - Prevent adding multiple media tracks under the same media plate binding. Given that, by design in sequencer: The tracks under an object binding are not reorderable and the sections cannot be moved or re-ordered across tracks, it is preferable to prevent users from creating multiple tracks under a media plate binding to avoid the confusion.
Fixed double sRGB to linear conversion on Mac when capturing video from a webcam using AvfMedia.
Material Texture Expression: Media Textures will automatically recache affected material's uniform expressions upon dimensions change. Media Textures can change dimensions and format dynamically as part of media playback.
Web Browser: Fixed CEF <select> popup crash and rendering in accelerated paint path.
Img Media: Fix OpenExr reader to read the full mipmap chain. Prior to this it would only read up to the mipmap level that is not smaller than the tile size.
Process EXR: Fix the toaster messages and Fix crash if closing the panel while processing.
Process Exr from an Img Media Source (content browser context menu).
Media Plate: The user is randomly unable to create a media playlist or media source from the media plate resource asset picker menu.
Replaced IImageWrapper in favor of preferred FImage interface in generic image sequence reader.
Media Viewer (Beta)
New:
Color Picker performance improvements for large textures.
Display 2D grid for better pixel visibility when zoomed in past a certain threshold.
Bug Fix:
Drop-target single image - Stricter detection of image sequences: The harm done in erroneously opening a non-sequence as a sequence is greater than opening as a single texture. Therefore, the folder must be a "pure" sequence, i.e. contain only one file type, all filenames must have a frame number and a stem. Dropped images not part of a sequence will be viewed as transient texture2d.
MetaHuman
New:
UEMHC
MetaHumanCharacterEditorPipelineTool: Warn when bake materials is enabled but override materials are not based on default MetaHuman materials.
Adds a check in UpdateToolMessage that walks the parent chain of each override MIC in SkinSettings.TextureMaterialOverrides.MaterialOverrides and lists any whose ancestors do not include a base material returned by FMetaHumanCharacterSkinMaterials::GetHeadPreviewMaterialInstance / GetBodyPreviewMaterialInstance.
Baking still proceeds; the warning notes those slots will not benefit from the MetaHuman baking pipeline. minor
Live-update Virtual Texture / Bake Materials warnings in the assembly tool. minor
Remove Root Motion from locomotion animations minor
Allow more editing while the character is rigged.
Skin Tool stays active when rigged; only face/body texture indices, texture filter controls and Texture Position Offset are disabled via CanEditChange. Skin tone, roughness, accents, freckles, hands/feet etc. remain editable.
Texture Position Offset moved next to Face Texture Index in the Skin Tool.
Tool builders reparented to UMetaHumanCharacterEditorToolWithToolTargetsBuilder which now provides shared GetTargetRequirements and IsCharacterRigged / IsCharacterRequestingHighResTextures helpers. Removes duplicated GetTargetRequirements / CanBuildTool across all MHC tool builders.
Per-tool CanBuildTool rigged checks: Presets, ImportFrom{DNA,Identity,Template}, MeshImport, Body, FaceEditing, HeadModel (except Materials sub-tool), Pipeline.
TextureMaterialOverride tool is always buildable.
Mode warning text updated (Material selections are allowed on rigged chars). minor
Use default axis drawing code from FEditorViewportClient.
Also gate drawing the axis behind the bShowViewportOverlays option
Add show hands option to skin material editingminor
Adds a check for a missing pipeline on the character's internal collection: Prompts the user to reset it to the default pipeline, logging an error and skipping the character if they decline. Also add cvar mh.Character.UseCustomAssetEditor which can be used to load the default UE asset editorminor
Update Texture Synthesis model to TS-1.3-F_UE_res-1024_nchr-153 [at]mh-uemhc minor
Change UMetaHumanCharacterEditorSettings from per-user config to project-level defaultconfig Migrate from config=EditorPerProjectUserSettings to config=Editor,defaultconfig so settings are stored in Config/DefaultEditor.ini (source controlled, shared) instead of per-user ini. Adds one-time migration in PostInitProperties that loads old values, saves to the new location, and shows a Message Log warning with a clickable file link if the save fails. Moves UMetaHumanCharacterEditorSettings defaults to Editor.ini minor
Extend MetaHuman Character Editor viewport toolbar with camera controls, view modes, and visualization options Camera Menu Enhancements:
Added near and far view plane controls to the perspective camera menu, matching the style used in UnrealEdViewportToolbar.
Added focal length (mm) spin box that converts to/from FOV using the CineCamera's default Super 35mm sensor width (24.89mm).
Added a "Reset Camera Defaults" button that restores FOV, near plane, and far plane to their default values without closing the menu View Modes:
Added a View Modes submenu (Lit, Unlit, Wireframe, etc.) to the viewport toolbar via UE::UnrealEd::PopulateViewModesMenu.
Extended with visualization submenus matching the level editor: Buffer, Nanite, Lumen, Substrate, Groom, Virtual Shadow Map, and Virtual Texture minor
Enable Lumen in the MetaHuman Character Viewport.
Enable Lumen in UEMHCminor
Reduces redundant data copies on the DNA asset load and legacy-compatibility conversion paths. Editor load time and peak asset memory both improve when working within UEMHC.
MHC
More robust handling of invalid assets when duplicating Common content.
DuplicateDepedenciesToNewRoot() now detects when an existing asset at the Common target path is of an incompatible UClass and bails out with an error instead of crashing in StaticAllocateObject.
DuplicateDepedenciesToNewRoot() detects any orphaned objects in the target package and removes them.
Automatic bone count reduction for the Skeletal Mesh Editor and MetaHuman assembly pipeline.
UMHC: Extended the UMHC Editor to allow the insertion of custom import tools.
Detect degenerate triangles before autorig.
S Meta Human Identity Parts Editor::AddPartsFromAsset: suppressable warning dialog (key "SuppressDegenerateTrianglesHint"), proceeds with part creation.
U Meta Human Character Editor Subsystem::RequestAutoRigging: validates FaceMesh up front; logs Warning and continues on degenerate triangles, logs Error and aborts on any other incompatibility. minor.
MetaHuman Performance: Prompt for calibration when processing stereo footage without depth When a Performance asset has stereo RGB cameras (>=2) but no depth sequences and no valid calibration, the Process button is now enabled and a modal dialog prompts the user to select a Camera Calibration asset before processing begins. Previously the Process button was disabled with a tooltip explaining calibration was missing, requiring the user to manually assign one via the Capture Data details panel. Changes:
CanProcess() relaxed to allow processing when stereo depth generation is possible.
Added NeedsCalibrationForDepthGeneration() to detect the missing-calibration case.
Added calibration picker dialog with warning icon, asset picker with thumbnails, and primary-styled Continue button.
Added OnCaptureDataInternalsChanged() handler to refresh camera names and notify the toolkit when calibration properties change on the Capture Data (works for both dialog assignment and manual assignment in the details panel).
Depth processing info dialog now uses an info icon instead of warning icon.
Updated no-depth warning text to differentiate stereo vs non-stereo cases.
Adds an optimized cooked-serialization path for DNA assets that delivers a major reduction in runtime initialization cost. Instead of re-serializing the raw DNA bitstream and re-initializing RigLogic on every load, the cooked archive carries the already-initialized FRigLogic state directly and restores it verbatim at runtime.
Brings the RigLogic plugin to the latest version that introduces support for Joints-only ML rigs - a Graph-Neural-Network-based rig where a single learned model emits per-joint transforms directly, replacing the classical PSD + blendshape + ML-rig-blendshape stack with joints as the sole deformation channel. Joints-only ML rigs evaluate substantially faster on CPU than the classical PSD + blendshape + ML-rig pipeline:
The runtime skips PSD network evaluation, ML-rig blendshape evaluation, and the corrective blendshape deformation pass entirely, leaving only the joints-only ML network and the standard skin-cluster deformation.
The DNA format gains a new extended ML behavior layer that carries the model's graph topology, cluster assignments, per-node MLP weights and activation choices; the runtime gains a generic ML operation graph (Gather/Scatter/MLP/WeightedSum) and a quaternion-native joint evaluator that consumes the model's parent-local output.
The new generalized coordinate-system pipeline introduced elsewhere in UE 5.8 is wired into the joints-only ML evaluator. JoML models are trained to output transforms in a specific coordinate system, which is encoded in the model metadata. When the DNA's chosen destination coordinate system does not match the model's, a runtime converter transforms the model outputs to the destination system. This incurs additional runtime cost per evaluation, so models should be trained for the coordinate system the DNA will be used in.
Added the MetaHumanGenerator Toolset plugin.
Added tool for instantiating a new metahuman character asset.
Added type definitions for EyeColor, SkinTone and BodyShape.
Added getter setter tools for skin tone, eye color, and body parameters.
Added MetaHumanEditSession for start up and clean up of a metahuman character edit session, and caching of metahuman edit sessions to efficiently concatenate multiple tool calls on the same character.
Includes test coverage for all getter setter methods and utility functions. Run tests with ``` import metahuman_toolset.tests metahuman_toolset.tests.run_tests() ```
Hardens the DNA file parser against malformed input. Adds bounds and validity checks throughout the binary deserialization path so that crafted or corrupted DNA files are rejected cleanly instead of producing undefined behavior.
Adds the ConvertLegacyDNAAssets commandlet that migrates existing DNA content to the new UDNA asset type introduced in 5.8. Walks a configurable path, detects legacy DNA (either UDNAAsset attached as AssetUserData on a USkeletalMesh, or older serialized UDNA versions), and produces an updated standalone UDNA asset. Supports dry-run preview, in-place conversion, and re-import from the original.dna source file.
FRigLogicConfiguration is expanded in 5.8 to support per-platform tuning and two new runtime knobs. Calculation backend, floating-point precision, and ML multi-threading are now per-platform fields rather than single project-wide values, so a project can ship FP16 to mobile and FP32 to desktop from the same asset. A new boolean controls whether the ML evaluator runs multi-threaded - certain models are so small that the threading overhead makes single-thread evaluation a better choice. The previous plain-enum CalculationType and RotationOrder fields are deprecated; rotation order is now read from the DNA itself rather than the configuration.
Adds a Project Settings → Plugins → RigLogic page that defines per-project defaults applied to every newly imported DNA asset. Two settings are exposed: The default FDNAConfig (LOD ranges, target coordinate system, rotation convention, face winding order, layers) and the default FRigLogicConfiguration (per-platform calculation backend, FP precision, ML multi-threading toggle, and the rig-system load flags for joints / blend shapes / animated maps / ML / RBF / twist-swing). Project leads can declare these once, in one place, instead of touching each DNA after import.
Extends RigLogic's half-float (FP16) evaluation backend to Linux and Windows desktop platforms, alongside the platforms where it was previously available. Projects that opt into FP16 (directly or via the platform-Auto resolution) now benefit on the major desktop targets.
Makes FDNAConfig editable on the UDNA asset itself. LODs, layers, target coordinate system, rotation convention, and face winding order can now be changed from the Details panel (or scripted from Python) without re-importing. Edits trigger an in-place rebuild of the DNA reader under the new configuration, a refresh of the RigLogic runtime context, and a reinitialization of any anim graphs evaluating the affected DNA. MaxLOD and MinLOD are per-platform: a Default value plus optional per-platform overrides, edited in the Details panel and flattened to the cook target during PreSave so each cooked package ships only the LOD range relevant to its platform.
Added support for coordinate system conversion in DNA library, making it possible to convert DNA files to a destination coordinate system at load time, without requiring additional conversion steps. Introduced a new FDNAConfig struct that consolidates all DNA loading parameters: data layer, LOD constraints, coordinate system, etc. Switched to using the new conversion functionality where possible and provided fallback paths for code paths that have not yet been updated to the new workflow.
The default Capture Manager 'working' and 'download' directories have moved from user documents to user settings. minor MetaHuman.
Added "MetaHuman|..." namespace category to all BP exposed UFUNCTIONS to aid discoverability in the BP function palette.
MHA: Remove MetaHuman Identity state validator as the feature has been disabled for a while.
Removed the warning triangle widget in MetaHumanIdentityEditorToolkit.
Removed MetaHumanIdentityStateValidator.
Deprecated UMetaHumanIdentity::InvalidationState minor.
Exposed GetFaceModelCoefficients and SetFaceModelCoefficients to add conform to PCA support in MetaHuman Python API.
Bug Fix:
UEMHC
Fix Remove Unused Wardrobe Items leaving stale WardrobeIndividualAsset minor
Fix DCC export polluting /Game/ with temporary texture graph assets. Redirect TempAssetFolderPath from /Game/<character>/DCCExportAssets to /Temp//DCCExport/<character> so generated textures live under Saved/ mount and never enter Content Browser.
Remove Root body from PHYS_Body minor
Fix MetaHuman character editor light rig rotation and environment-swap preservation.
Rewrote UpdateLightRigParentRotation as a per-tick world-yaw delta (fixing inverted sign + quat-drift freeze from the previous offset model).
Added mh.Character.Viewport.LightRigCameraTracking CVar (default on).
Extended env-swap rotation preservation to OnEnvironmentChanged (only the deprecated path had it).
Added initial camera placement to the viewport constructor.minor.
Unwear and unprepare wardrobe item when removing asset from list.
Prevents a wardrobe item from being stuck in the character without a way of removing it minor
Fix body texture updates when moving skin tone slidersbugfix
Ensure eye material parameters are set in the baked eye materials.
Adds bCopyAllNumericalParameters property to FMetaHumanBakedMaterialProperties to allow copying all numerical parameters from input to baked material minor
Fix custom sclera tint not refreshing after disabling it.
Fix warning about Pupil Feather not having proper metadata set minor
MHC
Fixed LOD settings between Body and Face for all assembly qualities.
Expose assembled character name override for UEFN export.
UMHC: Fixed a crash that occurred when programmatically quitting the editor while the MetaHumanCharacter asset editor was open.
Fix DNA control name filtering, so driver joint names are not included in the animation curve list, which would cause them to be set to 0.0, overwriting the default identity initialization for quaternions, which in the absence of actual driver joint inputs (e.g. missing Skeleton), would cause twist and swing to output NaN values in RigLogic.
Fix crashes and data loss when opening upgraded MetaHuman identities from older UEFN versions.
LensFile.cpp: Defer tick registration to PostInitProperties. The constructor now passes ETickableTickType::Never to avoid ticking on async loading threads, then PostInitProperties enables conditional ticking once construction is complete on the game thread. Fixes Tickable.cpp ensure when loading old identity assets.
MetaHumanFootageComponent.cpp: Guard material instance creation with IsInGameThread check. PostLoad defers creation to the game thread via AsyncTask when called from an async loading thread. Fixes MaterialShared.cpp ensure on identity open.
MetaHumanIdentity.cpp: Guard MoveData call in OnFrameComplete with HasData check to prevent crash when DepthMapDiagnosticsNode fails. Show pipeline error detail in the failure dialog via GetErrorNodeMessage. Skip false-positive diagnostics warnings when depth data was not populated, and show an explicit "Depth Diagnostics Unavailable" message when depth footage is present but depth calibration is missing.
Fix frame count mismatch for sub-30fps footage in Performance asset.
The audio display rate ratchet is now skipped when a video track is present. In audio-only mode (speech-to-animation, no video track) the 30fps default is preserved to match the processing rate.
The audio SetMediaTrack was unconditionally ratcheting the Sequencer display rate to 30fps. When a video track is present, its own SetMediaTrack already sets the display rate to the footage source rate. The audio ratchet was overriding this for sub-30fps footage, causing the timeline to show an inflated frame count (e.g. 100 frames at 24fps displayed as 125 frames at 30fps).
MetaHuman Toolkit: Fix crash in HandleSequencerGlobalTimeChanged during teardown.
Add null guard for Sequence in GetCurrentFrameNumber() to prevent checkf crash if called during teardown.
The toolkit's internal FSequencer binds HandleSequencerGlobalTimeChanged and HandleSequencerMovieSceneDataChanged via AddRaw, which provides no prevent-after-destroy protection. Since FSequencer ticks as a FTickableEditorObject (always), these delegates could fire on a partially-destroyed toolkit during editor shutdown or asset close.
Unbind OnGlobalTimeChanged and OnMovieSceneDataChanged delegates in ~FMetaHumanToolkitBase, covering all toolkit subclasses (Performance, Identity, Character).
Fixes NaN joint output in packaged builds for characters that use twist/swing input controls.
In the editor the bug was masked because preview / animation systems populated those inputs to valid values before the twist/swing evaluator ran; in packaged builds, where that upstream population doesn't happen on the first evaluation, the zero-initialized values flowed straight into the evaluator and tripped a single assert.
The bug: Twist and swing input controls were being initialized to all-zero, which is a degenerate input to the twist/swing decomposition - quaternion normalization of (0,0,0,0) produces NaN, which then propagated through to joint output.
Guard unprotected TMap accesses in MetaHumanPerformance HandleSourceDataChanged.
Fix crash when opening a MetaHuman Performance asset whose Capture Data references image sequences with invalid or missing paths on disk. The crash occurred because MediaFrameRangesImage Sequence: and MediaFrameRangesDepth Sequence: used TMap operator[] (which asserts via FindChecked) without verifying the key existed in the map. When GetFrameRanges was skipped or failed to populate entries for the relevant sequences, the assertion failed.
Added MediaFrameRanges.Contains() guards on both the colour and depth sequence map accesses, matching the existing guard pattern already applied to the audio track access in the same function.
Added warning logs in the else branches for diagnostic visibility.
Note: The ensure(bImageOK) in CaptureData.cpp GetFrameRange() is a separate pre-existing issue - it fires when GetImageSequenceInfoFromAsset fails to read files from disk. This ensure is not addressed here; it is non-fatal and execution continues past it. The editor now opens gracefully with missing tracks when image paths are invalid. Fixing the paths and triggering a property change regenerates the tracks normally.
Prevent audio muting after processing a Performance DeleteSequencerKeysInProcessingRange iterates all MovieScene sections and calls FloatChannel→Reset() on every float channel. This clears the SoundVolume and PitchMultiplier default values on UMovieSceneAudioSection, causing audio to evaluate at zero volume after processing. Only UMovieSceneControlRigParameterSection and UMovieScene3DTransformSection sections should have their keys cleared.
Fix crash opening performance asset when media is missing Guard MediaFrameRangesIn Audio: access in HandleSourceDataChanged with a Contains() check.
When FootageCaptureData exists but image media is not available (e.g. opened on a different machine), IsInitialized() returns false and GetFrameRanges() is skipped, leaving MediaFrameRanges empty. GetAudioForProcessing() still returns a valid audio track pointer independently, so the unguarded TMap access asserts.
Also guard the undo/redo handler's GetAudioFrameRange call against null AudioForProcessing. When InputType is Audio but no audio asset is assigned, GetAudioForProcessing() returns null, which would crash in both GetAudioFrameRange and GetAudioMediaTimecode.
Fix DDC commandlet crash when deserializing MetaHuman Identity assets LoadPredictiveSolver() used IAssetRegistry::GetAssetsByPackageName() to find the GenericPredictiveSolver asset from the MetaHumanDepthProcessing plugin.
During DDC commandlet asset deserialization, the asset registry may not have finished indexing plugin content, causing the query to return empty results. The subsequent check(DefaultSolver→PredictiveSolver) then crashes.
Switched LoadPredictiveSolver() to use LoadObject() with a direct package path, matching how LoadFaceFittingSolvers() already loads the FaceAnimationSolver. LoadObject resolves paths directly without depending on asset registry state, so it works reliably during re-entrant loading from constructors.
Also replaced the hard check() on PredictiveSolver with a warning log as a safety net ? if the solver can't be loaded for any reason, the identity asset still deserializes and predictive solver training is reported as unavailable rather than crashing.
Fixes an issue in MetaHuman Creator where using Lorenzo as a blend preset would result in an elongated neck.
Improved eye control evaluation consistency between Unreal Engine and Maya, resolving a rare edge case where control behavior could diverge between the two environments.
Fix process_performance.py to use create_or_recreate_asset to handle existing assets in unattended mode.
Fixed bug with eyelashes cards not showing on LOD0.
Fixed an issue with Eyelashes cards selected in the materials section not being updated in strands wardrobe panel.
Fixed crash when pressing undo following modification of calibation diagnostic options for an empty Capture Data asset.
Fixed an issue where neck bone transformations were not properly propagated from the body to the face rig, causing incorrect head alignment and LookAt behavior. LookAt controls now correctly follow head rotation.
Deprecated:
MHC: Deprecate ApplyFaceDNA() and split out the API into: AlignFaceDNAWithBody (modifies DNA) and face SKM update (reads only DNA).
Mobile Rendering
New:
Fixed an issue where the override 'Use Half Precision' option in material editor wasn't working when the cvar r.Mobile.FloatPrecisionMode=2 (i.e. full precision everywhere) was set. Created a new option called "Use Half-precision including shader parameters" in material editor to allow uniform buffers with custom parameters like PreshaderBuffer to be set to half precision.
Add ShowFlag.VisualizeHDR support for mobile.
Added support for Variable Rate Shading debug preview (r.VRS.Preview) and image combiner when using VK_EXT_fragment_density_map.
LocalExposure integrated in Mobile Tonemap Disabled by default for now on mobile.
Remove MobileLocalLightsBuffers Drop the LOCAL_LIGHTS_DISABLED suffix from TMobileBasePassPS and use LocalLightsEnabled for when local lights are enabled on mobile.
Refactor UseGPUScene to only require EShaderPlatform argument, remove the FeatureLevel argument.
Added support for the VRSImage_Fractional format (VK_EXT_fragment_density_map/FDM) to r.VRS.DebugForceRate. VRS Image Generators that do not support VRSImage_Fractional will be automatically disabled when VK_EXT_fragment_density_map is not in use, preventing rendering issues.
Added support for Qualcomm's FDM Offset Extension: VK_EXT_fragment_density_map_offset.
Bug Fix:
Fix Detail Light in Mobile Preview by applying the DiffuseOverrideParameter and SpecularOverrideParameter set by the ViewportClient like Desktop does.
Fix Mobile Basic EyeAdaptation, by properly falling back to the bottom of the histogram range if the contributed weight is 0(so the scene is very dim) instead of extremely bright(1). Now it matches the way desktop does the calculation in ComputeWeightedTextureAverageAlphaSubRegion. Fix VisualizeHDR so it works when autoexposure is disabled, matching desktop.
Fix for missing reflection captures in PIE if the lighting scenario is loaded after reflection capture components.
Fixed an issue where the Pipeline File Cache could fail to properly serialize and precompile PSOs with Variable Rate Shading enabled.
Mobile Postprocessing
New:
Added CVar r.Mobile.Upscale.Quality by merging Add control over mobile upscaling method.
Bug Fix:
Fixed histogram exposure for the mobile renderer if eye adaptation was skipped because there's no adaptation range.
Fixed an issue where Viewmode LODColoration was not working on builds with cooked assets unless ODSC was used.
Added support for the buffer visualization view mode in the mobile renderer's post processing path.
Motion Design
New:
Added support for nested masking. Primitives masked by the mask output modifiers can now be affected by up to 4 different mask sources, when previously it was only one.
Moved Motion-Design tabs (Scene Settings, Outliner) in level editor to their own group. This includes Material Designer and Operator Stack only if the Motion Design plugin is enabled. Updated Remote Control icon and moved the tab spawner entry to the level editor group.
Rundown: Added page loading options (All, Next, Selected) to the show control toolbar and added a message to recommend the user close page details during in-editor playback as page details currently does synchronous loading that cause hitching. This synchronous loading issue only affects in-editor playback and does not affect playback outside the editor (e.g. another process in -game or render node).
Added project setting to force disable collisions for Text3D and shapes.
Remote Control: Added setting to determine whether any UFUNCTION is allowed to be executed remotely. Disabled by default for security.
Added experimental freeze modifier stack feature. This allows modifiers to be applied/run once, frozen and then removed.
Added ability to specify transition tree assets instead of each level having its own copy.
Added Blueprint function to gather actors and order them based on the motion design scene tree order.
Added Text3D option to use existing character mesh components as templates to new ones.
Added experimental ability to delete Remote Control presets from a motion design level. Remote control presets can be deleted by going into the additional options menu next to the 'Remote Control' button and selecting the delete entry.
Added optional wait for text to finish incremental builds before doing change sequences in Transition Logic. This wait is enabled by default.
Added `ClonerEffector.UpdateSystemAfterLoad` console variable for option to call UpdateSystemAfterLoad() on cloner niagara in loading time rather than in activation time, as activation time is likely to be more time-sensitive than loading.
Added shape build system to update motion design shapes in parallel, if supported. By default all built-in shapes are.
Changed cloners to use mesh array data interface to avoid having to go through more expensive operations in Niagara System.
Added optimizations for scene tree to have items sorted ahead of time, instead of modifiers that rely on the scene tree ordering having to sort every time.
Added geometry mask writer to decouple masking logic from actor component. Mask Write modifier no longer needs to create any component.
Added option to disable python for local playback, as python garbage collection affects performance. Also, added a preview string for the command line that will be used when executing local playback server for clarity.
Moved Rundown worlds to tick with other worlds and tick before end frame sync.
Added Text3D builder that is able to do both incremental (time-sliced) and blocking builds.
Added Text3D TextRenderer and TextExtension can now be referenced in a Blueprint variable.
Added Text3D component function to retrieve casted text renderer in Blueprint, this will allow user to access functions exposed in the renderers.
Changed way cleanup is done in Text3D. Before the cleanup would happen periodically (once every 5 minutes by default). Now, it will schedule a cleanup to happen after a set amount of seconds when a glyph becomes unused.
Added Scene State state parameters for an additional (closer) scope of parameters for tasks.
Improved Text3D performance by removing unnecessary use of thread-safe TSharedPtr to reduce heap allocations and atomic reference counting when building glyph. In addition, glyph mesh building is now done across multiple threads for performance.
Added Text3D option to disable collision for performance improvement. In addition, Text3D static mesh components are now by default added to the scene in batch rather than individually for further improvement in performance.
Introduced the 'scene state schema' that sets the rules of which tasks are allowed for a scene state graph.
Improved scene state debug execution flow visualization by tracking state execution without relying on state instances (as these get removed as soon as states exit). This is so that states that have exited still have time to be visualized and fade out.
Added Text3D option to set text shape direction manually.
Updated transition tree debugger to use state tree delegates instead of tracing channels. This has the benefit of not needing to enable trace when debugging transition logic trees.
Changed the Geometry Mask canvas render target texture to be R16f instead of RGBA16f. This is to simplify the system by having one canvas render target be handled by one geometry mask canvas while also not wasting memory when a non-multiple of 3 number of masks are used in a scene.
Changed mask modifiers to use the material bridge API in Motion Design. The material bridge is a system that is more flexible in dealing with different types of objects and materials than the existing internal material handle system.
Removed creating and adding mask read component in mask read (output) modifier as it was not doing anything other than additional performance costs.
Geometry Mask canvas resource now uses FCanvas directly as UCanvas has expensive calls like GetDisplayMetrics that the resource doesn't need.
Rundown changed to by default disallow calling FlushRenderingCommands on an actor component's PreEditChange (called by Remote Control). This can be re-allowed via the console variable "MotionDesignPlayable.AllowFlushRenderingCommandsOnPreEditChange"
Added Rundown execute controller column to be able to force execute a controller within page details. This is so that the user avoids having to commit the controller's value to a different one and back.
Added Load Page as a command for instanced page lists.
Added mechanism to cache shaders before starting the graphics. Additionally, Remote Control referenced assets also attempt to get streamed in and completed before play.
Added material bridge to abstract how materials are gathered per component. This is used for Rundown to gather all used materials in a level without needing to know about specific implementations like Text3D/Shapes/etc that handle materials differently than primitives.
Changed Shape actor and Text3D to static draw since shapes and Text3D are mostly going to be unchanging mesh in most frames.
Added option to DetachLoader instead of ResetLoaders to avoid reloading package synchronously in Rundown.
Added layout transform stagger option to animate each character individually.
Bug Fix:
Storm Sync
Fixed vulnerability where importing an spak containing package names/paths deliberately changed to be outside mount points would lead to arbitrary file write on user systems.
Fix Tcp Port collision avoidance. This fixes scenarios where 2 or more Storm Sync servers (typically when running multiple editors) are running on the same host and caused port collision.
Text3D
Exported virtual functions to allow effect extensions to be implementable outside Text3D module.
Fixed issues where changing color for a Text3D component in a Blueprint actor does not work. The issue of this stems from the same reason renderers were not working before. FActorComponentInstanceData duplicates these object (in this case material extension) but skips serializing the new object into the Text3DComponent property because it deems the property as 'UCS Modified', making all properties in that object ineditable and kept as default value. Rather than relying on the built-in route of duplicating the extensions/renderer and patching the data via FComponentPropertyReader, Text3DComponentInstanceData is now used to save the source objects (extensions and renderer), and move them over to the new Text3D component. An additional benefit of this is that it preserves non-reflected property data. The only special behavior that needs to be done here is setting the renderer state back to uninitialized state so that the components get recreated (TextRoot, the Mesh Components), as the previous ones have already been trashed.
Fixed Text3D breaking when inputting a large number in tracking/kerning/etc and resetting it back to zero. For static mesh renderer it's a two step process to reduce the inaccuracy of floating point operations by resetting the relative transform first. For dynamic mesh, since each letter gets merged into a single dynamic mesh, the original version that the geometry update produces is cached and used as reference for the vertex positions.
Fixed Text3D issue where setting style to custom with 'use single material' breaking 'solid' style.
Fixed Text3D Inaccuracies from character pivot alignment.
Fixed Text3D issues where components outered to the meshes renderer were not being renamed and effectively not updating their cached owner.
Material Designer: Fix crash when switching a value to a curve atlas. Curve atlas values default to null atlas and curve, which generate a compile error in UMaterialExpressionCurveAtlasRowParameter.
Fixed Rundown taking the graphic out when clicking on Preview Frame a second time.
Fixed storm sync export wizard UI creating a large number of nested folders when changing file name or selecting a new file path.
Property Animators: Fixed property animators to properly evaluate end of cycle. Previously end of cycle would evaluate back to the initial state, rather than the final state.
Fixed issue with modifiers like translucency priority not applying the latest state of the outliner actor order. This was because the actor hierarchy change was being broadcasted too early, before the scene tree was sorted and the outliner refresh was complete. This is fixed by queueing these changes and broadcasting them at the end of refresh.
Cloners: Fixed cloners spawning default actors while in async loading thread. Instead, these are called by the tool directly early on so that the spawn of the cloner and its attached actors are under one transaction.
Fixed issue where duplicating actors with modifiers and deleting the new duplicates would cause the original actor to uninitialize its modifier stack.
Fixed issues with using 'save-as' on an opened level sequence asset inside motion design level.
Fixed Scene State issues with bindings not checking for null event payload struct (optional). Additionally, fixed bug where InstanceTaskObjects would step into soft/weak object pointers and incorrectly scan for instanced object properties there to duplicate.
Scene State: Fixed issues with packaged builds not calling template data Link function, causing transition and conduit evaluation events to not be set and never called.
Fix Remote Control web socket function call to validate the function prior to invoking it. Exposed functions to the preset are also validated too.
Remote Control: Fixed issue where RC is causing keyframe icons to disappear in details panel because it's holding a shared ptr to the original details panel created. New details panel created for the first level editor details are never found by sequencer module because the original details is still in the list.
Fixed Scene State issue with pasted state names appending '_1'. Fixed issues with sub graphs not being visualized in hierarchy.
Fixed Scene State issue with debug controls showing properties that are not instance editable. The debug controls tab should look very similar as the level editor details panel only showing instance editable properties. Also made the details panel for the scene state editor selection disabled to avoid user confusion of what to edit when debugging.
Fixed Rundown preview in command doing preview frame instead of preview in and moved preview frame to its own command.
Movie Render Pipeline
New:
Added the ability to specify DWAA/DWAB compression on EXRs within MRG's EXR nodes.
Updated the default configuration type used in the queue to Basic.
Added the ability to filter out sublevels outside of the current persistent level in the Sublevel query UI for graph collections.
Added two new EXR metadata values for Accumulation DOF: AccumulationDof/numSamples and accumulationDof/splatSize.
Updated the Preview window for MRG to display "Accumulation DOF" for passes that are using Accumulation Depth of Field.
Added a new "layer warm-ups" concept in the graph (opt-in) that provides a way of allowing Lumen to settle properly if changes are made across layers which impacts lighting (eg, with the Light Modifier node). This is distinct from normal (shot) warm-ups which run once before a shot renders. Layer warm-ups run before each layer renders a frame, so it has a substantial impact on render time (the tradeoff being that the layer's lighting is now much more correct). Exposed on the Warm Up Settings node and the Render Layer node.
Added the new "Basic" configuration type. This configuration allows you to set up a render directly in the queue without creating a preset or a graph.
Updated the queue to have a cleaner, more streamlined layout.
Updated MRQ and MRG to set bPrevAllowBackgroundAudio=true to ensure that audio records correctly even if the editor is in the background.
Updated the graph's collection UI to copy the layer operation to the new query when switching the query type.
Updated the graph to include the ability to edit comment node properties (color, font size, etc).
Added a new "Visible in Reflections" property to the Modifier node in the graph.
Updated post process material (PPM) output in the graph to ensure that alpha=1 when the PPM does not generate alpha.
Added Accumulation DOF support to MRG via the Deferred Renderer node, and added a new Accumulation DOF Modifier node.
Default-increased the engine's combined LUT size to 64^3 during MoviePipeline renders.
Added a new "Component Name" condition group query to the graph.
Added a new "Light Actor Type" condition group query to the graph.
Added a new "Light Modifier" node to the graph. This modifier contains a set of built-in light properties that are commonly-modified, but also allows for nearly any light property to be added via the "Custom" section.
Updated the Execute Script node to include two different modes, "Editor Only" and "Editor + Runtime". This was primarily done so the Asset Referencing Restrictions plugin doesn't flag Python scripts (this requires the new Editor Only mode to be used -- Python scripts cannot be referenced in Runtime builds). Also enabled MovieGraphScriptBase for use in Blueprints, meaning Blueprints can now be used for scripting within MRG via the Execute Script node.
Updated the autocomplete used in MRG to support MRG tokens as well as CAT naming tokens. Additionally, all MRG node properties that support {tokens} now display the autocomplete widget.
Updated spatial sampling in the graph so it only affects the last 5 warm-up frames. This is optionally adjustable via the "MovieRenderPipeline.NumWarmUpFramesWithSpatialSampling" cvar.
Added support for the "Play After Render" feature into the main MRQ queue.
Bug Fix:
Fixed an issue that could cause some frames to fail to write to disk when: 1) multiple shots are being rendered at the same time, 2) certain combinations of tick-rate in the sequence and shutter timing on the camera, and 3) more than one temporal sample is being used. The issue manifests as the first shot's frames being written to disk, but frames for subsequent shots are not. This fix only applies to MRQ presets; graphs within MRG, as well as Basic configurations, are unaffected and do not have this issue.
Fixed a bug in MRG that caused a one-frame render to fail to output to disk when 1) a 32-bit PPM is being used, and 2) more than one spatial sample is being used.
Fixed audio pops between shots when using the.wav output, or the MP4/ProRes encoders, in the graph.
Fixed an issue with the.wav writer that would not output files per-shot if requested in the graph.
Fixed an issue in the graph that could cause audio in remote renders to be delayed by potentially many seconds. Depending on the machine, this may need additional tweaking (see the MovieRenderPipeline.AudioLatencyCompensationFrames cvar).
Fixed a crash that could occur if using the Sublevel or Actor condition group query in a graph and doing a remote render in an editor build.
MRQ: Improvements for Popping/Gaps/Repeats between Movie Scene Camera Cuts and Cinematic Shot Tracks when rendering.wav output.
Fixed a crash that could occur if a recursive connection is made in the Globals branch within the graph.
Speculative fix to address a rare crash in UMoviePipelinePIEExecutor that could occur when the queue is mutated during a render.
Fixed a crash that could occur if a render is performed when a shot's camera binding is invalid.
Fixed a rare MRG crash that could occur when: 1) writing multi-layer (non-multipart) EXRs, 2) also writing another output type (like JPG) with burn-in enabled and compositing turned off.
Fixed a rare crash that could occur when choosing a preset in the queue.
Fixed shots/sub-sequences with Time Warp curves not appearing in the queue when other shots in the same sequence have no Time Warp.
Speculative fix for a rare crash (likely due to a data race) with Object IDs in MRG.
Fixed an issue in the queue that could cause a crash when 1) clicking on the Output Directory link, and 2) the graph contains an invalid connection or a node from a non-loaded plugin.
Fixed a bug that caused the "Is Spawnable" condition group query in MRG to share its bool value with *all* "Is Spawnable" condition group queries (ie, the value could not be controlled independently across multiple Collection nodes).
Added missing camera metadata for MRG output types that support metadata (fstop, fov, focalDistance, sensorWidth, and overscanPercent). Also added camera 'squeezeFactor' metadata for both MRQ and MRG.
Speculative fix for a rare crash in MRQ/MRG that could happen if the pipeline is torn down before a render has a chance to start (which could happen if there's a PIE initialization error).
Fixed a crash that could occur if a new (unsaved) graph is assigned to a job, the graph editor is opened, then an undo is performed.
Updated MRG to set the promoted value of CustomPlaybackRangeStart/End to "Sequence Default" if these properties are *not* overridden when they're promoted to a variable. This ensures that default sequence frameranges are rendered, rather than a range containing zero frames.
Fixed an issue in MRQ that caused incorrect motion blur when temporal sampling is turned on, a high-FPS level sequence is being used, and motion blur on the camera is enabled and set to 0.
Fixed a bug in the graph that could crash the editor when duplicating a comment node.
Fixed graph member pin coloring not updating correctly in the graph and in the Members tab.
Fixed a bug that caused depth PPMs in the graph to generate corrupt data when using AMD graphics cards.
Fixed a bug that caused lights and decal components to not hide properly via the Modifier node when "Is Hidden" is used.
Fixed a bug which could cause non-deterministic collection evaluation in the graph (happens when a modifier is modifying actors across several sublevels, and actor names are duplicated across those sublevels).
Muted cameras in Sequencer will now be correctly skipped even if Render All Cameras is enabled.
Fixed MoviePipeline crash on exit with null pointer to output merger.
Fixed issue where the Current Viewport mode in Quick Render would not reflect the viewport camera properly if it was transformed within Sequencer.
Online
New:
Update EOSSDK from 1.19.0.7 to 1.19.1.2.
EOSSDK v1.19.0.7 Full update.
Online Services EOS Presence Refactor:
Optimistic cache.
Retry logic using EOSSDK cached state.
Echo suppression.
Added FUserPresence::operator==, used to detect differences and fire events.
Simplified UpdateUserPresence.
Fix missing RichPresenceString in FMutations merge Also refactored PresenceCommon::PartialUpdatePresence to use ApplyPresenceMutations to prevent future field omissions.
Added runtime network status monitoring to platforms missing it (iOS, Android, Windows, Mac, Linux).
Removal of audio device configuration logic from NintendoEOSVoiceChat classes. Using EOSSDK defaults now.
Added better error context to OnlineBeacon failures.
Bug Fix:
Fix crash when Connect AddNotifyAuthExpiration callback fires if the user logs out and logs back in.
Added logic to clear EOS presence state for user on auth logout.
Hotfix System
New:
Added OnlineTitleFileNull which can be used to load hotfixes in -nomcp mode (pulled code out of TitleFileMcp into the Null one).
Changed OnlineHotfixManager to use the OnlineTitleFileNull when -TitleFileLocalPath or -HotfixLocalPath are specified.
Add support for custom config in hotfixes.
Online Subsystem
New:
Added an option to trigger the OnConnectionStatusChanged delegate also for the Unknown network connectivity state. The option is active by default but can be disabled via a CVar.
Add brackets to EOS P2P connection string in OnlineServicesEOSGS.
Log a warning when a stat name passed to FOnlineStatsEOS::WriteStats is not uppercase.
The version of the Steam SDK we are using has been upgraded to 1.63. This also includes experimental support for targeting the Android platform with Steam.
Updated the comments on OSS IOnlinePurchase::IsAllowedToPurchase API to clarify that this API is meant for platform-specific policy or permission checks. For the Google Play store purchase interface only: IsAllowedToPurchase() API will now always return true, as there are no policy or permission reasons for a Google Play purchases to be blocked. If you still need to detect whether the billing client is connected, please use the new IsBillingClientConnected() API instead. This behavior aligns with other implementations of this interface.
Removing port info from all EOS P2P connection strings.
Added the Bucket ID to the default Lobby search parameters to align with Session search behavior.
Increase ApiVersion for EOS_Auth_LoginOptions from 2 to 3.
Bug Fix:
Follow-up fix to issues tied to ports being removed from EOS P2P addresses.
Modified the logic around EOS_UI_AddNotifyDisplaySettingsUpdated in OnlineSubsystemEOS to only fire when an input is done in the overlay, and the overlay is visible. Modified the logic around EOS_UI_AddNotifyDisplaySettingsUpdated in OnlineSubsystemEOS and OnlineServicesEOS to not fire on duplicated unchanged values.
Fixed a crash in UIpConnection::LowLevelSend when SocketSubsystemEOS is null.
Clear session cache when EOS_Sessions_DestroySession returns EOS_NotFound in FSessionsEOSGS::LeaveSessionImpl.
Cleaned up notification id objects in OnlineSessionEOS.
Added a new Ecom flow to fix several issues with the existing ecom flow. The new flow can be used by setting bUseNewEcomFlow in config.
Fixed a crash ensure that occurred when stopping play in editor while a voice chat session was active.
Pixel Streaming
New:
Pixel Streaming 2
Add: Support for iOS and Android.
Add: Ability to access VideoConsumer in BP and retrieve FTextureResource* in C++.
Pixel Capture: Add: Support for iOS and Android.
AV Codecs: Add: Support for iOS and Android.
Web RTC: Add: Support for iOS and Android.
Libpx: Add: Support for iOS and Android.
Added optional IPv6 support to WebSocketsNetworking and PixelStreaming2 signaling server.
Added configurable origin-based connection filtering to the PixelStreaming2 signalling server in the Unreal Editor. Connections are now validated against an allowed origins list before the WebSocket handshake completes.
Bug Fix:
Pixel Streaming 2
Fix: Potential deadlocks during player connection.
Fix: Audio processing pathways for resampling and channel mixing.
Fix: Warnings about differing send and receive codec capabilities.
Fix: Update EpicRtc log filter to remove "ticking audio too late" warnings.
Fix: Crashes when PropertyChangedEvent.Property is nullptr.
Fix: Input handler would not unregister itself during shutdown.
Fix: Play-In-Editor streamer could crash due to unsafe pointer access.
[Pixel Streaming, Pixel Streaming 2] Fix: Internal signalling server hitting an ensure during creation due FTickableGameObject not being created on the game thread.
Pixel Capture
Fix: Potential deadlock when pinning weak UObject ptr.
Fix: Crashes due to obtaining texture pointer outside of a pass.
AV Codecs/NV Codecs: Add: Launch boolean launch argument (`AVCodecs.NvEnc.D3D12UsesCUDA`) and config option (`D3D12UsesCUDA` under the `AVCodecs.NvEnc` section) to revert to legacy D3D12 → CUDA → NvEnc code path to work around memory leak in NvEnc.
Platform
New:
Add IPlatformFile::OpenMappedEx2. OpenMappedEx2 has more granular flags so it's possible to better specify behavior when working with multiple handles to the same file. OpenMappedEx has different behavior on unix-like and windows platform when using AllowWrite. This behavior is not changed to avoid breaking any existing platform specific code. Specifically, unix-like platforms use OpenForWrite|OpenExisting and Windows platforms use OpenForWrite|AllowRead. Additionally
MaximumSize is now correctly set in all implementations for both read and write.
On unix-like platforms, mode flags are set consistent with other API calls on the platform.
On unix-like platforms, O_CLOEXEC is set consistent with other API calls on the platform.
For Programs always disable UBT checking if AutoSDK is disabled.
When AutoSDK is on and the UE_SDK_ROOT env variable is set -Run UBT once, then cache the results -If AutoSDKPath is set for the platform, then run SetupAutoSDK, if its not set then we have nothing to setup and assume its valid. When AutoSDK is on and the UE_SDK_ROOT env variable is not set or AutoSDK is off.
Run UBT every time.
Check UBT output to gather valid platforms When UBT is not found, not available.
Only RunningPlatform TargetPlatformControl is created, all the other platforms only load the TargetPlatformSettings for preview.
This is why we moved IsRunningPlatform from TPControl to TPSettings.
Improved performance in WriteLineToStdOut and FWindowsPlatformProcess::ReadPipe.
Bug Fix:
Changed AdditionalPlugins to go to the Editor project, not the non-existent project, when using bMakeProjectPerTarget (currently only on by default for Xcode projects).
Convert pakchunkN files to local path separator when reading them in so path matching works on all platforms.
Fixed how Build setting is obliterated every editor boot, and use saved ini setting instead.
When "If running a locally built editor" is used in Packaging Settings, the code now looks at the InstalledBuild flag, along with the PromotedBuild flag (to match a BuildUAT in LauncherProfile).
All Apple
New:
Added support for Metal Ray Shaders on Mac Path Tracing is now supported on Mac (please use MacOS >= 26.4 due to driver bug).
Re-enabled preview platforms for Mobile and SM5 when running SM6 Metal RHI.
Fixed bug where large texture allocations on SM6/Bindless paths were never deallocated.
Added an optional certificate checker to UBT (AppleCertificateVerification) verifying that certain Apple certificates are installed correctly to the system keychain (e.g. for enforcing shared codesigning identities).
Added ApplePlatformWebBrowser support for the Slate Reflector and taking screenshots programmatically.
Exposed Apple Contacts support in the UE5 Core module.
Bug Fix:
Unreal Build Tool: Fix thread-safety of MacToolChain.DebugInfoFiles causing intermittent dSYM failures DebugInfoFiles is a List<FileItem> mutated concurrently from Parallel2.ForEach in UEBuildTarget.Build. Change to ConcurrentBag to prevent lost entries.
Disable ProgramSize metric on macOS (which was previously broken) to match Windows behavior.
Making both FApplePlatformMemory and FMacPlatformMemory consistently use 64-bit structures and phys_footprint instead of resident_size when reporting UsedPhysical memory.
Added defensive checks against callbacks in ApplePlatformWebBrowser from going ahead upon module shutdown.
Moved 3D browser assets into engine to allow ApplePlatformWebBrowser to use indirect/3D rendering path even when the UMG Web Browser Widget plugin is disabled.
Refactored the authtoken stuff in ExportAppleBuild to automatically re-create the token as needed, but wrapping the token and HttpClient together in a new JwtTokenClient.
No longer attempts to memory map lazy Metal shader libraries if USE_MMAPPED_SHADERARCHIVE=0.
HMI
New:
Modular Viewports plugin and UEngine viewport registration API Additional viewports can be registered to the engine, so that custom viewport clients can participate in the engine draw loop. The new (highly experimental) plugin includes:
Viewport Clients for drawing individual cameras and individual players, as alternatives to Scene Capture Component that have different performance characteristics and input integration.
Utility for spawning additional Game Instances (multiple worlds on different maps in a single process).
Widget class that exposes Scene Viewport to UMG for picture-in-picture, layering.
Linux
New:
Updated SDL3 to 3.4.4.
Fix up Vulkan Validation layer build scripts and rebuild against our Rocky toolchain.
Add support for ASTC/ETC2/DXT/Multi cook flavors for ARM.
Provide Linux with a meaningful FPlatformMemoryStats::GetMemoryPressure() implementation.
Make server fork delay configurable and add a batch count for how many forks can be fulfilled per signal.
Add support for prepending project file Config\BootstrapPreamble.sh to the front of the generated linux bootstrap script.
Inactive windows no longer ignore the first mouse click.
Bug Fix:
Add new Preview Platform VULKAN_SM6 in order to get Disable Preview option when running editor with -vulkan -sm6 Remove unsupported platform from Linux Editor.
Directory creation failure logs are now more informative.
Add all additional libraries to RPATH on Linux - solves an issue with plugins that depend on the main game module.
Fixed chunking of projects when packaging on a Linux host.
Fixed touch input having mismatched number of start/end events in some Linux environments.
Re-enable -nocef when running unattended to unblock horde ASan tests.
Mac
New:
Switched on multi view SlateRHIRenderer support on macOS by default to integrate native views within Slate rendering contexts (e.g. in ApplePlatformWebBrowser's WKWebView), allowing such views (and theoretically other custom native macOS views) to respect Slate rendering order.
Add support for the Xcode view debugger displaying Slate rendered Metal views in the editor.
Bug Fix:
Ignore leading whitespace for mac file dialog file extensions to fix some file dialogs not appearing on mac.
Fixed mac es3.1 support for the asset cooker and the cooked builds themselves.
Making sure the dedicated server through RunUAT's BuildCookRun is using the right directory with macOS.app bundles to fix an error with cooking multiple clients on the fly.
Fixed Lyra APT-related issues for mac runs.
Online
Bug Fix:
Fixed platform invitations not being sent along with in-game invites when users are not friends.
Fixed steam_appid.txt not being generated for dedicated servers and improved error logging for steam initialization.
Windows
New:
Windows ARM64 Support (Experimental) UE 5.8 introduces experimental support for Windows ARM64 and ARM64EC architectures, alongside x64, enabling game targets to run on Windows on ARM hardware.
ARM64 support in this release covers game targets only. The Unreal Editor is not supported on ARM64 in UE 5.8. You can package ARM64 builds from the editor's Platforms menu or Project Launcher, or from the command line using `RunUAT BuildCookRun -clientarchitecture=arm64...` for a pure ARM64 build or `-clientarchitecture=arm64+x64` for a combined build.
The April 2026 GDK or later is needed to use the Microsoft GDK Plug-ins on ARM64.
Both pure ARM64 and ARM64EC (Emulation Compatible) builds are supported, as well as a combined architecture build that packages two side-by-side executables, with the UE bootstrapper launching the correct one based on the machine's architecture.
New plugin that will automatically select OnlineSubsystemGDK when run from installed MSGameStore package.
Run with -ForceOSSGDK to apply the configuration regardless of whether we are a packaged process, or -ForceNoOSSGDK to leave the configuration as default even when packaged.
You will also need this line added to your game's WindowsEngine.ini to ensure the OSS configuration is patched before it's used by the OSS module Online Subsystem: +AdditionalModulesToLoad=MSGameOSSSelector Additional ini files can be placed in this folder, with a Windows prefix (e.g. WindowsEngine.ini): YourProject/Config/Windows/MSGameOSS/...these should have an appropriate [Staging] entry in your project's main WindowsGame.ini: +AllowedConfigFiles=YourProject/Config/Windows/MSGameOSS/WindowsEngine.ini These additional ini files can be used to configure other online related items such as:
DefaultPlatformService, LocalPlatformName, NetDriverDefinitions etc, It can also override other key items depending on the needs of the project, such as: Platform Features: SaveGameSystemModule=GDKSaveGameSystem Streaming Install: DefaultProviderName=GDKPackageChunkInstall And finally, you can also load additional modules: MS Game OSS Selector: +AdditionalModulesToLoad=MyCustomGDKModule.
Experimental PC GDK plugins are available for building games that target the Xbox PC App (Windows Store) and Xbox Services.
Windows remote deployment and launching support via the Xbox PC Remote Tools (https://aka.ms/GameRemoteDevtools). This enables game builds to be deployed and run on remote Windows PCs directly from the Unreal Editor or via RunUAT BuildCookRun -deploy -device=myfirstpc. Both x64 and Windows on ARM64 remote devices are supported. Remote devices are registered by machine name and appear in the editor's Launch On menu once paired. Pair devices with the Xbox PC Toolbox App, then add them to %LOCALAPPDATA%\Unreal Engine\Engine\Config\UserEngine.ini Remote Win: +DeviceNames=myfirstpc +DeviceNames=mysecondpc
MSGamingRuntime's bLazyInitialize now defaults to true, and the default value is correctly honored.
Enabled MallocBinned3 by default for Windows for improved speed over MallocBinned2.
Maximized editor windows no longer allocate a swapchain that is oversized by 16 pixels in both dimensions, thus use marginally less VRAM.
Added GPUCrash.D3DResult and GPUCrash.D3DDeviceRemovedReason fields to crash reports for DX11 and DX12.
Moved D3D11 and D3D12 adapter selection logic into new module WindowsD3D to reduce inconsistencies with adapter heuristics.
Added r.D3D12.DXR.MinimumDriverVersionIntel and changed existing vendor CVars from int32 to FString.
Added bForceHighDPIInGameMode to WindowsTargetSettings to apply Per Monitor V2 DPI awareness earlier from application manifest for Game and Client.
Extended UGameUserSettings with members to track the DisplayID and DisplayIndex to improve support for multiple monitors.
Removed unused D3D12 RayTracing allocations when feature level is not SM6.
Added function RHIGetAvailableResolutionsForDisplay to get resolutions for a specific monitor on Windows.
Added log line to show if GPU is tile-based for Windows D3D12.
Added log flushing in D3D12MessageCallBack so the message is available in VS debugger at UE_DEBUG_BREAK.
Added macro UE_WINDOWS_FORCE_NONEXCLUSIVE_FULLSCREEN to disable exclusive fullscreen for Windows builds if desired.
You can now set Game Input::IncludeRedistFiles=True in your project's DefaultEngine.ini to have BootstrapPackagedGame run a GameInputRedist.msi installer! You should set this for any packaged game using the Game Input for Windows plugin.
Bug Fix:
Stopped precaching PSOs with wave ops if the GPU doesn't support the wave size.
Added CVar WindowsCursor.DynamicLockToggle to toggle the mouse lock to be active only when the window is in the foreground on Windows.
Changed WIndowsConsoleOutputDevice2.cpp (-newconsole) to send input to Engine Cmd handler, even if python is installed (Python was stealing the comment input).
Arm64ec libcef.dll CEF crash fix -Arm64ec is compatible with x64 and arm64ec, not with arm64.
Fixed RHIVendorIdToString for Qualcomm on Windows.
Fixed logic for computing windowed resolutions if the display's desktop resolution is less than its maximum resolution.
Set up texture discard on creation for D3D12 to ensure we always have a valid resource.
Added Visual C++ redistributable version validation on editor launch), warning users if their version isn't up to date.
Set Windows PGO automation to fail if the output PROFRAW file is zero bytes.
Adjusted RHI usage in ParticleGpuSimulation.cpp to fix warnings from the D3D12 debug layer about uninitialized resources.
Fixed D3DDebug warnings for ES3_1 on Windows about missing input layout elements during PSO Precaching.
XR
New:
Removed the Android_OpenXR flavor, as it is now possible to keep bPackageForMetaQuest and/or bPackageForOpenXRImmersive enabled for a project without breaking normal Android builds, eliminating the need for a special cook flavor.
Adding Meta Quest 3s as supported device when bPackageForMetaQuest is enabled.
Add Meta Quest 3S device profile.
Added the GetPreferredSwapchainFormat IOpenXRExtensionPlugin hook, allowing OpenXR extension plugins to override the color swapchain format.
Adding Android manifest lines that enables Android XR devices to work out-of-the-box.
Added a new special shader parameter/resource binding type, Texture2DMultiView, which allows binding either a Texture2D or Texture2DArray depending on whether shaders were cooked to use mobile multi-view stereo (VK_KHR_multiview).
Texture2DMultiView parameters can be set up in the shader parameter struct in the same manner as a Texture2D or Texture2DArray parameter, e.g. SHADER_PARAMETER_RDG_TEXTURE(Texture2DMultiView, TextureName).
If the parameter struct is registered as a static uniform buffer (IMPLEMENT_STATIC_UNIFORM_BUFFER_STRUCT), the parameter will automatically be added to your shader headers. Otherwise, you will need to explicitly define a "Texture2DMultiView TextureName" in your shader after #including Common.ush.
This is intended to be used alongside FSceneView::CreateStereoTextureDesc() to create a matching texture description.
Disable chunked PSO cache on Quest devices The chunked PSO cache has the following tradeoffs: Pro: Drivers which fully serialize access to their PSO caches get better concurrency Pro: Drivers which don't scale well to large PSO caches get faster lookups Con: Drivers which can reuse cached information for pipelines which are different but similar may have cache misses due to the pipelines being in different chunks Con: Drivers which can reuse cached information for pipelines which are different but similar may use extra memory storing multiple copies of this information in different chunks On Quest devices, the driver doesn't benefit much from the Pros, and is hindered by the Cons. It's better to turn this feature off.
Added OpenXR loader for linux arm64.
Removed r.Mobile.AntiAliasing=3 (MSAA) from the Android_OpenXR device profile. It will no longer automatically override the AA mode set in project settings, which already defaults to MSAA for VR Template.
OpenXR SteamFrame and Android support improvements -New Platform/Android setting bPackageForOpenXRImmersive alongside bPackageForMetaQuest. This does many of the same things, but leaves out the quest specific additions. Normally you would want one or the other enabled depending on the type of build you want to generate however the differences are primarily in the APL and extra stuff will usually be ignored. -Merged the content of OculusOpenXRLoader_APL.xml into OpenXR_APL.xml.
Fix casing of CVars for OcclusionFeedback settings in BaseDeviceProfiles.ini.
Added PICO controller plugin which supports XR_BD_controller_interaction and XR_BD_ultra_controller_interaction extensions. Enabled the PICO Controller plugin and added PICO Controller Bindings to VR Template's Input Mapping Contexts. Removed Windows Mixed Reality Bindings.
OpenXR android apl fixes -Removed deprecated PackageForOculusMobile which was replaced by bPackageForMetaQuest more than two UE versions ago.
OpenXRHMDSettings BlockedExtensions -Added a config variable backed project setting to block the use of a list of OpenXRExtensions even if the runtime supports them and even if they are required for us to run OpenXR at all. Mainly intended for testing.
IOpenXRExtensionPlugin GetBlockedOptionalExtensions -Added GetBlockedOptionalExtensions which fills an array with extensions to block. -Removing those extensions from the optional extension requests by UE and by OpenXRExtensionPlugins. -Logging so we know what is happening. -Mainly intended for testing.
OpenXR initialized by default on Android platforms, if available -Removing unusual behavior that testing showed was obsolete. We want enabling the OpenXR plugin to be the decision point, not doing that and this bool, however earlier versions of the OpenXR loader did not behave well on all devices.
Adding base device profiles for Steam Frame.
XR Crash reporting improvement -For OpenXR this will include the runtime and it's version. For non-OpenXR it will tell us if we are on ARKit, ARCore, SimpleHMD, etc. -Example: <XR>XR OpenXR PicoStreamingXR (Standalone) 1.1.46</XR>.
Updated SMAA to support mobile multi-view (MMV), and fixed`toggledebugcamera` mode when using MMV on desktop via -es31 -vulkan.
Bug Fix:
Fix an issue where OpenXR frame synthesis/space warp would not work properly when materials using translucent velocity (such as Niagara particles) were onscreen.
Crash fix with Vive trackers in viewport Adds empty-array guards to FOpenXRViveTracker accessors to prevent out-of-bounds access when the Trackers array has not been populated.
Fixed a crash caused by OpenXR motion vector and motion vector depth swapchains being incorrectly allocated even when r.Velocity.DirectlyRenderOpenXRMotionVectors=0.
Open XR: Fix for parsing of Input dpad paths -Some special handling for dpad inputs because its natural keynames do not quite fix what our openxr input code expects. -Note: We recommend that OpenXRExtensionPlugins specify the paths via GetInputKeyOverrides and avoid this older string matching system.
OpenXR 1.1 config variable lookup fixed.
Fix FBFoveation race condition during startup. Update FBFoveation CVars to be read-only to avoid crashes when toggling at runtime.
Fixed Crash Report:[Assert] OpenXRInput!FOpenXRInputPlugin::FOpenXRAction::FOpenXRAction() [OpenXRInput.cpp]
Added an ensure and early out to report wide character action names which openxr does not support, and then ignore them to avoid the crash.
Platform Mobile
New:
Adding the "stat thermals" command to display the thermal state of the device. Currently only available on Android/iOS.
Expose CPUTemp and ThermalStatus CSV metrics to other platforms than Android
New Cross Platform Thermal stats: DeviceTemperature ThermalState.
DeviceTemperature is in degrees C, and only implemented for Android now.
ThermalState mirrors the Android thermal status enum and iOS thermal state values are mapped onto the first four values of it. See the comments in ThermalStats.h and the platform implementations for more detail.
The pre-existing TemperatureLevel stat is deprecated. It reports temperature on Android and thermal state on iOS.
Bug Fix:
Fixed an issue where on a project with r.Mobile.FloatPrecisionMode=2, saving a material with Float Precision Mode = "Use Half-Precision" would revert to Default after closing and re-opening the editor.
Android
New:
Android Platform: Added touch support from custom Surfaces (ANativeWindow).
Changed androidx WorkManager auto initialization to on-demand to prevent certain WorkManager crashes.
Added android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY to the manifest for Android 16+ targets.
Auto download the command-line tools for streamlined Android Turnkey.
Add support for configrules to force software WebView compositing with set:(Android.ForceSoftwareWebView=true).
Auto return new intent data in WebAuth if app restarted during login session.
Reimplemented Android Background HTTP Manager.
Replaced findClass with loadClass in the jni ClassLoader. Made improvements to jni TConstructor to show parameter names. Added some Marshaling to FEnv.
Added AuthTab support to WebAuth plugin.
Made WebAuth redirect more robust on Android.
Put JNI class initializations into a separate data section to make statics constexpr.
Bug Fix:
Deal with startup issue on Android causing possible wrong Webview state preventing either render or interaction with WebAuth Fix can be reverted if necessary with bWebAuthSetLaunchAuthTab=true in DefaultEngine.ini [/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
Fix to a rare race with ContextWrapper binding that could cause an ANR.
Android build fixes:
Fixed LTO builds.
Optimized PGO builds to use -Os instead of -O3 with no outlining as it produces faster and smaller code.
Fixed UPL reading of.INI data to use the same hierarchy as C# build files.
Fixed JAVA_HOME path during manual Android Sdk switching on macOS.
Fix Android JSON generation for ANGLE devices.
Add Initial batch of JSON devices to persistent PreviewJsonDevices folder.
Option to terminate process on exit instead of doing proper shutdown for Android as a way to avoid ANRs.
Android.TerminateOnExit cvar (defaults to 0 which is off).
Commandline option -ProperShutdown bypasses it.
Fix for ForegroundServiceDidNotStopInTimeException.
DoWork as blocking potentially forever; added a watchdog (5.5 hours)
Similar watchdog on DownloadManager worker since it reschedules itself indefinitely.
BForceStopped volatile since set in another thread.
Reduced the timeout for OKHttp so it doesn't spend so long before retry.
Added HTTPManager skip flush for Android ANR workaround (cvar cttp.SkipShutdownFlush, defaults false).
Fix for timeout not shutting down AFS service properly and cleaned up some warnings.
Fix issue with code-only projects using wrong architectures for packaging on Android.
Fix issue with loading OBBs caused by wrong directory separator.
GameApplication initializations only for non-PSO processes.
Improve thread safety on SystemInfoLogs.
Fixed java memory stats issues.
Fixed Potential Hang in Android Background Downloader.
Update WorkManager runtime and handle onTimeout properly.
Fixed typo in Android manual resolution override parameter.
Fixed various bugs in BackgroundHTTP, mainly for Android.
Fixed Android Studio project generator if no client target.
Fixed adb pathing of Android installer/uninstaller scripts for all platforms.
Deprecated:
Deprecated the entry "Android Graphics Debugger" from Project Settings→Platforms→Android→Graphics Debugger because the tools it refers to have been deprecated and are no longer available.
iOS, tvOS, and iPadOS
New:
Supported gestures with native iOS gesture recognizers. The existing Pinch/Flick/Rotate were replaced, and added new gestures Tap/LongPress/Pan.
Added the option of having Haptics feedback working while recording on IOS.
Added support for MarketplaceKit eligibilityRegion.
Added support for requesting CT token.
Added support for getting StoreKit store.
Added support for mimalloc v2.1.2 on iOS. mimalloc generally has better performance than Unreal Engine memory allocators, which are heavily optimized for memory usage.
Add support for Additional wav, aiff, caff resources to allow users to deploy custom notification sounds for iOS applications.
Bug Fix:
Ensure CFBundleVersion is populated in the archived Info.plist when Versions.xcconfig isn't set.
Fixed the LLM ProgramSize statistic for iOS.
Fixed a memory leak affecting the 3D/indirect rendered ApplePlatofrmWebBrowser on iOS.
Quixel
New:
PVE - Foliage Shader Framework.
Changed some default parameters in the roughness material function.
Added a better Perlin wind gust texture.
Added a default VT mask texture.
Added several smaller material adjustments to the maple tree demo shader.
Rendering
New:
VSM
Added throttle for the invalidation triggered from r.Nanite.VSMInvalidateOnLODDelta such that it can be turned on without causing large performance regressions. The budget is set via r.Shadow.Virtual.DeferredInvalidationBudget (defaults to infinite).
Added r.Shadow.Virtual.PrefilteredDistant.ProjectEnable to gate the prefiltered distant feature (shaders in particular) behind.
Prefiltered distant experimental implementation. This adds support for drawing distant shadow casters into the clipmap at much lower resolution, while using prefiltering and temporal reprojection to produce a smooth result that often matched ground truth better than SMRT.
NFOR
Default to higher clarity than ghosting. Set r.PathTracing.Denoiser.Prepass.RankedLuminanceVariance back to 1 if the previous config is preferred.
Add low memory mode for memory constrained GPUs. All 32bit channel cache will be stored in 16bit when `r.NFOR.Memory.Mode = 0`. 4k rendering total cached texture memory usage reduced from 2814MB to 2113 MB when Frame Count = 2.
DOF: Added r.DOF.PreferLowerBitDepth. When enabled, the bit depth of intermediary buffers in DOF is lowered. This improves performance at the cost of quality on platforms that are bandwidth constrained, such as handhelds. This optimization was previously only available when the scenecolor format was set to r11g11b10. This change only works when the recombine and accumulator quality are set to low.
Optimize reflection capture updates for deferred shading.
Significantly improved performance of the CreateShadingRateImage pass.
Implemented the following Nanite- and WPO-related features for skinned meshes to match their Static Mesh counterparts:
World Position Offset Disable Distance.
Evaluate World Position Offset.
Disallow Nanite.
Reduce default fudge factor to 1e-13 to keep legacy material math working. It's still higher than the UE 5.7 default (1e-8) so rendering will start breaking further away. It's also now exposed as a r.SceneDepthFudgeFactor. This can be useful for finding bugs caused by it or reverting to pre UE 5.8 behavior.
GPU Scene: Made the use of tiled stride for instance data depend on reserved resources being available to avoid allocating large blocks of low end platforms.
SLW: Move velocity write from base pass to depth prepass Move Single Layer Water velocity output from the SLW base pass (via GBL_ForceVelocity GBuffer layout) to the SLW depth prepass (via velocity shaders).
A new CVar is added "r.Water.SingleLayer.VelocityOutputPass" to control the fallback. it has also been added to project setting. When r.Water.SingleLayer.VelocityOutputPass=0, no velocity written. When r.Water.SingleLayer.VelocityOutputPass=1 (default), all SLW materials use velocity shaders in the depth prepass. The base pass uses GBL_Default (no velocity RT). MVWO (Motion Vector World Offset) is only supported when PrepassVelocity=0. When r.Water.SingleLayer.VelocityOutputPass=2 (fallback), legacy behavior is preserved: Base pass writes velocity via GBL_ForceVelocity, prepass is depth-only. This CVar deprecates r.Water.SingleLayer.ForceVelocity. -"r.Water.SingleLayer.DepthPrepass" has also been added to the project setting.
Fixed MVWO ensure when revert connections.
Added shadow invalidation when a FLevelCommand unhides primitives.
Fixed spikes when loading maps with large HISMs that were introduced as part of a fix for a different issue. This new fix is narrower in scope and should only cause rebuilds when ApplyComponentInstanceData is called.
Button added to automatically clean up "More overridden materials (N) on static mesh component than are referenced (M) in source mesh '<Name>'" map check errors. Button appears on the source mesh field, only for meshes currently affected by the error. The "Select actors by message" right click menu in the map check dialog can be used to select all affected meshes, to fix these errors in bulk.
Added the ability to enable collision on Instanced Skinned Mesh Component. (NOTE: Collision bodies remain statically posed in reference pose).
Moved all CSM state out of FScene and into FCSMShadowScene.
Introduced FLightSceneId and specialized containers and replaced uses of int32 in the renderer. This does not change any functionality but makes the logic clearer and is a preparation for further refactors of scene data.
Exposed StaticMesh accessor methods GetNumTexCoords, GetNumNaniteVertices, and GetNumNaniteTriangles to Blueprint.
Added detailed Insights trace to FRuntimeVirtualTextureFinalizer::RenderFinalize in order to better assess RVT perf (useful in case of large page invalidations in particular).
Add GetHairDescriptionCustomVersions to make common version tracking (used by FHairDescription and FHairDescriptionBulkData).
Moved core logic for building the primitive scene data inside the proxy to BuildPrimitiveUniformShaderParameters_RenderThread in FScene to reduce exposure of internal rendering data and improve performance.
Deprecated and disabled the r.SkipRedundantTransformUpdate feature and associated API as it leads to inconsistencies, ASAN warnings and is of doubtful performance value (possibly detriment).
FPrimitiveSceneProxy cleanup: Removed some deprecated API and deprecated OnDetachLight as it is not used anywhere.
Removed: WritesVirtualTexture, GetNaniteResourceInfo, UpdateInstances_RenderThread, and GetDistanceFieldInstanceData.
Refactored spline mesh to not need to pass information through the FMeshBatchElement, instead using the LooseParametersUniformBuffer to pass the information to the shader.
Enabled Reserved Resources for GPU Scene to reduce hitches on resize and peak GPU memory use by eliminating the need to double buffer during the copy.
Added a constexpr-if to compile out functionality to toggle fullscreen on non-desktop platforms.
Implemented hierarchical CPU Instance Culling for non-Nanite ISM and similar. Controlled by r.SceneCulling.HierarchicalCPUCulling (runtime, default off) and r.SceneCulling.HierarchicalCPUCulling.ProjectEnabled (offline, default on).
Changed the MDC instance count to 1 when BatchElement.bFetchInstanceCountFromScene is set to allow all MDCs from ISM to hash to the same ID.
"Mask material only in early Z-pass" renderer setting is now enabled by default.
Avoid groom resources allocation if a groom instance is not visible and has no simulation.
Added experimental SetDefaultIfNull to SystemTextures in order to get default texture if a shader resources is null.
Removed inline allocation for dynamic RT meshes, saving up to ~2k bytes per SM proxy (reducing size by 2/3).
Added slice index as an argument for canvases to support writing to different slices in a render target 2d array.
Added OverrideVirtualTextureThrottle option to scene capture component. That allows to remove all sorts of throttling on the RVT system for the duration of the capture. This has a performance cost but can ensure that textures are not blurry if the scene capture renders a region that requires a lot of RVT pages to be locked or rendered to. This does *not* perform any kind of warmup, though, so only the existing RVT page requests will be processed during the capture when this option is on. Another capture has to be performed prior to this in order to generate the appropriate requests.
Decrease fudge factor in ConvertFromDeviceZ as it was causing too large discrepancies in the distance between real SceneDepth and ConvertFromDeviceZ() breaking temporal reprojection and similar operations. With the new factor at 300km from the origin the error is basically 0 (previously it was 62km). At the same it is still small enough where it's safe to do random math operations (in e.g. material shaders) for ConvertFromDeviceZ(0.0) without handling this case explicitly.
Improved hair composition with SLW.
Changed the selection outline rendering to make use of the per instance selection data, rather than relying on internals of the ISM VF.
Added new DeferredAtmospherePass show flag to preserve atmosphere lighting but disable its main render pass with show-only scene captures.
Prevented crash on instance upload for scenes with too many instances by skipping upload for instances outside the instance data buffer.
Bug Fix:
Remove crash in mobile renderer when using groom binding.
Fixed long shader compilation time on hair debug shaders on certain platforms.
Fixed bug in instanced static mesh where previous transforms were not added if the batch-add APIs were used (AddInstances* vs AddInstance).
Fixed crashed in hair strands/cards streaming code with root resources.
Fixed DumpGPU mid-file encoding corruption in ResourceDescs.json, previously causing files to display empty.
Ensure we don't access out of bound section data when running AddHairStrandInitMeshSamplesPass.
Fix an issue where fog could be applied incorrectly to volumetric clouds in splitscreen or stereo views, causing artifacts against the sky near the edges of objects.
Fix Dynamic Translucency Resolution (DynTranslucencyRes) display in Stat Unit and other dynamic resolution states not using the correct resolution fraction. Fix Dynamic Translucency current fraction in Stat RenderScaling using max current fraction instead of current fraction.
Fixed hair strands RT buffer being partially updated causing RT geometry to have stale data.
Fixed incorrect hair offset in streaming request.
Fixed crash when using at the same time ShaderPrint and RDG clobber resources.
Fixed groom binding builder distance computation with degenerated triangle causing groom binding to fail.
Fixed race condition in FHairStrandsSceneProxy::CreateMeshBatch().
Changed hair scene to store hair instances as ref. counted reference to avoid use after crashes.
Fixed race condition when in hair code.
Fixed groom allocating RT memory for strands data even when not needed if a project has PathTracing enabled.
Add early return statement to GroomComponent::SetForcedLOD to fix an edge case where an LOD value of -1 would call SwitchSimulationLOD with an invalid LOD when in a non-forced LOD selection mode.
Fix hair cards/meshes not always outputting velocity vectors when needed.
Fixed texture streaming for translucent materials in DVSM_OutputMaterialTextureScales.
Fixed shader print being incorrect activated by hair culling.
Fixed out of bound access when hairstrands plugin is disabled through CVar.
Fixed hair strands custom depth which were using previous frame data when rendering custom data before base pass.
Remove bUseAttachParentBound override on groom component when using groom binding.
Fix crash when creating new LOD on an empty groom card.
Removed unnecessary check in groom's group index voxelization causing crash.
Fixed missing albedos when lighting is disabled (e.g. unlit view or lighting show flag set to 0).
Workaround for incorrect view distance scale being captured in the GPU scene primitive data for InstanceDrawDistance, InstanceWorldPositionOffsetDisableDistance and PixelProgrammableDistance. The GPU scene now tracks the value of r.ViewDistanceScale and triggers a full upload if it changes. This behavior can be disabled by r.GPUScene.ViewDistanceScaleWorkaround.
VSM: Fixed culling view override propagation for non-nanite VSM which caused mismatch between CPU and GPU culling if r.Shadow.LODDistanceFactor was used.
Fixed incorrect hair cards builder logic for finding closest guide point and for rebuilding mesh description normal/tangent prior to build hair card data.
Fixed non-deterministic build in groom builder.
Fixed typo in GroomComponent hair cards rendering code.
Fixed typo in RBF deformer causing invalid indexing of guide's point.
Fix memory leak when iterating on groom binding with hair cards.
Fixed invalid change tracking in groom card and groom mesh.
Fixed hair mesh data fetching from DDC.
Fixed typo causing inverted CPU/GPU memory report for groom binding.
Fixed issue with projective matrices when used with Large World Coordinates by making affine transforms explicit in DoubleFloat. Previously, some of the transform functions implicitly assumed an affine transform matrix, leading to errors when used with projective matrices. This change makes the DF[Fast]Multiply* functions compatible with non-affine matrices, while introducing separate functions with optimizations for affine transforms.
Fixed incorrect instance count caused by updates to HISMs affected by density scaling.
ISM instance data fixes.
In instance data manager/proxy the custom data count was updated before movement due to deleted instances, causing OOB array access.
Custom data was also not reset properly when the count is changed.
Added bounds checks in ISMC before marking instances as removed.
NFOR: Remove one unnecessary additional base memory allocation for radiance and feature caching.
Fixed a crash in the DynamicWind plugin when changing preview platforms during PIE and then stopping PIE.
Fixed some crashes caused by multi-threading data races in the experimental DynamicWind plugin.
Fixed LDS out-of-bound read when aggregating hair bounds within a macrogroup.
Fixed hair transmittance artifact when with ViewRectOffset + VSM One-pass-projection.
Fixed to primitive alpha holdout use with heterogenous volume.
Fixed hair card only groom asset.
Fixed an issue where splitscreen, stereo, or letterboxed views would incorrectly reproject Contrast Adaptive Shading shading rate images, leading to shimmering in those views when moving the camera.
Fixed OIT shader compilation error with post process domain material when per pixel OIT is enabled.
Fixed issue where the Buffer Visualization Overview viewmode would show certain buffers without gamma correction.
Fixed voxel quantization causing voxel resolution to drop/increase, having side effect (running out of voxel pages).
Fixed bug that caused incorrect precomputed data to be used with the instance hierarchy. This can happen when a sublevel has a transform, as there is no mechanism for notifying the primitive when this causes a transform to change.
Fix incorrect culling of hidden line in ShaderPrint when r.ShaderPrint.DrawOccludedLines is enabled.
Fixed incorrect lighting on hair pixel with full coverage and having scatter scene lighting enabled.
Fixed UWorld::IsPlayInMobilePreview returning true incorrectly when previewing non-mobile platforms.
Fixed incorrect force async compute pipeline when hair raytracing geometry is disabled.
Fixed determinism in hair card builder.
Architecture
New:
Dump GPU
Now DumpGPUViewer can inspect the referenced uniform buffer if r.RHI.UniformBufferContentMap.Enable is set to true.
Added a "Relative Zoom" checkbox to the texture visualization bar for cross-resolution texture comparison.
Added r.MeshSortingMethodWithoutEarlyZ to allow sorting meshes front to back to reduce overdraw even when not using the mobile renderer.
Texture Cube Arrays support mixed source format and gamma correction options, similar to the functionality already present on Texture 2D Arrays. Improved validation when adding elements to a texture cube array, plus error message banner.
Viewport now keeps its assigned Viewport Client from being deleted (prevent use-after-free).
Add WaveReadCrossLane function.
Add QuadReadAcrossX/Y/Diagonal for float2/3/4 and uint2/3/4 on supported platforms.
Added WriteIndirectDrawArgs and WriteIndirectIndexedDrawArgs helpers in Platform.ush.
Added COMPILER_SUPPORTS_WAVE_MATCH_INTRINSIC to known if WaveMatch is supported or not for a particular platform.
Replaced CVar r.TextureGroup.OptionalQualityLevel with new device profile property UTextureLODSettings::TextureGroupOptionalQualityLevel to specify the value for Windows without propagating to other platforms just because the cooking editor runs on Windows.
Bug Fix:
Fixed BBox expansion for FGPUOcclusionPacket if only r.ExpandNewlyOcclusionTestedBBoxesAmount or r.ExpandNewlyOcclusionTestedBBoxesScreenSpace is set to restore artifact reduction.
Allow Shader PSO precache to fail gracefully if shader data is not available yet.
Dump GPU: Add CVar r.DumpGPU.RedumpInputs (0, default off) to enable re-dump of inputs at each pass. This fixes the lost of input resource's intermediate update if it was already dumped previously but the intermediate passes written to it was filtered out. Enable it will increase the memory footage.
Custom Render Passes now support the Scene Capture "Exclude From Scene Texture Extents" flag, to allow large custom render passes to run without increasing other Scene Texture memory.
Fix memory corruption in cooked builds when a loaded texture mip is larger than expected at cook time.
Fixed mismatches in material quality level for building texture streaming when saving materials and material instances through the editor.
Lighting
New:
Day Sequence
Added OnPostEnableModifier to DaySequenceModifierVolume.
Added GetTargetApparentTimeOfDay to fetch the target static time for active static time contributors.
Updated GetStaticTimeOfDay to return GetTimeOfDay when there are no active static time contributors.
Added internal support for StaticTime channels to compute the blended target time of day.
Added support for blending blend weight over a fixed duration to DaySequenceModifierComponent. Previously the Blend Time property was only active and available when the DaySequenceModifierComponent was in Time mode, where it would describe the fixed time to fade in/out the effect on entering/exiting the bounds of the component. Now, Blend Time will also apply in Volume and Global modes, where the Blend Time influences the duration it will take to transition from the current blend weight to the target blend weight. This can be useful for more gradual transitions where it is possible for the blend distance/user blend weight to vary dramatically over a short period of frames.
"Diffuse Ambient Captures" are an experimental feature added in 5.8 for the mobile renderer. These are a modification of the existing reflection capture functionality to use time sliced runtime capture, instead of baked, and include diffuse ambient irradiance in low mips of the reflection cube map to simulate indirect lighting.
See r.ReflectionCapture.Runtime.* CVars for additional configurability options (budget of active captures, whether to include translucency, fast capture on teleport, etc).
Enabled by CVars r.ReflectionCapture.Runtime (enables time sliced runtime capture) and r.Mobile.DiffuseFromCapture (enables diffuse ambient irradiance).
Change Hair LUTs (dual scattering, directional albedo, coverage) to be resources loaded on demand instead of being recomputed at load time. This allows to enable hair LUTs on all platforms, while before it was disable on some platform for cost reasons.
Added option to populate scene HZB with hair depth data.
Added hair strands occlusion to SSS transmittance.
Editor optimizations when using the r.ReflectionCaptureUpdateEveryFrame CVar. Hidden reflection captures no longer refresh, and an alternate setting of the CVar to "2" only updates selected captures.
Improved perf when updating Rect light atlas.
Forced rect light atlas to reset when changing the atlas filtering type.
Add common functions for blue noise sampling to reuse sampling logic across View and BlueNoise resources.
Unify r.SkyLight.RealTimeReflectionCapture.PreExposure and r.Lumen.CachedLightingPreExposure into r.EyeAdaptation.CachedLightingPreExposure as they both do the same and usually should have the same value.
Decrease default r.EyeAdaptation.CachedLightingPreExposure to 4, which is a better balance between lighting around 0EV and PBR correct lighting, which can push towards 16EV.
Add screen warning when current exposure is outside of supported range and lighting will be clipped.
New BP function on AGameUserSettings: IsGlobalIlluminationAllowed which can be used by a game's Blueprints to set the PPVolume depending on whether GI is enabled.
Added ubershader permutation to VirtualShadowMap projection shader.
Distance Fields: Remove distance field shader permutations when distance fields are disabled in project settings.
Add uber shader permutation for VolumetricFog.
Disabled scene light scattering for hair as it can create artifact at silhouette.
Added ubershader permutation to FDeferredLightPS.
Allow distance fields to run on GRHIDeviceIsIntegrated. This check was added a decade ago to prevent issues on some outdated drivers, but nowadays it prevents some pretty capable SM5 GPUs to run distance field features.
Bug Fix:
Day Sequence
Fixed DaySequenceModifierComponent's Time mode blending causing visual popping artifacts.
Fixed timed blends for global/volume modifiers to account for DSAs with non-zero budgets or sequence update intervals.
Disabled DaySequenceModifierVolume actor ticking.
Fixed time blending to account for non zero tick interval setups. Fixed time blending causing modifiers to turn on at BeginPlay() even when the player does not spawn in the volume.
The modifier component is now the root component of the DaySequenceModifierVolume actor.
GetBlendWeight() is now used to determine the enable state of a DaySequenceModifierComponent.
Rect Light Atlas filtering fixes and optimizations.
Fixed box filter which was reading uninitialized values and then multiplying them by 0 which causing bad things to happen in the mip chain.
Optimized r.RectLightAtlas.FilterQuality=1 by replacing 25 taps with a gaussian filter approximation using 13 bilinear taps. New filter blur a bit more but results look good. This also fixes bug in previous filter which was skipping taps on borders.
Fixed incorrect light function scissor rect when using the hair lighting path with RT shadow enabled.
Multiply Lighting.Transmission by LightData.DiffuseScale in order to preserve overall light energy. Without it certainly shading models like eye or hair were too dark for high diffuse scale values.
Fixed missing light function on hair strands when using RT shadow.
View lighting channels now work for mobile directional lights.
Fixed incorrect tangent during material evaluation when using discret hair strands LOD.
Fixed per-object shadow size not being correctly clamped to the max shadow size.
Fixed incorrect hair transmittance in splitscreen when VSM one pass is used.
Fix r.SSR.Compute=1 in splitscreen.
Fix hair cards having incorrect tangent orientation when using TwoSided.
Fixed FastLog_N for correct logarithm calculation.
Fixed pooled buffer and texture memory leaks in GlobalDistanceField when changing global distance field resolution at runtime.
Fixed an issue where Variable Rate Shading was not properly applied to the ReflectionEnvironmentAndSky pass even when r.VRS.ReflectionEnvironmentSky was enabled.
Decrease max spotlight culling angle in order fix float precision issues in RayInfiniteConeVolumeOverlap causing ray tracing lighting grid to be broken for 90 degree spotlights.
Fixed usage of LowResCubeViewPtr in RenderCubeFaces_SkyCloud.
Deprecated:
Deprecate SSGI (Screen Space Global Illumination). SSGI is superseded by Lumen GI.
Lumen
New:
New Lumen Medium Quality, which is 2x faster than Lumen on High Quality, while maintaining art direction for lighting. Lumen Medium Quality is targeted at low end PC and handhelds.
Enabled by setting GI and Reflection Quality to Medium (sg.globalilluminationquality 1 + sg.reflectionquality 1 console commands in game).
Lumen Medium Quality is 4 components: Faster opaque GI through Irradiance Field Gather, faster reflections, faster GI on transparency / fog and faster Lumen Scene.
Irradiance Field Gather is an irradiance field with probe occlusion and automatic probe placement that reuses Lumen's World Space Radiance Cache. Interpolation to pixels is downsampled and relies on TAA to reconstruct at full resolution. Probes which are placed inside geometry are detected during tracing and ignored during interpolation. Probes are moved outside geometry using the GBuffer. This helps overall but needs improvement as it makes the lighting view dependent, especially indoors.
Indirect specular comes from Screen Space Reflections for smooth surfaces, and cheap rough specular from radiance probe mipmaps for rough surfaces. No rays are traced for reflections.
Lumen Translucency GI Volume shares the Radiance Cache used by Irradiance Field Gather, with a Clipmap Bias.
Lumen Scene uses a smaller Surface Cache atlas and skeletal meshes are disabled for tracing.
Added missing skylight leaking to Lumen Translucency Volume. This was causing lit translucency and volumetric fog to be too dark when skylight leaking was used.
Reduce transient memory usage in Lumen Radiance Cache by compositing into smaller temporary atlas presized just to hold probes updated in the current frame.
Reduce dissoclussion artifacts by using stronger probe spatial filtering for newly uncovered Lumen Screen Probe Gather pixels.
Added hair strands support to LumenIrradianceFieldGather.
Fix black splotches on dissoclussion and tighten probe interpolation to recover more indirect detail.
Added constant bias for radiosity and Screen Probe Gather. Radiosity and Screen Probe Gather use r.Lumen.HardwareRayTracing.SkipBackFaceHitDistance for biasing, but heavily simplified RT mesh geometry can still have internal front faces causing self-shadowing issues. It's good to have an ability to fix that or at least to check at runtime whether this is the case.
Boost priority of currently used high res surface cache pages in order to reduce lighting update lag in reflections.
Increase number of World Space Radiance Cache probes updated per frame on Epic scalability level. This helps with lighting convergence on fast camera movement in large games.
Reduce radiosity num frame accumulated atlas size to have one texel per card tile which saves almost 16mb of memory.
Remove surface cache opacity to save 16mb of memory and remove lots of shader permutations.
Removed r.Lumen.HardwareRayTracing.SurfaceCacheAlphaMasking, which allowed to retrace ray if it hit something transparent. This feature was disabled by default as it slows down tracing and now we have a better way to handle holes in Landscape by removing triangles from geometry. In theory it could be used also for alpha masking simple objects like fences, but it wasn't a popular use case.
Removed alpha masking from heightfield tracing (detail traces for heightfields). This is a pretty slow path, which doesn't make much sense given proliferation of GPUs with RT support.
Reduce Lumen Reflections artifacts in dissocluded regions.
Improve Lumen Reflections denoiser behavior on non-planer surfaces with low-roughness where ray hit based history reprojection was smearing reflection results during movement. This adds a bit more noise on planar surfaces, but makes reflections less smeary on everything else.
Added control over Lumen Ambient Occlusion Intensity to Post Process Volume.
Lumen Scene Direct Lighting: Skip tracing against Near Field geometry when originating from a Far Field mesh.
Less aggressive culling of small objects from Lumen Scene on Epic and Cinematic GI quality. Reduces pops in emissive lighting and black spots in reflections from small objects.
Reduced r.LumenScene.SurfaceCache.CardMinResolution from 4 to 2.
Remove r.Lumen.Supported.SM5 as it was deprecated 2 releases ago and no longer functions correctly.
Remove r.Lumen.ScreenProbeGather.IntegrateDownsampleFactor 2 from High scalability as it was generating too much noise and softening normals. This has to be now manually tweaked per title for a more explicit tradeoff.
Make radiosity atlas optional for better scalability. This removes costly radiosity atlas clear (0.12ms) and 24mb memory on a certain console with lower surface cache settings.
Added r.Lumen.ScreenProbeGather.ScreenTraces.HZBTraversal.SkipUnlitHits, which allows to skip unlit shading model hits. This allows to work around GI noise from tiny emissives.
Reduce GPU memory usage by not aligning radiance cache height to nearest pow2. This saves ~50mb on a certain console.
Enabled Lumen applying height fog to reflection ray hits by default (r.Lumen.HeightFog 1).
Reduces the mismatch between screen traces and other trace types in heavily fogged scenes (but screen traces are still fogged incorrectly).
However r.Lumen.HeightFogOnGI is still 0 to save a little perf (missing out on fog inscattering in heavily fogged scenes).
Fixed double-fogging of reflections from SampleSceneColorAtHit and DistantScreenTraces.
Fixed ScreenProbeGather rays fogging using MaxTraceDistance when falling back to the Radiance Cache, causing too much fog. This also fixed Skylight Leaking applying too much on Radiance Cache hits.
Cost is about.03ms on High GI settings on 2080 at 1080p.
Bug Fix:
Fixed Lumen Screen Probe Gather trace visualization not working when visualization mode is disabled.
No longer marks unlit materials as pixels which trace dedicated rays in the Lumen Performance View.
Use DeviceZ directly instead of converting it back and forth through ConvertToDeviceZ(ConvertFromDeviceZ(DeviceZ)). ConvertToDeviceZ has a small fudge factor in order to prevent from divide by zero / return finite SceneDepth for empty pixels. So such back and forth conversions will drift DeviceZ value causing artifacts in the distance.
Fixed Lumen card diffuse color accumulation with Substrate-Adaptive.
Fix Substrate-GBuffer subsurface shading model artifacts when using Lumen hit-lighting, cause by an incorrect subsurface color in ray hit payload.
Fix for rare crashes in EvaluateGlobalDistanceFieldHit caused by a memory fault when reading GlobalDistanceFieldPageObjectGridBuffer or when using data read from that buffer.
When Lumen GI is enabled but Lumen Reflections and SSR are not, use Rough Reflections from GI instead of falling back to unshadowed skylight via ReflectionEnvironmentAndSky.
Fix compilation errors when changing LUMEN_MAX_VIEWS.
Fix out of screen bounds reads causing GI artifacts on edges in split screen.
Fixed linear screen traces (r.Lumen.ScreenProbeGather.ScreenTraces.HZBTraversal 0) being broken due to FurthestHZBTexture not being set properly.
Fixed Lumen visualization exceeding dispatch limits and causing rendering artifacts when using 4k render resolution.
Materials and Shaders
New:
Subsurface Profile
Add separated subsurface diffuse path to allow SceneColor as RGB format. Adds an alternative to storing subsurface diffuse luminance in SceneColor.a: A dedicated R16F texture (SeparatedSubsurfaceDiffuse) accumulates diffuse luminance via additive MRT blending or UAV read-modify-write, allowing SceneColor to remain an RGB format (e.g. FloatR11G11B10) without requiring checkerboard encoding. This would fix shadow flickering due to checkerboard, allow higher resolution and support VRS. New CVars:
r.SSS.SeparatedDiffuse.Enable (RenderThreadSafe) runtime toggle. The feature is mutually exclusive with Substrate opaque rough refraction (which already separates diffuse in its own buffers) and is gated behind the per-platform support CVar.
r.SSS.SeparatedDiffuse.Supported (ReadOnly, per-platform) controls shader permutation compilation via SSS_SUPPORT_SEPARATED_SUBSURFACE_DIFFUSE. Add the dedicated R16F texture allocation and binding. Should not enable on low end systems.
Migrate old profiles to new settings. All newly created profiles is more closer to pbr. 1. After this change, all newly created profile will use transmission matching to the preview except that it shifts by half pixel to avoid high intensity for small transmission. 2. Old profile used with Ray traced shadow might look a little bit different and requires an eye on it.
Improve the UX of subsurface profile editor. 1. Add subsurface profile presets from Jensen et al. 2001. 2. Add diffusion preview. 3. Add transmission preview. 4. Add a thickness slider to inspect transmission profile and the diffusion process on the surface or at a certain depth like for back scattering.
Shader layout is now determined using translation output, instead of conservative Material Asset based heuristics. This leads to a decrease in shader counts and can be toggled using r.Material.UseShaderCompilationParameters.
Add Material Parameter Subgroups! Similar to Blueprints, subgroups can now be added using the separator '|'. All parameter groups from inside Material Functions are included in the Base Material and modifying their Priorities is made easier using a streamlined UI in the Base Material's details panel.
Added virtualized file support to the UBA controller used for shader job distribution when using UnrealBuildAccelerator (along with some other optimizations/improvements). This effectively eliminates a class of I/O bottleneck submitting shader jobs (and so provided sufficient helper agents, we can effectively now compile shaders as fast as the cooker/editor are able to generate the work). High level summary of these changes:
Use UBA's virtual file mechanism for all inputs and outputs instead of needing to write them to disk and read them back unnecessarily, when the r.UbaController.UseVirtualFiles cvar is set to true (default on windows, currently disabled on mac/linux due to missing uba shared memory implementation)
Skip serializing source to the SCW input files in this case, instead registering additional virtual files for each source object and fixing up the FShaderSource on the SCW side after deserializing the input (avoids most of the memory overhead of having to keep the input files around in memory for the duration of the UBA task)
Remove unnecessary attaching of dependent source files to distributed build task; these are no longer needed since preprocessing occurs in the cooker process (also fix up fastbuild and sndbs controllers which were still using this)
Remove unnecessary temp file creation and file move in SCW; this is not needed when not actually writing the files to disk (and probably was never needed for UBA in general since it operates with completion callbacks instead of disk polling)
Modify job processor thread to use an event for synchronization with the controller module instead of sleeping; the controller will trigger the event whenever new jobs are added and wake up the thread if it's currently blocked.
Remove unnecessary serialization of debugdescription to SCW input files; these are large, was causing both memory bloat and slower task "file" creation.
Bump threshold at which cooker throttles package processing due to pending job queue; this was unnecessarily low.
Modify behaviour determining count of agents to request and how many local cores to use. always use the number of cores available to us (similar to how local workers would operate), base remote help request based on the total queue size (not just how many we've currently submitted), update the latter on an interval to prevent getting stuck processing a big queue and only modifying how much help we ask for after the queue is fully processed.
Enabling PropertyMatrix for UMaterial assets.
Default Textures Memory Optimization. Even if referenced by the base Material, all default material textures which are not used for rendering are now not loaded at runtime. This can be toggled using r.Material.StripUnusedDefaultTextures.
Translucent Materials no long compile the non-skylight version of base pass pixel shader to reduce shader permutations and instead always use the skylight version w/ a dynamic branch.
This leverages the existing branch in `GetSkyLighting` (`if (UseBasePassSkylight > 0)`) to determine if we should render the skylight. When Lumen is enabled we don't even take this code path.
For opaque materials we already just pick the non-skylight version (and skip compiling the skylight version).
In `FBasePassMeshProcessor::Process` if we are translucent we need to sure to always render with the skylight version of the shader.
In CreateTranslucentBasePassUniformBuffer we set the uniform (UseBasePassSkylight) whether or not the scene has/wants a skylight. Like before if Lumen is enabled we never take this branch. minor | Rendering - Materials and Shaders.
Reduced the number of materials which are automatically exempted from Variable Rate Shading.
Only materials using Pixel Depth Offset or Masked blend mode will be exempted, and only from Hardware VRS.
The Pixel Depth Offset exemption has been narrowed to only include materials which actually evaluate PDO at runtime.
IsVariableRateShadingAllowed() will now return bAllowVariableRateShading directly rather than reflecting exemptions.
Added a new 'SpiralBlur - Texture' material function using manual derivatives (ddx and ddy) to calculate the correct mipmap level.
Wrapped firstbithigh with WaveReadLaneFirst in WaveGetActiveLaneIndexLast to ensure SGPR usage on AMD.
SLW: Add Motion Vector World Offset node support to Single Layer Water shading model.
Change material shadermap layout and content hashes to fshaderhash (xx64) instead of sha1. This saves 12 bytes per shader in both the shader library metadata, and shader map lookup structure, and further is much faster to compute. This theoretically comes with a risk of shader collisions but it's extremely unlikely in practice. The mechanism was factored out such that the underlying implementation of FShaderHash can be somewhat easily swapped, provided the thing it's swapped to has the same API (so i.e. switching back to SHA1 as an emergency safety valve should be trivial).
Duplicating a Material Function now sets bExposeToLibrary as false by default on the new Material Function, to avoid exposing them automatically to the Material Editor Palette.
Add cook-time hash collision detection to the shader library population code; this is safety measure due to recent change to 64-bit hashes. The likelihood of collisions is exceedingly low, but this gives us assurance that any possible shader mismatch issues are not caused by hash collisions.
Added 2 new Blueprint Nodes for getting and setting values for Material Instance Parameters overrides.
UX adjustments to Material Editor: Shader Code window Added permutation name to shader name in the material editor's show shader code tool (simplified name in the list + full permutation name in the tooltip) to avoid seeing duplicate names in the list.
Add GetMaterialUsedTextures which accepts a UMaterialInterface so it cleanly works with UMaterials and UMaterialInstances alike.
Deprecate the existing GetUsedTextures which only accepts a UMaterial and forward its calls to the new BP function.
Add a Named Reroute palette in the Material Editor.
F Material Editor
:OnNodeTitleCommitted needed special case code to refresh the palette when you change the reroute declaration's name on the node directly itself.
:OnFinishedChangingProperties needed special case code to refresh the palette when you change the Name or NodeColor on the declaration.
Adds a SMaterialNamedReroutesPanel class and add it to the MaterialEditor.
Need 3 separate locations in the code where reroute declarations can change and I needed to handle refreshing the reroute panel:
Add a OnGraphChangedDelegateHandle to the MaterialGraph to handle changes to the node graph like duplication, add, or removal to catch when the reroute palette should update. The graph changed delegate blindly refreshes the palette on any graph change.
Similar to the "Named Reroutes" section in the material right click menu, this is a tab on the left side which is a list of all named reroute nodes.
Refactor UMaterialGraphSchema::GetNamedRerouteActions into a public function so both the graph and the palette can discover all reroutes with a common function.
Refactor common code into FMaterialEditor::SelectNamedRerouteUsages to find all reroute usages in the graph from a given declaration expression. This is used in the context menu in the palette and in the graph.
Physical Material is now displayed as an overrideable parameter.
Adapt Deferred Decal invalid blend mode warnings for Substrate.
Remove shader compile warnings from shader DDC records. The only mechanism that used this data was logging of shader warnings on job cache hits or shadermap load (optionally, disabled by default), which is of questionable value. It was decided that due to the amount of storage this consumed in DDC as well as constant issues with non-determinism, that the cost was not worth the value of the feature.
Modify the material diff tool to work on Material Functions.
The code in SMaterialRevisionMenu::MakeDiffMenu explicitly only looked for objects that inherit from UMaterialInterface which won't include Material Functions.
I've just changed the logic to consider any valid UMaterialInterface or UMaterialFunctions that are not transient.
~19% optimization to LoadStableKeysFile by preventing unnecessary allocations by reserving the TArray size for all shader entries.
7511 seconds → 6029 seconds in my large test file with millions of entries. minor | Rendering - Materials and Shaders.
Added the same tooltip to material parameters in the Parameters panel of the material editor tab as in the material instance editor in order to help the user understand where the parameters come from (especially useful in combination with when r.Material.PedanticErrorChecksEnabled 1 is used, in order to detect where the differing parameter values come from).
Prevent warnings when cooking a material asset with no set Usage Flags. The warning will still be triggered in case a Material which has usage flags and should have shaders but has an empty shader map, along with all other cases. This is meant to be used in case the removal of shaders caused by a Material Asset which is not used for rendering is desired, but the Material Asset itself is not easily removable because of asset dependencies.
Add permutation count to the recompileshaders listtypes command Looks like this: ``` ShaderTypeName, Filename, PermutationCount FBufferTextureMappedCopyCS, /NNEDenoiserShaders/NNEDenoiserShadersMappedCopy.usf, 125 FTextureBufferMappedCopyCS, /NNEDenoiserShaders/NNEDenoiserShadersMappedCopy.usf, 125 FStochasticLightingTileClassificationMarkCS, /Engine/Private/StochasticLighting/StochasticLightingTileClassification.usf, 3072 ```
Adding bespoke "UI Material" option in the content browser's new asset menu.
Explicitly disables used with static mesh usage flag so all new UI materials don't automatically have extra static mesh shaders.
Turn off automatically set usage flag that way users don't accidently turn on usage flags and add more shaders.
Set the new material's domain to UI.
Material is created with the following name: "M_UI_Material" minor | Rendering - Materials and Shaders.
Use a ListView to display all the shaders a material has in the Material Editor instead of a combo box.
Update the code to use a SListView instead of SComboBox.
Move the SListView into a splitter so it is side-by-side with the Shader Code.
This makes it easier to see all the shaders at a glance.
Update the Shader Code Tab to include the full platform string which includes the quality level. minor | Rendering - Materials and Shaders.
Added new "GetExpressions" Blueprint node to utility Blueprints, which can be used to get all expressions of a Material.
Display Total Shaders as a SNotificationBackground as an overlay in the bottom right hand corner of the Material Editor and Material Instance Editor Viewport.
The goal here is prominently display the number of shaders that this material has. That way as a user modifies the material they can see live the impact of their changes when changing usage flags, or plugging in WPO.
SNotificationBackground is an overlay in the bottom right corner of the material viewport.
UpdateMaterialInfoList is called every tick, and we quickly query the material resource to estimate the number of shaders the material would have. This number matches the PlatformStats panel.
Since the Material Stats owns the calculation of the shader count this code can be leveraged in the Material Instance Editor.
In the Material Editor we use the preview quality level for querying the shader count.
No longer displays this widget if we are editing a Material Function.
Improve Material Instance Editor start-up time by 40%!
Fix translucent materials not showing up in shader complexity view mode.
Since we now only compile the skylight version of BasePassPS for all translucent materials (to save shaders), the non-skylight version of the shader is missing.
Debug viewmode rendering was always asking the material for the non-skylight version with the assumption that this shader would always exist.
Since the shader no longer exists I needed to special case the logic. If we are a translucent material we need to get the skylight version of the shader to get instruction count.
Adds UMaterialEditingLibrary::ListShaders which will return an array of all shaders that material will compile.
This returns a list of FDebugShaderInfo, which contains the Vertex Factory Type Name and the Shader Type Name for each shader in the material.
Re-implement the `GetNumShaderTypes` to simply just return the length of that array returned by ListShaders.
Handle null shader types, or if a VF type is null (non mesh-material shaders) minor | Rendering - Materials and Shaders.
Add Select Focused Nodes feature to the Hide Unrelated Nodes mode for the Material Editor. This automatically selects all the nodes that are focused based on the options selected for "Hide Unrelated Nodes".
Material Functions Tooltips in the Material Editor Context Menu now show the full path, to help differentiate between functions with identical names in different locations.
Material Instance Editor Parameter tooltip now shows all parameter override sources, instead of the first one.
Added Tagged Asset Browser implementation for new Material Wizard. Contained in default enabled plugin.
Old factories removed from UI if browser is not setup in Material Editor Settings.
New factories with wizard added to UI if browser is setup in Material Editor Settings.
Optimized linear array search in UMaterial::GetAllReferencedExpressions to avoid N^2 behavior. Observed speed improvement for switching preview platform of up to 50s (58s → 8s).
Mask Nodes tooltip information now reflects which ones lead to new permutations, to help avoid creating shader permutations.
Shader Pipeline Cache Tools: Added a command line facility to extract a shader from ushaderbytecode by its hash (for debugging / analysis).
Make material editor log errors hyperlinks. This is to bring visibility to the fact that it is possible to click on the log line to jump to the Node in question when errors are presented. It also brings the Material Editor in line to how the Blueprint Editor works where by any nodes present in a log line are hyperlinks that can be clicked.
Bug Fix:
Fixed shader compilation test to check for wave size capability of the platform for BitonicSort and cook missing permutations.
Fixed WaveGetActiveLaneIndexLast for 128 wave size.
Velocity: Fix Material with PDO breaks velocity output in prepass. ScreenPosition calculated from Input.PackedVelocityA (SvPosition and packeVelocityA interpolate differently and can cause depth mismatch) creates +- 1 ULP of depth difference when compared to the logic in the basepass if PDO is use. It fails depth stencil equal test.
Fix invalid default compilation value in LandscapeLayerBlend which could cause issues if used in conjunction with Material Attributes.
Fixed horizontal scrollbar behavior in material stats shader list view.
Subsurface Profile: Store specular luminance for the additional R16F texture path instead of diffuse luminance to fix error amplification due to quantization. Add r.SSS.DebugPixel to show what happens in the recombine pass if shader print is also enabled.
Fix stack overflow crash in the Material Editor when making loops in the graph w/ reroute nodes.
StaticSwitchParameter plugged into a RerouteNode plugged back into the same StaticSwitchParameter.
This created a cycle: Reroute::IsResultMaterialAttributes → TraceInputsToRealExpression → StaticSwitchParameter::IsResultMaterialAttributes → back to Reroute.
This affects any material expression that overrides IsResultMaterialAttributes and recurses into its inputs (StaticSwitch, If, QualitySwitch, FeatureLevelSwitch, LandscapeLayerSwitch, etc).
Add ContainsInputLoop() guards to all fourUMaterialExpressionRerouteBase methods that delegate to resolved expressions: IsResultMaterialAttributes, IsResultSubstrateMaterial, GatherSubstrateMaterialInfo, and SubstrateGenerateMaterialTopologyTree.
Refactor the code to reduce duplication between all 4 implementations of that function.
Fixed a rare stomp that could occur in shader preprocessing when the end of the inline buffer is hit when adding SSE padding via arrsetcap in copy_to_action_point and copy_to_action_point_macro_expansion. This capacity increase could potentially reallocate the buffer, causing the cs→dest output pointer to become stale - and this pointer is used to set the output length in the subsequently called copy_and_filter_macro function. in the case where this buffer allocates, and the length set is required, this would write 4 bytes into a freed buffer. This should hopefully fix a variety of very rare crashes that occur when preprocessing shaders (small but non-trivial numbers of these have been reported for every release since the new preprocessor was introduced).
Fix performance issues caused by Material Instance validation happening every tick.
Added a wait on shader compile job submission tasks during shutdown; this fixes crashes that can occur when these are still in flight when shutdown is requested. This class of crash manifested more frequently on low-core-count systems (and was easy to reproduce with -corelimit=2 and a 100ms sleep added to the submit job task via r.ShaderCompiler.DebugStallSubmitJob=100).
Fixed an incorrect length calculation in macro arguments in the shader preprocessor. This manifested when preserving leading whitespace (in the case of multi-line macro argument lists), and resulted in incorrectly truncating the result array due to not accounting for the re-added whitespace characters. Unclear whether this caused any real issues in practice.
Fix up Material Parameter duplicates validation errors when using r.Material.PedanticErrorChecksEnabled=1. Before, this was reporting only the parameters with different Default Values than the first one chosen by the code, which can be random. Now, when a duplicate with a different Default Value appears, all are reported, with their respective values and their asset paths.
Fix crash happening when attempting to preview TextureObject material graph node.
Fix crash happening when attempting to use a Custom Preview Mesh which has Nanite data, in a Material Function Editor when no Material Expressions are selected for previewing.
Fix crash happening when trying to open a material with missing expressions.
Fixed a bug in Common.ush for a duplicate definition of DivideAndRoundUp128, which shadows the correct definition of DivideAndRoundUp128 to divide by 256 instead.
Fixed input pin display name when using Mip Value Mode "Mip Bias" on a virtual texture sample material node.
Prevent all dependent material functions from becoming dirty when using the material parameters panel on a material.
Fix a bug where base property and usage flag changes in a parent material would not propagate to loaded children MaterialInstances and not propagate to opened Material Instance Editors.
The issue was that we would call `RebuildMaterialInstanceEditors` to refresh the MI Editors _before_ we actually updated the MI itself.
The MI itself would get updated in the destructor of `FMaterialUpdateContext UpdateContext`, but the call to `RebuildMaterialInstanceEditors` was still in the scope of the update context causing it to pull stale data.
To fix this I've moved the call to RebuildMaterialInstanceEditors and the UpdateContext to inside `RecompileMaterialInternal`. This way each call site doesn't need to manage the context and the call to RebuildMaterialInstanceEditors.
The call to `UMaterialEditingLibrary::SetBaseMaterialUsage` was correctly calling RebuildMaterialInstanceEditors outside the scope of the update context. To avoid a duplicate call, I've removed the call to rebuild instance editors.
Remove UE_API on private functions in the mat editing library. minor | Rendering - Materials and Shaders.
StaticSwitchParameter material expressions now validates so Material Attributes cannot be combined with scalar or vector values.
Fix shader job infinite compilation bug which could happen when a shader was requested through BeginCompileShader but then never be submitted because another shader in the same request with a different frequency would not pass ShouldCache conditions and the method would early return.
Fixed a rare deadlock in the shader library when mounting chunks.
Ensure material resources and shaders are compiled when creating new material assets so their thumbnail renders correctly.
This fixes a bug where all newly created materials would render their thumbnail with the default material.
Without these changes there was no rendering resource and UMaterialInstanceThumbnailRenderer::CanVisualizeAsset would always return true since IsCompiling always returned false.
Submit background shader compilation jobs, and let the thumbnail system handle calling CanVisualizeAsset to see if we are ready to render. minor | Rendering - Materials and Shaders.
Fix performance issues or hitches caused by Color Picker hitches when editing. SColorWheel and SColorSpectrum now have High Precision Input enabled only when requested by the user(Control held down) and not by default.
Fix editor performance issues caused by MaterialStats Manager triggering shader compilation on Scalar and Vector params modification.
Holdout: Fixed when refractive material IOR is active and not 1.0f, it is set to be fully opaque and matches path tracing.
Fixed invalid output type returned by StaticSwitchParameter expression causing it to be unusable with Texture2DSamplers or similar expressions that do not accept float as input.
Fixed UMaterialExpressionParticleSubUV::Compile bug that caused the node not to use texture object connected to the Texture input pin.
MegaLights
New:
Added anisotropy support when Substrate is enabled.
No longer traces multiple rays towards the same light if it's not in a penumbra. This greatly improves performance (0.3-1ms on console, depending on the scene).
Added IES support to volumes (volumetric fog and translucency). When IES aren't used on lights there's no measurable performance regression.
Added r.MegaLights.ScreenTraces.Quality which allows to tweak screen space trace quality for scalability.
Added overview, shadow caster and shadow caster mismatch visualization modes. The idea here is to help diagnose issues with MegaLights shadows due to missing shadow casters or ray tracing proxy being too simplified. This visualization can be also accessed using r.MegaLights.Visualize CVar.
First Person Geometry support.
Visualize and color rays based on the number of iterations (on supported platforms). This helps with finding RT performance issues caused by content. Controlled by r.MegaLights.VisualizeRays.
Early cull lights by light power and falloff. This allows it to quickly skip lights, which don't contribute to the final pixels and reduces light sampling by ~20% in Firefly without adding any measurable cost to light grid culling. This heuristic isn't entirely correct, as it assumes a pure diffuse surface. For example, light specular (shape) is visible infinitely far away in a perfect mirror, but this change will cut it off. Still in practice it works really well and it's hard to spot any missing energy. r.MegaLights.LightAttenuationFalloff 0 can be used to disable it.
Added transmission support. For Subsurface and Subsurface Profile shading models it flips ray direction (if ray would enter the surface) in order to estimate distance, which ray traveled through the mesh.
Per light transmission flag and r.MegaLights.Transmission controls whether it should be enabled. This controls transmission for subsurface, subsurface profile and foliage two-sided for all lights (raster path behavior depends on the light type).
R.MegaLights.Transmission.SampleWeight controls assumed surface transmission for sampling, which can be used to tweak sampling noise of surfaces with transmission.
Remove guiding by light area as while it improved quality in some static scenes it was causing too many artifacts during light or object movement.
Improve detail and lighting convergence speed and details near regions without any light influence.
Improve spatial filtering lighting sharpness and details.
Reduce denoiser ghosting due to too relaxed depth test for history reprojection.
Improved lighting detail and sharpness on disocclusion.
Disable local primitive interaction when MegaLights is enabled in project settings in order to skip large CPU overhead of tracking movable primitives per light. Previous behavior can be restored by using r.Visibility.LocalLightPrimitiveInteraction 1.
Treat newly spawned lights (without a valid PrevForwardLightIndex) as visible. It greatly improves noise for muzzle flashes and similar user cases as usually newly spawned lights near the camera are visible.
No longer compiles Substrate-Adaptive specific ComplexSpecial shading tile permutations when only Substrate-Blendable is used.
Optimize GBuffer loading for tiles using simple shading (unlit or default lit shading models).
Improve lighting detail and sharpness.
Temporal filter now works with non-downsampled neighborhood. This adds a tiny bit more noise, but is much better at retaining shadows during movement and sometimes improves sharpness.
Temporal filter now has higher clamp tolerance when shading confidence is high. The idea here is that in that case we don't get much ghosting, but we can get more detail coming through the temporal. This does increase ghosting a bit during movement, but it still has less than with downsampled neighborhood.
Temporal filter now uses a soft neighborhood clamp, which help a tiny bit with some noise.
Shading confidence is now remapped to max frames accumulated in a non-linear fashion, which makes more sense given that shading confidence means how large % of incoming energy we managed to sample this frame. The result of this is a bit more.
Added bicubic history resampling in order to improve image sharpness and details during motion. First we check a 12-tap region, which is required for an optimized 5-bilinear tap Catmull-Rom filter. If entire region is valid then we use Catmull-Rom. If not, then we revert ot a 4-tap bilinear filter with per tap weighting.
Cleanup sample per pixel CVar description to indicate that final number of sampler per pixel depends also on the downsample factor. Also changed available modes to 1/2/4 as those are more commonly used that 2/4/16 and compiling that shader permutation with 16 is pretty slow. Further scaling up is possibly through the multi-pass reference mode.
Reduce material demodulation factor contrast in oder to reduce artifacts when filtering across different materials.
Added r.MegaLights.Denoiser, which allows to fully disable any internal denoising and its overhead. Useful in case of using joint denoising and upsampling at the end of the frame.
Replaced hidden sample reweighting with a max shading weight, which is applied only to hidden lights (r.MegaLights.MaxShadingWeightForHiddenLight). This fixed various dark ghosting artifacts during disocclusions.
Increase denoiser temporal filer neighborhood using center sample. This restores detail on thin elements with different lighting on background (thin branches, thin normal map lines etc.).
Control all debug types through a single r.MegaLights.Debug CVar instead of per feature CVars like r.MegaLights.Volume.Debug.
Added SSS transmission support for Substrate Format=1 on MegaLights.
Added show flags for all trace types.
Added smooth falloff for min sample weight. This allows to set min sample weight higher for scalability purposes without visible sharp light cutoffs.
Lighting channel optimizations by reducing the amount of lighting channel filtering done through AHS.
Added fast clear path to skip clearing and processing unused 8x8 screen tiles.
Reduce leaking by tightening the history reprojection depth test. This test is now also dependent on the NoV in order to fix broken reprojection when looking at a flat floor at a grazing angle. Additionally threshold was exposed as a r.MegaLights.Temporal.HistoryDistanceThreshold console variable.
Enable specular spatial filter filtering on dissoclussion. This adds cost (worst case ~0.3ms 1080p), but also removes a lot of specular noise.
Added tracing for non-shadow casting light for hair pixels.
Merge translucency MegaLights injection with the translucency temporal filtering pass in order to save on bandwidth (both passes were reading and writing translucency volume). Saves 0.05ms on console with default translucency settings and 1080p.
Improve trace coherency after compaction.
Implement Wave64 compaction. This makes compaction a bit faster and outputs a bit more coherent lists.
Add ZOrder2D to compaction for better ray coherency.
Increase compaction group size to 32 for better ray coherency This saves ~0.1ms in Firefly, 1080p, both consoles.
Skip composite for pixel without any diffuse or specular energy in order to optimize MegaLights spatial denoiser pass.
Added manual AddBarrierPass in a few spots in order to optimize barriers on platforms which don't support split barriers.
Tweaked volume sample weighting in order to reduce noise.
Removed Megalights reference permutations on PC's cooked build.
Added r.MegaLights.Supported which allows to remove all MegaLights shader compilation overhead if it's not used in project.
Bug Fix:
Fixed stochastic upsample sometimes picking up 0 weights which could be invalid samples (e.g. out of screen view rect).
Fixed shading confidence being too high in the penumbra region due to skipping ray fail penalty if it wasn't guided as visible. This improves convergence of area light shadows in the penumbra region.
Fix haloing artifact in MegaLights with Substrate Format=1 due to neighbor pixels reusing history having belonging to materials with different topology.
Fixed artifacts on borders with unlit pixels on AMD GPUs.
Fixed screen space rays picking up objects, which don't cast shadows.
Fixed missing transmittance computation on hair with MegaLights.
Fixed ray guiding in split screen.
Fixed SSS checkerboard being too bright and Subsurface Profile Transmission BaseColor mismatch.
Fixed crash when enabling "r.MegaLights.HardwareRayTracing.EvaluateMaterialMode 2" due to a missing ray gen shader.
Fixed issues where float quantization was applied to all pixels, including pixels marked with INVALID_LIGHTING, causing various artifacts on sky and unlit pixels.
Nanite
New:
Significantly improved performance of Nanite rasterization on handheld platforms.
Significantly improved performance of Nanite culling on handheld platforms.
Fix Invalid Material log spam for translucent materials on Nanite meshes.
Added new console variables for the ability to disable Nanite Tessellation in Virtual Shadow Maps at run time for scalability/performance reasons:
`r.Shadow.Virtual.Nanite.AllowTessellationDirectional` can be used to toggle Nanite Tessellation in directional light shadows.
`r.Shadow.Virtual.Nanite.AllowTessellationLocal` can be used to toggle Nanite Tessellation in local light shadows.
Added a project setting to package Nanite streaming bulk data as optional so it can be packaged in optional pakfiles.
Performance optimization: Reuse Nanite readback buffers to avoid reallocation.
Added "Nanite Pixel Programmable Distance" property to foliage types.
Bug Fix:
Fixed culling bug when running with r.Nanite.Culling.MinLOD and reenabled it.
Fixed a GPU crash that could occur when rasterizing tessellated Nanite geometry.
Fixed bug resulting in Nanite HZB occlusion not working when r.HZB.BuildUseCompute was disabled.
Fixed a crash in Nanite build that could happen from an overflow of the external edge counters.
Fixed assert in FStreamingManager::CompactLRU when resizing the streaming pool before the cluster page data was allocated.
Added some new Nanite Assembly build errors when the data exceeds certain internal limits (would previously crash).
Fixed a bug where it will not simplify a Nanite Assembly static mesh fallback if there's no geometry in the base (non-part) mesh.
VSM: Fixed incorrect position parameters in materials, caused by warped SVPosition in Nanite raster not being accounted for in SvPositionToTranslatedWorld. This affected various use cases, such as masked materials on Nanite skinned meshes.
Fixed a bug with Nanite Landscape materials using Displacement and Displacement Fade where cracks could appear on cluster boundaries when `r.Nanite.MaxPixelsPerEdge` is set to a value higher than 1.
Fixed a bug where the TangentToWorld accessed by the material graph would have spline deformation doubly applied on Nanite spline meshes.
Fixed a warning about memory estimate missing for Nanite skinned assembly meshes.
Fixed a bug with the ActorWorldPosition material node when it's used for calculating the previous frame WPO for motion vectors.
Fixed a bug with skinned Nanite where the previous instance-space position could be wrong when queried in the material's vertex shader.
Fixed a bug where WPO was prematurely disabled on Nanite meshes using both WPO and pixel-programmable materials when WPO Disable Distance exceeded Nanite Pixel Programmable Distance.
Fixed some rare crashes in async compilation of Nanite Assembly static and skeletal meshes.
Fixed some crashes in Nanite builder caused by Nanite Assembly parts with no bone influences.
Fixed an issue where small Nanite Assembly parts could disappear.
Fixed issue where Nanite build could crash when operating on assembly parts with different vertex formats.
Fixed a bug where Nanite Tessellation might not render on some select AMD hardware on PC.
Fixed a bug where enabling Nanite would not work on a static mesh asset that was originally created using `BuildFromStaticMeshDescriptions` with `bFastBuild=true`.
Niagara
New:
Add GPU Bitonic Sort algorithm for Particles sorting, the default (configurable) heuristic will choose Bitonic over Radix for particle count under a certain threshold for better GPU performance.
Niagara Debug Hud: Add FiltersEnabled command tuple Adds a MakeTuple entry for "FiltersEnabled=" to NiagaraDebugHud.cpp, matching the pattern used by OverviewEnabled and other existing settings. This allows bFiltersEnabled to be toggled via the Niagara.DebugHUD command, enabling global filter control without requiring per-filter commands.
Spawn By Trigger module. Spawns particles based on a bool being flipped from false to true.
Decouple project setting from scalability-based setting to enable or disable Heterogeneous Volumes. r.HeterogeneousVolumes.Allow (default=1) This option allows scalability controllers to modify the use of Heterogeneous Volumes, in conjunction with the Project Setting value EffectsQuality scalability configurations drives the Allow value based on these general rules: Allow is 1 for High, Epic, and Cinematic scalability. Otherwise, Allow is set to 0.
Add Random Jitter dynamic inputs. Allows random values to be selected based from a center value and an offset.
Add a Ramp In/Out dynamic input for floats.
Enabled Async Factory Workflows for Niagara and Material Wizard.
Removed unused cruft/functions.
Added delegate for factory window to close the window automatically when focus is lost.
Niagara Rightclick Option on Niagara Asset Tag Definition Assets to transfer previously tagged assets to User Asset Tags Also added fx.Niagara.MigrateInternalTagsToUserAssetTags command that handles the c++ defined tags within the current CB path.
Bug Fix:
Data Hierarchy Editor: Save and restore tree view expansion state across refreshes.
Prevent clamping HDR values when querying volumetric shadow maps from translucent objects.
Fixed wrong indexing in Niagara Chaos Destruction Data interface causing some particles to spawn at the origin.
Path Tracer
New:
Path Tracing
Ignore the r.RayTracing.ExcludeTranslucent cvar when the path tracer is being used.
Add support for sun color scale parameter on directional lights.
Path Tracer
Implement support for "Visible in Reflections" flag on primitives.
Allow refractive materials to automatically contribute to depth buffer.
Improve shading normals on diffuse BRDFs. The handling of normal-mapped surfaces has been improved in extreme cases for better alignment with the deferred renderer.
Improve translucent directional volumetric lighting model to better match the deferred renderer The new implementation handles directionality values greater than 1 in a way that is closer to behavior of the deferred renderer.
Improve shading response inside a point (or spot) light's radius Geometry and volumes close the a point or spot light's origin could show artifacts that were inconsistent in behavior with the deferred renderer.
Bug Fix:
Path Tracing
Fix potential crash when enabling MeshEdges flag at the same time as the path tracer.
Fix orientation of the geometric normal for scenes with instances including negative scale factors.
Path Tracer
Fix shading normals in reflections for r.RayTracing.Nanite.Mode 1.
Fix overly dark glass absorption when materials have no internal medium.
Fixed PT hair strands tangent direction.
Editor: Outliner eye toggle fails to hide static meshes when Affect Indirect Lighting While Hidden is enabled.
Deprecated:
Path Tracing: Removed rarely used EnableBackfaceCulling cvar and default to on.
Postprocessing
New:
TSR
Set Early translucency velocity pass to after volumetric cloud reconstruction (r.Translucency.EarlyVelocityPass 2) by default. TSR async pass can now overlap with passes after volumetric cloud reconstruction. The more complex those passes the more saving.
Add early translucency velocity path (r.Translucency.EarlyVelocityPass 2) to allow early TSR async overlap. The default location is after volumetric fog. Other locations are after deferred lighting, and before translucency.
Improve responsiveness of afterDOF translucency when thin geometry detection is on.
Improve high-intensity line aliasing in thin geometry detection. We extends depth-based thin edge detection to also detect bright sub-pixel lines using luminance intensity. Depth alone misses specular highlights and emissive edges that flicker under jitter. It's enabled by default with a new CVar r.TSR.ThinGeometryDetection.Coverage.MinKeepLineIntensity (default 0.30, set 0 to disable). The cost is added due to the need of the luma texture being recorded, and it is free if temporal stability analysis is on.
Thin geometry stability improvement. 1. Add a new shading range = 3 and as default. When temporal analysis is on, run a tailored thin geo detection on non-foliage materials to improve line stability.
Add antiflickering path for thin geometry detection. So the residual flickering can be captured by the moire error. Default on. use `r.TSR.ThinGeometryDetection.AntiFlickering 0` to disable it.
Improve Thin Geometry Detection performance. Reduce RejectShading Thin Geometry LerpClamp3x3() logic VGPR pressure by reusing existing VGPRs, swap MinMax3x3 by consecutive calls. This increases the occupancy from 40% to 60% on some consoles (saving approximately 0.1ms), back to the occupancy without thin geometry detection.
Add weight modification optimization with tiling logic for the weight relaxation pass.
Add r.TSR.ShadingRejection.Mode for temporal stability control. Default 1 to improve shading flickering.
Added a standalone mode to AddPostProcessMaterialPass, allowing it to execute outside or before the regular scene render.
Added CVar r.LUT.Shaper for developer control, and defaulted the setting to Log2 for speed over PQ, even in HDR.
Moved ACES calculations to a secondary LUT for speed.
Stopped precaching FLUTBlenderCS during launch because it's unlikely to change permutations and hitch during gameplay.
Added support to configure HDR paper white through GameUserSettings.
Improved HDR UI composition by modifying the default of 300 nits to 203 nits to match BT.2408 and blending in gamma space by default to approximate SDR behavior.
Added more vignette options. Vignette can now be rendered as an analytical circle, or from a texture. Vignette can now be moved, scaled, colorized and feathered.
Moved CombineLUTs to async compute.
Added support for ACES 2.0 in SDR and plumb HDR display info from RHI.
Added ColorParade, VectorScope and ColorHistogram color grading visualizations. Can be enabled with ShowFlag.VisualizeColorGrading.
Removed code paths to generate the tonemapping LUT using pixel shaders and the ability to have a 2D LUT, compute shaders and 3D LUT only.
Forced alpha writes to remove the clear from tonemap for PF_A2B10G10R10 outputs because clears can be slow on some GPUs.
Added r.PostProcessing.Debug.Property. When set to the name of a property in PostProcessSettings, the source of the value for that property will be shown in ShowFlag.VisualizePostProcessStack.
Bug Fix:
SSAO: Fix manual filtering of SSAO sampling outside the border of viewport.
TSR: Fix memory spike at camera cut and teleport. It is caused by the texture 2d array size mismatch of history color at the time. A new texture needs to be allocated while the old one still exists.
Implemented weak pointers to track PostProcessVolume lifetimes to prevent use-after-free. Previously, incorrect use of the API would cause occasional crashes.
Fixed incorrect scene texture sampling uv in postprocess materials after TSR, caused by incorrect viewport calculations. This also affected related variables such as screen and world position.
Clear letterboxing with transparent alpha when r.TransparentViewportClear is set.
Fix absolute world position coordinate is queried at wrong coordinates due to dynamic resolution in PPM.
Fix incorrect velocity Scene Texture Data indexing in post processing materials when viewport size ~= buffer size.
Fixed 'dark outlining' artifact seen in some depth-of-field scenes caused by incorrect scatter occlusion test in hybrid scatter pixel shader. The scatter occlusion output from the gather stage is stored in encoded coc radius units, while the scatter occlusion shader works with output coc radius, which lead to false occlusion of scattered bokeh.
Fixed aliasing artifacts in depth-of-field caused by undefined behavior in reduce pass around shared memory access.
Fixed issue where Showflag.VisualizePostProcessStack was drawing to an uninitialized texture.
Ray Tracing
New:
Adding support for Linear Swept Spheres (LSS) for ray tracing of hair strands Raytracing of hair strands will take advantage of LSS primitives on nVidia Blackwell GPUs, reducing memory usage and improving performance compared to the intersection shader based implementation.
While using the fallback RTPSO, display an on-screen warning and only log once.
Transmission: Add CVar to skip transmission denoising for ray traced shadow r.Shadow.denoiser.transmission 0. When transmission is disabled, all noise is expected to be denoised in the temporal upscaler. This can be used to deal with potential transmission bleeding of the ray tracing shadow denoiser.
Bug Fix:
Hair Strands
Fix position math not accounting for PreViewTranslation on triangle fallback.
Fix for the instance scale factor being applied twice for raytraced hair primitives.
Fix exposure handling for debug views.
RHI
New:
All D3D12 heaps with are going to be created with D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT so all D3D12 resources can start EVICTED by default and are made resident by the residency manager at submission time.
Dynamic Resolution support is enabled for PC on both DX12 and Vulkan RHIs.
Implemented ConvertRAWSurfaceDataToFColor for the PF_G8 and PF_R8G8 cases.
Updated async compute usage on D3D12 for Intel GPUs to check for hardware capability.
[Vulkan] Enabled dynamic rendering by default on desktop.
ProfileGPU log output now includes Graphics pipe wait times, which greatly improves Frame GPU time accuracy with async compute, and shows where on the graphics pipe the waits were.
[Vulkan] Added VK_EXT_descriptor_heap support (experimental).
Vulkan: Enabled async compute by default when requirements are met.
[Vulkan] Enabled specialization constants for Vulkan in DDSPI.
Stat unit console command shows GPU VRam Used and Budget debug information on discrete GPUs.
[RHI] Added support for specialization constants.
Additional asynchronous pool allocation strategy for D3D12 buffer allocators (Upload heap and Default buffer pools). The implementation pre-allocates "Overflow" pools on a background thread in order to reduce allocation hitches on the critical path that occur when existing pools become full and new pools must be created synchronously.
More compact log formatting option for ProfileGPU.
Added r.ProfileGPU.TableFormatting, which can be disabled to get indentation based formatting that's easier to read Fixed r.profilegpu.thresholdpercent being relative to the current root, it's supposed to be relative to the total frame time Fixed 'Other Children' node which shows hidden exclusive time.
Exposed more display information from RHI implementations, mostly in support of HDR tonemapping.
Bug Fix:
Fixed: Crash when running window-related automated tests with nullrhi.
Vulkan: Fixed an issue where some drivers report MAX_UINT for timelines when device is lost.
[Vulkan] Fixed some bad layout reported by validation.
Fixed RHI scissor rect validation failing with fractional viewports.
Updated the r.ShaderPipelineCache.PrintNewPSODescriptor description. It now calls out that it prints additional information not only for graphics PSOs, but also compute and raytracing.
Fixed FloatRGBA SDR backbuffer by ensuring the swapchain color space is set to G10 in SDR, and that secondary windows retain the same format.
Remove incorrect check in AsyncReallocateTexture2D.
Fixed a bug where the EVTProducerPriority::VirtualTextureStreamingPriority is not properly set when configured through a device profile. The FTextureLODGroup::SetupGroup function would always default the priority to be Normal, which overwrote any other value that might have been set in the device profile.
Updated the description of r.PSOPrecache.GlobalShader to reflect the recent changes that were made for the dynamic shader preloading refactor in.
Deprecated:
Removed r.Vulkan.CPURenderthreadFramePacer which resulted in artificially stunted frame-rate when multiple viewports are used, and was effectively redundant to GVulkanCPURHIFramePacer.
Substrate
New:
Add F90 approximation for Substrate Blendable GBuffer format.
Add clear pass on downsampled depth for closure count > 1 in Lumen's reflection when Substrate is adaptive Gbuffer is enabled.
Add Substrate IOR to F0 variant for conductor materials.
Add groom bound visualization.
Change RT occlusion for SSS surfaces with Substrate Format=1 to use the unified pass, and fix inconsistency compare to Format=0.
Changed rough diffuse BSDF to use EON model instead of Chan.
Removed HairComplexTransmittance permutation when Substrate is enabled, as it is no longer needed with classification.
Added helper function to regroup Substrate's IsComplexMaterial for GBuffer Format=0.
Removed SheenQuality settings. Substrate now always uses Sheen LTC.
Changed hair strands to use Substrate lighting when Substrate is enabled.
Added different stage option for Substrate's stencil marking pass.
Reduced shader permutation in IndirectLighting composition when using Substrate.
Enable Substrate's classification stencil writing during the indirect lighting pass for better performance.
Add option to run Substrate's stencil writing for classification during the IndirectLighting composition pass and improve performance.
Bug Fix:
Fixed Opaque rough refraction being incorrect disabled with GBuffer Format 1.
Fixed incorrect diffuse response on legacy clear coat with Substrate.
Fixed Substrate multi layered materials with special complex slabs.
Fixed crash when previewing SM5 Vulkan in editor with Substrate Adaptive GBuffer.
Fixed incorrect Lumen's Screen probe gather indirect args clear when using Substrate adaptive gbuffer, causing artifacts.
Fixed incorrect RWLumenTileBitmask writing during the overflow pass when all the pixels of the tile are invalid.
Fixed incorrect Lumen's screenprobegather history fetching for pixel with non-matching closure index.
Fix preexposure being applied twice on diffuse lighting when Lumen reflections are disabled.
Fixed missing pre-exposure on sky lighting when using Lumen GI is disabled.
Fixed missing material's Emissive contribution on Mobile deferred path.
Fixed crash when enabling light complexity view mode.
Fixed incorrect Subsurface look with area lights placed beneath the surface.
Fixed incorrect hair shading due to incorrect tracking of complex transmittance bit with Substrate.
Fixed missing light transmission when light has transmission enabled.
Fixed clear coat rendering on Mobile when using Substrate with Substrate's ClearCoat node.
Fixed Specular profile not being applied on low end mobile platform.
Fixed thin surface refraction with RTTranslucency.
Fixed incorrect anisotropy output when using Substrate Format=0 with Substrate node like vertical layering.
Skipped indirect diffuse composition pass when project has disabled static lighting, and only use SSAO+sky lighting as GI solution.
Fix incorrect RequestByte check during Substrate simplification causing material compilation to fail when using Slab node with features with Format=0.
Simulation
New:
Fracture Mode
Added new fracture mode utility to split islands.
Added new split island controls to fracture tools.
Bug Fix:
Fix NaNs in geometry collection part sizes for parts with negative volume (due to inverted faces and/or degenerate geometry).
Chaos Visual Debugger
New:
Added the Complexity Viewer Tab to the Chaos Visual Debugger.
New implicit geometry hierarchy viewer for particles in CVD in the Details pane.
Bug Fix:
Fix Heightmap Render Mesh Generation for Heightmaps with holes.
Fix CVD recording channels being overwritten by defaults when clicking Start Recording.
Cloth
New:
Updated converter from legacy SKM cloth to Chaos Cloth Asset to produce a fully editable Dataflow graph.
Dataflow Cloth Weightmap Node will try to automatically transfer the map if the input topology has changed (works once the node has at least one snapshot stored on the node).
Added new cvar p.ChaosClothVisualization.NumSphereSections to define how many sections to use to draw debug spheres in PIE/game.
Set default group name for Cloth selection set nodes (SimVertices3D).
Fixed the Selection Tool to start in vertex selection mode when you have an empty selection of vertices.
Updated Cloth Environmental Collisions to handle instanced static meshes.
Added options to filter debug draw to a single vertex or named set of vertices.
Updated RemeshNode to reproject accessory mesh data.
Added new Strip User Attributes Node which gives more granular control over stripping maps, sets, and face int maps from the ClothCollection to reduce the collection and asset size.
Dataflow Cloth Remesh node can take a selection to control which part of the sim/render mesh will be affected by the remesh operation (also added an option to use a weightmap as a selection for that same purpose).
Added ExtrudedTaperedCapsule option to Cloth Physics Assets.
Added new ClothAssetInteractorDataAsset which allows creating sets of cloth properties. Use this to manage and set properties from a single function call on the ClothAssetInteractor.
Added Chaos Cloth Velocity Scale debug draw options.
Bug Fix:
Fixed issue when using Legacy SKM cloth with Softs::FEvolution solver where some internal data was accidentally reset when updating properties such as Mass in the editor).
Fixed external convex collision transforms.
Guard against crash and unexpected results in cloth remesh node.
Deprecated:
Deprecated anything related to extracting collision data from cloth simulations directly (e.g., FClothingSimulationInstance::AppendSimulationData, USkeletalMeshComponent::FindClothCollisions).
Core Physics
New:
Chaos
Parallel Constraint Solver
Added Chaos stats for the number of colors of all common constraint containers (suspension, collision, linear joint, non-linear joint, character ground).
Added a parallel solver option which graph-colors all constraints and processes them in parallelizable batches as tasks with dependencies ("p.Chaos.Solver.PartitionManager.Partitioning").
Added support for max force in joint angular drive when using SimD.
Partial Island Sleep: Exposed the CVars which activate and tune partial island sleep to the Unreal Editor project settings in Engine/Physics/Chaos Physics/Sleep Settings.
Added filtering option to get both dynamic and sleeping particles within a Chaos Field.
Immediate physics API adds GetCollisionSolverSettings().
Fixed HashMappedArray Reset implementation to not shrink internal allocations.
Updated memory dump command to accept a geometry type filter.
Updated FTriMeshCollisionData serialization to include the new bReducedMemoryRepresentation flag.
Bug Fix:
Chaos
Fixed an assert triggered during particle destruction by separating disconnection and destruction of persistent (joints, suspension, etc.) and transient constraints (collision).
Fix joint linear/angular drive position target reset when plasticity enabled on initialization.
Fixed soft angular constraints incorrectly applying velocity like hard constraints.
Fixed an issue where midphase data was not properly stored in MidPhaseModifierAccessor.
Fixed Chaos impulse fields not properly waking up particles when they are asleep, causing them to not move.
Fixed crash when calling Chaos Physics Object Interface SetLinearEtherDrag or SetAngularEtherDrag method from the physics thread.
Fixed crash in Chaos fields when using them on Geometry Collection internal/partial clusters.
Fix LineTrace_Geom and FPhysInterface_Chaos::Sweep_Geom for FBody_Instance that are not owned by a Component or are not part of a Physic scene.
Fixed ISM-ISM overlap events index reporting for other body.
No longer allows Island to sleep when SleepType is set to NeverSleep.
Fixed FConvex::FindClosestIntersectionImp to correctly handle thickness.
Fixed bodies that start their simulation asleep firing a spurious wake event while remaining asleep.
Fixed auto-computed mass display for an actor to not include shapes that are flagged to not contribute to mass.
Fix solver actor initialisation crash when creating a solver actor on an async thread (e.g. async loading thread).
Fixed SetAngularVelocityInRadians so it correctly sets the angular velocity rather than setting an angular impulse.
Fixed GetWorldContactLocations causing a contact pair modifier to report a modification when reading contact positions.
Fixed physical material mask index addressing selecting an incorrect index.
Fixed sphere scale max axis detection in FKSphereElem for scaled physics geometries.
Fix instability on scaling up with AnimDynamics.
Fix scaling body properties on world space for AnimDynamics. Add teleport support on scale changes. Fix debug draw for scaled bodies.
Primitive Component Physics:Set Physics Linear Velocity: Fixing an issue where the SetPhysicsLinearVelocity() call wasn't doing what we expected.
Collision Conversions: Physical material in hit result. Fixed an issue where the physical material wasn't coming back for a hit result even if the bReturnPhysMat == true.
It was failing because we are checking to see if the PhysicsObjectOwner has implemented the IPhysicsBodyInstanceOwnerResolver interface. When we hit components, this will fail and then we won't send the physical material for the hit.
This doesn't seem right to gate keep the physical material return just because the owner hasn't implemented a certain interface. I believe this was a mistake to have the bReturnPhysMat check inside of this if check.
Add minimum scaling limits to avoid a simulation blowup in AnimDynamics.
Dataflow
New:
Dataflow Selection
Dataflow Selection tools will display information about the selection in the construction viewport.
Dataflow Selection and Paint tool nodes now store data using snapshots.
The Chaos Cloth Asset is now using the Unified Dataflow Editor.
Improved error reporting for the Dataflow Edit Skin Weight node.
Added Chaos Flesh Dataflow Templates.
Dataflow Volumetric plugin is now production ready.
Added a Dataflow node to create external collision on a geometry collection (Box, Sphere, Capsules).
Added support for subgraph when copy/pasting Dataflow graphs (copying a subgraph node will also copy the subgraph network recursively if needed).
Added a skeletal mesh terminal node.
Added exploded view and hierarchical component when rendering Geometry Collection in Dataflow.
Added a Catmull-Clark mesh subdivision node to dataflow.
Added support for gizmo mapping to node properties in the construction view.
Added editor-only dynamic mesh processor class, so dataflow geometry script users can access the editor only nodes by picking the appropriate parent class.
Added a split islands dataflow node.
Added skeleton subdivide dataflow node.
Added text details in the construction viewport for the Cloth Remesh Dataflow node.
Dataflow compatible assets: Offer a unified menu for right clicking on them in the Asset Browser, including a way to set a dataflow graph from templates).
Added new split island controls to dataflow fracture and mesh-to-collection nodes.
When selecting a preview animation in Dataflow Editor, the timeline will resize to fit the animation length.
Cloth Physics Asset Dataflow Node now displays the collision shapes in the construction view.
Added auto-convert Dataflow node when connecting an asset output to a string input.
Dataflow node list now displays the node icon if it has been set.
Dataflow assets can now be assigned a "reference asset". When set the dataflow asset will only be editable from this reference asset and all derived assets will be read only and will only be able to override variables.
Added a new dataflow node to simplify medial skeletons.
Added a dataflow node to merge dataflow skeletons.
Added a SmoothBoneWeights Dataflow node.
Get Variable Dataflow node has description (for tooltip) and category properties that will be reflected in the variable overrides.
Managed Array Collection type is now available as variable type in Dataflow.
Added Dataflow MakeArrayNode.
Improved default settings for Groom dataflow nodes.
Added DataflowSkeleton as a simple wrapper of FReferenceSkeleton in dataflow. Added a medial skeleton to the dataflow skeleton node. Added a bind dataflow skeleton to the mesh node.
Added a dynamic mesh→skeletal mesh dataflow terminal node.
Added a dataflow node to convert medial skeleton + mesh to a skinned dynamic mesh.
In cases where a dataflow toolkit is editing an EditorContent that itself is an instance of UAssetUserData - prefer the dataflow asset name instead of the dataflow owner name.
Added lasso selection support to the Paint and Selection Dataflow Tool.
We now don't clear the gutter alpha channel in the fracture autouv tool's bake, and instead copy pixels to the gutter unchanged to reduce the chance of visible seams. For equivalent dataflow nodes, we keep original behavior (clearing gutter alpha) as default, but add an option to not clear it.
Parallelised selection merging and geometry decomposition.
Added medial axis skeletonization dataflow node.
Added convex decomposition node to dataflow for physics assets. Supports a simple number-of-hulls approach and a more configurable negative space mode using GeometryTools decomposition systems.
Image and texture Dataflow output types can now be visualized in the construction view.
Added path related Dataflow nodes (Get asset path, Path Replace).
Dataflow Anytype output types can be changed by right clicking on the output pin if the list of compatible types is finite.
Added a large number of nodes that can sample float and vector from 3D positions.
Added keyboard shortcut information to Dataflow paint tools tooltips (value picker, mirror buttons, selection grow, shrink, flood, color ramp options).
Added real time mirrored painting support to Dataflow Pain tools.
Added option to display attribute values on each vertex in the Dataflow paint tools.
Added rendering settings to Dataflow construction view (each rendered type has customized settings).
Added dataflow sampler to attribute node.
Added support to visualize specific attributes when rendering a Geometry Collection in Dataflow.
Added Dataflow Vertex Color to attribute transfer node.
Added Dataflow Material view in the construction viewport.
Added a "sphere covering" input to more dataflow nodes. Added add new node to generate a sphere covering.
Added the ability to directly specify negative space that a convex decomposition should use (separately / in addition to any automatic detected navigable space). This is exposed in the Leaf Convex Decomposition dataflow node.
Added Dataflow Texture to attribute transfer node (works for geometry collection and cloth collection).
Added a preview scene controller for physics asset dataflow preview scenes to allow custom settings in the preview.
Added motion types in Dataflow for Swing-Twist constraint nodes so the node will produce a constraint with locked axes when needed.
Allow convex geometry generators to use merged bone selections in Dataflow graphs.
Added falloff support for Dataflow Vertex paint tools.
Added Dataflow ability to merge bones within selections similar to the non-dataflow physics editor when building collision geometry.
Added option to Dataflow weight map paint tool to toggle back face painting (on by default) and make brush disappear when not on the mesh and not being actively dragged.
Dataflow context Info/Warning/Error now supports localized strings.
Dataflow Vertex attribute and Weightmap paint tools now remember color ramp changes and can save presets.
Added support for Chaos Flesh Dataflow graphs.
Added rendering support in Dataflow for Box and Sphere types.
Assets using a Dataflow Graph will now show a graph icon in the top left corner of their thumbnail and information about the dataflow graph in their tooltip.
Added two Dataflow template for Geometry Collection Assets:
One to create a geometry collection from its own geometry sources.
One to create a geometry collection from a static mesh (using a variable)
Dataflow can now be embedded in their corresponding assets or shared across assets.
Added an "area contact" option for small geo removal (fracture mode and dataflow).
Added a RemoveMeshOverlaps node, useful for creating a nice input for the mesh cut fracture node.
Bug Fix:
Fixed issues and crashes with the Dataflow Editor Weight Map Paint tool happening when two or more Dataflow Editor were opened simultaneously.
Fixed undo/redo issues with Dataflow comment nodes.
Fixed crash in Dataflow happening when using the "Promote To Variable" feature on some struct typed inputs.
Fixed crash when editing Cloth Asset in Dataflow Editor if the original topology of the sim mesh was updated while using spring constraints.
Dataflow Editor better respect the Manual Evaluation settings and will avoid evaluating the node if the construction view refreshes.
Fixed brush accumulation issues for the Dataflow vertex attribute and weight map paint tools.
Fixed auto-wiring not working properly between Anytype connection and concrete type ones.
Improved variable and subgraph renaming validations and messaging.
Fixed Dataflow node no longer being invalided after using an Undo command.
Fixed time offset when replaying Cloth caches in Dataflow editor.
Fixed handling of inputs with special characters in dataflow geometry script node inputs.
Fixed crash on passing UObject* to a dataflow geometryscript node.
We now copy the FReferenceSkeleton to the dataflow skeleton debug draw object rather than trying to hold an unsafe raw reference to its address.
Fixed Geometry Collection to apply force and impulse at position methods to properly wake up sleeping particles.
Fixed traces not always working on Geometry Collection partial clusters when using remove on break/sleep.
Fix Dataflow mesh boolean node rejecting results that only have small artifacts, and add more controls for simplification, edge welding, and UV handling.
Fix Dataflow copy/paste ignoring properties that were tagged as Instanced in their UPROPERTY data, causing instanced objects to all point at the same target.
Fixed setting collision response on a Geometry Collection Component at runtime * make sure we fall back to applying the component.
Fixed name extraction from clipboard paste operation when a node name contains special characters.
Fixed crash when attempting to open a dataflow asset without setting a graph for physics assets.
Fixed a crash in the Dataflow Editor Collection Spreadsheet when displaying an attribute with an empty name.
Fluids / Smoke
New:
Screen space rendering option on 3d flip first pass.
Add NiagaraDataInterfaceParticleNeighborQuery - New method for computing particle neighbors that has an unbound number of particles per cell. Memory is much more efficient than NeighborGrid3D, and it has an open architecture that will allow for future optimizations and improvements.
ChaosCloth Water Body Interaction.
Subclass of VelocityField that supports Water Body interactions.
New parameters exposed in DF for controlling buoyancy and underwater drag.
Existing drag applies for above water parts of cloth.
Hooks for replacing existing VelocityField and configuring BuoyancyField in ChaosCloth Future Work (Depending on various factors).
ISPC implementation.
Per Triangle water body queries for accurate collisions (needs threading issues in Buoyancy addressed).
Semi implicit drag: Improve stability with high values.
Updated pressure solver.
Automatically set relaxation.
Cull more extraneous buffer reads.
Only dispatch over SOR cells being updated (half the grid cells)
Update all 3d gas/liquid emitters/systems.
Redo scaling on drag (1 now is correct and works well).
Several other small fixes.
Support for waves.
Fixed interactions with oceans.
Small cleanup and bug fixes.
NDC collisions for 2d gas.
Buoyancy computation optimizations.
Lift parameter exposed.
Fixed bug with scaling on drag.
Readjusted convex topology limits.
Speedup collision geometry computation when baking river.
Simple sparse grid.
Underwater post process material for shallow water fix power of 2 sampling issues with VT (stretch instead of pad)
Bug Fix:
Fix to not tick on server (PIE or in packaged build).
General Physics
New:
Fracture Mode
Added 'full image' padding option to fracture autouv baking.
Added a bake-specific 'padding' option to the fracture auto UV tool, to copy boundary pixel values out to a larger range of empty pixels when baking (without affecting the spacing of the UV layout step).
Added a console variable to allow Geometry Collection to destroy their physics state when SetSimulatePhysics is set to false - p.Chaos.GC.DestroyProxyOnSetSimulatePhysicsFalse (Off by default).
Optimized Managed Array Collection CopyTo method by parallelizing the data copy of attributes across multiple threads.
Added Trailing events from Geometry Collection to Chaos Event Relay so they can be processed in a Blueprint.
Ph AT: Convex (and primitive) generation now works with meshes when there are helper bones. In addition, the workflows generally prevent shape generation from deleting bodies (e.g. if their shapes can't be calculated/updated). Adds an option to directly create convex hulls for shapes.
The centre of mass offset on the root body of a physics asset is now applied on top of the CoM offset applied to the component itself, so they combine together. Note that this could cause a (likely small) change in behaviour for games that had both offsets set, but it generally allows for more intuitive runtime adjustments to the CoM position.
Added GyroscopicTorque option to Geometry Collection Component.
Added new Blueprint function for Geometry Collection Component : GetCurrentTransforms and GetCurrentTransformsFromIndices.
Geometry collection cache (using static pose) can now emit break and collision events through the Chaos Cache Event relay.
Add GetDisabled, SetDisabled, SetGravityEnabled, GetGravityEnabled, SetSleepType, GetSleepType, on UClusterUnionComponent.
Added support for setting linear and angular damping on Geometry Collection Components at runtime.
Bug Fix:
Fixed issue with Geometry Collection Component bUpdateComponentTransformToRootBone option which was causing shift in rendering when root was broken.
Fixed geometry collection event firing twice when using a Geometry Collection Component inside a Blueprint Geometry collection.
Fixed Geometry Collection internal/partial clusters not breaking when using Crumble Cluster operations.
Fixed NumMaskBuffer assignment from OffsetsBuffer to MaskBuffer in Chaos Flesh deformer.
Fix root proxy issues when caching Geometry collections.
Fixed Geometry Collection caches not working properly when recorded with a scale.
Fixed Geometry Collection velocities not being properly set on the game thread.
Fixed Geometry Collection cache to use kinematic targets to move cached pieces so that they properly wake up other physics objects they are in contact with.
Makes PhAT resilient to the skeleton being deleted.
Fixed Geometry collection various crashes happening when using replication.
Fixed multi trace results not being sorted correctly when the trace involves cluster unions.
Deprecated:
Deprecated the StaticMesh property from the Chaos Flesh asset.
Groom
New:
Added a Dataflow terminal node to convert guides to skeleton bones(GuidesToJoints).
Added a Dataflow node to generate the average groom curve selection.
Added a render setting to limit the number of curves rendered in a Dataflow Groom asset.
Bug Fix:
Removed IsCPUSkinned check when creating Groom Bone Buffer.
Modular Vehicles
New:
Modular vehicles can now be set up using only static meshes or only skeletal meshes, without requiring a combination of both mesh types and cluster unions/geometry collections to provide the collision representation.
Fix suspension SpringLength and HitDistance set to 0 when not colliding. Now set at MaxSpringLength.
Net Physics: Add functions to get and reset the NetworkPhysicsSettingsResimulationErrorCorrection of a PhysicObject.
Updated the suspension constraint and modular vehicle system to support two-way vehicle ground interaction, so that vehicles now apply reactive forces to the ground surface during simulation. So a see saw will pivot as the vehicle drives along it, also the vehicle will move along with moving platforms.
Bug Fix:
Null check the return of UModularVehicleBaseComponent::CreateNewCoreModule in UModularVehicleBaseComponent.
Sim Type: Fixing the SimType FName to not be a reference because that will cause it to be overridden and eventually turned into garbage. We don't need to send an FNameand because FName's are already efficient and compiled into an int anyways.
Networked Physics
New:
Optimize network overhead for replicated Input and State properties via the "legacy" RepGraph or Iris Last Resort replication in NetworkPhysicsComponent.
Remove Owner* replication (24+8 reduced to 0 bits).
Replace DeltaSourceFrame with DeltaSourceIndex (16 or 24 reduced to 2 bits).
Clamp NumFrames (8 reduced to 4 bits).
Send data array ordered to improve ServerFrame delta serialization (18 bits reduced to 1 bit on arrays larger than 1).
Optimization to not cache physics results during resimulation frames, except for the last frame.
Implement new networked Actions feature into the NetworkPhysicsComponent.
Actions are a separate concept compared to inputs and states.
Actions can be forced to only be authored on the server and synchronized to the clients.
Actions can be scheduled for a set time from "now" or a specific frame.
Actions can be predicted on clients and those predictions will get stomped by confirmed actions from the server.
Actions can be proposed by clients to the server. The client will apply the action predictively and replicate it to the server which will need to produce the same action and then compare that action with the proposed action from the client, if the proposed action is "close enough" then use the proposed action. As a way of reducing desyncing of the autonomous proxy.
Actions are re-predicted and applied during resimulation.
Simulation Decay: Integrate less of accelerations onto velocities and integrate less of velocities onto position and rotation to slow down the simulation for simulated proxies. An alternative to using Input Decay.
Per-step quantization of physics state to the network quantization grid, to increase determinism between client and server when running resimulation as the physics replication mode, disabled by default.
Utilize SimulationDecay during resimulation to handle timeline transition for PhysicsReplicationLOD.
Adaptive resim coalescing of physics frames when resim is predicted to exceed CPU budget.
Improve the Iris Delta Serialization flow for inputs, states and actions in the NetworkPhysicsComponent.
Register and unregister PhysicsReplicationLOD focal particle on pawn possession change.
Improve logic around resimulation with objects that are pending deletion to enable and disable them correctly.
Added a new setting (percent of resim cache size) for the number of frames to look back when finding a valid resim frame.
Move callbacks for InjectInputs_External, ProcessInputs_External and ProcessInputs_Internal into native ISimCallback instead of only via IRewindCallback. By default they are not enabled and if using IRewindCallback the callbacks will be handled via that as long as they are not enabled via ISimCallback.
Resize RewindData when physics tick-rate changes.
Improve NetworkPhysicsTickOffset API to easily get the value on the physics thread and game thread.
Option to disable physics replication per-actor at runtime via EPhysicsReplicationMode::None.
CVar to choose which physics step to trigger resimulation on if multiple physics thread tasks are scheduled at the same time from the game thread.
Support Seamless Travel with the NetworkPhysicsComponent.
When sim-proxies are not replicating with resimulation, apply the inputs in the same timeline we receive states in. This plays out better together with Predictive Interpolation, making sim-proxy pawns replicate better.
Move custom state recording to post-solve and record it as for the beginning of next frame. This allows the game thread to then network the state for the beginning of next frame before that frame has started.
Add a setting for cooldown frames between resimulations and a setting to clamp number of resim frames. By default when out of resim frames, physics replication switches to Predictive Interpolation temporarily.
Add a clamp to how far behind the requested resim frame we search for a valid frame before opting for an incomplete frame.
Dynamic input buffer scaling for networked physics via NetworkPhysicsComponent.
Bug Fix:
Fix issue where a sleeping object would cause a desync when woken up by interaction while using resimulation replication.
Fix input issue for sim-proxies not merging inputs in NetworkPhysicsComponent.
Stop Predictive Interpolation from stuttering when resimulations affect it.
Fix bug where TickOffset for networked physics didn't get updated in ChaosVisualDebugger.
UI
New:
Common UI
Added a Blueprint-assignable OnSelectedButtonLostSelection delegate to UCommonButtonGroupBase that broadcasts the previously selected button whenever the group's selection changes to a different button or is cleared.
Added a Blueprint-callable UCommonUILibrary::RequestRefreshFocusIfLeafmostDescendant that lets any widget request a focus refresh on the current leafmost activatable widget, provided the calling widget is actually a descendant of that leafmost widget. This is useful for asynchronously created or plugin-injected widgets that cannot easily call RequestRefreshFocus directly on their owning activatable.
Added supporting public API on UCommonUIActionRouterBase and FActivatableTreeRoot: GetLeafmostActivatableWidget and IsWidgetInLeafmostNodeHierarchy, which allow gameplay code to query the leafmost activatable widget and check whether a given UWidget lives inside its hierarchy.
Added a VeryVerbose log line to LogUIActionRouter that prints the old and new leafmost activatable widget (via FReflectionMetaData::GetWidgetDebugInfo) whenever the active leafmost node changes, making it easier to diagnose focus and input-routing issues.
Improvement: The CommonUI.DumpActivatableTree command now includes each node's SupportsActivationFocus value in its output, making it easier to diagnose why a given activatable widget is or is not receiving focus.
API Change: Renamed UCommonUILibrary::RequestRefreshFocusIfLeafmostDescendant to RefreshFocusIfLeafmostDescendant, updated its tooltip with a more descriptive explanation of its async / plugin-injection use case, and added a warning log when the function is called from a widget that is not a descendant of the leafmost activatable widget.
UMG/Slate
Added proximate-entry navigation support to SListView, STileView, UListView, and UTileView (enabled via bEnableProximateEntryNavigation). When focus enters a list from outside, or moves between entries, the list now picks the spatially nearest entry (and the nearest sub-widget within that entry) instead of always routing to the first or previously selected item.
Added nested-list and cross-entry navigation support that tracks the last sub-widget to hold focus inside an entry (IntraEntrySourceWidget) and uses it as the navigation source for intra-entry, cross-entry, and cross-list spatial routing.
Added FSlateApplication::SetPendingNavigationContext / GetPendingNavigationContext so list views can re-publish a navigation context after ScrollIntoView completes, ensuring spatial focus resolution runs against the freshly-scrolled geometry.
Added UListView::SetEnableProximateEntryNavigation to enable or disable proximate focus routing at runtime.
FSceneViewport now has virtual methods for responding to (dis)association with a viewport.
Removed padding when UIFramework button was pressed to prevent a visual jiggle.
Engine: Promoted UUserInterfaceSettings::GetFontDisplayDPI, ConvertFontSizeFromNativeToDisplay, and ConvertFontSizeFromDisplayToNative from editor-only to runtime so gameplay and UMG code can convert between native render DPI and the project's Font Resolution DPI.
Bug Fix:
Common UI
Fixed SCommonListView and SCommonTileView focus-on-receive behavior when bEnableProximateEntryNavigation is off by restoring the historical non-proximate selection and navigation paths and scoping the immediate SetDirectly focus push to proximate-enabled lists only.
Fixed UCommonButtonGroupBase::OnSelectionStateChangedBase broadcasting OnSelectedButtonBaseChanged with a stale index when a button raised a "selected" notification but was not actually a member of the group.
Hardened FActivatableTreeNode::AppendDebugString against nodes whose represented widget has no cached SWidget. Previously, dumping the activatable tree could crash by dereferencing a null cached widget when reading PersistentState.LayerId.
UMG/Slate
Improved proximate-entry list and tile view navigation for partially clipped targets, jagged last rows in scroll-disabled tile views, and culled off-screen items, with alignment-aware scrolling via ScrollIntoViewAlignment.
Fixed a one-frame focus flash in SCommonListView and SCommonTileView when focus was set programmatically (EFocusCause::SetDirectly) onto an entry that was already fully visible. Focus is now pushed immediately via FSlateApplication::SetUserFocus, bypassing the deferred scroll pipeline that previously allowed the analog cursor to hit-test the centered tile mid-transition.
Fixed list-view focus being stranded on the container when no item was selected: focus now reliably falls back to item 0 instead of leaving the list itself focused.Fixed crash when viewing or editing object properties on MVVM viewmodels at runtime.
UI Hold Input Action fix.
Fix for enhanced input action with hold trigger being processed as a single press instead of hold (use CommonUI.bEnhancedInputDynamicallyResolveHoldKeysForInputAction)
Press and quick release will not trigger pressed event while hold is expected (use CommonUI.AlwaysWaitForHoldActionToComplete)
Added BlueprintAutocast functions so CommonUI gameplay tag subclasses will default to FGameplayTag comparison operator in Blueprint, rather than not being comparable in Blueprint.
Slate
New:
Web Browser
Added experimental CEF v147 support The new version must be enabled manually by toggling the `bUseExperimentalVersion` flag in CEF3.Build.cs, and rebuilding the EpicWebHelper program in Shipping configuration.
Allow overriding the Product/Application part of the HTTP UserAgent string per-window.
Added a CPU profiling event to trace the duration of Slate cache invalidation triggered after async font loading.
Optimized the Slate timer update path by consolidating iteration into a single loop, reducing per-frame overhead.
CEF3: Promoted v128 to stable version, removed old v90 binaries.
Change the SInlineEditableTextBlock to accept the delay time as an argument and skip creating a timer if set to zero.
Added `FWindowStyle::GetBorderless()` to expose style used by `UGameEngine` default window.
Slate Console Debugger now filters for game/app content by widget instead of by entire-window; widgets can selectively opt-out of debugging by overriding `SWidget::SetIsProjectContent`.
Adding SearchableComboBox in SlateIM.
Fixed NavigationMethodProximity::PopulateCellsToSearch so proximity-based UI navigation correctly populates focus candidates across the entire screen. Previously, the search loop exited as soon as one edge of the search cone left the screen, and the Up direction used an incorrect anchor point, causing focus targets near screen edges and corners to be skipped.
Add a Slate.EnableTooltipForceFieldDraw console variable, with which it's possible to draw the effective tooltip force fields.
Exposed text selection/cursor movement through a new Slate event (FOnCursorMovedWithSelection/FOnEditableTextBoxCursorMovedWithSelectionEvent).
Bug Fix:
Slate
When navigation candidates are equidistant on the navigation axis, Slate now prefers the widget whose center is closest to the source (Slate.Navigation.NearestCenterTiebreak, default on). Scoped to proximate-entry list view navigation; other navigation is unchanged.
Fixed NavigationMethodProximity so it now skips candidate widgets whose parent hierarchy is disabled when searching for the next focus target. Previously, proximity-based UI navigation could land on a widget that was implicitly disabled by an ancestor, causing focus to stop on an unresponsive element.
Fixed a shader crash in SlatePostProcessPixelShader when using Kawase blur, with Instanced Stereo rendering enabled.
Fixed: Material Parameter Collection usage in Slate would break if an SViewport was nested inside another SViewport with a different world.
Extracted Blueprint-accessible types (USlateFXBaseSubsystem, USlatePostBufferBlur, USlatePostBufferProcessor, USlateFontInfoBlueprintLibrary) from SlateRHIRenderer into a new SlateBaseRenderer module. This fixes Blueprint compilation errors that occurred when running with the null renderer, as these types are now available regardless of which renderer is loaded.
Web Browser
Fixed CEF losing mouse events when the cursor leaves the webview, even when still captured by UE.
Fixed crashes when third-party CEF plugins prevent successful module initialization Also prevent CEF startup if we detect a version mismatch, the API isn't guaranteed to be compatible in that case.
Slate IM
Fix assert when opening a modal (like a File Dialog) from a SlateIM widget.
Fix SlateIM widgets in a viewport root not occupying their specified space.
Disable SlateIM updates during package saving.
RetainerBox with zero-size child returns correct LayerId.
SVectorInputBox no longer expects OnVectorValueCommitted to be bound during its lifetime.
Fixed a memory leak in SScrollBox where a hard reference to itself prevented the widget from being destroyed when no other references remained.
Fixed SComboBox incorrectly overriding bShowMenuBackground to true, which caused combo box dropdowns to render with a black background.
Fixed a bug with widgets that inherit from STableViewBase consuming RMB mouse-down input events when RMB-scrolling is disabled.
Fixed a CJK text input bug on Windows 11 with the new Windows IME (TSF) Defocusing a text field without defocusing the window itself (e.g. by focusing another widget in the same window) left the IME context in a stuck state, so it wasn't possible to toggle between CJK and English anymore for that text field.
Cursor-locking no longer prevents the cursor from reaching the outermost pixels in borderless game windows. Widgets are no longer prevented from overriding the cursor zone to "titlebar" in full-screen windows.
Adapted text handling with some widely used IME on windows.
Deprecated:
`EWindowType::GameWindow` is now deprecated.
UMG
New:
Common UI
Added support for additional key bindings on CommonUI input actions via FCommonInputTypeInfo::AdditionalKeys, so designers can assign extra keys that trigger the same action while the primary key continues to drive displayed prompts.
Add support to register UI Action from BP.
Added multiple functions inside the CommonUserWidget to support input registration the same way we do it in code.
This could be expanded later to add more events but this covers most sue case from tech designer for now.
Added the console variable CommonUI.TextGlobalScaling to apply a global scale factor to Common UI text elements. The scale is applied when the value is greater than 0 and mobile scaling is not enabled (mobile scaling takes priority). It affects UCommonTextBlock and UCommonRichTextBlock.
MVVM
Downgraded the one-way binding warning for sources without FieldNotify from a compilation error to an informational notice. Compilation no longer fails in this case; an icon is displayed in the binding row instead, with a tooltip explaining that the binding may not trigger as expected.
Changed the VM parameter in UMVVMViewModelContextResolver::DestroyInstance() to non-const, allowing resolvers to perform pre-destroy cleanup on view models that are no longer referenced but not yet garbage collected.
Add ability to add implicit converters.
Used widgetblueprint class directly instead of CDO in MVVM Listview/Panel Extension to get the view during compilation.
UMVVM Panel Widget View Extension:
Added OnItemsChanged delegate. Broadcast at the end of ReplaceAllSlots.
Fixed a bug in MVVM editor to fallback to generated class if skeleton is missing.
Improved the MVVM binding picker so new variables show up without a recompile.
Exposed UMG ToolSet to EDA as Experimental.
Bring Common UI out of beta, it is now production ready.
Add a new MVVM resolver type, Context, which can pull view models from a parent widgets binding or from an external context extension on any user widgets in the widgets hierarchy.
Fixed UUserWidget::IsAnimationPlayingForward to return false if the animation is invalid.
Exposed the default Frame Rate for Widget Animations in the project Widget Designer settings.
Fixed a duplicated if statement in the Widget Blueprint compiler's animation handling path.
Exposed AnyTextSelected to UMG for editable text blocks.
Added Blueprint-callable SetFontSize and GetFontSize functions on UTextBlock. These work in the project's Font Resolution DPI (rather than the engine's native render DPI), letting designers change only the font size without copying and re-passing the entire FSlateFontInfo struct.
Added an Export button to the Font Face Details panel alongside the existing Import button. Users can now export source font files (.ttf and other supported formats) directly from the Font Face Editor.
Bug Fix:
UMG
Fixed an issue where a UserWidget's Desired Focus Widget would reset to "self" (or null) after a Blueprint compile when the outer widget tree was temporarily unavailable. SetDesiredFocusWidget now stores the target by name for later resolution, and GetDesiredFocusWidget resolves that name against the current widget tree at runtime.
Improved UUserWidget::NativeOnFocusReceived focus forwarding to use the full Slate focus path and verify the target widget is hosted under this UserWidget before setting user focus, preventing focus from being forwarded to widgets that are no longer in the live widget hierarchy.
Zero‑length UMG widget animations now correctly fire their OnAnimationFinished callback instead of being silently set to Stopped before the event is delivered.
Fixed HDR alpha blending of corners for UMG widgets being drawn as Rounded Box on top of a background blur.
Correction to UMG Designer: Inherited NamedSlot now support to be selected as the Desired Focus property and in Bindings.
Made sure EditorStyle module is loaded before UMGEditor module.
UMG + Enhanced Input: Fix for child widgets not having bAutomaticallyRegisterInputOnConstruction set when their parent did, preventing them from processing input events that their parents were bound to.
Fix compile error happening when renaming a widget that is targeted by a UI Component while the component is referenced in the Blueprint Graph.
Fixed a bug with widgets not being renamed if new name only differs by case.
Fix MVVM view to only remove specific delegate registrations tied to a source instead of removing all delegates tied to a source. Fixes situation where two properties expose the same source and changing one would cause the other to stop responding to change notifications.
Fixed default MVVM resolver being outered to the package instead of the widget Blueprint.
Marked the default MVVM resolver object public to fix serialization issues.
Fixed asset references being editor only if the widget Blueprint is saved but not compiled.
Common UI: Fix not properly resolving the new virtual keys.
Virtual Production
New:
Added new media capture option called Media Texture capture, which allows the contents of a media texture to be output to a media output. Any media texture is supposed, included the media textures connected to media sources of the same media profile, allowing passthrough from media source to media output. A transformation can also be applied to rotate or flip the texture before it is output to the media output.
Remote Control: Added allow list for remote function calls, and specifying built-in functions to allow for Epic Stage App.
Added button to refresh timecode and genlock in the media profile editor.
Moved various Virtual Production assets to different asset categories in the content browser to reduce category bloat in the content browser's context menu.
Added new section to media profile toolbar dropdown menu that allows users to start or stop captures from valid media outputs on the active media profile without having to open the media profile editor.
Added toolbar button to media profile editor that can set or clear the media profile being edited as the active media profile.
Added ability to save and load editor layouts in Media Profile Editor. These layouts store the tab configuration and the viewport configuration of selected media sources and outputs, and are accessed from a new dropdown on the Media Profile Editor's toolbar.
Added ability to rotate and flip the media source display in the Media Profile Editor. Under the View dropdown in the viewport toolbar, a Transform category allows users to select how the media source is being rotated or flipped when displayed in the editor.
Timecode and genlock toolbar widget in Media Profile Editor is now clickable, and opens or focuses the Timecode/Genlock panel in the editor.
Users can now interact with the level editor viewport when a Current Viewport Media Capture is live.
Immersive view in the Media Profile Editor now displays all open viewport panels instead of just one.
Added ability to select discovered URLs from a dropdown menu for stream media sources.
Settings from the active media player can now be modified in the Media Profile Editor's details panel for selected stream media sources.
Bug Fix:
Color Correction Regions: Fixed Color Correct Region effects being clipped on the bottom and right when dynamic resolution scaled below 1.0.
Fixed issue where a media source or output would be opened in more than one viewport if it had previously been locked in the media profile editor.
Fixed issue where media sources and outputs could be inadvertently removed when opening a non-active media profile in the media profile editor.
Fixed issue where attaching an actor to the socket of another skinned actor would not correctly transact over Multi User.
Compositing
New:
Added new luminance keyer pass type, recycling the existing proxy/shader.
Added a new sky sphere / sky light convenience actor to easily use the plate texture for image-based lighting.
Exposed erosion/dilation pass support, which was previously only used implicitly by the built-in custom render pass.
Added alpha transform pass with fade support.
Added support for composite layer and pass sequencer integration, such that their properties can be keyframed.
Added planar reflection layer, as a new (potentially faster) option for catching reflections.
Added fast gaussian blur pass using weighted bilinear taps.
Added support for new masking pass (texture or primitives).
Added support for depth compositing with new composite depth mesh actor.
Added a composite mesh visualization toggle to the composite actor panel.
Added a "Restrict to Active Viewport" option on the composite actor, which lets users avoid conflicts between multiple lit viewports with compositing.
Added user notification of recommended project settings for Composite actors (r.DefaultFeature.AutoExposure). Screen percentage was left in user control though 100% or more is recommended for clean keyed edges.
Generalized spawnable binding support across all composite layer actor arrays.
Added UltimatteMasking convenience pass for simpler masking setup.
Improved Ultimatte support for layers, composite meshes and masking pass.
Added full pass support across all composite layer types.
Exposed independent X/Y radius controls on blur pass.
Added a media profile toolbar button to Composure panel that allows users to manage the active media profile.
Refactored CenteredScale pass into a more general Transform2D pass for post-move transform support.
Added ability to add custom materials to composite mesh actors in the composite mesh actor picker. Users can now select the material to apply to composite meshes in the material dropdown menu, in addition to the default lit and unlit materials.
Allowed post-process materials as media passes on plate layers.
Added ability to include or exclude primitives as composite mesh primitives in the Plate layer's composite mesh actor list. Now, when selecting a composite mesh actor, the context menu provides the ability to include or exclude specific actor primitives to be treated as composite mesh primitives.
Added ComposureShared plugin which migrates generic assets from legacy Composure to be shared with new Composure (Composite).
Added keyframe support for most relevant composite actor, layer or pass properties.
Allowed UTexture2DDynamic use on composite plate layer.
Added support for referencing sequencer-spawnable cameras on the composite actor.
Added pass support on the main render layer.
Refactored layer class to derive from base pass; API simplification and cleanup.
Reduced default render (target) resolution to improve performance with shadow/reflection layer.
Added support for only using despill on the color keyer pass, as a new advanced setting.
Simplified composite actor (de)activation in multiuser with optional VP role.
Registered composite meshes are automatically hidden when a plate layer or a composite actor is disabled, deactivated or hidden in editor.
Allowed composite mesh use (on the plate layer) without holdouts.
Added plate texture preview that is displayed when a keyer pass' key color picker or eye dropper is used, allowing users to select colors from the raw plate texture.
Added 'Capture Clean Plate' functionality to Composure's Plate layer that grabs a frame from the active media source texture to save and apply as a clean plate texture.
Added support for actor hidden in game property, which will deactivate compositing in game mode if enabled.
Color grading on Composure passes now show up in the Color Grading drawer. The pass's color grading settings can be managed from the drawer, and selecting the passes will sync selection between the drawer, the scene outliner, and the Composure panel.
Single light shadow map bounds are automatically calculated to facilitate setup.
Bug Fix:
Protected against PF_Unknown scene color format crash in composite passes.
Fixed recurring issue where toast-notification-changed CompositeCore project settings are not version-controlled.
Skipped redundant scene capture work for inactive layers.
Enabled automatic overscan removal on plate layer with built in scale pass.
Added support for inverted alpha handling to Blur, ColorGrading, and OpenColorIO passes.
Replaced the composite actor camera picker with an actor soft pointer, such that cameras on sublevels can be selected/serialized.
Fixed input texture sampler filter preservation through compositing passes.
Replaced masked material's Dither TemporalAA material function with Dither Opacity Mask material property for better support with MRQ.
Fixed missing alpha unpremult/opacification needed for a texture plate behind holdout masks.
Fixed double-DOF artifacts with translucent keyed footage applied on composite meshes.
Fixed support for multiple keyer passes in a sequence.
Prevented addition of the same composite mesh on different plate layers.
Fixed support for AfterDOF primitive alpha holdout holdout translucency composition into scene color.
Default-disabled main view resolution in layer scene captures to avoid viewport resolution affecting performance.
Removed AutoConfigureActors setting on the shadow/reflection layer. By default, we control r.MegaLights.ScreenTraces and r.Lumen.ScreenProbeGather.ShortRangeAO.HardwareRayTracing values for correct shadows/reflection while hidden (by default).
Fixed the color grading pass' flipped WhiteBalance setting, with new option to unpremultiply before grading.
Fixed single light shadow layer, mandating the registration of shadow caster actors on the layer.
Fixed processing layer not running without additional compositing work.
Re-register primitives on end-of-frame, adjusted scene capture defaults to preserve sky atmosphere, and fixed destruction of scene capture components.
Deprecated:
Renamed UCompositePassColorGrade to UCompositePassColorGrading.
DMX
Bug Fix:
Fix a crash when pixel mapping has unpatched components and Draw Patch Color is enabled for said component.
Fix a crash when trying to edit a sequence with a fixture patch that no longer contains a mode previously used in said sequence.
nDisplay
New:
nDisplay cluster monitor Editor panel that displays all live nDisplay clusters and their observable entities. Each entity can be streamed to the editor via NDI media and previewed here. Additional tools, such as remote console command execution, are also available. Implemented nDisplay cluster monitor for remote observation of cluster nodes.
Implemented custom states (shared, distributed) Implemented custom states that make it easy to share arbitrary data across the cluster.
Inner camera composition order can now be overridden per viewport, to support led processors that support time slicing.
Updated depth of field compensation gain maximum to be 10 instead of 4.
Bug Fix:
Fixed nDisplay viewports to correctly respect non-default DisplayGamma for FloatRGBA SDR backbuffer.
Fixed issue in Color Grading drawer where deleting the currently selected color grading group in an nDisplay stage would not correctly select the previous color grading group, resulting in a bad UI state for the color grading drawer.
Fixed issue where cursor was jumping back to starting position when moving stage components in the ICVFX panel.
Fixed issue where editor would crash when importing an nDisplay config into an existing nDisplay asset while hovering mouse over output mapping tab.
Fixed rare assert failure where ICVFX window would attempt to get DPI on render thread which would result in trying to access FSlateApplication on an unsupported thread.
Performance Capture
New:
Mocap Manager
Added missing support for access to the bUseHitchProtection property in Record Manager.
Added workflow warning message to record manager if the user's record rate and custom timestep rates do not match.
Add support for excluding components and properties from recording on motion actors. Now supports full recursion to any depth of component tree that's provided.
Performer mesh workflow now uses the user given performer actor class, rather than the previously hard-coded native-only class.
Added default folder for ingested capture data, this will be video ingested using capture manager into a Mocap session.
Exposed Take Recorder clock source in the session template, viewmodel and the Record Manager UI.
Added Camera phase to Mocap Manager. Users can create and control auto-posing cameras which follow mocap motion actors. Added Autocamera BP and component.
Face Manager phase: This tool spawns a scene capture attached to the head bone of any chosen Character or Performer and shows a preview of the face animation in the mocap manager panel. The default shows a lambert shading view to neutralise scene lighting.
Exposed Take recorder hitch protection property to the Take Recorder Subsystem Get and Set Global settings struct.
Add IKRig duplicate function to performer creation workflow. Now validates bones in IK rig are compatible with the performer mesh. Added default IK rig member to PCapViewmodel so setting lasts for a whole engine session. Added duplicate IKRig function to pcap function library.
Exposed Take Recorder show notifications property in the Record Manager panel.
When stage visibility is toggled, overview map is now recaptured.
Adds new dataasset type which user can create to define their ideal mocap manager workflow, optioning in and out which sections of the UI they wish to use. Uses.ini defined class to filter class of UMG widgets that are pickable in the new data asset type.
Improved pcap character creation workflow. Now, when the user supplies an IK Rig and/or retargeter, the retargeter and IK rig are duplicated with the preview mesh swapped out to the chosen character mesh. This still might cause issues with the retarget alignment pose if limb lengths have changed. Default behaviour will now always duplicate from given source.
Make the UMG viewport render correctly with a project that is using Explicit z order on widgets. Have set explicit z order on the widgets that need it. Improved the base viewport mouse control. No longer loses input outside the widget's geo.
Added a scalar to the prop component allowing for scale of a prop's motion from the origin of the motion capture system, AKA global scale of prop. Does not affect the scale of the mesh - only affects the location.
Added date and time of recording finalisation to the takes record struct. BP changes to support writing this new field into a takes datatable.
Added WASD flight controls to the UMG custom viewport.
Bug Fix:
Mocap Manager
Fix to bug in dynamic prop passing prop between two characters.
Fix UI bug where unmanaged actor source cannot be added if in a sub-level map.
Fix divide by zero error in splitter widgets. Mouse position is now clamped to at least 1 pixel.
Sets PCapViewport to always create an EditorPreview world.
Performance Capture Core: Fix crash in GetCustomProfile on a null anim instance.
Fixed bug with Take Recorder target path breaking when /Game was stripped for the directory path string. This should now enable shooting into a project content folder or a content plugin.
UMGViewport: Added bool to expose if PreviewScene is of Game or Editor type. Moved Preview scene initialisation later to enable setting world type.
Fixed bug with invalid slate names containing forbidden characters possibly being passed to take recorder and recording failing as a result. Slate name strings are now passed through filename sanitization. Added Duration readout to show how long the active recording has been running.
Fix bug in application scale calculation in vertical split box.
Fixed crash during MU garbage collection arising from storing hard-refs to the level actors in the Pcap viewmodel which is not torn down on level save or load.
Rendering
New:
Accumulation DOF: Experimental plugin that renders depth of field by accumulating deferred renders from multiple aperture view points, intended for production rendering (not gameplay). Provides a way to render depth of field that greatly mitigates artifacts due to missing parallax, while preserving deferred rendering lookdev. Use when not getting the desired visual results with the default DOF. Rendering time increases linearly with number of samples. Main settings:
Number of samples. The scene will be rendered from multiple aperture locations and accumulate the results.
Splats size. To improve bokeh fill, it uses standard DOF as splats. The size is the fraction of the aperture diameter (defaults to 1/8), and kept small as to not reintroduce artifacts or over-soften the bokeh edges. Usage:
In-editor preview, under level viewport >> scalability dropdown >> Accumulation DOF.
MRG integration via Accumulation DOF component in Cine Camera. Feature support:
Petzval swirly bokeh
Cat's eye (barrel)
Anamorphic squeeze
Multi-band lateral chromatic aberration
Multi-band axial chromatic aberration
Spherical aberration
User-customizable bokeh texture
Updated OpenColorIO library from v2.4.1 to v2.5.1; ACES 2.0 transforms are now built-in.
Color Correction Regions: Fixed an issue where stencil ID assignments on Color Correction Actors did not propagate across Multi-User sessions, by replacing the polling-based Concert sync request with a reliable custom event. Bug Fix: [Color Correction Regions] Fixed undo/redo not capturing stencil ID changes on Color Correction Actors; the change now shares a transaction with `AffectedActors` and `PrimitiveComponent::Modify()` is invoked before modifying stencil values.
Update OpenColorIO plugin config asset to V2 to allow working color space use via ACES interchange.
Added OpenColorIO config type selection menu to facilitate and promote the use of built-ins.
Added new lens distortion option to apply distortion as a scene view extension pass after tonemap (useful for other plugins).
Added support for the {Engine} token in OpenColorIO configuration assets.
Bug Fix:
Fixed OpenColorIO handling of linear floating point SDR backbuffer (colors must remain linear with a DXGI_FORMAT_R16G16B16A16_FLOAT swapchain).
Tools
New:
Live Link Hub
Transient Media Profile (no.uasset exposure)
Makes the Media Profile in Live Link Hub a transient in-memory asset instead of a saved.uasset. This removes the save dialog, Asset menu bar, and Content Browser that were previously exposed to users when opening the Media Profile editor - none of which are appropriate in LLH.
Media Profile state is serialized into the LLH session config JSON via the existing ILiveLinkHubSessionExtraDataHandler extension system (same pattern as LiveLinkDevice). A FOnCreateTransientMediaProfile delegate in MediaProfileMenus.h lets the LLH handler own the transient profile lifecycle without coupling MediaProfile ? LiveLinkHub A config flag
Media Profile: bUseTransientProfile=true (set only in LLH's DefaultEngine.ini) gates the transient behavior in shared MediaProfile editor code Only profile-owned sources/outputs are serialized (GetOuter() == Profile); device-injected sources are already persisted by the device framework Protected fields on UMediaProfile (timecode/genlock overrides) are accessed via UProperty reflection since no public setters exist No impact on standard UE editor behavior. All transient-specific code is gated on GetPackage() == GetTransientPackage() or the config flag, which is only set in LLH.
Enables support for messaging the bIgnoreSubframes property on modification of the TimecodeCustomTimestep property of the media profile.
Added the ability to receive changes to slate and take number from Unreal Editor devices.
Remove Capture Manager and Live Data sections from Window menu Consolidate all data view tabs under a single "Data Views" section instead of splitting by mode.
Media Profile Menu Entry: Add Media Profile panel entries to LLH Window menu When the Media Profile editor is hosted in Live Link Hub, its sub-panels (Details, Media, Media Output, Timecode/Genlock) can be closed with no way to reopen them ? the editor's own Window menu is absorbed by the host application. This change extends the LLH Window menu with a "Media Profile Editor" section containing entries for each panel. Clicking an entry opens the Media Profile editor (if not already open) and focuses the specified panel within it. Entries show a checkmark when the corresponding panel is open, matching the style of existing LLH Window menu entries. The entries are only registered when the Media Profile toolbar button is hosted in a custom application (i.e., Live Link Hub). The standard Unreal Editor is unaffected.
Recording toolbar available in all Live Link Hub modes.
Consolidate Timecode and Sync Lock setting to the media profile, in line with UE behaviour.
Deprecate LiveLinkHub settings properties.
Add support for Hub setting the TimecodeCustomTimestep on connected clients.
Capture Manager
Improved handling of non-integer frame rates.
Relax iPhone take archive video naming restriction When ingesting a legacy iPhone take archive (pre-UE 5.6, take.json format), the expected.mov filename is constructed deterministically from take metadata as {slate}_{take_number}_{subject}.mov. If the file on disk doesn't match this name, ingest would silently proceed with a bad path. This change adds a fallback in ParseOldLiveLinkTakeMetadata: if the expected file is not found, the take directory is scanned for a single.mov file. If exactly one is found it is used in place of the expected path. If multiple are found, ingest bails with a validation error rather than guessing. The correctly-named case and the live network ingest path (ULiveLinkFaceDevice) are unaffected, the fallback only runs when the expected file is absent.
Added ability to get and set the Media and Import Directories in the Capture Manager Editor Settings via Blueprints.
Removed redundant timecode extraction calls and set timecode and frame rate correctly for audio in Mono Video Ingest device.
No longer falls through to other timecode extraction methods if third party encoder enabled. Improved third party encoder checks and warning messages.
Integrate Capture Manager with the Data Devices panel and deprecate the now redundant Devices panel.
Udp Messaging
Implemented token bucket send pacing. The MaxSendRate setting, ignored in recent versions of the engine, should now be correctly respected.
Improved segment retransmission logic, including robust RTO calculation, more precise timing, and ACK prioritization and coalescing.
Added support for UDP segmentation offload. Maximum USO generated datagram count is controllable via the `MessageBus.UDP.MaxOffloadSegments` cvar (default 16, max 64).
Switchboard
Added a recording stopwatch to the status line.
Added the ability to reinitialize the timecode provider.
Added the ability to set or clear the Media Profile and Live Link preset at runtime.
Console exec history now persists between app restarts.
Live Link Hub device improvements, including redesigned UI and per-device config overrides.
Mocap Manager: Added gain control to audio recording sources.
Extend CPS with capabilities feature.
Removed delegate pattern for transient profile creation (simplified to direct NewObject in MediaProfileMenus.cpp as the reviewer suggested) Removed MediaProfileEditor module dependency from LiveLinkHub.Build.cs Unified transient profile initialization: handler now listens to OnMediaProfileChanged and adopts any externally-created transient profile, ensuring default USystemTimeTimecodeProvider and UTimecodeCustomTimeStep instances are always populated regardless of creation path Removed dead code (GetOrCreateTransientMediaProfile, GetTransientMediaProfile) Hide save button and browse-asset button entirely for transient profiles (IsSaveAssetVisible, IsFindInContentBrowserButtonVisible) instead of just disabling them Label persistence: media source/output user-defined labels are now saved and restored via MediaSourceLabels/MediaOutputLabels on the preset struct, so editor viewport panel assignments survive session reload.
Added a new toggle to the Take Recorder toolbar that minimizes the sequencer to simple view whilst recording.
Add ConfigureMediaSource virtual hook to ULiveLinkFaceDevice HandleConnectionChanged creates the URtspMediaSource with common defaults (Host, DecoderBufferSize, bProvideCpuBuffer) but had no way for derived devices to customize source properties. Added a protected virtual ConfigureMediaSource(URtspMediaSource*) hook called during source creation in HandleConnectionChanged. Default is empty. Other devices can use the same hook for any source-specific configuration.
Attaching actors that are being recorded to spawnables now automatically adds an attach track into the live sequence. This ensures their attachment is correctly managed by the sequence and is correctly recorded.
Tri-state attachment setup for Take Recorder added, including support for recording attachments to spawnables. The previous bRecordParentHierarchy boolean has been deprecated in favour of this new option. New options are:
None : Do not record any attachments.
Attachments : Record only attachments if they exist.
Hierarchy : Original behaviour. Record any parent actors and their attachments.
Added connection indicator for Live Link Face devices.
Made Takes modules runtime compliant. The modules that are now runtime compliant are:
TakesCore
TakeRecorder
TakeTrackRecorders
TakeRecorderSources
TakeRecorderNamingTokens
Expand calibration generator batch library tests.
Added Live Link OBS Studio Device.
Split TakeRecorder module into TakeRecorder and TakeRecorderEditor and made all code in the TakeRecorder module runtime compliant.
Added batch calibration generation Blueprint library.
Added in new Take Recorder Sources Manager interface that hides away the sources logic for runtime and editor Take Recording.
Added ability to mask to specific RGBA channels when displaying media sources and outputs in the Media Profile Editor, as well as display an alpha-blended checkerboard background to visualize the alpha channel. These options live in the View menu of a media item viewport in the Media Profile Editor.
Switchboard: Implemented live log streaming infrastructure.
Camera Calibration: Added CharUco pattern to lens calibration and nodal offset. new: Camera Calibration: Added the ctrl+alt+drag not in the simulcam viewport tooltip for better discoverability of that feature.
Bug Fix:
Switchboard
Fixed host vs remote platform handling when connecting to Linux nodes from a Windows control box.
Live Link Hub devices now have the opportunity to gracefully disconnect clients at shutdown.
Live Link Hub devices no longer potentially incorrectly consume incoming OSC messages from an Unreal device at the same address.
Standard UdpMessaging command line arguments are now applied for Live Link Hub devices.
Live Link Hub
Fix mode switcher showing in sub-editor toolbars The CommonActions toolbar (AssetEditorToolbar.CommonActions) is a process-wide singleton UToolMenu. LLH's override of GenerateCommonActionsToolbar registered the AppModeSwitcher into this shared menu, causing it to appear in the toolbar of any standalone sub-editor opened within LLH (e.g. the Media Profile editor). Give LLH its own CommonActions menu name (AssetEditorToolbar.LiveLinkHub.CommonActions) so sub-editors fall through to the base-class version with standard Save/Browse buttons.
Fix File menu commands not working when Media Profile editor is focused When the Media Profile asset editor opens inside Live Link Hub, it creates its own SStandaloneAssetEditorToolkitHost with a menu context containing only the Media Profile editor's command list. The menu structure is inherited from MainFrame.MainMenu, so LLHub's File menu entries (New Config, Open Config, Save Config, Save Config As) are visible, but clicking them silently fails because FLiveLinkHubCommands are not mapped in the active command list. Changed AddMenuEntry() to AddMenuEntryWithCommandList() for all four File menu command entries in RegisterFileMenu(), explicitly binding LLHub's toolkit command list. This ensures the commands resolve correctly regardless of which sub-editor has focus.
Fix LLH UI hang when selecting MetaHuman video source Two fixes for Live Link Hub MetaHuman video source workflow: Hide unsupported device types (Media Bundle, Media Source) from the device type picker when running in Live Link Hub. These types require editor asset pickers and produce URLs that WMF cannot handle as capture devices, resulting in MF_E_INVALIDMEDIATYPE errors. They remain available in the UE Editor where they are valid. Cache video track enumeration results in the media source widget. GetVideoTracks blocks the UI thread with a synchronous WMF device query (up to 5s timeout). Previously this ran on every device selection change with no caching, causing a ~10s freeze on repeated select/deselect cycles.
VP Utilities and Time Management: Moved Timecode custom timestep to the TimeManagement engine module so it can be used in Live Link Hub and not require the VPUtilities plugin.
Capture Manager
Fix ASAN shutdown crash in UCaptureManagerEditorSettings delegate registration The OnModularFeatureUnregistered delegate registered in UCaptureManagerEditorSettings::Initialize() used AddLambda with no lifetime binding, allowing it to fire after the CDO was destroyed during engine shutdown, causing a use-after-free (ASAN failure). Additionally, the lambda cleared LiveLinkClient whenever any modular feature was unregistered, not just ILiveLinkClient. Fix by using AddWeakLambda(this,...) to tie the delegate to the CDO lifetime, and add a feature name guard so LiveLinkClient is only cleared when ILiveLinkClient specifically is unregistered.
Fix bug when converting 48 and 50 fps frame rates to timecode rates.
Crash on close when updating take list.
Udp Messaging
Retransmitted messages are no longer potentially delivered twice.
Fixed a crash caused by a race condition in deserializer struct lookup.
Stereo Video Ingest: Fix component name consistency across ingest devices When performance footage and calibration footage are ingested using different devices with different input data structures, the derived component names could differ making it impossible to establish correspondence between them downstream. Root cause: the <Auto> directory-structure discovery path left component Names empty, while the token-parser path derived them from filenames. Even within <Auto> mode, the fallback naming used relative paths (including subdirectories), producing names that varied with folder structure rather than reflecting the actual source file. Fix: consistently derive component names from the source filename across all discovery paths, so the same physical file produces the same component name regardless of which device or directory layout was used to ingest it. Adds duplicate-name detection when multiple components resolve to the same name.
Ensure a transient MediaProfile always exists from startup Create a default transient MediaProfile during handler construction so that TC/genlock settings are applied immediately, even if the user never opens the Media Profile tab. Loading a config replaces the default with the saved state. Also fixes: MediaProfileMenus: reuse existing transient profile instead of creating duplicates on repeated clicks (GetPackage check instead of RF_Transient) Recreate a default profile on early-return paths in OnExtraDataSessionLoaded to maintain the always-active invariant Hide asset browser submenu and relabel "Create" to "Open" in transient mode.
XR Creative: Fix regression where actors moved with the VR Gizmo then can't be selected because the physics scene is stale. Now call RecreatePhysicsState at the close of each interaction.
Fixed issue where a null sub section sequence would cause a Take Record to crash the engine.
Fixed potential crash during a Take Record in the Animation Track Recorder where the object to record could become null and trigger an assertion.
Fixed issue where after recording into sequence, the user could not drag any new sources in to the Take Recorder source panel. Fixed issue where reopening the TakeRecorder would lock out the UI. Fixed issue where a takes AssetMetadata was locked even if the sequence was not marked as read only.
Timemanagement: Enable the TimecodeCustomTimestep to ignore subframes and expose it as an option to the user.
Fix Widget component getting invalidated in multi-user sessions. We now no longer transact setting the custom depth cvar to avoid invalidation occurring. Renamed the XRCreativeMode base class to appropriate naming.
Fixed issue where TakeUtils::MakeNewAsset would incrementally append a number onto the end of a name instead of incrementing the index in place, potentially ending in a crash.
Virtual Camera
Bug Fix:
Fixed issue where certain types of lens files would cause a crash due to an abundance of undefined calibration points. The lens distortion interpolation now supports cases where any number of points near the interpolation are undefined as it now uses the whole focus and zoom curves to compute proper interpolation values.
アップグレード ノート
AI/ML
Neural Network Engine (NNE)
Upgrade Notes:
The NNERuntimeORT plugin's bundled ONNX Runtime was upgraded from 1.20 to 1.24.3, and the DirectML library used by its DirectML execution provider was upgraded to 1.15.4. Standard imported ONNX assets continue to load without action. If you cache or stage NNERuntimeORT artifacts as part of your packaging pipeline, update any deployment scripts that reference the prior version-suffixed shared-library names: On Linux and LinuxArm64 the libonnxruntime.so.1.20 file is replaced by libonnxruntime.so.1.24, and on Mac libonnxruntime.1.20.dylib is replaced by libonnxruntime.1.24.dylib. No project-side C++, INI, or build-flag changes are required.
The IREE compiler, runtime, and command-line tools bundled with NNERuntimeIREE were upgraded from the prior version to IREE 3.11.0. Compiled model artifacts produced by the previous IREE version are not guaranteed to remain ABI-compatible with the new runtime; clear the compiled-model cache and re-cook any project that ships pre-compiled NNERuntimeIREE assets so that they are regenerated against the new toolchain. Console platform support was expanded so that an additional supported console platform now carries its own IREE platform layer. No project-side C++, INI, or build-flag changes are required.
NNE model assets compiled with NNERuntimeIREECpu can now carry per-model compiler flags. Open the affected UNNEModelData asset and add entries under the new IREE Runtime Compiler settings; each entry filters by Platform and Target name (leave either empty to match all) and contributes a flag string that is appended to the IREE compiler invocation. The first entry whose Platform and Target both match is used. Adding, removing, or editing a flag entry invalidates the compiled model cache and triggers a recompile on next cook or load. No project-side action is required for existing models; models with no entries configured retain the prior compiler behavior.
The Core ML runtime can now import models in the .mlpackage directory format in addition to the existing .mlmodel single-file format. Because the Unreal Editor cannot import a directory directly, drag the Manifest.json file from inside the target .mlpackage folder into the Content Browser; the import logic detects the surrounding .mlpackage parent and serializes the full package contents into the resulting UNNEModelData asset. The asset will be named after the .mlpackage folder rather than after Manifest.json. Existing .mlmodel assets continue to work without re-import. No config, INI, or platform deny-list changes are required.
No project-side action is required. Existing projects using NNERuntimeIREE automatically emit CPU profiler trace events for IREE runtime activity in Debug, DebugGame, and Development builds. Test and Shipping builds remain unaffected. Win64 arm64 is not supported. If you rebuild the IREE third-party libraries from source, re-run the updated build scripts in Engine/Plugins/Experimental/NNERuntimeIREE/Source/ExternalBuild/Scripts/ to produce the new ireert_dev variants used by non-Shipping configurations.
Projects that requested NPU inference through the NNERuntimeORTDml runtime must migrate to the GPU or RDG paths exposed by the same runtime. After upgrading, GetRuntime("NNERuntimeORTDml") will never return a proxy that implements INNERuntimeNPU, and CanCreateModelNPU / CreateModelNPU on the DML runtime will no longer be callable. Project code that branches on the returned proxy type must be updated to stop expecting an NPU-capable variant. No build-flag, .uplugin, or content changes are required.
API Change:
UNNERuntimeIREECpu now overrides INNERuntime::CreateDefaultRuntimeSettings to return a new UNNERuntimeIREECpuSettings UObject. UNNERuntimeIREECpuSettings holds an FNNERuntimeIREECpuCompilerSettings struct, which in turn wraps a TArray of FNNERuntimeIREECpuCompilerFlags entries (Platform, Target, Flags fields). These USTRUCT and UCLASS types are reflected and show up in the per-model runtime settings panel on UNNEModelData. The matched flag entry is mixed into the compiler hash, so changes to settings invalidate the cached compiled model. All affected headers live in the plugin's Private folder, and no public NNE or NNERuntimeIREE headers were modified. API Compatibility: No public API was removed or renamed.
Added a new runtime module IREETracing to NNERuntimeIREE that bridges the IREE tracing ABI to FCpuProfilerTrace. Modules linking the IREE runtime directly must add "IREETracing" to their dependencies; NNERuntimeIREE and IREEDriverRDG already do. The IREE.Build.cs now selects ireert_dev for Debug/DebugGame/Development and ireert for Test/Shipping. All iree_tracing_* entry points are no-ops when UE_BUILD_SHIPPING is set or CPUPROFILERTRACE_ENABLED is 0. IREETracing/Internal/IREETracing.h is internal - do not expose through public game-module headers. No existing API was removed or renamed.
Animation
API Change:
Per type, give the possibility two merge Asset User Data. Useful when merging two SKM.
Remove non-reflected UE_DEPRECATED items (5.3-5.6):
AnimAssetFindReplace: RequestUIRefresh.
AnimationEditorViewportClient:
SetCustomAnimationSpeed
GetCustomAnimationSpeed
SetPlaybackSpeedMode
GetPlaybackSpeedMode
GetPersonaModeManager.
BlendSpaceAnalysis: 10 deprecated static template overloads.
CalculatePosition
CalculateVelocity
CalculateAngularVelocity
CalculateOrientation
CalculateOrientationRate
CalculateDeltaPosition
CalculateDeltaOrientation
CalculateBoneOrientation
CalculateComponentSampleValue
CalculateSampleValue
IAnimSequenceCurveEditor: 2 SmartName methods.
IAssetFamily: RecordAssetOpened pure virtual (overrides removed).
IPersonaPreviewScene:
RegisterOnSelectedBoneChanged
UnregisterOnSelectedBoneChanged pure virtuals (overrides removed).
PersonaDelegates: FOnStopEditingCurves.
PersonaModule:
CreateCurveViewerTabFactory post-undo overload
CreateSkeletonSlotNamesTabFactory post-undo overload
CreateBlendSpacePreviewWidget TAttribute overload
TestSkeletonCurveNamesForUse
CreateCurvePicker(IEditableSkeleton).
IAnimationEditor: 2 FCurveEditInfo SmartName ctors.
IEditableSkeleton: 8 SmartName virtuals
AddSmartname
RenameSmartname
RemoveSmartnamesAndFixupAnimations
AddCurve
RemoveCurve
SetCurveMetaBoneLinks
SetCurveMetaDataMaterial
SetCurveMetaDataMorphTarget).
RegisterOnSmartNameChanged / UnregisterOnSmartNameChanged delegates.
Character Customization
API Change:
Implemented as an External Operation.
New External Operations can be declared in non-Mutable related plugins. Once an External Operation is registered, it automatically appears as CO node. These nodes are automatically compiled into Mutable VM code. Added an example plugin which show how to create and use new External Operations.
CustomizableSkeletalComponent is a wrapper of the CustomizableObjectInstanceUsage. It is recommended to use usages instead of components to link instances with actors.
Upgrade Notes:
Use Mesh Transform Mesh in Bone Hierarchy instead.
Node no longer supported. Use Material Modify instead.
Replace accesses to deprecated properties with calls to the corresponding CustomizableSkeletalComponent API.
Review Skeletal Mesh Make and Skeletal Mesh Merge (Modifier) from Customizable Objects using manually created LODs and remove unused LOD pins.
Control Rig
Upgrade Notes:
Deprecated direct Blueprint access to FRigBoneElement, FRigNullElement, and FRigControlElement structs FindBone, FindControl, and FindNull on URigHierarchy are now deprecated in Blueprint. Direct access to Index, SubIndex, bSelected, and Settings on element structs is also deprecated. Use the following replacements instead:
Check presence: Contains(Key).
Get bone type: GetBoneType(Key) (new).
Get control settings: GetControlSettings(Key) (new).
Get selection state: IsSelected(Key).
Get element index: GetIndex(Key) / GetLocalIndex(Key) Existing Blueprint graphs continue to work with deprecation warnings.
API Change:
Remove non-reflected UE_DEPRECATED items (5.5-5.6):
U Movie Scene Control Rig Parameter Section
:LoadAnimSequenceIntoThisSection non-FLoadAnimSequenceData overloads (2x, 5.5-5.6)
:GetControlsMask, SetControlsMask, FillControlsMask inline shims (5x, 5.5)
F Baking Helper::GetSequencer (5.6).
U Control Rig::GetRigModuleNameSpace (5.6).
FModuleInstanceHandle(const UModularRig*, const FStringand) (5.6).
FRigUnit_DebugHierarchy::DrawHierarchy no-DebugDrawSettings overload (5.5).
Remove non-reflected UE_DEPRECATED (5.5) GetCharacterOwner from UMotionWarpingComponent and URootMotionModifier. Replacement is GetOwnerAdapter()→GetActor() / GetActorOwner().
Gameplay
Upgrade Notes:
Any animation content with rotation modifiers using a rotational offset with facing mode will need to be manually adjusted (this was introduced in 5.7).
IK and Retargeting
Upgrade Notes:
Opening RigMapper Definition data asset once and resaving it is all it is needed. Underlaying structure works uninterrupted even without saving.
Opening and loading IK Retargeter and resaving will suffice.
Reloading relevant RigMapper Definition Data Asset should suffice.
No action necessary. Reloading RigMapper Definition Data Asset should suffice.
Runtime
Upgrade Notes:
Set "a.AnimSequence.UseBinaryDDCKey 1" to opt in (disabled by default).
Set "a.AnimSequence.UseBinaryDDCKey 1" to opt in (disabled by default).
API Change:
F Smart Name Container::Serialize(FArchiveand, bool), FSmartName::Serialize(FArchiveand), the three operator<<(FArchiveand,...) overloads, and TStructOpsTypeTraits<FSmartName>::WithSerializer. USkeleton::Serialize gates the drain on a new custom version FUE5ReleaseStreamObjectVersion::RemovedSmartNameContainerPayload so future-saved skeletons skip it.
AnimSequence family:
ExtractRootMotion
ExtractRootMotionFromRange
ExtractRootMotionFromTrack
ExtractRootMotionFromTrackRange
ExtractRootTrackTransform
CacheDerivedData
CompressRawAnimSequenceTrack
CompressAnimationDataTracks
DoesNeedRecompress
PopulateDDCKey
PopulateDDCKeyArchive
UseRawDataForPoseExtraction
FindBoneTrackByName
FindBoneTrackByIndex
FindFirstChildTrackIndex
ClearCompressedBoneData
ClearCompressedCurveData
GetCompressedCurveIndexedNames
GetCompressedTrackToSkeletonMapTable
DecompressCurve
EvaluateCurveData
GetFloatCurveName
GetTransformCurveName
GetBoneTransform
GetBoneTransformFromModel
GetAnimationPose
BuildPoseFromModel
CreatePoseFromAnimation
GetMarkerSyncPositionfromMarkerIndicies
GetMaxCurrentTime
UpdateFrameRate
LinkSequence
LinkMontage
StopAllMontagesByGroupName.
AnimInstance/AnimNode:
FAnimTickRecord
FAnimExtractContext
FAnimationActiveTransitionEntry
TestMontageTickRecordForLeadership
GetRelevantAssetPlayerFromState
RecalcRequiredCurves
AddCurveValue
WantsSkippedUpdates
OnUpdatesSkipped
StartInertialization
ApplyInertialization
OverrideAsset.
Compression:
GetAssetRegistryTags (non-Context overload)
GetExposedValueHandlers
GetPropertyAccessLibrary
GetPropertyAccessLibrary_Direct
SetExposedValueHandler.
BlendSpace/BlendProfile:
UpdateSampleAnimation
GetWeight.
Anim Class Interface:
InputProperties
GetExposedValueHandlers.
Anim Sequence Helpers:
GetCurveNames
GetPoseNames
InitializeCurveMetaData
GetCurveMetaData
GetCurveBufferAndSamples
FAnimCurveBufferAccess.
Pose Asset:
AddOrUpdatePose
AddOrUpdatePoseWithUniqueName
ContainsPose
ModifyPoseName
GetUniquePoseName
AddReferencePose
RetargetPose.
Animation Modifier: IsCurrentlyApplyingModifier.
Ancestor Tracker:
GetAncestor,
TrackAncestor.
IAnimationDataModel: IterateBoneKeys/CurveKeys (non-UFUNCTION).
AnimGraphRuntime + MovieSceneTracks:
AnimNode_BlendListBase: GetResetChildOnActivation (5.3).
AnimNode_BlendSpacePlayer: GetLoop (5.0).
AnimNode_SequenceEvaluator: GetShouldLoop (5.0).
AnimSequencerInstance / AnimSequencerInstanceProxy: UpdateAnimTrackWithRootMotion non-FAnimSequencerData overloads (5.4).
AnimGraph compiler interfaces:
IAnimBlueprintCompilerCreation Context: OnStartCompilingClass
OnFinishCompilingClass
OnPreProcessAnimationNodes
OnPostProcessAnimationNodes
OnPostExpansionStep
OnCopyTermDefaultsToDefaultObject delegate-registration APIs (5.0).
IAnimBlueprintGeneratedClassCompiledData: GetExposedValueHandlers
GetPropertyAccessLibrary (5.0).
PropertyAccessCompilerHandler class deleted whole; replaced by UAnimBlueprintExtension_PropertyAccess.
AnimBlueprintExtension_PropertyAccess: AddCopy(EPropertyAccessBatchType) overload (5.3; replaced by context-ID AddCopy).
FSmartName deprecation (5.8) was added to FSmartName / FSmartNameMapping / FSmartNameContainer / FSmartNameMappingIterator. Caller-side PRAGMA_DISABLE/ENABLE_DEPRECATION_WARNINGS wrappers were added around the remaining still-live references to those types.
Skeleton.h::SmartNames_DEPRECATED
PoseAsset.h::PoseNames_DEPRECATED
AnimCurveTypes.h Name_DEPRECATED accesses
CurveIdentifier.h/.cpp InternalName_DEPRECATED migration
AnimInstanceProxy.h AddCurveValue(FSmartNameMappingand
Persona editor curve models/tracks
UEditorAnimCurveBoneLinks
Removed 5.0-5.6 non-reflected, non-virtual symbols (past the 2-version grace window; non-UPROPERTY / non-UFUNCTION): Runtime/Engine:
AnimCurveTypes.h: FVectorCurve(FSmartName,int32) and FTransformCurve(FSmartName,int32) ctors (5.3)
FRawCurveTracks inline FSmartName overloads
AddFloatCurveKey
AddCurveData
DeleteCurveData
DuplicateCurveData
RefreshName
GetCurveData(SmartName::UID_Type) const/non-const (5.3).
AnimInstanceProxy.h: FAnimInstanceProxy::AddCurveValue (FSmartNameMappingand,FName,float) inline (5.3)
GetSlotGroupInertializationRequestMap() + backing
SlotGroupInertializationRequestMap member (5.5) and cpp impl.
AnimCompressionDerivedDataPublic.h deleted whole
FAsyncCompressedAnimationsManagement
GAsyncCompressedAnimationsTracker
RequestAsyncCompression
GetNumRemainingJobs
WaitOnExistingCompression
Plus the now-orphaned FActiveAsyncCompressionTask / FQueuedAsyncCompressionWork support structs (5.2, editor-only).
Include removed from AnimCompressionDerivedData.cpp.
AnimCompressionTypes.h:
FCompressibleAnimData::NumberOfFrames (5.0)
ICompressedAnimData::CompressedNumberOfFrames (5.0 editor-only)
FCompressedAnimSequence::CompressedCurveNames (5.3 TArray<FSmartName>)
two free DecompressPose(...) overloads (5.1).
cpp cleanups: Deleted the orphaned NumberOfFrames / CompressedNumberOfFrames member initialisers/writes in FCompressibleAnimData ctors and ICompressedAnimData::SerializeCompressedData, plus the free DecompressPose bodies.
AnimInstance.h: UAnimInstance::SlotGroupInertializationRequestMap plain-member (5.5).
Runtime/AnimGraphRuntime:
AnimNode_RigidBody.h: FSimSpaceSettings::MasterAlpha (5.1 editor-only, not UPROPERTY, no PostSerialize consumer).
Editor/AnimGraph:
IAnimBlueprintCompilerHandler.h + IAnimBlueprintCompilerHandlerCollection.h deleted whole (5.0 empty base classes, replaced by UAnimBlueprintExtension_PropertyAccess). Editor/Persona:
AnimAssetFindReplace.h:
FAnimAssetFindReplaceConfig members FindString / ReplaceString / Type / Mode / SkeletonFilter (5.3) and the now-unused EAnimAssetFindReplaceType enum
Explicit defaulted ctors/copy op and their PRAGMA block removed.
AnimTimeline/AnimModel.h +.cpp:
Deprecated mutable/const GetRootTracks() accessors (5.1) and the UE_DEPRECATED tag on the RootTracks member (still live, only internal use remains)
pragma wrappers in AddRootTrack/ClearRootTracks/ForEachRootTrack cleaned up.
AnimTimelineTrack_Curve.h/.cpp: FSmartName-taking ctor (5.3).
AnimTimelineTrack_VectorCurve.h/.cpp: FSmartName-taking ctor (5.3).
SAnimSequenceCurveEditor.h/.cpp: FRichCurveEditorModelNamed FSmartName ctor (5.3) and Name (FSmartName) member.
Editor/UnrealEd:
EditorAnimCurveBoneLinks.h/.cpp: EditableSkeleton member and Refresh(FSmartName,...) non-virtual (5.3).
Virtual Initialize(FSmartName,...) kept per policy (deleting deprecated base virtuals can silently break overrides).
Removed (selection):
Smart Name:
FAnimationCurveIdentifier
FindSmartName
FindSmartNameByUID
DoesSmartNameExist
RemoveSmartNames
RenameSmartName
RetrieveSmartNameForCurve
GetUniquePoseSmartName
FillUidArray
FillNameArray
FillCurveTypeArray
FillUIDToCurveTypeArray
FillUIDToNameArray
FindUID
GetMaxUID
CurveUIDToArrayIndexLUT
RetrieveContainerNameForCurve
GetContainer
AddContainer.
Kept (deprecated) - required by the USkeleton load path to drain the legacy FSmartNameContainer payload from existing .uasset files: FSmartNameMapping::Serialize(FArchive&),.
Remove non-reflected UE_DEPRECATED items (5.0-5.6):
FProviderPollResult 4-param constructor (5.0)
ULiveLinkControllerBase::AttachedComponent member (5.1)
ULiveLinkSettings::GetPresetSaveDir (5.1)
FLiveLinkSourceCollection::GetSources (2 overloads, 5.5)
FLiveLinkSourceCollection::GetSubjects (5.5)
FLiveLinkSubject::PreprocessFrame 1-arg override (5.6)
ULiveLinkSettings::GetValidColor, GetInvalidColor (5.6)
ILiveLinkHubModule::PreinitializeLiveLinkHub, StartLiveLinkHub, ShutdownLiveLinkHub (5.6)
ILiveLinkHubApplicationModeFactory::CreateApplicationMode + the private FLiveLinkHubApplicationMode() default ctor and friend declaration supporting it (5.6)
Audio
Upgrade Notes:
Waveform editor playhead refactored to use more precise frame positions.
Audio sections will no longer auto expand to keyframes outside the bounds of the section.
Added option to movie render queue to select multiple submixes for export and get a wav file for each one.
Added keybinds to shift to next zero crossing with H, and ability to expand loop regions to snap to zero crossing using shift with the existing movement keybinds.
Adds a control bus mix track to the sequencer for users using Audio Modulation to enable or disable mixes in a sequence.
Allows resizing of subtitle sections in the sequencer.
Control bus tracks added to sequencer to allow users using Audio Modulation to control control bus values directly in a sequence.
API Change:
This will result in the software convolution reverb being used by default.
Architecture
Upgrade Notes:
If existing attenuation submix sends were implicitly disabled due to SoundBase→bEnableSubmixSends, they may now be audible. These flags should not have been coupled.
MetaSounds
API Change:
CVar au.EnableRelativeRenderCostVoiceLimit has been enabled by default.
This calculates a sound's voice count based on its relative render cost, rather than an assumption that the cost of one sound is weighted the same as any other single sound.
This is especially relevant for MetaSounds, where one with many concurrent wave players will generally be more expensive than one playing a single wave, and now takes into account that relative difference.
Because less sounds may be playing under this new calculation, this may result in performance increases and you may want to reconsider voice count tuning.
WaveForm
Upgrade Notes:
Deprecated UFadeFunction, FFadeFunctionData, and EWaveEditorFadeMode (5.8). Migrate to UTransformationFadeFunction and UWaveformTransformationFade.
Editor
Upgrade Notes:
You can disable the "SourceCodeNavigation.EnableAsync" Cvar to go back to a synchronous operation.
Scripting
Upgrade Notes:
For globally useful actions, add UObject or AActor to your SupportedClasses array for UAssetActionUtility or UActorActionUtility, respectively.
API Change:
Python-defined function return value fixes A Python defined ufunction that had multiple ret types as a packed tuple (e.g., `ufunction(ret=(int, str))`) must now pack those values in the order they're declared in the ret argument (e.g., `return (10, "hello")`), rather than having to pack them in reverse (e.g., `return ("hello", 10)`).
Foundation
Build
Upgrade Notes:
Optional migration: Replace `#if PLATFORM_*` with `#if UE_PLATFORM_*`
API Change:
Specifically with IOS, but possibly other platforms, the define `PLATFORM_IOS` can be stomped by included IOS framework headers. This can cause compile time issues with code guarded by `#if PLATFORM_IOS` being incorrectly evaluated. Using the new `#if UE_PLATFORM_IOS` and other similar defines will not encounter this issue and therefore can be reliably used to block code on a per-platform basis.
Core
API Change:
This may cause a compile time error for existing code, but the implicit cast to bool is most likely not ever desired. If it is, an explicit cast can be added, otherwise a proper LexToString implementation should be added for the type being converted.
In case licensees observed performance regression in certain corner cases from this change they can increase bins config with UE_MB3_MAX_SMALL_POOL_SIZE project define.
Renamed ExecCheckImplInternal to CheckEnsureFailed to be more clear that it applies to ensures and not checks.
Upgrade Notes:
These replace UE_LOG which will eventually be deprecated. Please convert UE_LOG to UE_LOGF. The release contains ConvertUELog.py to safely upgrade most uses.
Derived Data Cache graphs are now configured in the [DerivedDataCacheGraphs] section of the Engine config.
Derived Data Cache stores are now configured in the [DerivedDataCacheStores] section of the Engine config.
Graphs are an ordered list of stores. They support Name=OtherName to remap store names and Deprecated="DeprecationMessage'.
Stores are configured the same as before, with the addition of Base=BaseStoreName to inherit and Deprecated="DeprecationMessage" to deprecate.
Deprecated AsyncPut, KeyLength, and Verify graph nodes. AsyncPut is created automatically. Verify is created based on the -DDC-Verify command line argument.
FSharedEventRef was previously always using EEventMode::AutoReset regardless of if EEventMode::ManualReset was passed in to the constructor. With this fix, the constructor argument is now functional so please be sure to check your callsites.
Insights
API Change:
If you have implemented custom Trace event which uses the OnConnect callback and you need the event to be analyzed ahead of regular events (that includes events in the tail buffer), add the `MaybeImportant` flag to the event definition. Using this flag both synchronized and non-synchronized events can safely be emitted during OnConnect.
Note that events emitted during OnConnect that are not marked `MaybeImportant` are now queued and written using the regular buffer queue. They will be analyzed after events in the tail buffer.
Framework
API Change:
Map placed actors in the persistent level were previously untracked by LSP. Now persistent properties on those actors can be tracked as well.
Map placed actors in any level that were destroyed during a previous level life cycle, can now be re-destroyed automatically. This can be configured for all actor classes or specific ones. They can also be "ejected": not destroyed now, yet will be destroyed on reload (for actors starting death anim).
Re-destruction on servers happens for an actor after its BeginPlay to ensure proper cleanup via the net driver for multiplayer. For offline sessions, re-destruction can be configured to happen before BeginPlay.
Actor base classes can be configured to be runtime respawnable. Instances of those classes are detected at save-time. A record is made of their runtime class, root transform, and persisted actor and subobject properties. At load-time of that same level the actor will be respawned and their persisted properties restored.
Performance limitations: For now, the respawning happens synchronously when a level is added to the world. Recorded classes in the save file are synchronously loaded when calling InitializeFrom (once per map). Level-wide and per-class object-wide C++ hooks exist for PrePersist, PostRestore, ShouldPersist and ShouldRespawn.
AI State Tree
API Change:
The data deprecation is automatic. Code will need to be updated manually.
Upgrade Notes:
Binding on the override linked state might not work anymore. They never worked as intended, and it was probably a bug if they did.
Blueprint
Upgrade Notes:
Blueprint function local variables should not use the same name as member variables. If they do, one variable may unintentionally inherit a parent class's default from the other, unrelated variable. Existing Blueprints can have local + member variables with name collisions, you should fix them up manually by renaming one of the variables.
Gameplay
Upgrade Notes:
Use ChaosMover plugin instead. Equivalent functionality is there for every PhysicsMover feature.
Convert existing use of FloorQueryUtil functions to use the new FFloorCheckSettings variants, rather than the old ones that take individual parameters.
The Raw Input plugin is being deprecated in favor of the new "Game Input for Windows" plugin.
This fix is behind the EnhancedInput.IgnoreHeldKeysOnFlush CVar (default: True) which will be removed in a future release.
This change is behind the CVar EnhancedInput.CorrectTouchBoolActionKeys, which is defaulted to on, in case any existing content is relying on this broken behavior. This CVar will be removed in a future release.
This is behind the "input.bShouldUpdatedDeviceSubsystemOnConnection" CVar, which is default on, in case this change in metadata causes an unexpected change in flow for a project.
API Change:
You can set the UE_USE_LEGACY_INPUT_DEVICE_SCOPE flag in your build target to enable the FInputDeviceScope again if required.
Blueprint programmers can now get the Level Streaming Persistence Manager (world subsystem), and call SerializeTo and InitializeFrom from Blueprint. This serializes the persistence data for streaming levels of the current map, to be included in SaveGames or loaded from them.
The FActiveGameplayEffectHandle constructor taking an int32 Handle value has been deprecated; its use has been replaced with FActiveGameplayEffectHandle::GetInstantExecutedHandle. FGameplayEffectRemovalInfo now contains a pointer to the ActiveGE's owning ASC.
To use this feature, set the bEnablePreferredInputAPIPreferences flag in the input project settings to true and provide a list of default preferred input APIs, such as "XInput,WinDualShock"
A partial fix for this was submitted back in 5.7 regarding the "input.bRespectIMCPriortyForTriggers" CVar, but that didn't resolve the whole scope of the issue.
Mass
API Change:
New processor architecture:
USpringUpdateProcessor: Runs spring damper, updates FSpringMovementRuntime (no movement).
USpringMovementApplyProcessor: Applies spring state to transform (skipped when FMassCustomMovementTag present).
UMassSpringMovementToTrajectoryProcessor: Generates trajectory from spring state.
UMassMovementToTrajectoryProcessor: Generates trajectory from desired velocity (no spring).
UTrajectoryToMovementProcessor: Moves entity along generated trajectory.
UMassPoseTrajectoryDebugProcessor: Debug visualization Creates two new modules within the MassGameplay plugin:
MassCharacterTrajectory: Trajectory generation, trajectory movement, debug visualization.
Spring movement processors and fragments added to MassMovement Execution order: SpringUpdate → Trajectory → Movement/SpringApply → TrajectoryMovement Trajectory generation always runs before movement for consistent start-of-frame sampling.
Networking
API Change:
In order to support parallel NetConnection::Tick, thread safety primitives have been added in certain core networking functions. By default these are included in the build and may add a few nanoseconds to execution time. If your application does not require parallel server replication then you can set UE_SUPPORT_PARALLEL_IRIS=0 and those primitives will be completely compiled out.
Level Design and Art Tools
Geometry Core
Upgrade Notes:
Added a mesh simplification mode that supports controllable attribute preservation with seam support to geometry core library and expose in geometry script. This affects texture coordinates, normals, tangents and color attributes.
World Building
Upgrade Notes:
The Celestial Vault actor's components hierarchy has changed. If you already have one in your scene, it won't reflect the changes. Please replace it with a new instance. (You can copy/paste properties if you wish).
API Change:
FPCG Source Data Container: For execution source data.
UPCGComponent now exposes SourceDataContainer through the execution source interface.
MetaHuman
Upgrade Notes:
Opt-in per asset via UDNA::bUseOptimizedCooking (default true on UDNA; not available on the legacy UDNAAsset). Projects must re-cook to pick up the optimization.
Existing classical-rig DNA assets continue to load and resave through the file-format migration path; no manual content steps are required. Projects that intend to ship joints-only ML characters need a DNA exported from the new pipeline capable of producing JoML DNAs, they cannot be produced from a classical-rig DNA in-engine.
Recommended for any project that imports DNA from untrusted or user-supplied sources. No content or API changes. Well-formed DNA files behave identically to before.
Run once per project to migrate existing MetaHuman content to the new asset layout:
Command LineUnrealEditor-Cmd.exe MyProject.uproject -run=ConvertLegacyDNAAssets -PathFilter=/Game/MetaHumans -ResaveDNA -VerboseUse -DryRun first to preview the scope of changes without writing.
Use -ReimportFromSource to re-pull from the original.dna files instead of converting in place. The commandlet is idempotent - re-running on an already-migrated project is safe and a no-op.
F Rig Logic Configuration::CalculationType and FRigLogicConfiguration::RotationOrder are deprecated. Existing assets are migrated on load: PostSerialize lifts the old plain CalculationType value into the new CalculationTypePerPlatform.Default, and the rotation order is now sourced from the DNA's authored convention rather than the configuration, so the old field is silently ignored. Code that read either field directly should switch to CalculationTypePerPlatform.GetValueForPlatform(...) or Reader→GetConfig().RotationSequence respectively.
Existing DNA assets are not retroactively reconfigured - the project defaults seed new imports only. To re-apply the new defaults to an existing asset, edit its DNAConfig / RigLogicConfiguration in the Details panel or use ConvertLegacyDNAAssets -ReimportFromSource (which honors both DefaultDNAConfig and DefaultRigLogicConfiguration).
FP16 evaluation remains opt-in via FRigLogicConfiguration::FloatingPointTypePerPlatform (or project-level default in Project Settings → Plugins → RigLogic). Numerical output in FP16 mode differs from Float mode within the documented FP16 precision envelope.
No content migration. Edits made post-import are persisted with the asset and are used as the read configuration on subsequent loads. The struct is reachable from editor scripting (set_editor_property("DNAConfig",...)) and from Blueprints (struct fields are EditAnywhere, BlueprintReadOnly). Config edits are destructive.
Narrowing the Layers bitmask permanently removes the dropped layers from the in-memory DNA - re-enabling a layer later does not restore the data.
The same applies to tightening MaxLOD / MinLOD / ExactLODs: LODs outside the new range are discarded.
The only way back is to reimport from the source.dna (Asset Actions → Reimport on the UDNA). Use a copy of the asset if you're uncertain what you're discarding.
Opening metahuman in editor, selecting corresponding eyelashes in head model panel and assembling should suffice.
API Change:
Adds UPROPERTY(EditAnywhere, Category="DNA") FDNAConfig DNAConfig to UDNA. PostEditChangeProperty on the DNAConfig member normalizes cascading layer bits (e.g. GeometryWithoutBlendShapes masking Geometry), then reloads the current reader with the new settings. MaxLODPerPlatform and MinLODPerPlatform are FPerPlatformInt. UDNA::PreSave resolves each per-platform field against SaveContext.GetTargetPlatform()→IniPlatformName() and writes the resolved value into the Default slot of the serialized struct; the PerPlatform map is WITH_EDITORONLY_DATA and is stripped from cooked packages.
Mobile Rendering
Upgrade Notes:
Materials with the override 'Use Half Precision' set will now revert to Default to preserve their previous behaviour. Materials reverted in this manner will be printed in the message log.
Motion Design
Upgrade Notes:
The old behavior of allowing UFUNCTIONS to be executed can be re-allowed in Remote Control project settings.
Online
Hotfix System
API Change:
Hotfix files can now use MyConfig_Engine.ini syntax when MyTarget.CustomConfig = "MyConfig" for example.
Online Subsystem
Upgrade Notes:
For Android Google Play Store integrations: If you are using the IsAllowedToPurchase API for detecting whether the IAP system has been initialized or not, you will need to cast the interface to FOnlinePurchaseGooglePlay, and use the new IsBillingClientConnected() API instead.
Pixel Streaming
Upgrade Notes:
Set AllowedOrigins found under PixelStreaming2PluginSettings → SignallingServer to * to allow all origins, or leave empty to disable filtering and use the old behavior.
A memory leak has been identified in the direct D3D12 → NvEnc code path. If you are seeing increased untracked memory usage leading to application crashes, please use the launch argument or config property to revert to the legacy code path. Please note that the legacy code path may result in corrupted video if you are using placed D3D12 resources.
Platform
Windows
Upgrade Notes:
In order to include this new GameInputRedist.msi file with packaging, users must do the following: Set Game Input::IncludeRedistFiles=True in the project's DefaultEngine.ini. Like this: ; Include the GameInput redist files on windows targets Game Input: IncludeRedistFiles=True
Platform Mobile
iOS, tvOS, and iPadOS
API Change:
If it is desired, a licensee can enable mimalloc via UE_APPLE_USE_MIMALLOC_MIN_FREE_RAM_MB project define at a cost of a significant memory footprint. The define sets a minimal free RAM threshold that is checked on startup and if the device has free memory above that limit, it will instantiate mimalloc.
Rendering
Upgrade Notes:
R.Water.SingleLayer.ForceVelocity has been deprecated, use.Water.SingleLayer.VelocityOutputPass instead or configure it in the project setting.
Architecture
Upgrade Notes:
If your code contains any custom subclasses of FViewportClient that include a TSharedPtr to the associated FViewport, you should change it to a weak pointer to avoid an object-leak (or assign a raw pointer from AddAssociation/RemoveAssociation overrides). Client-owns-viewport patterns should be reconsidered, viewport-owns-client or viewport-borrows-client are more appropriate.
Lumen
Upgrade Notes:
Enabled Lumen applying height fog to reflection ray hits by default (r.Lumen.HeightFog 1).
Reduces the mismatch between screen traces and other trace types in heavily fogged scenes (but screen traces are still fogged incorrectly).
Fixed double-fogging of reflections from SampleSceneColorAtHit and DistantScreenTraces.
Fixed ScreenProbeGather rays fogging using MaxTraceDistance when falling back to the Radiance Cache, causing too much fog. This also fixed Skylight Leaking applying too much on Radiance Cache hits.
Cost is about.03ms on High GI settings on 2080 at 1080p.
Materials and Shaders
API Change:
Should be used in pixel shader and not vertex shader.
Older OpenGL APIs (ES 3.0 and below) do not fully support it.
Upgrade Notes:
New feature, no changes needed.
No explicit upgrade step required, should be transparent.
No specific upgrade steps necessary, but if you were relying on this mechanism (showing shader compile warnings on load from DDC), you'll now need to force shader compilation to see warnings.
Subsurface Profile: If `r.SSProfiles.Transmission.UseLegacy` has been set to 0 previously, now you will have to manually reduce the newly added `transmission distance scale` by 10 to better match the old project behavior.
Niagara
Upgrade Notes:
Hierarchy Editor stores expansion state across refreshes.
Path Tracer
Upgrade Notes:
To disable backface culling on specific primitives, mark the material as two-sided.
RHI
API Change:
This help reducing the CPU cost of CreateCommittedResource and reducing memory pressure by keeping unreferenced resources out of VRAM. Controlled by read-only CVar D3D12.ResourcesStartResident, by default Off.
Simulation
Cloth
Upgrade Notes:
Add collisions from a different SKM+physics asset to the simulation using AddClothCollisionSource instead.
Dataflow
API Change:
UPROPERTY must be tagged with "GizmoType" metadata (Translate, Rotate, Scale, Transform) When using Rotate or Scale, "GizmoPosition" must be used with the name of the property defining the position of the gizmo.
UI
Upgrade Notes:
Fixed a bug that caused CommonUI tags to not be comparable in Blueprint.
Slate
Upgrade Notes:
"OnlyGameWindow" cvars have been renamed to "OnlyProjectContent", and "bDebugGameWindowOnly" ini settings have been renamed "bDebugProjectContentOnly". Opting a custom widget tree into the Slate Console Debugger now requires overriding `SetIsProjectContent` or `SetIsProjectContentParent` from a subclass of any widget, rather than setting the `SWindow` as `EWindowType::GameWindow` or tagging it as "PIEWindow".
Anywhere `EWindowType::GameWindow` was used, use `EWindowType::Normal` instead.
API Change:
If a build.cs file has SlateRHIRender as a dependency, it might be needed to add SlateBaseRenderer too.
Virtual Production
Tools
API Change:
This option is exposed through the Take Recorder settings as a boolean and is accessible through Blueprints.
The new ITakeRecorderSourcesManager interface should be used in favor of directly accessing the Take Recorder Sources from a sequences metadata.