Unreal Engine 5.1 リリース ノート

Unreal Engine 5.1 の新機能および更新機能の概要

Choose your operating system:

Windows

macOS

Linux

新機能

Unreal Engine 5.0 は、画期的なリリースであり、新しい多数のツールをユーザーに提供するものでした。5.1 は、5.0 のフレームワークを基盤として構築されており、次世代のリアルタイムの 3D コンテンツやエクスペリエンスの制作をさらに容易にする更新や改善を実現します。さまざまなセクターのニーズを念頭に置き、機能セットを堅牢にし、ワークフローに即した汎用性のあるものにすることを目指しています。

ビジュアルの整合性とパフォーマンス

次世代コンソールや次世代対応 PC で、60 fps のゲームの制作をサポートするための改善を行いました。これには、以下が含まれます。

  • Lumen、Nanite、および仮想シャドウ マップの改善

より大規模なワールドとコラボレーションを構築する

  • World Partition を利用し、より大規模なワールドを制作できます。

  • チームワークをより効率的にする改善が行われ、ゲームの開発プロセスがスムーズになりました。

バーチャル プロダクションとインカメラ VFX

バーチャル プロダクションとインカメラ VFX (ICVFX) の新しいツールについて、迅速な開発を続けています。映像に関する作業がかつてないほど簡単になりました。

  • インカメラ VFX エディタを使用し、色補正、ライト カードの適用、一般的なステージ操作の実行ができます。

  • MVR のサポートによって、DMX の構成が改善されました。

  • Lumen は、nDisplay の初期実装を備えています。

  • GPULM ワークフローが改善されました。

これらのツールについての詳細情報、および Unreal Engine 5.1 のすべての改善点の一覧をご覧ください。

今回のリリースには、GitHub の Unreal Engine デベロッパー コミュニティから寄せられた改善点が含まれています。Unreal Engine 5.1 に貢献いただいた以下の皆様に謝意を表します (以下、敬称略)。

ABoy (lvhuming), AchimTuran, Adrian-Marian Popoviciu (ArmainAP), Aidin Abedi (aidinabedi), aknauermaxon, Albin Odervall (albinodervall), aldenc98, Alex Garcia Ruiz de Oteiza (AlexOteiza), Alexander (DecoyRS), Amit Kumar Mehar (amuTBKT), andersonbisconsin, Andreas Andersson (derwiath), Antoine Vugliano (avudnez), AntsyBoi, az6667, Ben Raziel (benraziel), Ben Rog-Wilhelm (zorbathut), Ben Sutherland (BlenderSleuth), Ben Sweeney (BenSweeneySG), BenAD83, Benito Alessandrino (BennyExtreme), Benjamin Thomas Blodgett (BenVlodgi), bestofact, bhickmanl, bitdewy (bitdewy), bmiwcy, Brang Pakdring (brangpd), Brent G (Punlord), Brent Goodacre (WGBrent), Brent Scriver (FineRedMist), Bromfitsen, Cameron Rapp (MalikuMane), cbrandtieng, Cecco (ceccocecco), Charles Alexander (muchcharles), Chris Anderson (CasperTheCat), Chris Haddon, Christian Kendall (ckendal3), Chris Wallis (The Coalition), cmsinflexion, CodingBot (ameaninglessname), Colden Cullen (ColdenCullen), daktor, Damien Kochanek (DamienKochanek), Dan Hertzka (HertzDonut), David Bollo, David Gilbert (davidyrgilbert), David Nadaski (GlassBeaver), dbsigurd, dening (loening), Denis Blank (Naios), Dezső Zoltán (zaki), Diyou, Dmitry Korshunov (originomeg), Dmitry Vinnik (vinnik-dmitry07), Doğa Can Yanıkoğlu (dyanikoglu), dorgon chang (dorgonman), Dorian (Hisamera), Dorian Gardes (d-gardes), Doug Richardson (drichardson), Douglas Jose (douglasjose), Douglas Lassance (douglaslassance), drcxd, Dzmitry Malyshau (dm-tesla), Eddie Stubbington (Edstub207), Edin Suta (edinsuta), Elhoussine Mehnik (HoussineMehnik), Elliot Colp (ecolp-improbable), Emil Rosenquist (EmilRosenquist), Enno Rehling (ennorehling), Eric Thiffeault (ethiffeault), Ethan Thornburg (erebel55), etheranger, Evan Hart (ehartNV) (NVidia), Filippo Tarpini (Filoppi), Fluffy Kalashnikov (FluffyKalashnikov), Fredrik (Temaran), furby™ (furby-tm), fury22pl, Gabriel T. Nardy (gtnardy), Gamergenic (gamergenic), Gaurang Ingale (gaurang-ingale), Geordie Hall (geordiemhall), Georgy Treshchev (gtreshchev), Giovanni Paolo Viganò (gpvigano), Hannah Gamiel (hgamiel), Hirofumi Seo (HSeo), IgnacioFDM, Igor Karatayev (yatagarasu25), igor-kondratiev, Ilddor, Ilya (ill), Incredible (ameaninglessname), Isaac Ashdown (Eyesiah), Isaac Ribeiro (i-ribeiro), Jack Andersen (jackoalan), Jack Isaacs (JackIsaacs), Jackson Fields (fieldsJacksonG), Jacob Kostenick (kostenickj), James Baxter (TheJamsh), Jared Taylor (Vaei), Jay Lu (JayLu2000), Jeremy Abel (jeremyabel), Jessica Chen (Intel), jm00517, John (GoldNotch), John Dickinson (jdckmz), Jonas Kjellström (JonasKjellstrom), Jørgen P. Tjernø (jorgenpt), JSaueressig88, Juan M Gómez (jmgomez), June Rhodes (hach-que), Justin Bostian (jb5n), JustinTime (JustinTether), Kacper Kowalczuk (Ogniok), kaffeewolf, Kai Klyden (RoboMage), Kenn Zhang (breakstring), Kenshin Azuma (aziogroup), Kevin Østerkilde (Kosai106), Kevin Xiao (KXOC), Koji Kawasaki (kedamazigoku), KonstantinKohl, KrisRedbeard, Kristján Valur Jónsson (kristjanvalur), Krunoslav Zaher (kzaher), Krzysiek Justyński (MothDoctor), leobenaducci, Levil0229, lijenicol, lijinlong, LindyHopperGT, LizardThief, losemymind (losemymind), Lukasz "iniside" Baran (iniside), MagForceSeven, Måns Isaksson (mansisaksson), Marat Radchenko (slonopotamus), Marcel Egle (EgleM2022), Marco Antonio Alvarez (surakin), Marijn Suijten (MarijnS95), Mario Arsenov (Xertor), Marius Petcu (dapetcu21), Marnix Kuijs (MarnixKuijs), Matias N. Goldberg (darksylinc), Matthias Hölzl (hoelzl), Maxim Ivanov (redbaron), melchior-haven, Meta Immersive Synthetics (metakgs), Michael McCartney (mccartnm), Mike Bell (MichaelBell), Mike Seese (seesemichaelj), Mike Slegeir (tehpola), mikoto-studio, Milan Šťastný (aknarts), Minseok Lee (codeonwort), Mohammad Mossa (WizardCell), Morva Kristóf (KristofMorva), muyang.zhang (87770906), nathandh13, Neema Teymory (nteymory), Nicholas Frechette (nfrechette), Nicholas Nathan Colotouros (NicholasColotouros), Nick Edwards (NEdwards-Sharkmob), Nick Edwards (NEdwards-SumoDigital), Nick Lamprecht (freezernick), NickScriv, Nico Ell (nicoell), nuntax, nutti, Paolo Galeone (galeone), Paul Greveson (moppius), Paweł (PoetaKodu), Peter Kovář (1div0), phisko, Phyronnaz, pl-dsk, Pratik Chavan (ppchavan001), ProgC, projectgheist, pwoytiuk, Qinja, QRare, Quentin Dietz (quentin-dietz), RangeMachine, Rareden, Remi Palandri, Rem (rveilleux), René Ferdinand Rivera Morell (grafikrobot), Rick G (rtrick), Rob Cowsill (rcowsill), Robert.Kawiak (Intel), Robert Kihl (kihl), RumbleballTheReal, rveilleuxBHVR, Ryan DowlingSoka (Ryan-DowlingSoka), Ryan Van Vliet (RyanVHumanoid), ryugibo, S_MC (slimsons), Scott Ramsay (foobit), Sean Saleh (seansaleh), Sébastien Rombauts (SRombauts), Setepenre (Delaunay), SkyXMoon, splatxman, sqexmuelas, Stas Korotaev (Stals), steelixb, Stefan Zimecki (stefan-zimecki) (Improbable.io), sunduk, SungJinKang (SungJJinKang), takaokato, Teodor Chishiki Jakobsson (Maigo), Tobi W (TWAtGH), Tom van Dijck (tvandijck), Travis Hopkins (djethernet1), Urszula Kustra (ukustra), Valery Komarov (ValeryKomarov), Ves (VesCodes), WinsonS (WinsonSS), Wouter Weynants (WouterWeynants), xiexbmu, yang xiangyun (pdlogingithub), Yashas Gujjar (yashasg), yashverma, Yohann MARTEL (ymartel06), YoshikazuAzechi (y-azechi), yumnuska, Yuri Belleri (ZioYuri78), Yuriy (SmelJey), Zsófia Balogh (zosiu), 丛越 (congyue1977), 华清飞扬-小木子 (hui211314dd), 徐晨 (kimixuchen)

レンダリング

Lumen の改善

Lumen で、背面からライティングを集め、リーフを通してそれを散乱させ、マテリアルの SubsurfaceColor で減衰させることで、両面フォリッジ シェーディング モデルがサポートされるようになりました。

Lumen Two-Sided Foliage Example 1

Lumen Two-Sided Foliage Example 2

また、Lumen のソフトウェア レイ トレーシング では、確率的半透明のディスタンス フィールド レイ トレースにより、フォリッジでの過度なオクルージョンが修正される、フォリッジのはるかに正確な新しい表現が追加されています。

Lumen では、カメラが動いていない場合に特に、よりクリーンな画像品質にするために時空間ブルー ノイズが使用されます。品質が最も大きく改善されるのは、Lumen で次世代コンソールでの 60fps を対象とする High Global Illumination スケーラビリティ レベルが使用されている場合です。

Cleaner global illumination with Spatiotemporal Blue Noise.

Lumen の ソフトウェア レイ トレーシング では、低解像度で光漏れが発生しやすいボクセル表現ではなく、サーフェス キャッシュが直接サンプリングされるようになりました。それによって、小さなエミッシブ サーフェス要素からのセカンダリ バウンス、反射、グローバル イルミネーションが改善されています。

Lumen sampling from Surface Cache instead of voxel representation for improved results from small surfaces.

プロジェクトで [High Quality Translucency Reflections (高品質透過性反射)] が有効になっている場合、Lumen の反射では、透過サーフェス マテリアルの最前面レイヤーでのミラー反射が提供されます。

Lumen high quality translucency reflections from translucent surface materials

Lumen の反射で 単一レイヤーの水面 (Single Layer Water) がサポートされるようになり、その反射は強制的にミラーになっています。

Lumen Reflections on SingleLayerWater shading model.

今回のリリースでは、Lumen に以下の機能と改善が加えられています。

  • ハードウェア レイ トレーシング モードでの反射で、サーフェス キャッシュからのアルファを評価することで、高速アルファ マスキングがサポートされるようになりました。

  • サーフェス キャッシュの生成アルゴリズムがさらに強固になり、小さなシーン要素用のサーフェス キャッシュの使用など、より多彩なメッシュをカバーできるようになりました。

  • HighEpicCinematic のスケーラビリティ レベルに内部設定が追加されて、パフォーマンスと品質のトレードオフのより強力な制御がサポートされています。

  • ポストプロセス ボリュームの設定で Skylight Leaking (スカイライト漏れ ) 機能が利用可能になり、屋内の領域が完全に暗くなってしまうことを防ぐ非物理ベースのアート ディレクション ノブとして使用されます。

  • ポストプロセス ボリュームの設定で Diffuse Color Boost (ディフューズカラーブースト) 機能が利用可能になり、シーンでの反射光の量を増やすために使用されます。

  • キャプチャ コンポーネントのポストプロセス ボリュームの設定で Lumen の GI と反射を強制的に有効にすることで、Lumen がシーン キャプチャでオプションとしてサポートされるようになりました。シーン キャプチャで実行される場合、デフォルトではサーフェス キャッシュの解像度はそのデフォルト サイズの 50% に低減されていますが、それをコンポーネントの設定でオーバーライドすることもできます。

  • Lumen が nDisplay で複数のビューポートをサポートするようになりました。各ビューポートでは独立した Lumen シーンが使用されます。

  • Vulkan での ハードウェア レイ トレーシング のサポートが実験的機能として追加されています。

    • サポートされているのはサーフェス キャッシュの反射ライティングのみであり、ヒット ライティングはまだサポートされていません。

  • 安定性およびバグが多数修正されました。

詳細は「Lumen の技術的詳細」を参照してください。

Nanite の改善

今回のリリースでは、Nanite に以下の機能と改善が加えられています。

  • 以下のオプションを使用しているマテリアルがサポートされるようになりました。

    • 両面

    • マスク ブレンド モード

    • ワールド位置オフセット (ベータ機能)

      • カリングの境界はまだ更新されていないため、使用方法によっては三角ポリゴンが消えることがあります。

    • ピクセル深度オフセット

    • これらの機能の期待されるパフォーマンス特性の詳細については、Nanite のドキュメントで確認できます。

  • Nanite フォリッジ ジオメトリの次のサポートが改善されました。

    • Nanite スタティックメッシュのための新しい [Preserve Area (エリアを保持)] オプションにより、フォリッジに対して有効にした場合に遠距離でジオメトリが間引きされるのを防ぎます。

    • ランドスケープ グラス メッシュで Nanite を有効にできるようになりました。

    • Nanite のフォリッジのパフォーマンスは複雑なトピックであり、コンテンツへの依存が大きい、多数の要素の影響を伴います。これらの詳細については「Nanite」のドキュメントをご覧ください。

  • ハイブリッド Nanite および非 Nanite のワークフローで、Nanite をサポートするプラットフォームとサポートしないプラットフォームの両方でオーサリングを目的として以下の改善が行われています。

    • 既存の非 Nanite メッシュに、右クリック メニュー項目 [Level of Detail (詳細度)] > [High Res (高解像度)] > [Import High Res... (高解像度をインポート...)] を使用してコンテンツ ブラウザから Nanite 表現を追加できます。このワークフローでは、インポート プロセスで Nanite ジオメトリからフォールバック メッシュが自動的に生成されるのではなく、既存のメッシュと LOD チェーンがフォールバック メッシュになります。

    • マテリアルでの Nanite Switch 式が追加され、Nanite でレンダリングされる場合の特殊な動作を定義できるようになりました。

    • マテリアルとマテリアル インスタンスに Nanite Override Material スロットが追加されています。このスロットが設定されていれば、Nanite としてレンダリングする割り当て済みメッシュでは、代わりに参照されているマテリアルが使用されます。このスロットはマテリアル インスタンスでは強制的に None がデフォルトになるため、親マテリアルでのオーバーライドが設定されていても、自動的には子に継承されません。

    • スタティックメッシュ コンポーネントに Disallow Nanite (Nanite を禁止) パラメータが追加されて、同じメッシュ アセットで Nanite アクタと非 Nanite アクタを混在させて使用できるようになりました。

  • Nanite 対応メッシュで [Hidden Shadow (シャドウを非表示)] フラグがサポートされるようになったため、カスタム シャドウ プロキシ メッシュを Nanite にすることができるようになり、仮想シャドウ マップのパフォーマンスが向上します。

  • インスタンス化されたスタティックメッシュ コンポーネントの Nanite としての描画で、距離に基づくカリング設定が反映されるようになりました。

  • (実験的機能) Nanite を使用してレンダリングされるようにランドスケープを変換できるようになりました。

  • r.RayTracing.Nanite.Mode=1 を設定することで、Nanite メッシュのネイティブのレイ トレーシングおよびパス トレーシングの初期サポートを有効にできます。この手法ではディテールがすべて維持されますが、GPU のメモリ使用量がゼロ誤差フォールバック メッシュよりも大幅に少なくなります。初期段階のテストでは、低品質のフォールバック メッシュのレイ トレーシングの 5 ~ 20% のパフォーマンス負荷であることが分かりましたが、結果はコンテンツによって異なります。

  • 他にも品質とパフォーマンスに関する多くの改善が行われています。

Unreal 5.1 以降、Nanite では DirectX 12 でシェーダー モデル 6 が有効になっている必要があります。 Vulkan の設定を変更する必要はありません。

詳細については、「Nanite 仮想化ジオメトリ」を参照してください。

テンポラル スーパー解像度の改善

今回のリリースでは、テンポラル スーパー解像度の多数の領域で次のような改善が加えられました。

  • アニメーション化されたマテリアルのアンチエイリアスのサポートが向上

  • 透過ジオメトリやモーション ベクターが間違っているジオメトリで、品質が向上し、ゴーストが軽減

  • アンチエイリアスの品質の向上とゴーストの軽減により、ピクセルのちらつきとモアレの検出が向上

  • 60fps のターゲット用のパフォーマンス最適化

詳細については、「アンチエイリアス処理とアップスケール処理」を参照してください。

パス トレーサーの改善

今回のリリースでは、パス トレーサーに以下の機能と改善が加えられています。

  • 次のようなさまざまなエンジン機能のサポートが追加されています。

    • 指数関数的高さフォグと Sky Atmosphere

      • 指数関数的高さフォグ コンポーネントでは、ボリュメトリック フォグ を有効にする必要があります。ローカル ライトはデフォルトでボリュメトリック シャドウをキャストしないため、その設定内で有効にする必要があります。これは、リアルタイムのライティングとデフォルトのワークフローに一致する設定です。

      • スカイ環境は、[Reference Atmosphere (参照アトモスフィア)] ポストプロセス ボリューム設定でサポートされています。この設定を有効にした場合のボリュメトリック クラウドのサポートはまだ行われていません。

    • 平面デカール

    • 水のジオメトリと Single Layer Water シェーディング モデル

    • インスタンスごとのカスタム データとインスタンスごとのランダム マテリアル式

    • ライト関数のサポートが追加されました。r.PathTracing.LightFunctionsColor を有効にすることで、色付きライト関数もパス トレーサーでのみ使用できます。

  • より正確なモーション ブラーを生成するための [Reference Motion Blur (参照モーションブラー)] オプションがムービー レンダリング キューに追加されており、より高いパフォーマンス負荷で滑らかな結果が得られます。このモードでは、ポストプロセス ブラーは適用されず、すべての空間サンプルおよびテンポラル サンプルが蓄積された後にノイズ除去が適用されます。適用するテンポラル サンプルが多いほど品質が高くなります。

  • マルチ GPU レンダリング (mGPU) のサポートが追加されました。そのためには SLI が必要です。有効にするには、Unreal Editor のコマンドラインで -MaxGPUCount=2 を指定し、コンソール変数 r.PathTracing.MultiGPU=1 を設定します。このコンソール変数はランタイム時に切り替えることができます (エディタで mGPU を有効にするために、.ini ファイルで r.AllowMultiGPUInEditor=1 を指定する必要はなくなりました)。

  • Optix デノイザーの実験的サポートを追加しました。デノイザーは GPU で実行され、高速なデノイズ時間を実現します。また、ノイズ除去されたアニメーションのちらつきの低減を試みる実験的なテンポラル コンポーネントを備えています。OpenImageDenoise プラグインと Optix プラグインの両方がロードされた場合は、r.PathTracing.SpatialDenoiser.Type 0 (デフォルト - OpenImageDenoise の場合) または 1 (Optix の場合) を使用し、現在アクティブなデノイザーを選択してください。Optix デノイザーは、Nvidia ハードウェアでのみサポートされており、プラグインは手動で有効にする必要があります。

  • テンポラル ノイズ除去の実験的サポートを追加しました。このノイズ除去は、r.PathTracing.TemporalDenoiser 1 を使用して有効にします。テンポラル ノイズ除去は、[Reference Motion Blur (参照モーションブラー)] を有効にしてムービー レンダリング キューとともに使用することを目的としています。Optix デノイザーは、NVIDIA の Optical Flow SDK を使用してモーション ベクターを推定します。一方、OpenImageDenoise デノイザーはエンジンの組み込みアルゴリズムを使用します。ただし、この機能は、あらゆる場合で完全な時間的安定性を保証するものではありません。そのため、高いサンプリング レートが必要です。

詳細については、「パス トレーサー」を参照してください。

GPU Lightmass の改善

今回のリリースでは、GPU Lightmass に以下の機能と改善が加えられています。

  • 次のようなエンジン機能のサポートが追加されています。

    • Sky Atmosphere

    • 固定スカイ ライト (ベント法線あり)

    • 静的ライト用のボリュメトリック シャドウ

    • 静的ライトからの色付き半透明のシャドウ

    • 静的ライトの IES プロファイル

    • ライトごとのシャドウ キャスティング フラグ

  • 放射キャッシュと最初のバウンス レイのガイディングの動作が改善されており、同じ設定を使用しても品質が向上します。

  • Intel のノイズ除去機能の前後にトーンマッピングと逆トーンマッピングを適用し、極端なダイナミック レンジでの変色の問題を軽減することで、低いライト レベルでのノイズ除去機能の結果が改善されています。

  • ボリュメトリック ライトマップ レンダラでの品質、パフォーマンス、GPU メモリの使用量が改善されています。

    • シーン全体のボリュメトリック ライトマップのすべてのプローブを一度にレンダリングするのではなく、レンダラは複数回のバッチでプローブを処理します。ただし、そのためにボリュメトリック ライトマップのインタラクティブ プレビューが中断されます。

    • これらの変更により、ボリュメトリック ライトマップのベイクに必要な GPU メモリ使用量が元の 4 分の 1 で済むようになり、必要なプローブの数が約 25% 少なくなるようにプローブの配置が改善されています。

詳細については、「GPU Lightmass」を参照してください。

透過オーバーレイ マテリアル

スタティックメッシュおよびスケルタルメッシュにセカンダリ オーバーレイ マテリアルを割り当てることができるようになりました。これを使用して、メッシュを複製することなく、特定のビジュアル エフェクトを実現できます。メッシュは 2 回レンダリングされます。1 回はベース マテリアルが使用され、もう 1 回は透過オーバーレイ マテリアルが使用されます。オーバーレイ マテリアルは、マテリアル スロットの数に関係なくメッシュあたり 1 つのみであるため、メッシュ全体にわたるシェーディング エフェクトはワンパスでレンダリングできます。

Translucent Overlay Material Slot in Material Details panel.

On-Demand Shader Compilation

On-Demand Shader Compilation (ODSC) では、エディタで画面に表示されているものをレンダリングする場合、およびオンザフライでのクックを使用する反復的プラットフォーム開発時にレンダリングする場合に、必要とされるシェーダーのみがコンパイルされます。ODSC は、定期的にビルドを同期させていてコンパイルするシェーダーが多数ある場合、マテリアルとシェーダーでコンパイルを頻繁に繰り返す場合、キャッシュされているシェーダーを利用するためのリモート DDC へのアクセス権がない場合に、コンパイルする必要があるシェーダーの数を大幅に減らすことができます。

ODSC はデフォルトで有効になっており、コンソール変数 r.ShaderCompiler.JobCacheDDC で切り替えることができます。

ODSC は、定期的に多数のシェーダーをコンパイルする大規模プロジェクトでの大部分の作業でコンパイルするシェーダーの数を減らすことができますが、現時点ではエディタの初回起動時にコンパイルされる「グローバル シェーダー」の数は減りません。

DX12 PSO のコンパイルの改善

UE 5.1 では、オブジェクトがレンダリングされる時点ではなく、コンポーネントがロードされたときに早い段階で PSO をコンパイルし始めることで、シェーダーのコンパイルで発生する遅延を減らすことを目指しています。そうすることで、時間のかかるプロセスであり完全にカバーしていることは保証できない、PSO キャッシュを手動で収集する必要性が軽減または解消されます。

ただし、オブジェクトがロードされた直後にそのオブジェクトをレンダリングする必要がある場合は、依然として遅延が発生する可能性があります。遠方にあるオブジェクトのバックグラウンド ストリーミングに対応できるように、PSO の準備が整うまではメッシュのレンダリングをスキップするオプションが追加されており、それらのオブジェクトの描画を遅らせることと引き換えに遅延が軽減されます。それと同様に、タイルでカメラをまったく新しい位置にテレポートする必要がある場合や、そうしなければ多数の新しいマテリアルを一度に表示する必要がある場合は、すべての PSO をコンパイルするのに十分な時間がありません。その場合は、ゲーム コードで、早い段階でマテリアルとメッシュをロードし、それらの描画が必要になる前にレンダラに示唆する必要があります。

既存の PSO キャッシュ システムは、新しいシステムと引き続き併用することもできます。絶えず必要とされることがわかっているマテリアルやテレポート イベントの後に使用されるマテリアルは、手動で生成した小さな PSO キャッシュに入れておき、他のほとんどのマテリアルは自動システムの処理に任せる、といったハイブリッドな手法を考え出すことができます。

このシステムは現在も開発中であり、そのパフォーマンスは今後のリリースのエンジンで改善される予定です。また、Vulkan などの他の RHI もサポートされるように拡張される予定です。

ストラータ マテリアル (実験的機能)

Strata (ストラータ) は、Default Lit や ClearCoat などのシェーディング モデルの固定スイートを置き換えるマテリアルを作成する新しい方法であり、より広範なサーフェス外観やより幅広い動作範囲のパラメータ空間を提供する、より表現力に優れたモジュール式のフレームワークを使用していますストラータ マテリアルのパフォーマンスは、プロジェクトの複雑さと望ましい割り当てに応じて変動し、従来のマテリアルの負荷はこれまでと同様です。

Strata material sphere example.

ストラータ マテリアルは、[Project Settings (プロジェクト設定)][Engine (エンジン)] > [Rendering (レンダリング)] > [Strata (ストラータ)] で有効にすることができます。

実験的機能であるストラータの詳細については、Epic Developer Community forums を参照してください。

テクスチャおよびテクスチャ アセット エディタの改善

今回のリリースでは、テクスチャおよびテクスチャ アセット エディタに以下の改善が加えられています。

  • テクスチャを、32 ビット浮動小数点の単一チャンネルおよび 4 チャンネルの形式である R32F および RGBA32F でインポートできるようになりました。後方互換性を確保するため、これらのオプションはオプトインであり、ディスク上のソース ファイルで 32 ビット浮動小数点形式が使用されている場合でも手動でオンに切り替える必要があります (現時点では、スカイライトでは 指定キューブマップ は 16 ビット浮動小数点にクランプされ、最大ピクセル値は 65,504 に制限されています。これは今後のエンジン バージョンで対処される予定です)。これは今後のエンジン バージョンで対処される予定です)。

Texture Compression Settings options.

  • 次元が 2 の累乗ではないテクスチャでミップマップを使用できるようになりました。テクスチャが圧縮可能であるためには、各次元が 4 の倍数である必要があります。これは、コンテンツをネイティブなアスペクト比で格納して、異方性フィルタリングなどの一部の機能を向上させるのに便利ですが、プラットフォームによっては、1 つ上の 2 の累乗のサイズと比べてメモリ使用量が節約されるとは限りません。

  • Texture2D 配列がチェックボックス付きのスライスとして表示されるツールバー オプションが追加されています。

  • キューブマップ HDR テクスチャがチェックボックス付きの フェース3D ビュー として表示されるツールバー オプションが追加されています。

  • Scene Capture コンポーネントで使用されているレンダー ターゲットが表示されているときに、Scene Capture の GPU メモリ使用量とそれに属するすべてのテクスチャ (そのキャプチャで Lumen がオンになっている場合は Lumen シーンも含む) が詳細パネルに表示されるようになりました。

Lumen オフ:

Texture Asset Editor stats for Scene Capture without Lumen enabled in the capture.

Lumen オン:

Texture Asset Editor stats for Scene Capture with Lumen enabled in the capture.

新規プロジェクト用の PC ではシェーダー モデル 6 が有効である DirectX 12 がデフォルト

Unreal Engine 5 で新規作成されるすべてのプロジェクトでは、PC 上でシェーダー モデル 6 (SM6) がデフォルトで有効になっている DX12 が使用されるようになりました。DX12 では CPU 時間、GPU 時間、メモリ使用量に関するあらゆる面で効率が向上するため、新機能を活用できます (最も顕著なのがレイ トレーシング)。

Nanite および仮想シャドウマップでは、SM6 が有効になっている DX12 がいずれは必要になります。

すでに DX12 を使用しているプロジェクトでは、[Project Settings][Platforms (プラットフォーム)] > [Windows] > [D3D12 Targeted Shader Formats (D3D12 ターゲット シェーダー形式)] にある [SM6] チェックボックスで SM6 を有効にできます。

PC で DX12 が使用されている場合、エンジンは有効になっている各シェーダー モデルを降順で試行するため、SM5 と SM6 がどちらも有効になっていれば、まず SM6 が試行され、そのマシンで SM6 がサポートされていなければ SM5 にフォールバックします。有効になっているどのシェーダー モデルも使用できない場合は、DX11 SM5 にフォールバックします (プロジェクト設定で無効になっている場合を除く)。このロジックは、コマンドラインで -dx12-dx11-sm5-sm6 などのフラグを使用して RHI またはシェーダー モデルが指定されている場合は適用されません。その場合に、指定されているコンフィギュレーションがサポートされていなければ、エンジンは終了します。

マテリアル エディタの [Platform Stats (プラットフォーム統計情報)] セクションのシェーダー命令数は、SM6 の中間言語で違いがあるため、SM6 と SM5 で直接比較できません。SM6 の命令数は、同等のレベルの複雑度に対し、より大きい数が表示されます。SM6 の命令数は、SM6 でコンパイルされた他のマテリアルに対してのみ比較してください。

アナモフィック被写界深度とカメラ トリミング (実験的機能)

被写界深度で、垂直方向に伸びたボケの形状になるアナモフィック レンズのサポートが追加されました。アナモフィック ボケによって、完全なカスタム テクスチャのサポートをプロジェクトに提供することなく、パフォーマンスの高いオプションが提供されます。また、よく使用されるアスペクト比またはカスタム アスペクト比にカメラ ビューをトリミングできるようになりました。

Anamorphic Depth of Field example in scene and its camera settings.

アナモフィック ボケを設定するには、Cine Camera 設定および ポストプロセス ボリューム 設定の [Lens Settings (レンズ設定)] にある [Squeeze Factor (スクイーズ倍率)] 設定を使用します。

カメラのアスペクト比をトリミングする設定は、Cine Camera 設定の [Crop Settings (トリミング設定)] にあります。よく使用されるアスペクト比を選択するか、[Cropped Aspect Ratio (トリミングのアスペクト比)] を使用して指定します。

詳細については、「シネマティック被写界深度」を参照してください。

マテリアル エディタでのインライン編集

80 個以上の マテリアル式 が見直されて、マテリアル グラフにあるノードで直接定数値とプロパティをインライン編集できるようになりました。ユーザーはノードを選択してから [Details] パネルで値を編集する必要がなくなるため、マテリアル編集のワークフローに対する操作性はこの変更により多くの場合で大きく改善されました。

ライト ミキサー (ベータ機能)

ライト ミキサー は、シーン内のすべてのライトがコンパクトな表形式で表示される新しいエディタ ウィンドウであり、シーンの環境光コンポーネントが入っている 環境光ミキサー と類似しており、検査や編集を素早く行うことができます。

Light Mixer

ライト ミキサーには以下の機能があります。

  • ライトの作成や再ペアレント化をライト ミキサーから直接行う

  • ライトをフォルダ内部の階層コンテキストまたはフォルダなしのフラット リストで表示する

  • 選択しているすべてのライトで同じフィールドを同時に編集する

  • ユーザーが選択しているライトのサブセットが入っている コレクション と呼ばれる複数のタブを開く

  • [Solo (単独)] ボタンを使用して、単一のライトを分離し、他のすべてのライトをエディタで非表示にする

  • ビューポートとアウトライナーで同じライトを自動的に選択する [Sync Selection (選択内容を同期)] のオン/オフを切り替える

  • どのライト プロパティが編集用に表示されるかをカスタマイズする

  • ブループリント内に含まれている複数のライト コンポーネントを示す

仮想シャドウ マップ:遠方ライトモード

仮想シャドウ マップ を使用すると、少し離れてレンダリングされるローカル ライトが多数あるシーンの効率が向上します。これを有効にするには、コンソール コマンド r.Shadow.Virtual.DistantLightMode を使用します。

仮想シャドウ マップでは、シェーダー モデル 6 (SM6) が有効である DirectX 12 を プロジェクト設定 で有効にすることが必要になりました。SM6 は [Platforms] > [Windows] > [D3D12 Targeted Shader Formats] で有効にできます。

ハードウェア レイ トレーシングの Windows 10 バージョンの要件

ハードウェア レイ トレーシング は、Nanite および仮想シャドウ マップで Windows 10 バージョンが同じ最小要件となりました。詳細については、「ハードウェアおよびソフトウェアの仕様」をご覧ください。以前のように、ターゲットが SM5 シェーダー フォーマットでも SM6 D3D12 シェーダー フォーマットでも、レイ トレーシング シェーダーはコンパイルされます。

Worldbuilding

World Partition のデータ レイヤーの改善

データ レイヤー は、エディタ内またはランタイム時にデータ レイヤーの有効/無効を切り替えることで、ワールド データを条件付きでロードまたはアンロードするように設計されているシステムです。データ レイヤーは、エディタ内でワールドを整理して、ゲーム内でさまざまなシナリオを扱い、同じワールドのバリエーションを生み出すための非常に優れた方法です。

The new Data Layers panel

今回のリリースでは、データ レイヤーに関して以下の改善が加えられています。

  • データ レイヤーの機能が次の 2 つの構成概念に分けられました。

    • 複数のワールドにわたって有用なデータが格納される データ レイヤー アセット

    • データ レイヤー アセットを参照し、ワールドに特有である データ レイヤー インスタンス

  • データ レイヤー アウトライナー の操作性が改善されています。

  • レベル インスタンスのサポート:レベル インスタンス内のアクタで、ワールドにあるデータ レイヤーを参照できるようになりました。

詳細については、「World Partition - データ レイヤー」ドキュメントを参照してください。

HLOD での Water Body アクタのサポート

Unreal Engine の Water システム のレンダリング ツールおよびメッシュ化ツールでは、水を表現するためにさまざまな Water Body アクタ タイプをレベルに追加する機能が提供されています。

Water HLOD Settings

今回のリリースでは、Unreal Engine の Hierarchical Level of Detail system (HLOD) で Water Body アクタが完全にサポートされるようになりました。各アクタを HLOD レイヤー に割り当てることができ、各アクタにはプロジェクトのニーズに合わせてカスタマイズできるさまざまな HLOD 設定項目があります。

Water システムの詳細については、「Water システム」ドキュメントを参照してください。

Hierarchical Level of Detail システムの詳細については、「Hierarchical Level of Detail」および「World Partition - Hierarchical Level of Detail」ドキュメントを参照してください。

アクタ エディタ コンテキスト

Unreal Engine 5.1 リリースでは、エディタの 3D ビューポートの右下隅にアクタ エディタ コンテキストが表示されるようになりました。

Actor Editor Context window shown in the bottom right of the viewport

この小さなボックスには、現在の選択されている サブレベルWorld Partition のデータ レイヤーレベル インスタンス、または現在アクティブな アウトライナー アクタのフォルダ が表示されます。ワールドに配置されているすべてのアクタは、現在のアクタ エディタ コンテキストに自動的に追加されます。ワールドに配置されているすべてのアクタは、現在のアクタ エディタ コンテキストに自動的に追加されます。

ソース コントロールでの管理外チェンジリストのサポート

Unreal Engine の ソース コントロール システムでは、バージョン管理によりアセット ファイルとコード ファイルの共有を容易にすること、およびファイルのバックアップとプロジェクトの変更履歴を提供することで、開発チーム内でのコラボレーションがサポートされています。

Uncontrolled changelist support in source control

ソース コントロールは、World Partition のワークフローの重要な部分を担う One File Per Actor (アクタあたり 1 つのファイル) と密接に連動します。

Unreal Engine 5.1 では、ソース コントロールの操作性にいくつかの改善が加えられ、管理外チェンジリスト が利用されるようになりました。この機能では、プロジェクト内の書き込み可能なすべてのファイルが追跡され、すべてのローカルな変更に関する現状のリストが提供されます。

  • 変更内容は複数の管理外チェンジリストで追跡できます。

  • ファイルは、いつでも個別に管理対象チェンジリストに移したり元に戻したりできます。

  • テスト用およびデバッグ用の排他的チェックアウト ロックを行わないことで、ファイルの競合が軽減されます。

管理外チェンジリストは、Unreal Engine 5.1 ではデフォルトで有効になっています。

エンジン内ソース コントロールの詳細については、「Unreal Editor 内のソース コントロール」ドキュメントを参照してください。

Large World Coordinate での World Partition のサポート (ベータ機能)

5.1 リリースでは、このシステムが拡張されて、Large World Coordinates (LWC) のサポートが追加されました。5.1 リリースでは、このシステムが拡張されて、World Partition のサポートが追加されました。

Large World Coordinates のワールドの最大値が増加

今回のリリースでは新たに、デフォルトのワールドの範囲が 22 km から 88,000,000 km に拡大され、さらに大きなワールドを作成できるようになりました。

Large World Coordinates の詳細については、「Large World Coordinates」ドキュメントを参照してください。

バーチャル プロダクション

インカメラ VFX エディタ

ICVFX ステージ操作で最もよく使用されるコントロールを 1 つの選定された UI に集めるための、専用のステージ オペレーター パネルが追加されました。nDisplay 調整、色補正、ライト カードが 1 か所に提示されるようになったため、ステージ操作を効率的に行うことができます。

VP In-Vamera VFX Editor

ライト カード システムの改善

ライト カードが LED ウォールで表現されるときに、意図された形状を維持する UV 投影ロジックを使用するように、ライト カードが機能強化されました。ライト カードの作成、編集、配置のための UI も、このクリエイティブなライティング タスクと関連性が高いコントロールのみが提示されるようにスリム化されています。

ICVFX 用の色補正コントロールの改善

ICVFX プロダクション用の色補正のワークフローが拡張されています。色補正範囲は 3D で動作し、2D 形状と組み合わせることや、パワー ウィンドウとして 2D 形状と連動させることができます。これは、ビューポートごとの色補正に追加されています。任意の色補正領域/ウィンドウのカラー グレーディング エフェクトを、オプションでアクタの配列に属するピクセルに制限することができるようになりました。

メディア プレート

VP Media Plate Actor

これまでは、シーンでメディアをストリーミングするには、ブループリントを使用して複数の要素をまとめて手動でマッピングする必要がありました。代わりに Media Plate アクタ要素をシーンに直接追加できるようになり、それが下層のすべての接続に対処します。メディア プレートでは、最高品質で最大解像度で最大色深度の画像シーケンスに対して EXR タイリングとミップが使用されます。事前作成された球形と矩形の形状をメディア プレートで使用する場合、Unreal Engine はカメラで現在表示されているピクセルのみをストリーミングするため、ストリーミングの割り当て負荷が軽減されます。これにより、ユーザーがレンダリング ノードの負荷のバランスを取ることができ、PC ごとの帯域幅制限が改善されます。

この新しいビデオ アーキテクチャによって以下のメリットがもたらされます。

  • 大幅に単純化されたビデオ インポート プロセス

  • メディア プレイリストのサポート

  • 提案されるアセットとアクタの両方でのドラッグアンドドロップのサポート

  • アップデートされた情報ウィンドウとプレビュー ウィンドウ

  • シーケンサーの統合

  • 視錐台カリングによるパフォーマンスの向上

  • メディア プレーヤーとテクスチャ マネージャー

EXR プレートのパフォーマンス

VP EXR plate performance

非圧縮 EXR では、最適な品質の映像のフッテージが提供され、適度に高速なストレージ デバイスを使用した処理に対する最も迅速なパスがあります。非圧縮 EXR を一連のタイルとミップマップ レベルに前処理し、分割する新しいシステムが追加されました。Media Plate アクタのワークフローを使用すると、適切に最適化されたこれらの EXR が、このシステムを通じて、適切なミップ レベルとビューポートに従って可視タイルのみをストリーミングおよびレンダリングすることで、可能な限り最適な効率で再生できるようになります。その際、nDisplay システムでレンダリングされているかスタンドアローンでレンダリングされているかは関係ありません。

インカメラ VFX の Lumen (実験的機能)

Lumen では、nDisplay で複数のビューポートがサポートされるようになり、ICVFX に利用できるようになりました。各ビューポートでは独立した Lumen シーンが使用され、LED ボリュームのアーティファクトが除去されます。Lumen に加え、仮想シャドウ マップでも同じメカニズムによって nDisplay と ICVFX の複数のビューポートがサポートされます。

Cine Camera の近距離クリッピング

Cine Camera が、カメラごとの カスタム近距離クリッピング平面 を持つようになりました。

バーチャル カメラ

バーチャル カメラの出力に WebRTC Pixel Streaming のサポートが含まれるようになり、Live Link VCam アプリと Web ブラウザのどちらでも表示できる、信頼性とパフォーマンスが向上したストリーミング オプションが提供されます。バーチャル カメラにはエディタでの拡張入力のサポートを含まれるようになり、サポートされているハードウェア デバイスで VCam の再マッピング可能な制御が可能になっています。これらの変更は新しい VCamActor ではデフォルトで有効になっています。VCamActor は VirtualCamera2Actor を置き替えるものであり、ライブ アクション カメラのような感触とクリーンなフレーム画像に重点を置いて再設計されたデフォルトのオペレーター HUD を備えています。

さらに、バーチャル カメラの UI および UX が改善されています。

Virtual Camera UI improvements

仮想スカウティングの改善

Virtual Scouting は、OpenXR および拡張入力システムと連携するようになりました。

Live Link Face の CSV インポータ プラグイン

Live Link Face iOS アプリを使用してデバイス単独でフェイシャル キャプチャを録画したことがあれば (Unreal Engine に接続して Take Recorder で録画するのではない)、その (バックアップ) レコーディングを抽出した後にインポートできるようになりました。そのデバイスでは、生のタイムコードとブレンドシェイプ データ付きの .csv ファイルが格納されます。インポートした結果は、Live Link トラック付きのレベル シーケンスであり、Take Recorder でライブ ストリーミングを録画して得られるものと同等です。

マルチユーザー サーバーの UI

サーバーの実行状態をライブで調べるための UI がマルチユーザー サーバーに追加されています。これを使用して、オペレーターおよび ICVFX ステージ マネージャーはマルチユーザー サーバーの運用中の問題を調査、監視、診断できます。これはコンソール サーバーよりもメリットがあります。コンソール サーバーは、コンソール コマンドによる接続情報のストリームのみを提供し、実行中のサーバー運用に関するコンテキスト情報は提供しません。

コンソール サーバーは、ヘッドレス コンピュータや UI を実行できないコンピュータでの運用で引き続き利用できます。たとえば、Linux サーバーやコンテナ化された運用での利用が可能です。

ムービー レンダー キュー

テクスチャ動作の改善

ムービー レンダリング キュー (MRQ) がテクスチャ ストリーミングを処理する方法に対していくつかの改善が加えられました。テクスチャ ストリーミング が有効になっているときにロードされた間違ったミップマップに対する処理が改善されました。テクスチャ ストリーミングは MRQ ではデフォルトでは引き続き無効になっていますが、有効にすると、大規模なプロジェクトではメモリ使用量を節約できます。

シネマティック プレストリーミング

プレストリーミング レコーダー を使用し、仮想テクスチャや Nanite シネマティック キャッシュを作成できるようになりました。このプラグインは、シネマティック プレストリーミングが解釈を行うために構築するキャッシュへのレンダリング パスとして使用されます。構築が完了すると、シーケンス内でキャッシュを参照し、シネマティック中に Nanite およびバーチャル テクスチャのデータをより高い信頼性で確実にストリーミングすることができます。

cinematic prestreaming track

カメラの改善

カメラ関連の新しい機能がムービー レンダリング キューに追加されています。MRQ ジョブを実行する前に [Render all Cameras (すべてのカメラをレンダリング)] を有効にすることで、同じショットの 複数のカメラ アングルからレンダリング できるようになりました。

また、正投影カメラもサポートされ、パースペクティブではないカメラを使用してシーケンスをレンダリングできるようになりました。また、正投影カメラもサポートされ、パースペクティブではないカメラを使用してシーケンスをレンダリングできるようになりました。このオプションでサポートされているレンダリング パスは、現時点では パス トレーサー のみです。

ランタイム API の改善

ムービー レンダリング キュー API が単純化され、シッピングするプロジェクトで MRQ を使用する複雑さが大幅に軽減されるようになりました。具体的には、サブシステムから新しいジョブをリクエストし、そのコンフィギュレーションを設定し、そのジョブをレンダリングするようにサブシステムに依頼するだけで済むようになりました。また、キューを使用し、エグゼキューターを手動で設定したり、レンダリングするワールドやレベル シーケンスなどをソフト パスとしてジョブで基本的な設定をセットアップしたりする必要はなくなりました。

nDisplay

nDisplay SMPTE 2110 support

nDisplay メディア I/O マッピング システム (実験的機能)

改善されたワークフローにより、ユーザーは任意の時間同期ピクセルのソースとデスティネーションを ICVFX カメラ、nDisplay ビューポート、アプリケーション ウィンドウのバックバッファに指定できます。したがって、ネイティブな UE 3D シーンのレンダリングだけではなく、SMPTE 2110、メディア テクスチャ、ハードウェア キャプチャ デバイスからライブで生成されるデータなどの IP ビデオ ソースも、nDisplay ビューポートに登録できるようになりました。

SMPTE 2110 のサポート (実験的機能)

Unreal Engine に SMPTE-2110 I/O (Rivermax を使用) のサポートが追加されました。新しい メディア I/O マッピング システムを使用し、nDisplay レンダリング ノードから SMPTE-2110 をサポートする LED ウォール プロセッサに直接ストリーミングできます。これにより、各インナー錐台を専用のマシンでレンダリングできる nDisplay システムでさまざまなハードウェア構成も可能になります。その後に各インナー錐台を、アウター錐台で合成するための全体像の一部をレンダリングする各マシンで共有できます。そうすることで、パフォーマンス、カメラのリニア スケーラビリティ、およびより予測可能なコンテンツのパフォーマンスが向上します。

nDisplay のための ムービー レンダー キューのサポート

ユーザーは、MRQ を使用して nDisplay ビューポートをディスクにレンダリングできるようになりました。新しい設定により、ユーザーは、コンフィギュレーション ファイルと目的のビューポートを選択し、ネイティブの指定した解像度でレンダリングすることができます。

nDisplay のクイック ローカル ランチャー

nDisplay 対応プロジェクトをローカルで素早く起動して、デバッグのために使用することや、クラスタを必要とせずに自分の PC でローカルにプロジェクトを試してみることができるようになりました。

デベロッパー ツール

デフォルトの Visual Studio のバージョン

Unreal Build Tool (UBT) は、インストールされた最新版 Visual Studio 用の Visual Studio ソリューション ファイルを生成するようになりました。ただし、最新版をサポートしない Platform SDK をインストールした場合は除きます。この場合、UBT はその Platform SDK をサポートする、最新の Visual Studio 向けの Visual Studio ソリューション ファイルを生成します。推奨コンパイラは Visual Studio 2019 です。

Clang 13 のサポート

Clang 13 は、Clang ベース プラットフォーム (Linux) 向けにコンパイルする場合の必須バージョンになりました。

静的コード解析

Unreal Build Tool (UBT) は、複数の異なる 静的コード アナライザー の実行をサポートしています。静的コード アナライザーは、さまざまなアルゴリズムと技法を使用してソース コードを分析し、コードを実行せずにバグを検出します。

以下のアナライザーがサポートされています。

  • Default: 選択したコンパイラのデフォルトの静的アナライザーを使用します。

  • VisualCpp:ビルトインの Visual C++ の静的アナライザーを使用します。Microsoft Visual C++ (MSVC) ベースのプラットフォームでのみサポートされます。

  • PVSStudio:PVS-Studio の静的アナライザーを使用します。MSVC ベースのプラットフォームでのみサポートされます。このアナライザーにはライセンスが必要です。詳細については、PVS-Studio のサイトを参照してください。

  • Clang:Clang の静的アナライザーを使用します。コンパイラで MSVC ベースのプラットフォームの Clang の使用が強制されます。このアナライザーはベータ機能です。

Unreal Build Tool を使用して、静的コード アナライザーを実行するための構文を次に示します。

Engine\Build\BatchFiles\RunUBT.bat TARGET PLATFORM Development -StaticAnalyzer=ANALYZER

たとえば、次のコマンドをコマンドラインで入力し、Windows 64 ビット システムで Unreal Editor と選択コンパイラをターゲットとしてデフォルトの静的コード アナライザーを実行します。

Engine\Build\BatchFiles\RunUBT.bat UnrealEditor Win64 Development -StaticAnalyzer=Default

詳細については、「静的コード分析」のドキュメントを参照してください。これにはサポート アナライザーと追加のコマンドライン オプションの詳細情報が含まれます。

C# Unreal ヘッダ ツール

Unreal Header Tool (UHT) は C# を使って新たにゼロから作成され、Unreal Build Tool と直接統合されています。この再作成の目的は以下のとおりです。

  • メンテナンスのしやすさの改善

  • ビルド時間の削減

  • ビルドファーム時間の削減

  • エンジン フックの除去

C++ Unreal Header Tool は、非推奨になり、可能な限り早く削除されます。ただし、UE 5.2 以降となります。

C++ Unreal Header Tool

C++ UHT は、使用を続行する方法についての情報と併せて Unreal Engine から除外されるまで、引き続き使用されます。これには、次の 2 つの理由があります。

  • 使用している UHT スクリプト ジェネレータ プラグインには、現在 C# バージョンがない。

    • UBT はプロジェクトで使用されているスクリプト ジェネレータ プラグインを検出し、C# バージョンがプラグインにない場合、UBT は自動的に C++ UHT の使用に戻します。

  • UHT に対するローカルの変更がある。

    • この場合、bUseBuiltInUnrealHeaderTool = falseUEBuildConfiguration カテゴリで設定し、C# UHT を無効にします。

いずれの場合にも重要なのは、C++ UHT の変更とスクリプト ジェネレータ プラグインを、C++ UHT が UE から除外される前に C# に移植することです。C# UHT への変更が必要な場合、ソース コードは「Engine/Source/Programs/Shared/EpicGames.UHT」にあります。

C# スクリプト ジェネレータ プラグイン

C# スクリプト ジェネレータ プラグインのサンプルは「Engine/Plugins/ScriptPlugin/Source/ScriptGeneratorUbtPlugin」にあります。さらに、既存のすべての UHT エクスポータは「Engine/Source/Programs/Shared/EpicGames.UHT/Exporters」と同じメカニズムで作成されています。次に簡単なガイドを示します。

  1. 既存の C++ スクリプト ジェネレータ プラグインがあるプラグインと同じディレクトリ ツリーに C# プロジェクトを作成します。プラグインの拡張子は .ubtplugin.csproj であることが必要です。

  2. Visual Studio で、プロジェクト ファイルを生成します。作成するプラグインが「Programs/UnrealBuildTool.Plugins」にリストされます。

  3. EpicGames.UHT を、アセンブリ依存関係 (プロジェクト依存関係ではなく) として追加します。

  4. ScriptGenerator.cs を参照として使用し、スクリプトをエクスポートするためのエントリー ポイントを含むクラスを作成します。このクラスには UnrealHeaderTool 属性が、静的メソッドには UhtExporter 属性が必要です。

  5. 最後に、C# ジェネレータ プラグインは、C# ソースをビルドするために利用可能な同じ定義定数 (UE_5_1_OR_LATER など) をサポートしている必要があります。

提供されるファクトリ オブジェクトには、UE データ タイプをエクスポートするために必要なコンテキストが含まれます。ファクトリ オブジェクトには UhtSession が含まれます。この UhtSession には UhtPackages のリストが含まれます。ヘッダで定義されたデータ タイプは、UhtPackages 内にある、UhtHeaderFiles で見つかります。

C# UHT のベスト プラクティス

  • パフォーマンスを向上するために非同期タスクでファイルをエクスポートします。

  • ビルトインの変更検出、参照、照合出力を利用するため、IUhtExportFactory.MakePathIUhtExportFactory.CommitOutput メソッドを使用して、ファイルをエクスポートします。

  • BorrowStringBuilder を使用して、キャッシュされた文字列ビルダーを使用します。

  • 一時オブジェクトと文字列をできるだけ使用しないようにします。

  • デバッグ用に IUhtSession.GoWide プロパティを使用し、-nogowide がコマンドラインで指定されたかどうかを確認します。C# UHT がある場合は、非同期タスクを使用して出力を生成せずに、直接エクスポート コードを呼び出します。この方が、デバッグが簡素化されます。

オーディオ

MetaSound (ベータ機能)

MetaSounds Demo

MetaSound とはグラフベースの高パフォーマンス オーディオ システムで、5.1 で複数の機能が導入されています。

ノードのライブラリを拡張し、ピッチのシフト、グレイン ディレイ、リルートなど新しい機能が利用できるようになっています。さらに、マルチチャンネル オーディオ出力のサポートが追加され、没入感のあるサラウンド サウンド エクスペリエンスの作成が容易になりました。

MetaSound の詳細については、「MetaSound のドキュメント」を参照してください。

Audio Modulation

Audio Modulation プラグインは、ベータ機能の段階を終了して MetaSound と完全に統合されています。この機能には、オーディオ パラメータを変調する汎用メソッドが用意されています。あらゆる要素をモジュレーションのソースやデスティネーションにできるようになりました。独自のパラメータ グループを定義し、自在に制御することができます。

オーディオ ゲームプレイ ボリューム (ベータ機能)

オーディオ ゲームプレイ ボリューム は、ジオメトリベースのオーディオ管理とコントロールにおける改良版です。レガシーのオーディオ ボリューム システムを置き換えるものとして設計されたオーディオ ゲームプレイ ボリューム システムには、Unreal オーディオ エンジン機能の統合、拡張、可動性や動的変換などの緊密なゲームプレイ統合用にコンポーネント ベースのオプションがあります。

オーディオ ゲームプレイ ボリュームの詳細については、「オーディオ ゲームプレイ ボリュームのドキュメント」を参照してください。

サウンドスケープ (ベータ機能)

サウンドスケープでは、葉がカサカサ鳴る音、鳥のさえずり、交通の騒がしさなど環境音をプロシージャルに生成し、プレイヤーがワールドを動き回るのに合わせてストリーミングされます。一度セットアップすると、プラグインはこれらのサウンド システムを自律的に管理し、作成します。手動で作成する必要がなくなります。

波形エディタ (ベータ機能)

Waveform Editor Demo

波形エディタは Unreal Editor 内で音声波形を表示し、編集するための新しいツールです。トリミング、フェード、正規化が可能で、その他の波形調整も行えます。音声波形メタデータを、ループ領域やキュー ポイントなどをサポートするために変更することもできます。これらの変更は、オリジナルが維持されるよう新しいアセットに保存できます。

UMG/スレートの機能向上

UMG ビューモデル (ベータ機能)

View Model プラグイン では、プログラマーがウィジェットの構造を変更したときでも、デザイナーは変更に関係なく作業できるフレームワークを利用できます。

以前は、UMG のウィジェットにデータを転送するには主要な方法が 2 種類ありました。

  • 簡素化したデリゲート バインディング:ウィジェットはフィールドの 1 つ (テキスト フィールドなど) の値をプロパティまたは値を返すブループリント関数に送ります。この実装は柔軟性があり、容易に使用できましたが、パフォーマンスの問題がありました。属性自体が実際に変更されたかどうかに関係なく常にウィジェットが更新されるためです。

  • イベント駆動型の更新:イベント駆動型更新 – ゲームプレイは UI を手動で更新する関数を呼び出す、つまり UI はイベント ディスパッチャーまたはデリゲートに基づいて更新します。これによりパフォーマンスは向上しますが、UI での変更を反映するために手動でのコード変更が必要です。

View Model プラグインは両方のメリットを採り入れています。このプラグインを有効にした後、UI で使用する変数を保持する ビュー モデル を作成し、ウィジェットをビュー モデルの各プロパティにバインドできます。

The View Binding and Viewmodels windows

ビュー モデルは、UI で必要な変数のセットのコピーを保持する、分離したオブジェクトです。これらの変数の 1 つを変更する必要があるときは常に、直接 UI ではなく、ビュー モデル内で更新します。ビュー モデルは、UI のバインドされたウィジェットに値が変更されたことを通知し、更新内容をプッシュします。これによりデータ駆動 UI の作成プロセスが簡素化されます。コールバックと更新関数を作成する手間がなくなり、UI 自体から切り離されたものがプログラマーに公開されます。

プロジェクトで ViewModel を使用する方法の詳細については、「ビューモデル」のドキュメントを参照してください。

名前付きスロット ウィジェット

Example of a Named Slot Widget

UE 5.1 では 名前付きスロット ウィジェット が UMG に導入されています。これらのウィジェットは、テンプレートを作成するときに、他のウィジェットのプレースホルダーとして機能します。一般に、UMG ウィジェットの子クラスを作成するとき、そのウィジェットは階層で表示されません。

名前付きスロットは階層に表示され、PreConstruct イベントで安全に値が入ります。これにより、テスト ユースケースでテンプレート ウィジェットが簡単にプレビューできるようになります。また、名前付きスロットに子を挿入するとき、階層内での場所とレンダリング順は、親クラスに基づいて維持されます。

UMG Tool Palette プラグイン (実験的機能)

UMG Tool Palette

新しい Tool Palette プラグインが UE 5.1 の UMG に追加されています。この Tool Palette では、よく使用するツール、ウィジェット、インタラクションに素早くアクセスできます。[Plugins (プラグイン)] メニューからこのプラグインを有効にして、試すことができます。

エディタ

改良されたアセットの検索とフィルタリング

アウトライナー参照ビューアアセットのフィルタリング がサポートされるようになりました。これらのフィルタは コンテンツブラウザのフィルタ と同様に動作し、高度な検索構文演算子 がサポートされています。

アウトライナー、コンテンツ ブラウザ、参照ビューアで、アセット検索をカスタム フィルタとして保存できるようになりました。保存したカスタム フィルタおよび個々のフィルタ設定は、それを作成したユーザーのすべてのストリームおよびプロジェクトで使用できます。

コンテンツ ブラウザでのアセットの検索およびフィルタリングで、以下の改善が行われています。

  • 検索バーで、直近の検索の履歴が表示されます。

  • フィルタはデフォルトでは縦一列で表示されます。コンテンツ ブラウザの [Settings (設定)] メニューで、新型 (縦並び) と旧型 (横並び) のフィルタ レイアウトを切り替えることができます。

  • 1 つ以上のフィルタがアクティブであれば、[Filter (フィルタ)] ドロップダウン メニューにバッジが表示されます。

アウトライナーの改善

アウトライナーの操作性を向上させるために、上下にスクロールしたときにヘッダが積み重ねられるようになりました。

Stacking headers in the Outliner

アウトライナーに以下の機能が追加されたことで、アクタを見つけやすくなりました。

  • レベル ビューポートでアクタを選択したときに、アウトライナーが常にそのアクタまでスクロールするように、アウトライナーを設定できます。このオプションを有効にするには、アウトライナーの [Settings] メニューで [Always Frame Selection (常時フレーム選択)] を切り替えます。

  • レベル ビューポートでアクタを選択し、F キーを押すと、アウトライナーでそのアクタが強調表示されます。

  • 現在の選択アイテムが折りたたまれている状態であっても、現在選択しているアクタの親アイテムが強調表示されるようになりました。

アウトライナーのインスタンスを最大で 4 つ使用でき、各インスタンスを個別にカスタマイズできるようになりました。

アウトライナーで、列ヘッダを右クリックしてから、列名をクリックして表示/非表示を切り替えることで、どの列が表示されるかを選択できます。

参照ビューア ツールの設計変更

参照ビューア (Reference Viewer) ツールが設計変更されて、より多くのアセット参照とより深い参照グラフがサポートされるようになりました。参照の検索で、検索の深さが 50、検索幅が 1,000 までのアセット レベルがサポートされるようになりました。

アセット参照の検索で、Unreal Engine の改善された検索機能とフィルタリング機能が利用されるようになったため、参照グラフにどのタイプのアセットが表示されるかをユーザーがより詳細に制御できます。

参照グラフに表示されるアセット ノードはアセット タイプごとに色分けされており、アセットのサムネイルやファイル パスなどの追加情報が表示されるようにカスタマイズできます。

Unreal Engine 5.1 での参照ビューアのすべての改善点の概要については、「参照ビューアのドキュメント」を参照してください。

Python 型のヒント提示

Python プラグインで、型のヒント提示付きのスタブ ファイルを生成できるようになりました。型のヒントは、Python IDE のオートコンプリート メニューに表示されます。型のヒント提示を有効にするには、Unreal Editor のメニューバーで [Edit (編集)] > [Editor Preferences... (エディタの環境設定...)] を選択し、その画面で [Plugins (プラグイン)] > [Python] に移動します。[Developer Mode (デベロッパー モード)] をオンにして、好みの [Type Hinting Mode (型のヒント提示モード)] を選択します。そうすると、使用している IDE に追加できる Python スタブ ファイルが生成されます。型のヒント提示および型のヒント提示で利用可能なさまざまなモードの詳細については、「Unreal Editor の Python スクリプティングのオートコンプリートを設定する」を参照してください。

Editor preferences for python type hinting

ローカリゼーション パイプライン自動化の改善

ローカリゼーション コマンドレットは UE 5.1 において次の機能が向上しています。

ギャザリング (収集情報) のプレビュー

以前のバージョンの UE ローカリゼーション パイプラインでは、ローカリゼーション処理の前に、ビルド プロセスの各ステップを順に実行するビルド システムが必要でした。つまり、エラーや警告のローカリゼーションを確認するために、ユーザーはプロジェクト全体をリビルドする必要があったということです。UE 5.1 では、ローカリゼーション コマンドレットで、ローカリゼーション ファイルを収集するプリフライトを実行して、その中のエラーや警告を確認します。これによりローカリゼーションの誤りを見つけるのにフル ビルドの完了を待つ必要がなくなり、ローカリゼーションのデバッグが大いにはかどります。この機能向上は UAT ローカリゼーション コマンドレットで利用できます。

エラー レポートの CSV 形式サポート

UE の以前のバージョンでは、ワード カウントと名前空間のコンフリクトのレポートは .txt ファイルのみでしたが、UE 5.1 では .csv ファイルもサポートし、情報がわかりやすく、整理しやすくなっています。この形式は UE 5.1 ではデフォルトになっています。変更するには、エンジンのインストール ディレクトリに移動し、「Engine/Config/Localization/Engine.ini」を見つけて、ConflictReportName フィールドと WordCountReportName フィールドを .csv の代わりに .txt 拡張子を使用するように設定します。

コードのパース処理の改善

UE 5.1 では、コードにおけるローカライズされたテキストの処理を扱いやすくする複数の変更が追加されています。#define LOCTEXT_NAMESPACE#undef LOCTEXT_NAMESPACE を使用して、特定のローカリゼーション名前空間に属するように、コードのセクションをマークします。続いて、これらのマクロに挟まれたところで LOCTEXT マクロを使用して、キーとデフォルト テキストの文字列があるローカライズ テキスト エントリを定義できます。

#define LOCTEXT_NAMESPACE "Paper2D"
//…

DefaultRule.Description = LOCTEXT("TerrainDefaultRuleDesc", "Top");

//…

#undef LOCTEXT_NAMESPACE

上の例では、デフォルト テキスト Top があるキー TerrainDefaultRuleDescPaper2D 名前空間に追加されます。さらに、ローカライズされたテキストでエスケープ文字の使用をサポートします。

カーブ テーブル エディタ

カーブ データ テーブル エディタ で、シンプルなカーブリッチなカーブ を編集できるようになりました。カーブ テーブルを作成するとき、エディタを開き、テーブルまたはカーブ ビューでカーブを編集できます。カーブを作成した外部プログラムに戻る必要はありません。

  • [Content Browser (コンテンツ ブラウザ)] で [Miscellaneous (その他)] セクションに移動し、カーブ テーブルを作成できます。補間タイプを選択することで、リッチなカーブまたはシンプルなカーブを選択できます。

Curve Table Creations

  • 新しいキュービック カーブ テーブルを作成すると、Rich Curve テーブルが作られます。

RichCurve Table

  • 定数または線形のカーブ テーブルを作成するか、スプレッドシートをインポートすると、シンプルなカーブのセットが作成され、Unreal Engine の内部で編集できます。

Simple Curves Table

  • シンプルなカーブを編集するとき、すべてのカーブが同一のキータイムを持つコンストレイントを維持します。つまりキーを水平方向に移動できず、キーを追加すると、すべてのカーブにキーが追加されます。

Editing Simple Curves

  • このエディタではカーブの名前変更と削除をサポートし、定数カーブ テーブルのレンダリングが改善されています。

Renaming Curves

  • カーブのキー値の編集に加え、新しいツールバーの機能強化には、タイミングの再調整、キー列の追加と削除、再インポートなどがあります。

仮想アセット (ベータ機能)

仮想アセット により、プロジェクトのサイズが拡大し始めるときに、チームの全メンバー間でデータを高速に効率的に同期できるようになります。

アセット で作業するとき、ユーザーに必要なのは、エディタで表示するための最小限のアセット情報だけです。たとえば、テクスチャ ではサムネイル画像とエディタ プロパティ (座標系とスケールなど) が必要になりますが、テクスチャの .UAsset ファイルの大部分は不要なピクセル データです。プロジェクトをチームで同期するときにこれは無駄になります。

これらのアセットは「コア アセット メタデータ」部分が分離されています。これはソース コントロールのアセットがある場所にあり、「バルク データ」は別の場所に切り離されています。ユーザーがバルク データを必要とする場合は、ソース コントロールにおいてオンデマンドで同期できます。

次の機能があります。

  • パッケージ パス、特定アセット タイプ、特定アセットごとに、同時にプロジェクト全体を仮想化する。

  • テクスチャおよびオーディオのアセットをサポートする。

新しいインポート フレームワーク

Unreal Engine 5.1 の新しい インポート フレームワーク は、高パフォーマンスで、カスタマイズ可能なアセット パイプラインを使用できるように設計されています。このフレームワークはエディタ内およびランタイム時で動作し、ブループリントおよび Python によるスクリプト処理もサポートします。

Interchange framework options

この新しいフレームワークは形式に依存せず、次のステップで動作します。

  • トランスレータ:ファイル形式を Unreal Engine の中間グラフ構造に変換する。

  • ファクトリ:パイプライン出力からアクタとアセットを生成する。

  • パイプライン:グラフ構造を Unreal Engine アクタとアセットの記述に変換する。

このフレームワークでは現在、次の形式をサポートします。

  • 画像形式:BMP、DDS、EXR、HDR、JPG、PCX、PNG、PSD、TGA、TIFF

  • ライト形式:IES

  • 3D モデル:GLTF、OBJ

  • Material:MTLX

    • この初期リリースでは、MaterialX はインポート専用で、standard_surface シェーディング モデルを使用するマテリアルの変換のみをサポートします。

Unreal Engine で以前にサポートしていたファイル形式は、レガシー フレームワークで引き続きサポートしています。

詳細については、「Import/Export Interchange」のドキュメントを参照してください。(リンクは準備中)

モデリング ツールとスカルプティング ツール

UV エディタ (ベータ機能)

5.0 で実験的機能として導入された UV エディタ が、5.1 ではベータ機能になりました。UV エディタには、以前はプラグインを使用してアクセスできましたが、次の 3 つの方法で素早くアクセスできるようになりました。

  • [Modeling Mode (モデリング モード)] にある [UV] パネルを使用する

  • レベル 内のメッシュを 右クリック する

  • コンテンツ ブラウザ でスタティックメッシュを 右クリック する

UV の作成および編集は継続的に改善されており、デフォルトで有効になっている UV エディタだけではなく次の方法でも行うことができます。

  • ギズモで提供されているよりも複雑なトランスフォーム動作がサポートされている トランスフォーム ツールが追加されています。このコントロールには、連鎖したスケール、回転、平行移動、およびトランスフォームされる UV の相対的動きを調整するさまざまなピボット オプションなどがあります。

  • UDIM のサポートが、レイアウト ツールと アンラップ ツールでアクティブになっています。

    • レイアウトまたはアンラップの操作中に、既存の UV アイランドを、その UV アイランドが現在占有している UDIM にピン止めできます。

  • 分散 ツール は、UV アイランド間の間隔をバウンディング ボックスのエッジ ルールに基づいて自動的に調整します。

    • 手動による距離調整がサポートされ、さまざまな分散を行うときに UV 選択の間の間隔をユーザーが正確に制御できるようになりました。

    • オーバーラップの除去を最小限に抑える新しいモードがアクティブになっています。このモードでは、選択されている領域のバウンディング ボックスが交わらないように、必要に応じてそれらの領域を離すことが試行されます。また、このモードは新しい手動距離制御と連動するため、分離距離をカスタマイズできます。

  • 分割 ツールで、三角ポリゴンの全領域、全頂点、全エッジがサポートされるようになったため、既存の UV アイランドの選択およびセグメンテーションを素早く行うことができます。

  • 整列 ツールに、追加のグループ化ロジックが含まれています。このロジックでは、個々に選択されているアイランドを互いに独立して整列でき、相対的配置を維持しながら選択項目をグループとして整列できます。

    • 整列ツールと分散ツールで、頂点およびエッジの選択がサポートされるようになったため、境界および内側のラインに沿ってより正確に配置できます。それに応じて、これらのツールで個々の頂点を独立したエンティティとして扱うことがサポートされているため、頂点の整列と分散ごとに最大限に細かくスケールできます。

  • UV エディタの 3D ビューポート で選択項目へのカメラ スナップがサポートされています。

    • ビューポートのツールバーにある新しいカメラ フォーカス ボタン、またはカメラ スナップのデフォルトのキーバインド (Alt + F) を使用し、この機能を開始できます。

  • AutoUV ツールを使用し、既存のメッシュ ポリゴングループに基づいて UV を作成します。

    • 生成されるアイランドを元のポリゴングループに従って UDIM タイルに自動的に並べ替えるオプションがあります。

これらの改善の多くは、従来のアーティストおよび描画アプリケーションの機能を再現したものです。詳細については、「UV エディタ」のドキュメントを参照してください。

パターン ツール

アーティストのモデリング ツールキットが拡張されて、パターン ツールが追加されました。選択されている 1 つまたは複数のメッシュを、可動 3D 平面に向いているライン、グリッド、または円に沿ってタイリングします。補間する平行移動、回転、スケールなど、タイリング パターンごとにさまざまなパラメータを指定できます。生成されるパターンは、マージされた Dynamic Mesh コンポーネント、要素ごとの Actor コンポーネント (スタティックまたはダイナミック)、またはインスタンス化された Static Mesh コンポーネントとして出力されます。

アニメーション

Animation Synthesis

機械学習 (ML) デフォーマ (ベータ機能)

機械学習 (ML) デフォーマ システムを使用すると、ユーザーが独自の ML デフォーマ モデルを作成して、Unreal Engine で高品質のメッシュ変形を近似できるようになりました。

プラグインとしてパッケージされている ML デフォーマ フレームワーク では、既存の ニューラル ネットワーク推論 (NNI) フレームワークおよび再利用可能なアセット タイプとエディタが使用され、ユーザーはそれらを使用してランタイム時にニューラル ネットワークを評価することで、メッシュを変形させる ML デフォーマ モデルをトレーニング、検査、デバッグできます。

ML デフォーマ システムでは、デフォーマ グラフ システムとの統合も提供され、ユーザーはそれを使用して、生成されるメッシュ変形を編集および微調整できます。

また、新しい Neural Morph Model プラグインを有効にし、作成済みの高性能デフォーマ モデルを利用して、キャラクターの高品質の変形を少ないメモリ使用量でトレーニングできます。

  • ニューラル モーフ モデル頂点デルタ モデル を置き換えるモデルです。キャラクターあたりわずか数メガバイトの追加データと高速なハードウェア性能を必要としますが、ニューラル モーフ モデルを使用すると、最新のプラットフォームで ML ベースの高品質のメッシュ変形モデルを使用できるようになります。

ML デフォーマ フレームワークニューラル モーフ モデル の導入に加えて、ML デフォーマ アセット エディタ にはパフォーマンスと操作性にいくつかの改善が加えられています。

詳細については、「ML デフォーマ」のドキュメントを参照してください。

デフォーマ グラフ (ベータ機能)

Deformer Graph プラグインにはエディタが付属しており、それを使用すると、ユーザーがデフォーマ グラフ アセットを 作成 および 編集 して、すべてのスキン メッシュに対する複雑なメッシュ頂点変形動作をカスタマイズできます。

デフォーマ グラフ エディタ で、カスタム ブループリント ロジックと HLSL (High Level Shading Language) スクリプティング の組み合わせを使用すると、ランタイム時にダイナミック入力を使用してメッシュ頂点データを変更するメッシュ変形システムを作成およびカスタマイズできます。デフォーマ グラフは、モーフ ターゲット または クロス シミュレーション を使用してランタイム時に複雑なメッシュ変形を作成する、従来のリニア スキン メッシュを置き換える強力な機能です。

詳細については、「デフォーマ グラフ」のドキュメントを参照してください。

Physics Control コンポーネント (実験的機能)

Physics Control コンポーネント は、シンプルで直感的であり、しかも強力な物理ベースのコントロールをブループリントに追加する手段を提供するプラグインです。これらの物理コントロールを使用すると、芸術的な制御やゲームプレイの制御を維持したままで、スタティックメッシュおよびスケルタルメッシュの新たな物理的動きを利用できます。

Physics Control コンポーネントを使用すると、1 つのスケルタルメッシュのすべてまたは一部のみに影響を及ぼすコントロールを簡単に作成できます。たとえば、多くの制御を維持したままで新たな動きを確認したい状況で、ワールド空間 で動作する物理コントロールを作成できます。親空間 で動作して反応性の高い筋肉のような手足の動作を作り出すように、物理コントロールを設定できます。物理コントロールは、その場または外部にある複数の 物理ボディ の間で動作することもできます。

また、アニメーション、プロシージャル ターゲット、またはその両方の組み合わせを使用するように物理コントロールに指示することもできます。

全身エフェクト、二次的動き、ヒット リアクションなど、Physics Control コンポーネントの応用例を確認するには、Content Examples プロジェクトにある Physics Control レベルを参照してください。

アニメーション ゲームプレイ

Motion Matching (実験的機能)

Pose Search プラグインに、ステート マシン の動的代替である新しい Motion Matching アニメーション ブループリント ノードが追加されました。それを使用してキャラクター移動アニメーション システムを構築できます。

キャラクターの移動アニメーションが入っている データベース アセットを使用して、Motion Matching ノードはランタイム時に、キャラクターの 移動モデル に合致するように、格納されているアニメーションのセットから情報に基づくアニメーション ポーズ選択を行います。Motion Matching ノードを使用すると、複雑なステート マシン ロジックを必要とせずに、高品質で応答性に優れたキャラクター移動アニメーション システムを効率よく迅速にセットアップできます。

キャラクターのモーション データベース アセットまたはデータベース セット アセットにより多くのアニメーションを追加するだけで、キャラクターの Motion Matching アニメーションの忠実度と品質が向上します。Motion Matching ノードは、追加された各アニメーションを使用して、より多くのデータから描画し、プレイヤーの移動モデルに合致する高品質のポーズをより的確で効果的に選択できます。

Pose Search プラグインのパッケージには、Rewind Debugger のカスタム統合も付属しています。それを使用して、Motion Matching ポーズの選択プロセスを記録および分析でき、どのポーズが選択されたか、どのポーズが選択されなかったか、そしてその理由を確認できます。次にその情報を使用して、プロジェクトのニーズに合うように選択プロセスを調整および微調整できます。

custom rewind debugger implementation for motion matching

アニメーション ランタイム

Rewind Debugger

ユーザー インターフェースが刷新された Rewind Debugger では、アニメーション データ トラックの情報の視覚的グラフである タイムライン が表示されるようになり、それを使用して、キャラクターのアニメーション システムのデバッグ中にアニメーション データのきわめて重要な更新や変更を確認できるようになりました。

Rewind Debugger のタイムラインには、デバッグ対象の個々のコンポーネントまたは子オブジェクトのアニメーション データのトラックが表示されます。Rewind Debugger を使用して、アニメーション シーケンスの再生通知カーブブレンド ウェイト などを分析およびデバッグできます。また、タイムライン内でアニメーション データの各トラックを選択して、選択しているアニメーション データのより正確な測定値を、デバッグのために新しい Rewind Debugger の詳細パネル に表示することもできます。

また、シーケンサー には ポーズ ウォッチ 統合が追加されており、キャラクターのアニメーション ブループリントで有効にして、ゲームプレイのレコーディングされたセグメント内で任意のブループリント ノードの出力ポーズを観察することもできます。

詳細については、「Rewind Debugger」のドキュメントを参照してください。

シーケンサー

レイヤー バー

複数のキーフレームの移動とスケーリングを同時に行えるようにするために、レイヤー バー を使用して シーケンサー 内でキーフレームやセクションを動かすことができるようになりました。レイヤー バーは階層型であり、アクタ、コンポーネント、フォルダのトラックに表示されます。それらを任意のポイントで操作すると他のレイヤー バーが適切に処理されるため、各トラックを展開することなくアクタのキーフレームのタイミングを容易に再調整できます。

sequencer layer bars

キー バー

キーフレームの隣接するペアのタイミングをより簡単に調整する方法として キー バー がシーケンサーに追加されました。2 つのキーフレームの間に描画されているラインを選択してドラッグすると、両方のキーがそれぞれの位置を基準にして動くため、各キーを個別に複数選択する時間を省くことができ、それらのキーの間のカスタム カーブを維持できます。

sequencer key bars

アニメーション コンストレイント

Unreal Engine の新しい コンストレイント 機能を使用してさまざまな方法でシーケンサー オブジェクトを動的に制約できるようになりました。他のアニメーション ツールにある制約メソッドと同様に、親コンストレイント でトランスフォーム全体を制約することも、平行移動回転視線、または スケールのコンストレイント で個々のチャンネルに沿って制約することもできます。

コンストレイントを使用すると、シーケンサー アニメーションで オブジェクトアクタ、コントロールリグの コントロール を動的で非破壊的に、互いに対してアタッチすることが容易になります。

コントロール リグ

コンストラクション イベント

類似した他のブループリント ツールとの一貫性を高めるために、セットアップ イベント という名前が コンストラクション イベント に変更されました。また、新しい Spawn ノードが追加されたことで、コンストラクション イベント でのプロシージャル リグの作成がより迅速で簡単になっています。

construction event and spawn control

UX と機能の改善

コントロール リグに対していくつかの操作性の改善と UX の変更が行われ、ワークフローが改善されました。

  • コントロール リグ エディタは、複数のグラフをサポートするようになりました。これにより、リグのロジックを整理および分割し、別々のグラフにすることができます。

  • カスタム イベント をリグ グラフ (ユーザー定義イベントと呼ばれる) に追加できるようになりました。これにより、独自のリグ イベントを作成および実行できます。

  • [Animation Mode (アニメーション モード)] パネルの [Show Controls as Overlay (コントロールをオーバーレイとして表示)] を有効にすることで、他のソフトウェアの「X 線」設定と同じように、コントロールをジオメトリに重ねて表示できるようになりました。

  • プロキシ コントロール が追加されました。このコントロールは、新しいコントロールの タイプ であり、駆動する/駆動される関係にある他のコントロールにリンクできます。

  • Python コマンドをコントロール リグ エディタのピンにアタッチできるようになり、ノードの設定を自動化できるようになりました。

control rig user interface

IK リグと IK リターゲッタ

調整可能なストライド (歩幅)

IK リターゲッタ の使用時に利用可能な、IK 目標の長さ、幅、広がりを制御するための新しいプロパティが追加されました。ほとんどのケースで、リターゲットされたキャラクターの歩幅や全体のスタンスの調整にこれを使用できます。

速度プランティング

大きく異なる複数のキャラクターからのリターゲティング結果を改善する、新しいツールとワークフローが提供されています。速度プランティング ワークフローを使用することで、足の滑りや類似した他の問題を軽減できるようになりました。このワークフローの詳細については、「Speed Planting」のドキュメントのページを参照してください。

UX と機能の改善

IK リグと IK リグ リターゲッタのエディタでユーザー インターフェースとユーザー エクスペリエンスのいくつかの変更が行われ、ワークフロー、レイアウト、ツールの動作が改善されています。大きな変更点は次のとおりです。

  • リターゲティング エディタで、ソースとターゲットの両方のスケルトンがスケルトン階層とともにビューポートに表示されるようになりました。追加のフィルタ、検索バー、階層の並べ替えを使用して、チェーン プロパティを分離および編集する機能を向上させることができるようになりました。

  • IK プロパティなどの特定のプロパティは、リターゲティング チェーンで必要とされない場合に無効になります。また、プロパティに対するシンプルな UI が追加されています。デフォルト値ではないプロパティに対するプロパティ リセット インジケーターなどです。

  • リターゲティング ポーズを保存およびインポートできるようになったため、プロジェクトでカスタム ポーズを共有できるようになりました。

  • リターゲティング ポーズの編集が改善され、ボーン回転を数値で入力できるようになったため、より簡単で正確に制御できます。

ik retargeting interface

DMX

Vectorworks for DMX

Vectorworks および MVR のインポータ (実験的機能)

MVR は、ライブ イベントや映画/テレビ業界で DMX フィクスチャーやパッチ適用情報のトランスポートのための重要な形式です。この形式のサポートにより、CAD アプリケーション (Vectorworks など) や ライティング コンソール (Grand MA3 など) を使用しているチームと共同作業できるようになりました。

Vectorworks のファイルをライブ イベントや VP ステージのプレビズ用に UE にインポートするため、GDTF および MVR から Datasmith までのワークフローのサポートが追加されました。

MVR は、DMX フィクスチャーのトランスフォーム、パッチ情報、および GDTF シグネチャ ファイル を提供する一方で、Datasmith は共通のメッシュ データおよびテクスチャ データをインポートします。

バーチャル プロダクション向け DMX (実験的機能)

Unreal Engine が DMX イベントをトリガーし、DMX コンソールが Unreal Engine のアクタを制御できるという、Unreal Engine と DMX の間の双方向ワークフローの改善が進行中です。これは、Unreal Engine のユーザーと DMX ベースのライティング コンソールを使用するプロダクション チームのメンバーとの共同作業が増えている状況を支援するものです。

エディタ内でのリアルタイム サポート (実験的機能)

これまでは、DMX プラグインを使用して DMX サポートを有効にしており、送信/受信の機能を有効にできるのはプレイ/プレビュー/ゲーム/パッケージ化済みのいずれかのモードのみでした。エディタでのライブ実行のサポートを追加することで、DMX を使用してエディタ内要素を操作できるようになりました。

ピクセル マッパの改善 (実験的機能)

DMX Pixel Mapper の多数の UI の調整やワークフローの改善が行われました。特に、以前にインポートした MVR データセットのレイアウトを使用した 2D フィクスチャー マッピング グリッドを設定する機能に対してこれが行われました。

Unreal Cloud Services

ピクセル ストリーミング

バーチャル プロダクションでの Pixel Streaming のサポート

リモートの Pixel Streaming セッションでバーチャル カメラ (VCam) を操作するためのサポートが導入されています。これは新しい Pixel Streaming Output Provider を使用して実現されており、それが VCam アクタで出力プロバイダとして選択されています。

バーチャル プロダクションの LiveLink の改善 (実験的機能)

バーチャル プロダクションの Live Link iOS アプリにも、Pixel Streaming を使用して iOS デバイス上のバーチャル カメラを実験的にストリーミングおよび制御するための実験的サポートが追加されています。これまでは、Live Link アプリを使用してバーチャル カメラを制御すると、顕著なレベルのレイテンシーが発生していましたが、Pixel Streaming では、バーチャル カメラを操作するときのレイテンシーをはるかに小さくすることができます。このワークフローのサポートは実験的機能であり、まだプロダクション対応ではありません。

Pixel Streaming フロントエンドの改善

Pixel Streaming フロントエンド、単一サーバー、SFU、および関連スクリプトはすべて、Unreal Engine のリリース タイミングから切り離されている独自のトップ レベル Github リポジトリに移されています。これにより、Unreal Engine のリリース サイクルに縛られずに、これらのコンポーネントをより高い頻度でアップデートできます。そのリポジトリは次の場所にあります。

https://github.com/EpicGames/PixelStreamingInfrastructure.

これから Pixel Streaming を使用するユーザーにとっては、ワークフローの変更はほとんどない見込みです。アプリケーションをパッケージ化する場合、使用しているエンジン バージョンに応じて実行時に正しいバージョンの Github リリースをダウンロードする小さなスクリプトがアプリケーションにバンドルされます。リリース間でブラウザの互換性を損なう変更や問題がある場合、このリポジトリではリリース ウィンドウ外でそれらに対処するためのメカニズムが提供されます。また、Pixel Streaming のユーザーはフロントエンド/サーバーに関する問題をこのリポジトリに報告することをお勧めします。そうすることで、ユーザーとコラボレーションするのが簡単になります。

UE エディタ/ゲームでの Pixel Streaming のデコード

5.1 では、Pixel Streaming のビデオ ストリームをエンジン内でデコードするためのサポートが追加されました。これにより、複数のアプリケーション間およびエディタ間でストリーミングできるようになります。この機能には、C++ コードを記述することなくエンジンでストリーミングの再生をセットアップする、新しいブループリント ノードが伴っています。現時点では、ストリーミングを再生できるのは特別なマテリアルを使用している場合のみです。

Example of Pixel Streaming ingame

New Blueprint nodes for in-engine Pixel Streaming

エディタのビューポート ウィンドウでのストリーミング (実験的機能)

これまでは、Unreal Engine のユーザーはパッケージ化された Unreal Engine アプリケーションおよびゲームをストリーミングできていました。リモート ワークやリモート コラボレーションの増加により、Unreal Editor 自体を Pixel Streaming でストリーミングするための実験的サポートを導入しました。エディタのストリーミングは、Pixel Streaming が有効になっている場合に表示されるようになった新しい Pixel Streaming ツールバーを使用して試すことができます。または、無人セットアップで起動する場合は、-EditorPixelStreamingStartOnLaunch を指定することで起動できます。エディタのストリーミングは、通常の Pixel Streaming と同じ方法で実行され、Signaling サーバーは引き続き必要です。

また、エディタのユーザー エクスペリエンスに関するいくつかの制限があります。たとえば、マルチモニター ストリーミングは現時点ではまだサポートされていません。この機能は全般的に実験的プレビューであり、今後のリリースで機能セットとユーザー エクスペリエンスが拡張される予定です。ただし、この機能に対応できるように構築するユーザーは、この機能は今後変更される可能性があることに注意するようにしてください。

プラットフォーム

Apple Silicon での Unreal Editor (実験的機能)

これまでのバージョンの Unreal Engine では Apple の ARM-64 アーキテクチャ用にプロジェクトをビルドすることがサポートされていましたが、Unreal Editor 自体はそのアーキテクチャ用にネイティブにビルドされていないため、Apple Silicon デバイス上での実行は Rosetta 命令トランスレータに頼っていました。UE 5.1 では、Unreal Editor で Apple Silicon のネイティブ サポートの実験的バージョンが提供開始されたため、M1 以降のデバイスでエディタを実行する際のパフォーマンスが向上しているはずです。

このサポートは、Epic Games Launcher を通じて配布されるビルドでは利用できません。代わりに、Apple シリコンベースの Mac で Xcode を使用して Unreal Engine をソースからビルドする必要があります。Apple シリコンのプラットフォームの Xcode を使用した UE のビルドでは、デフォルトで実験的なネイティブ バージョンがビルドされ、ターゲット デバイスは My Mac としてリストされます。Rosetta バージョンをビルドするには、ターゲット デバイスを My Mac (Rosetta) に変更する必要があります。

Xcode Rosetta Option

なお、マーケットプレイス プラグインはまだ arm64 に対応していないため、このコンフィギュレーションではマーケットプレイス プラグインが動作する見込みはありません。

Linux IDE ワークフローの改善

UE 5.1 では、Linux での IDE のデフォルトのオプションとしての VS Code のサポートが改善されています。ユーザーが複数の IDE を使用していてコード アクセサが正しい IDE を見つけることができなかった場合にも、エラー処理とメッセージ出力が行われるようになりました。

Google Stadia

UE 5.1 では、Google Stadia プラットフォームのサポートを非推奨としました。UE5.2 では Google Stadia プラットフォームのサポートが除去されます。

XR

OpenXR のサポートの改善

ResetOrientationAndPosition インターフェース関数、ピクセル密度のほか、テンポラル アップスケール を備えた スクリーン パーセンテージ の実験的機能のサポートの追加に加え、いくつかの安定性の改善やバグ修正が行われました。

Enhanced Input (ベータ)

5.1 では、拡張入力 を使用して、OpenXR プロジェクトを扱う複雑な入力を作成できます。拡張入力で、OpenXR 対応のコントローラーとヘッド マウント ディスプレイがサポートされるようになりました。

VR テンプレートがアップデートされて、XR プロジェクトで拡張入力を使用する方法のサンプルが含まれています。

The OpenXR Input Mapping Context Details tab

レンダリング機能の同等性 (実験的機能)

Nanite および Lumen、およびテンポラル スーパー解像度の初期ステレオ サポートが追加されています。現時点では、この機能はディファード レンダラの使用時に PC 上でのみサポートされています。

HoloLens 用 OpenXR のサポート

Unreal Engine 用 Windows Mixed Reality プラグインが削除され、HoloLens 用 OpenXR に移行しています。5.1 で HoloLens 用のプロジェクトを開発するには、Windows Mixed Reality OpenXR Runtime と Microsoft OpenXR プラグイン をインストールする必要があります。

OpenXR を使用した HoloLens プロジェクトのセットアップの詳細については、「OpenXR の前提条件」のドキュメントを参照してください。

Oculus VR プラグインと SteamVR プラグインが非推奨になりました

Oculus VR プラグインと SteamVR プラグインは 5.1 で非推奨になりました。Oculus または SteamVR のプロジェクトでは、OpenXR プラグインと適切な OpenXR ランタイムを使用します。

OpenXR のプラグインとランタイムのインストールの詳細については、「OpenXR の前提条件」のドキュメントを参照してください。

モバイル

モバイル向け開発の要件と互換性のあるハードウェア

Unreal Engine 5.1 でサポートされている OS バージョンおよびモバイル デバイスのハードウェア最小要件は以下のとおりです。必要な SDK と IDE の詳細については、「プラットフォーム SDK のアップグレード」セクションを参照してください。

iOS、iPad OS、tvOS

UE 5.1 では、OS バージョン 15 以降が稼働している iOS、iPad OS、tvOS のデバイスがサポートされています。適合するデバイス モデルの最小要件は次のとおりです。

  • iOS 14

    • iPhone 6S 以降

    • iPod Touch 第 7 世代

  • iPadOS 14

    • iPad 第 5 世代以降

    • iPad Air 2* 以降

    • iPad Mini 4* 以降

    • iPad Pro (全モデル)

  • tvOS 14

    • Apple TV HD*

    • Apple TV 4K (第 1 世代)

    • Apple TV 4K (第 2 世代)

*Apple A8/A8X ベースのデバイス (iPad Air 2、iPad Mini 4、Apple TV HD) では、それをサポートするためのプロジェクト設定が有効になっている必要があります。

必要とされる SDK および MacOS のバージョンについては、後述の「SDK アップグレード ノート」を参照してください。

Android

UE 5.1 では、次の仕様に適合する Android デバイスがサポートされています。

  • Android 8 以降の 64 ビット Android

  • 64 ビット ARM ベースの CPU

  • 互換性のある GPU

    • Mali T8xx、G71、G72、G76、G77、G78、G710 シリーズ

    • Adreno 5xx、6xx、7xx シリーズ

    • PowerVR GM9xxx シリーズ

    • Xclipse 920

  • 互換性のあるグラフィック API

    • OpenGL ES 3.2

    • 互換性のあるドライバがインストールされている Android 10 以降のデバイスでサポートされている Vulkan

必要とされる SDK のバージョンについては、後述の「SDK アップグレード ノート」を参照してください。

モバイル レンダラでのディファード シェーディングがプロダクション対応になりました

モバイル レンダラでのディファード シェーディングは、UE 4.26 で実験的機能として導入され、UE 5.1 でプロダクション対応になりました。このモードでは、モバイル デバイスによく見られる Tiled GPU 用に最適化され、モバイルのフォワード レンダリング パスではサポートされていない (ライト関数、IES プロファイル、ライティング デカールなど) いくつかの高品質なライティング機能が有効になっています。UE でモバイル用にサポートされているすべてのデバイス (Android デバイスでの Vulkan および OpenGL ES モードも含めて) ではディファード モードで実行できます。

また、これまでモバイルではフォワード レンダリング パスでのみ動作していた以下のレンダリング機能が、モバイル ディファード パスでもサポートされるようになりました。

  • ディスタンス フィールド シャドウイング

  • スポットライト シャドウ

  • スクリーン空間アンビエント オクルージョン

以下の機能は、事前計算済みライティングを使用していない場合のみサポートされています。

  • スキン シェーディング モデル

  • ヘア シェーディング モデル

  • Thin Translucent モデル

DirectX シェーダー コンパイラがすべてのモバイル パスで使用されます

UE 5.0 では、DirectX Shader Compiler (DXC) を Vulkan および GLES のデフォルトのシェーダー コンパイラとしていました。UE 5.1 では、すべてのモバイル機能レベルで DXC (Metal を含む) を使用するようになりました。これにより、各レンダリング パス間での一貫性と機能パリティが向上し、DXC コミュニティのリソースを Unreal Engine のすべてのモバイル プロジェクトに向けることができます。

モバイルでのレンダリングの改善

UE 5.1 では、モバイル レンダリング パイプラインに以下の機能と改善が加えられています。これらの機能では、レンダリングの最適化を向上させることに重点を置いています。

Arm ASTC エンコーダ

UE で、ARM の Adaptive Scalable Texture Compression (ASTC) 圧縮規格がオプションとしてサポートされるようになりました。

リファクタリングされたマテリアルごとおよびプロジェクトごとの半精度/最大精度の設定

UE 5.1 では、モバイル デバイス用のマテリアルとマテリアル式の精度モードを指定するオプションが追加されています。利用可能なモードは次の 3 つです。

  • すべての浮動小数点で最大精度

  • マテリアル式のみで最大精度

  • すべての浮動小数点で半精度

新しい追加された主な機能は、エンジン シェーダーは半精度を使用したままにして、マテリアル式のみで最大精度を使用する機能です。どのエンジン シェーダー変数で半精度を安全に使用できるかが内部で判断されているため、通常は半精度をグローバルに設定するよりも信頼性が高くなります。

[Mobile Float Precision Mode (モバイル浮動小数精度モード)] 設定は、[Project Settings] > [Engine] > [Rendering] > [Mobile (モバイル)] にあります。

Mobile Float Precision Mode in Project Settings

これをマテリアルごとに設定することもできます。

モバイル レンダラでのクラスタ化されたローカル ライトと反射のサポート

UE 5.1 では、クラスタ化されたローカル ライトと反射のサポートが、モバイル フォワードとモバイル ディファードのレンダリング モードに追加されています。

Clustered Lights and Reflections in Mobile

PSO キャッシュの改善

これまで、UE はアプリケーション全体で使用される単一のモノリシック キャッシュとして PSO キャッシュ を構築していました。ゲームプレイ中にユーザーが目にすることがないアセットに対してもアプリケーションは PSO キャッシュをロードするため、このようなキャッシュは大量のメモリを消費し、そのコンパイル プロセスにも時間がかかっていました。

UE 5.1 では、PSO はクック処理フェーズでアセットごとの複数のキャッシュに分割された後、使用されるアセットに対してのみ PSO がロードされます。そうすることで、変更されていないアセットの PSO を再コンパイルする必要が軽減され、それをロードするためのメモリ使用量も少なくなります。

PSO の並列コンパイル

現在は Android OpenGL と Vulkan RHI のどちらにも個別の PSO 事前コンパイル プロセス (Android のサービス) があります。PSO に事前コンパイル処理を個別のプロセスで実行することで、グラフィック ドライバでの並列処理の問題の多くが解決され、安定性が向上し、事前コンパイル時間が 3 分の 1 ~ 5 分の 1 程度に短縮されることで通常はパフォーマンスも向上します。

エディタのモバイル プレビューの改善

レンダリング設定が異なる複数のプラットフォームでは、エディタ内プラットフォーム プレビューでその設定をより適切に表現できるようになりました。これまではすべてのモバイル プラットフォームに単一のシェーダー プラットフォームが使用されていたため、ディスタンス フィールド シャドウなどの機能が一部のプラットフォームで有効になっていて別のプラットフォームでは有効になっていない場合に、その機能を実際にプレビューすることはできませんでした。各プレビュー プラットフォームで独立したシェーダー プラットフォームが使用されるようになったことで、この制約が解消されます。

モバイル プラットフォームのプレビュー時に、スケーラビリティおよびデバイス プロファイルのコンソール変数がエディタ内で適用されるようになりました。

Android NDK 25 のサポート

UE 5.1 では、新しい長期サポート リリースである Android NDK 25 のサポートが追加されています。このサポートにより、より高速なコードにするための最適化を備えた新しい LLVM 14 ツールチェーンを利用できるようになり、コンパイル時間が約 15% 短縮され、バイナリのサイズが小さくなります。

ゲームプレイ フレームワーク

ブループリント

ブループリント ヘッダ ビュー

ブループリント ネイティブ化ツール と同様に ブループリント ヘッダ ビュー は、Unreal Engine の ブループリント クラスブループリント構造体 を C++ コードに変換するために使用できる新しい方法です。

C++ Header Preview

ブループリント ヘッダ ビューは、変換プロセスで、ブループリントで使用されているすべての 変数関数アクタ コンポーネントイベント ディスパッチャー に対して C++ 形式の宣言を作成します。

プロジェクトでブループリント ヘッダ ビューの使用を開始するには、コンテンツブラウザ でブループリントの クラス または 構造体右クリック し、コンテキスト メニューで [Preview Equivalent C++ Header (相当する C++ ヘッダをプレビュー)] を選択します。

Blueprint Class Action Preview Header

ブループリント名前空間

新しい ブループリント名前空間 機能を使用すると、エディタで開いたときに関連度が高いアセットとコンテンツのみがロードされるように、プロジェクトのブループリントを選択的に整理できます。複数の 名前空間 を使用してコンテンツをまとめることで、Unreal Engine のエディタの新しいインスタンスが開くときに、複雑なブループリントを迅速にロードおよび提示でき、大量のコンテンツを整理することでユーザーのワークフローの効率が向上します。

Blueprint Namespace Example

また、名前空間を使用する場合は、型ピッカー および 右クリック コンテキスト メニュー を使用してブループリントのコンテンツをフィルタリングすることで、アイテム リストのロード時間が短縮され、ワークスペースが整理されていて機能的な状態を保つことができます。

ブループリントの [Class Settings (クラス設定)] 内で、[Details] パネルにある [Blueprint Namespace (ブループリント名前空間)] プロパティを使用して、ブループリントに割り当てられている名前空間を設定および参照できます。

Characters Blueprint Namespace

詳細については、「ブループリントの名前空間」のドキュメントを参照してください。

Enhanced Input

Enhanced Input プラグインは、プレイヤー入力とプレイヤー コントロールを作成および管理する、機能豊富な新しい手段を提供します。

入力アクション アセットを使用すると、個々の入力または軸コントロールでのプレイヤー入力の方法を設定および定義できます。入力アクション アセットは 入力マッピング コンテキスト アセット内で収集および管理され、このアセットではプロジェクトでのプレイヤー入力とプレイヤー動作に対するより包括的な制御が提供されるため、ランタイム時に状況に応じて調整できる動的システムを作成できます。

また、Enhanced Input システムは、プロジェクトの規模が大きくなったときにプレイヤー入力を整理および管理するのに役立ち、オンラインローカル分割画面のマルチプレイヤー 入力システムの作成および管理を支援する堅牢な機能を備えています。

Enhanced Input システムの実際の例については、「Lyra サンプル プロジェクト」を参照してください。

詳細については、「拡張入力」のドキュメントを参照してください。

Mass

Mass Entity (ベータ機能)

UE 5.1 では、Mass Entity に大幅な改善が加えられ、ベータ機能として扱われるようになりました。Mass の API にはさらに大きな変更が加えられる見込みであり、Mass フレームワーク全体の継続的な開発がコミットされています。

システムの再編

Mass Entity の共有フラグメントは、アーキタイプ レベルからチャンク レベルに移されて、アーキタイプのメモリ断片化が制限されています。

また、Mass Entity サブシステムの中でこのエンティティで管理される部分が新しいタイプ「Mass Entity Manager」に分離されています。これは、カスタム ユースケースにおいて、テスト目的などのための分離エンティティ プールの作成を促進します。

セーフ マルチスレッディング

Mass Processing Phase Manager によってホスティングされているプロセッサのマルチスレッド実行は、専用サーバー以外のすべてのターゲットに対してデフォルトでオンになっています。

MassEntityQuery は、サブシステムの要件を表現できるようになりました。これは Mass 処理のマルチスレッディングの安全性の極めて重要な要素です。また、スレッドの安全性を確保するために極めて重要である追加のプロセッサ間依存関係を決定するために、プロセッサが所有するクエリが使用されるようになりました。

デバッグの改善

UE 5.1 では、Mass Entity に Mass Debugger UI ツール が導入されています。このツールは、選択されている Mass Entity Manager の構成とエンティティ数を示すことで、アーキタイプへの可視性を提供します。

また、このツールは、特定のプロセッサでどのアーキタイプが処理されているかを示し、Mass Processing Phase Manager が所有している質量処理グラフを視覚化します。

人口知能 (AI)

スマート オブジェクト

全般的な改善事項

UE 5.1 では、スマート オブジェクトに全般的な安定性とワークフローの改善が加えられて、スマート オブジェクト定義のセットアップがさらに便利になっています。

API は UE 5.0 との整合性が保たれているため、プロジェクト移行時の後方互換性が確保されています。

Gameplay Interactions プラグイン (実験的機能)

スマート オブジェクトの主なユースケースの一つは、意味のあるゲームプレイ インタラクションをゲームプレイ中に作り出すことができることです。そのため、スマート オブジェクトに Gameplay Interactions プラグインの初期実験的サポートが加えられています。このサポートは今後のバージョンで継続的に改善される予定であり、State Tree およびコンテキスト アニメーションをレプリケーション サポートと組み合わせるスマート オブジェクトに、ゲームプレイ インタラクションを埋め込むことを目標としています。

Environment Query System (EQS) のサポート

UE 5.1 リリースでは、Environment Query System を使用して、レベルにある AI エージェントまたはプレイヤーに最適なスマート オブジェクトを選択できるようになりました。

State Tree

State Tree

State Tree は Unreal Engine の汎用階層型ステート マシンであり、UE 5.0 で導入されました。UE 5.1 では、State Tree にかなりの改善が加えられており、プロダクション対応と見なされるようになりました。このプロセスの一環として、State Tree の API が 5.0 と比べて大きく変更されています。

全般的な改善事項

このアップデートには、アクタとブループリント中心のワークフローの改善が含まれています。ユーザーがブループリントのみのワークフローで State Tree を活用できるようになりました。

柔軟性の向上

State Tree をパラメータ化できるようになったため、異なるデータで同じ State Tree を使用できます。このアップデートには、より複雑な条件ベースの式のサポートの追加が含まれています。

State Tree イベントの改善により、外部のロジックに基づいて状態の変化をトリガーするためのよりシンプルな方法が提供されています。

また、このアップデートでは、State Tree 内でのタスクと条件の使用方法が単純化されています。エバリュエーターを使用せずに条件をタスクにつなぐことが簡単になっています。これにより、State Tree がさらにシンプルになり、さらに効率化されています。たとえば、エバリュエーターを使用することなく、ユーザーがアクタ データに直接アクセスできるようになっています。

追加されたモジュール性

UE 5.1 では、State Tree で サブツリー の概念が追加されました。サブツリーを使用すると、ユーザーが State Tree の共通部分を再利用できます。これにより、再利用性が向上し、複雑な State Tree を構築する直感的な手段が提供されます。

サブツリーはブループリント マクロと似ており、ユーザーは指定した名前でサブツリーを作成し、その入力を定義します。サブツリーは、State Tree 内で名前で直接呼び出すことができます。

メモリの最適化

State Tree の内部ストレージにいくつかの最適化が加えられたことにより、アクティブな State Tree あたりのメモリ使用量が大幅に減っています。ランタイム時に State Tree のメモリに格納されるのはアクティブなタスクのみです。また、State Tree にある大きなプロパティを、UE 5.0 で必要だった完全コピーではなく、参照としてバインドできるようになりました。

これらの改善により、City Sample でゲームプレイ時におよそ 35,000 の State Tree が実行されている場合のメモリ使用量が約 75% 減少しています。

World Partition でのナビゲーション メッシュ

ダイナミック ナビゲーション メッシュ (実験的機能)

Unreal Engine 5.1 には、World Partition 使用時のダイナミック ナビゲーション メッシュ (Navmesh) の初回実験的サポートが含まれています。

ナビゲーション メッシュの ランタイム生成 として ダイナミック モードを使用して、ワールド パーティション化されたダイナミック NavMesh を構築できるようになりました。

その場合、ベース ナビゲーション メッシュの一部としてロードおよびアンロードされるオブジェクトでは、ナビゲーション メッシュに対する変更は無視されます。また、World Partition のダイナミック NavMesh を使用している場合、ダイナミック タイルの構築はロード済みの領域に限定されます。

全般的な改善事項

このアップデートでは、World PartitionFixed Tile Pool Size を使用している場合のサポートが改善されています。タイル数の制限に達しているためにタイルを追加できない場合、Navmesh タイルの追加時に警告が表示されるようになりました。また、構築を迅速化できる UWorldPartitionNavigationDataBuilder コマンドレットを使用してナビゲーションを構築している場合は、Fixed Tile Pool Size の制限が無視されます。

ナビゲーション データは外部にパッケージ化されるようになったため、ワールド パーティション化 Navmesh の構築によってメイン マップがダーティになることはなくなりました。

また、World Partition マップに法線 Navmesh を構築する場合、ナビゲーション メッシュを構築する前にそのマップ全体が自動的にロードされるようになりました。

物理

シーン クエリと剛体シミュレーションのパフォーマンス向上

Unreal Engine 5.1 には、剛体とシーン クエリの両方の機能に関するいくつかのパフォーマンス改善が含まれています。UE 5.0 リリースと UE 5.1 リリースのテスト ビルドでの比較を以下に示しています。

UE 5.1 にアップデートした多数の異なる例でテストし、パフォーマンスが最も低い UE 5.0 の例に注目しました。最初の例は、回転する凸型オブジェクト内に、動的にシミュレートした 512 個の凸型オブジェクトを配置するタンブラー テストです。UE 5.1 のテストが 50% 高速化したこの結果を、以下に示します。

Tumbler test results

2 つ目の例では、複雑なテレイン、ワールドに配置されている 10 万個の静的オブジェクト、高度フィールド テレインに落とされる 512 個の動的凸型オブジェクトを使用しました。以下のこのマップに対するレイキャストの結果では、Unreal Engine 5.1 のパフォーマンスが Unreal Engine 5.0 の速度の 2 倍です。

Raycast test results

Fluid Simulation (流体シミュレーション)

乱流モデルと小規模な力

Unreal Engine 5.1 では、乱流モデルと小規模な力に改善が加えられています。これらの改善により、最先端のシミュレーションにディテールを追加することが簡単になりました。これにより、形状がより目立つように表示されるため、シミュレーションがさらに自然に見えるようにできます。

小規模な力がない場合とある場合の比較

トリキュービック補間

新しいトリキュービック補間モードが追加され、それを使用すると、シミュレーション全体の解像度を高くすることなく特別なディテールを追加できます。これにより、これまでのバージョンの Unreal Engine と同程度のコストで、より詳細なシミュレーションになります。

メモリ使用量の改善

Unreal Engine 5.1 では、流体シミュレーションのメモリ消費量に、いくつかの改善が加えられています。これにより、UE 5.0 と比べて、同じメモリ割り当てでより高解像度のシミュレーションに適合できるようになります。

Destruction

Unreal Engine 5.1 で、Chaos Destruction に大きな改善が加えられています。

改善されたフラクチャ階層

フラクチャ階層で以下のアップデートが行われています。

  • ボーン リストをスクロールすると、親クラスタが自動的に積み重ねられるようになりました。

  • この階層をレベルごとに色分けすることで、読みやすさが向上します。

  • 以下のオプションに基づいてコンテキスト情報が表示される、新しい 列モード が導入されています。

    • State and size (状態とサイズ):ボーンごとの相対的なサイズ、初期状態、アンカー情報が表示されます。

    • Damage (ダメージ):ボーンごとのランタイム ダメージ情報が表示されます。これは、アーティストがアセットのダメージしきい値を調整するのに役立ちます。

    • Removal (除去):ボーンごとの「破壊時に除去」設定が表示されます。

    • Collision (コリジョン):元のスタティックメッシュからインポートされたコリジョンに関する情報が表示されます。

ダメージ ウォッチャー

5.1 では、フラクチャ モード に新しいランタイム ダメージ ウォッチャー が追加されています。[General (全般)] 設定にある [Enable Runtime Data Collection (ランタイム データコレクションを有効化)] オプションをオンにして、[Simulate (シミュレート)] をクリックすると、ダメージ結果を記録できます。

ボーンごとに取得されたダメージが [Damage Column Mode (ダメージ列モード)] 内に表示されます。ダメージしきい値と破壊されているボーン (ある場合) も表示されます。

ツールの改善

Unreal Engine 5.1 のアップデートには、いくつかのフラクチャ モード ツールの改善が含まれています。これらのツールの詳細については、「破壊に関するドキュメント」を参照し、利用可能な 破壊のラーニング パス に進んでください。

GeoMerge ツール

Geometry Collection で選択しているジオメトリ断片をマージする、新しい GeoMerge ツールが追加されています。このツールは以前は GeoMerge という名前でしたが、追加のジオメトリの小さい断片をクリーンアップするという主な用途を表すように、TinyGeo に変更されました。

凸型ツール

新しい凸包生成設定により、生成される凸包の精度と、隣接する凸包とのオーバーラップのバランスを取ることができます。

デフォルトの凸型生成設定 (新規またはリセットされたすべての Geometry Collection に適用される) を、[Fracture Mode (フラクチャ モード)] プロジェクト設定で設定できるようになりました。

検証ツール

検証 ユーティリティが、検証および修正する対象を厳密に制御するチェックボックス付きのモーダル ツールになりました。 シミュレートでは望ましくない、子が 1 つだけのクラスタを修正できるオプションが追加されています。

選択ツール

選択 ツールで、現在のビュー レベルにあるすべてのリーフまたはすべてのクラスタを選択するボタンが追加されています。

自動クラスタ ツール

自動クラスタ ツールで、[Fraction of Input (入力の割合)] によるクラスタリングが追加されており、これを使用すると、階層を減らすときのイテレーションが大幅に迅速化されます。

新しい [Avoid Isolated (孤立した要素を回避)] オプションを使用すると、クラスタに常に 2 つ以上のトランスフォームが含まれるようになります。

メッシュ ペイント

[Mesh Paint (メッシュ ペイント)] モードで Geometry Collection がサポートされるようになりました。破砕されたジオメトリにある頂点カラーとテクスチャをユーザーがペイントできるようになりました。

また、頂点カラーは破砕によって生成された新しい頂点に伝播するため、それらを使用するマテリアルの動作の一貫性が向上します。

インポートされたコリジョン

Geometry Collection の構築に使用された元のスタティックメッシュからのコリジョンを使用できるようになりました。これにより、特に非凸型形状で、コリジョンを細かくカスタマイズできます。

除去

既存の スリープ時に除去 機能が改善され、新しい 破壊時に除去 機能が導入されました。2 つの機能の違いを以下に示します。

  • Remove on sleep (スリープ時に除去):

    • ゆっくり動く断片も除去できるようにする新しいパラメータが 追加されました

    • 部分的に破壊されているクラスタが砕けて、より小さい断片が放出され、最終的に除去されるようになりました。

  • Remove on Break (破壊時に除去):

    • 断片が破砕された後にその断片を除去できるようになりました。これらのパラメータはボーンごとに設定でき、クラスタが除去されるのではなく砕けるように設定できます。

接続グラフ

より正確な接続を提供し、断片が空中に浮遊するという問題を軽減する、新しい 接続グラフ 方法が利用可能になりました。

Previous method (minimal spanning)

New method (Bounds checking)

伝播システム

予測可能性と制御性が向上した破壊動作を提供する、新しいダメージ伝播システムが利用可能になりました。このシステムをインスタンス レベルでパラメータ化でき、破壊および衝撃波によって引き起こされるダメージ伝播に対する制御を提供できます。

ブループリント ノード

Geometry Collection の特定の部分に作用できる、新しい一連のブループリント関数が追加されました。イベントおよびトレース クエリが、アイテム インデックスを返すことができるようになりました。アイテム インデックスは、破砕された断片のレベルをクエリする関数、内部ひずみと外部ひずみを適用する関数、力を加える関数、砕けるようにクラスタに指示する関数で使用できます。

これを使用すると、フィールドを使用することなく、対象とする Geometry Collection の部分を非常に正確に指定できます。

Geometry Collection Blueprint nodes

パフォーマンス

UE 5.1 では、ランタイム時とプロセス作成時の両方のパフォーマンスに関するいくつかの改善が加えられています。

ランタイム時:大量の Geometry Collection をレベルに配置できるようにするための、いくつかの最適化が行われています。

作成時:フラクチャ モードでのいくつかのツールで、大量の Geometry Collection を処理できるようにするための最適化が行われました。また、フラクチャ ツールでは進捗バーが表示されるようになりました。このバーには、長時間に及ぶ演算処理の実行中に操作をキャンセルするオプションが付いています。

クロス シミュレーション

UE 5.1 では、クロス シミュレーションにいくつかの改善が加えられています。

クロス キャッシング

シーケンサー内でクロス シミュレーションを録画および再生できるようになりました。

Cloth caching in Sequencer

クロス圧力

新しい 圧力 コントロールがクロス コンフィギュレーションに、また、新しい Set Pressure 関数がブループリントの Chaos Cloth Interactor に追加されました。これらのコントロールでは、シミュレートされたクロスの各トライアングルに、一定の圧力を追加できます。

このエフェクトは、ペイント可能なマスク Pressure を使用してメッシュ全体にわたって調節できます。この圧力は常にトライアングルの法線方向に加えられます (逆方向に押すには負の値を指定します)。

Cloth pressure example

座屈

曲げ要素 コンストレイントに、新しい 座屈 機能を追加しました。この機能を使用すると、座屈率座屈剛性 のパラメータに応じて、曲げ要素コンストレイントを弱めるか強めることができます。これらのパラメータにより、ユーザーはシミュレーション中のクロス マテリアルの折り目をよりうまく制御することができます。

座屈率

要素が停止角度のこの比率を超えるように曲がった (「座屈した」) ら、曲げ剛性 ではなく 座屈剛性 の使用に切り替えます。座屈率が 0 の場合、座屈剛性が使用されることはありません。座屈率が 1 の場合、曲がりが停止設定を超えるとすぐに座屈剛性が使用されます。

座屈剛性

クロスが曲がる (特定の角度より曲がる) と、曲げでは曲げ剛性ではなくこの剛性が使用されます。一般的に、座屈剛性は曲げ剛性未満になるように設定されます。Buckling Ratio によって、Bending Stiffness と Buckling Stiffness のどちらを使用するかの切り替わり点が決まります。

Buckling stiffness example

この機能は、コンフィギュレーションの [UseBendingElements] チェックボックスにチェックを入れると有効にすることができます。

セルフコリジョンの改善

UE 5.1 では、クロス シミュレーションのセルフコリジョンに対して、いくつかの全体的な改善が加えられています。

追加の解決ステップ

Use Self Intersections (自己交差を使用) パラメータを通じて使用可能なセルフコリジョン解決ステップが追加されました。また、セルフコリジョン摩擦に独自の Self Collision Friction (セルフコリジョン摩擦) パラメータが追加されています。

セルフインターセクション

セルフインターセクションの解決法を調整し、コリジョン反発によって処理されないクロス交差の補正が試みられます。

セルフコリジョン摩擦

クロス シミュレーションに、新しい Self Collision Friction パラメータが追加されました。このパラメータは、クロスからクロスへのインタラクションの摩擦係数を参照します。

値が小さいと、クロスが自身でスムーズにスライドします。値が大きいほど、インタラクションにより多くの摩擦が適用され、クロス自体との接点を中心とする移動距離が少なくなります。

Self collision settings

機械学習クロス (実験的機能)

UE 5.1 では、新しい Nearest Neighbor Model プラグインが利用できます。このプラグインは、比較的小さいランタイム時のオーバーヘッドとメモリ使用量で、折り目やしわを豊かに表現したゲーム内のクロスを作成するツールを提供します。

プラグインのエディタで、ユーザーはニューラル ネットワークに学習させ、任意のポーズを対象として、事前にシミュレーションされた小規模なデータ セット (通常、50 ~ 100 フレーム) で最近傍探索を行うことができます。続いて、特定のポーズのクロスに対してジオメトリの詳細を転送するために最近傍が使用され、忠実度の高いランタイム時シミュレーションとなります。

Niagara

GPU のリボン

GPU で リボン がサポートされるようになりました。これまでのバージョンでは、リボン レンダラ は CPU エミッタにのみ追加できました。ゲームでのニーズや使用する機能に応じて、GPU と CPU のどちらでレンダリングするかを選択できるようになりました。

スケーラビリティ モード

Niagara エディタで スケーラビリティ モード をオンにすると、異なるスケーラビリティ設定をプレビューできます。そうすることで、異なるプラットフォームで再生するエフェクトを微調整できます。わかりやすくするために、スケーラビリティ設定がデフォルト表示から削除され、スケーラビリティ モードに追加されました。

Niagara Scalability Mode

エミッタのバージョン管理

4.27 以降、カスタム モジュールを作成するユーザーは、バージョン管理を使用して、既存のエフェクトを壊すことなく新しいモジュールをチームに提出していました。

5.1 では、エミッタ全体をバージョン管理してそれをチームに展開できる同じ機能が、エミッタに追加されています。バージョン管理を使用すると、新しいアセットを作成することも既存の動作を失うこともなく、自分のテンプレートを更新または変更できます。

Emitter Versioning in Niagara

フリップブック ベイカー (ベータ機能)

フリップブック ベイカー は、エフェクトのラスタライズしたフリップブックをベイクするために使用されるツールであり、最初のバージョンは UE 5.0 で導入されました。UE 5.1 では、ユーザー エクスペリエンスが向上し、オプションが追加されています。このツールでは次の 3 つのタイプをベイクできます。

  • 2D テクスチャ

  • ボリューム テクスチャ

  • シミュレーション キャッシュ (実験的機能)

レンダリング依存関係グラフ

Niagara で レンダリング依存関係 グラフがサポートされるようになりました。詳細については、「レンダリング依存関係グラフ」を参照してください。

異種ボリュメトリック レンダリング (実験的機能)

Niagara Fluids レンダリングは UE 5.0 で導入されました。初回の実装は限定的であり、2 つのディレクショナル ライトを流体シミュレーションに追加できるだけでした。流体にシャドウをキャストすることもできませんでした。

異種ボリュメトリック レンダリング は、シーンにセットアップ済みのライティングを取り込んで、それを流体シミュレーション レンダリングに適用できるように設計されています。このタイプのレンダリングは、ディレクショナル ライトだけではなくすべてのタイプのライトで機能します。使用できるライトの数に上限はありませんが、現時点での実装では、ライトが追加されるごとに負荷が直線的に大きくなります。

レベルに他のオブジェクトがある場合は、流体ボリュームにそれらのシャドウをキャストすることもできます。そうすることで、よりリアルに見えるようになり、流体エフェクトがシーンにさらに溶け込むようになります。

この実験的機能を有効にするには、[Project Settings] の [Enable Heterogeneous Volumes (異機種のボリュームを有効化)] チェックボックスをオンにします。その後に、流体シミュレーションでマテリアル MI_HeterogeneousVolumes_GasExplosionCine をメッシュ レンダラに適用します。

流体の品質の改善 (ベータ機能)

このバージョンで、Niagara Fluids に品質とパフォーマンスに関する以下のような改善が加えられています。

  • 乱流モデルが改善されています。

  • 小規模な力も改善されており、最先端のシミュレーションでディテールを追加することに役立ちます。

  • トリキュービック補間が実装されており、解像度を上げずに特別なディテールを追加できますが、パフォーマンスとのトレードオフがあります。

  • 流体の全体的なパフォーマンスが改善されています。

UX / UI の改善

Niagara エディタの新しいレイアウト

Niagara エディタ が、効率化された新しいレイアウトになっています。[Parameters (パラメータ)] パネルが左下に移されて、中央にある [System Overview (システムの概要)] に余裕ができています。[Curve Editor (カーブ エディタ)][Log (ログ)] が一番下にドッキングされ、[Timeline (タイムライン)] の横に配置されています。

Niagara Editor New Layout

[Parameters] パネルや [Selection (選択)] パネルなどのパネルがコンテキスト依存になり、選択されているものに応じて表示内容が更新されるようになりました。

Override Parameters から User Parameters への変更

以前は、レベル エディタにある Niagara アクタを選択する場合に、[Override Parameters (パラメータをオーバーライド)] というセクションが使用されていました。このセクションが [User Parameters (ユーザー パラメータ)] に変更されています。

Scratch Script Manager

以前のスクラッチ パッド インターフェースが、Niagara エディタ内で直接、スクラッチ モジュールを作成する新しいワークフローで置き換えられています。Niagara エディタで、必要なだけスクラッチ モジュールを追加し、それぞれのスクラッチ モジュールを独自のタブとして表示できます。

Scratch Pad Tab in Niagara Editor

パラメータ用の階層エディタ

多数のカスタム ユーザー パラメータを作成する場合は、[Parameters] パネル内でそれらが整理された状態を保つことが課題になりがちです。階層エディタ を使用すると、変数を分類および整理できるだけではなく、そのデフォルト値を設定することもできます。

Niagara Hierarchy Editor

レベル エディタでの [Effect (エフェクト)] セクションに関する情報

レベル エディタで Niagara システムを選択すると、[Details] パネルに [Effect] というセクションが表示されるようになりました。これは、Niagara システム用に編集する必要があるパラメータを素早く切り分けることに役立ちます。

Effects Section in Details Panel

システムまたはパラメータをデバッグする

Niagara Debugger を開く新しい方法、および分析する要素をトラックする新しい方法があります。

特定のシステムでデバッガをすばやくオンにするには、レベル エディタで Niagara コンポーネントをクリックし、[Details] パネルから [Debug (デバッグ)] を選択します。これにより、システム情報がすでに設定された状態で Niagara Debugger が開きます。

Niagara Debug HUD

パーティクルの存続期間など、特定のパラメータをデバッグすることもできます。Niagara エディタの [Parameters] パネルから、トラックするパラメータを右クリックし、[Watch Parameter in Niagara Debugger (パラメータを Niagara デバッガで観察)] を選択します。

Watch Parameter in Niagara Debugger

これにより、パラメータの情報を確認するためにデバッガに必要なあらゆる情報の関連オプションが自動的にオンになります。

詳細については、「Niagara Debugger」のドキュメントを参照してください。

アクセシビリティの改善

次のとおり UE 5.1 でアクセシビリティ ツールが改善されています。

マルチユーザー スクリーン リーダーのサポート

Screen Reader プラグインは同時に複数のユーザーをサポートできるようになりました。目が不自由な複数のユーザーが同時にプレイできます。ユーザーの入力デバイスで特別なオーディオ ポート (ゲーム コンソール コントローラーにあるポートなど) を利用できる場合、各ユーザーはヘッドフォンを接続して、スクリーン リーダーの音声を分離して出力できます。また、PC ユーザーやヘッドフォンがないユーザーに対しては、スクリーン リーダーはユーザーごとに異なるピッチで音声を出力します。スクリーン リーダーのユーザーは、FScreenReaderUser クラスによって表されます。このクラスは、音声案内をリクエストしたり、現在フォーカスが存在するアクセス可能なウィジェットについての情報を保持したり、新しいナビゲーション ポリシーを使用してユーザーのナビゲート方法を定義したりできます。

ナビゲーション ポリシー

ナビゲーション ポリシー を定義して、商用のスクリーン リーダーの動作と同様に、目が不自由なユーザーがスクリーンをナビゲートする方法を細かくコントロールできるようになりました。ナビゲーション ポリシーを作成するには、IScreenReaderNavigationPolicy を実装するクラスを作成します。その後、FScreenReaderUser::SetNavigationPolicy を使って、使用する共有参照を提供することで、スクリーン リーダーのユーザーのナビゲーション ポリシーを設定することができます。

Unreal Insights

Unreal Insights は Unreal Engine のコンパニオン アプリケーションであり、作成したゲームの CPU およびメモリ パフォーマンスを分析し、プロファイルを作成できます。全般的な情報については、「Unreal Insights」のドキュメントを参照してください。

トップ メニュー

以下のトップ メニュー コマンドが新たに利用できるようになりました。

  • Import Table (テーブルをインポート): Timing Insights (タイミング インサイト) から、.csv または .tsv テーブルを分析用にインポートできます。どのテーブルにもグループ化と階層パス分析機能を適用できます。

  • Session Browser (セッション ブラウザ): セッション ブラウザ を閉じた場合、開いているトレース ファイルから再び開くことができます。

  • Open Trace File (オープン トレース ファイル): Timing Insights ですでにトレースを開いている場合、異なるトレース ファイルを開くことができ、現在のセッションを置き換えたり、2 番目のセッションとして開いたりすることができます。

  • Auto Open Live Trace (自動オープン ライブ トレース): 有効である場合、現在のセッションはライブ トレースに自動で変わります。

セッション ブラウザ

Unreal Insights においてトレース セッション リストのフィルタリングやソート操作が可能になったため、注目している特定データを効率的に分析できるようになりました。

トレースをコマンド ラインから名前で検索できます。

Searching Trace Filter

トレースを右クリックして、セッション ブラウザからトレース セッションの名前を直接変更したり削除したりできるようになりました。コンテキスト メニューから削除や名前を変更すると、トレース ファイルと関連キャッシュ ファイルも削除または名前変更されます。

Memory Insights

メモリ トレースをキャプチャするには、セッションはコマンド ラインから開始する必要があります。レコーディングを開始するには、エディタまたはゲームをコマンドラインから引数 trace=default,memory を指定して実行します。コマンドラインからこれらの引数を指定して開始する必要がある理由は、エンジンが初期化したらすぐにトレース情報を追跡する必要があるためです。

アセット名とクラス名

Memory Insights をコマンドラインから、追加トレース チャンネル metadataassetmetadata を使用して開始できます。これにより、Memory Insights セッションの追加フィルタ オプションとしてアセット名とクラス名を利用できます。たとえば、アセットごとやクラス名ごとにメモリ アロケーションの負荷を計算できます。

改善されたツリー ビュー

文字列の列のグループ化に Path Breakdown (パスの分解) オプションが追加され、選択すると、折りたたみ可能な階層ビューが作成されます。低レベル メモリ (LLM) タグ、アセットおよびトップ ソース ファイルを次のようにグループ化できます。

このようにグループ化すると、見た目で整理できるだけではなく、親グループの負荷も表示できます。

Visual Studio で開く

Unreal Insights の従来のバージョンでは、コールスタックでグループ化したアイテムを右クリックして、コンテキスト メニューから Visual Studio で開くことができました。今回のバージョンでは、コールスタックでグループ化されていないときでもこのオプションを利用できます。たとえば、タグでアイテムをグループ化した場合、アロケーションを右クリックして、[Open in Visual Studio (Visual Studio で開く)] を選択できます。

モジュール ビュー

Memory Insights の [Modules (モジュール)] ビューではすべての .dll ファイルのリストを表示します。このバージョンでは、統計情報は簡単にソートできるように個別の列に分割されています。次の状態であるシンボルの数を示す列が見つかります。Discovered、Cached、Resolved、Failed

Modules View

失敗したリスト アイテムが赤色で強調表示され、正しく解決されたリスト アイテムは緑色で強調表示されます。黄色は一部のシンボルが解決され、一部が失敗したことを示しています。

ネットワーキング インサイト

パケット ビュー

パケットビュー 内のイベントがハイライトされるようになり、パケット内で特定のイベントが使用しているビット数が確認しやすくなりました。これにより、他のデータと比較してイベントがどれくらいの帯域幅を使用しているかをすばやく確認できるようになりました。

以下のどちらをハイライトするかを選択できます。

  • イベントのすべてのインスタンスの集計済みビットカウント

  • 単一イベントによって使用された最大ビットカウント

NetStatsCounters

NetStatsCounters という新しいタブがあり、選択したパケットまたは特定範囲のパケットのレプリケーション システムに関連する統計のカウンタを表示できます。統計には、次の 2 つの異なるカテゴリがあります。

  • FrameStats:フレーム全体の統計カウンタ。これは通常、ネットワークの構築に関連する統計カウンタを報告するために使用されます。これは、すべての接続間で共有される処理が対象となります。たとえば、このフレームで現在更新されているオブジェクトの数です。

  • PacketStats:特定の各パケットに関連する統計カウンタ。たとえば、シリアライズするようスケジュール設定されたオブジェクトの数や、そのパケットに実際に該当した数です。

NetTrace

マクロの UE_NET_TRACE_PACKET_STATSCOUNTER および UE_NET_TRACE_FRAME_STATSCOUNTER を使用し、ネットワーク トレース データと関連付けられた単純な統計をトレースできるようになりました。これらのいずれかのマクロを使用してトレースされたデータは、[Network Insights (ネットワーク インサイト)] の [NetStatsCounters] タブに表示されます。

Timing Insights

Task Insights

ParallelFor タスクのサポートを追加しました。

Cooking Insights

Cooking Insights にはプロファイリング メソッドがあり、パッケージをクックする方法に関する情報を収集し、表示します。クック セッションを記録するには、引数 -trace=default,cook を指定してコマンドラインから起動します。

クック チャンネルを有効にすると、[Packages (パッケージ)] というパネルが Timing Insights に追加されます。これにより、そのクック イベントに関連付けられたすべてのパッケージのリストが表示されます。各パッケージには、次のとおり、利用可能な統計情報があります。LoadTime、SaveTime、BeginCache、IsCacheCooked、Asset Class。これらのそれぞれが、グループ化およびソートできる列に表示されます。

Packages View

[Grouping (グループ化)] > [Path Breakdown - Package Name] を使用して、データの折りたたみ可能な階層ビューを生成します。アセット クラスでグループ化もできます。

コルーチン

ゲームがコルーチンを使用する場合、Timing Insights でコルーチンを表示できます。コルーチンは、1 つのスレッドで何かが実行を開始したとき、別のスレッドで処理を終了します。コルーチン専用のタイミング イベントを表示します。

スクリーンショット トレース

Timing Insights 内でスクリーンショットを有効にできます。Screenshot Tracing を有効にすると、スクリーンショットを取ることができ、Timing Insights のタイムラインに赤の垂直ラインが表示されます。スクリーンショットのサムネイルも表示されます。これにより Timing Insights で視覚的にデバッグできます。

スクリーンショット トレースを有効にするには、コマンドラインから引数 -trace=default,screenshot で起動します。

スクリーンショット トレースが有効になったら、コンソール コマンドから「trace.screenshot」を入力し、対象フレームのスクリーンショットを取得します。

アセット ロード時間

Timing Insights をコマンドラインから起動したときに追加できる新しいチャンネル Asset Load Time ができました。このチャンネルには次の 2 つの機能があります。

  1. UObject::Serialize 用の名前付き CPU タイマーを有効にする

  2. ブループリント名のトレースを切り替える

従来は、ブループリント名の追跡がデフォルトで有効になっていましたが、トレース ランタイム イベントに多くの負荷がかかっていました。今回は、ブループリント名のトレースを有効にする場合、コマンドラインからこの引数をオンにする必要があります。

アセット ロード時間の追跡をコマンドラインから有効にするには、引数 -trace=default,AssetLoadTime を使用します。

ブループリント名をオンに切り替えるときにタイマーが追加されますが、その数が多いため、デフォルトでは Trace Insights には表示されません。アセット ロード時間のトラッキングを有効にした後、-statnamedevents 引数を追加することで、ブループリント名を表示できます。

コピーおよび貼り付け

UE 5.0 ではタイミング イベントをコピーしたとき名前のみがコピーされていましたが、Ctrl+C でタイミング イベントをコピーすると、Timing Insights パネルで表示されているとおり、名前、持続時間、関連メタデータがコピーされるようになりました。

UI を開かずにコマンドを実行

Timing Insights は、UI を開かないでコマンドラインから直接起動できます。コマンドラインで直接単一のコマンドを指定することも、応答ファイルを使用して、コマンドのセットを実行することもできます。いずれの場合も、データのセットは CSV または TSV ファイルにエクスポートされます。いずれの場合も、データのセットは .csv または .tsv ファイルにエクスポートされます。

  • TimingInsights.ExportThreads:このコマンドは、GPU スレッドと CPU スレッドのリストをエクスポートします。

  • TimingInsights.ExporTimers:このコマンドは、GPU タイマーと CPU タイマーのリストをエクスポートします。

  • TimingInsights.ExportTimingEvents:このコマンドは、GPU タイミング イベントと CPU タイミング イベントのリストをエクスポートします。エクスポートされるイベントのリストは、スレッド、タイマー、時間の範囲でフィルタリングできます。

  • TimingInsights.ExportTimerStatistics:このコマンドは、GPU タイマーと CPU タイマーのリストおよびそれらの集約統計情報をエクスポートします。

これらのコマンドは自動テストを実行するときに役に立ちます。

コマンドラインから直接コマンドを実行する方法の詳細については、「Timing Insights」のドキュメントを参照してください。

トレース

コンソール コマンド

Unreal Insights の実行中に UE から使用できる既存のコンソール コマンドには、トレース ファイルを開始/停止するために使用する trace.starttrace.stop などいくつかあります。5.1 では、新たに 2 つのコンソール コマンドが追加されています。

  • Trace.SnapshotFile <filename>:現在メモリにあるトレース バッファのスナップショットをファイルに書き出します。すでにトレースを実行されている場合、アクティブなトレースは中断されず、このスナップショットのみが第 2 のトレースファイルに並行して記録されます。

  • Trace.Bookmark <name>:これにより、指定した文字列名の Bookmark イベントが発生します。ブックマークは、Timing Insights に垂直ラインとしてブックマークが記録された時刻に表示されます。以前は、API の TRACE_BOOKMARK() でのみこの機能を利用できました。

  • Trace.Screenshot <Name> <bIncludeUI>:上に述べたとおり、このコンソール コマンドを実行して垂直ラインを生成できます。オプションとして、Timing Insights でスクリーンショットに対して true/false を指定することにより UI を含めることができます。

マンドライン パラメータ

トレース自動スタート

プロジェクトの開始時に自動でトレースを開始するのか、コンソール コマンドからトレース コマンドで開始するのを待機するのかを選択できます。UnrealInsights.exe のデフォルト動作で、自動スタートはオンになっています。

自動スタートが有効である場合、Unreal Insights セッション ブラウザが実行中であることが検出されると、ランタイムは自動でローカル トレース サーバーへの接続を試行します。

トレースなしのスレッド化

ワーカー スレッドや、すべてのトレース情報をキャプチャする専用スレッドを使用して、ランタイム時にトレースを実行できます。また、通常フレームの最後にゲーム スレッドで直接トレースすることもできます。ゲーム スレッドを使用すると、ゲームのパフォーマンスに影響があります。

デフォルトでは、推奨セットアップであるワーカー スレッドを使用します。ただし、サーバーではワーカー スレッドが使用できない場合もあります。ワーカースレッドを無効にし、コマンドライン パラメータ -notracethreading を使用して、代わりにゲーム スレッドを使用できます。

Datasmith

新しい 3ds Max プラグイン

Datasmith 3ds Max プラグインが新たにゼロから作成され、3ds Max の新しいリボン ツールバーにあるすべての Datasmith 機能が統合されています。新しいプラグインではパフォーマンスが向上し、複数の新機能と機能向上を利用できます。

The Datasmith 3ds Max Ribbon

Direct Link サポート

3ds Max 用の新しい Datasmith プラグインでは Direct Link をサポートします。これで 3ds Max プロジェクトを Unreal Engine プロジェクトに接続でき、Direct Link Auto Sync 機能を使用して自動または手動で同期できます。

プラグイン互換性の改善と新規追加

3ds Max 用の新しい Datasmith プラグインでは次のようにサポートが改善されています。

  • VRay: マテリアル パラメータとプロキシ メッシュのサポートが追加

  • Corona: PBR マテリアルとプロキシ メッシュのサポート

  • Railclone: エクスポート機能向上と Railclone5 のサポート

  • Forest Pack: エクスポート機能向上と Forest Pack 7 のサポート

ベイク済みテクスチャ解像度のコントロール

ベイクされた 3ds Max テクスチャは、解像度 4096 で自動的にエクスポートされなくなりました。5.1 では、最大解像度を 64 から 4096 に制限できます。これにより複雑なマテリアルがある大規模シーンに対して、インポート/エクスポート パフォーマンスが向上しています。

XRef シーン エクスポートの切り替え

XRef シーンは、外部の 3ds Max ファイルから現在のファイルにロードされるシーンです。3ds Max プロジェクトを Datasmith でエクスポートするとき、XRef シーンを同様にエクスポートするかどうかを決定できるようになりました。XRef シーン エクスポートの切り替えは、新しいリボン ツールバーにあります。

改善されたライト エクスポート

Datasmith では以下のとおり、サポート対象ライト タイプの追加パラメータがサポートされています。

  • ArnoldLight

  • CoronaSun

  • PhotometricLight and TPhotometricLight

  • VRaySun

Texmap 変換

3ds Max 向けの新しい Datasmith プラグインは、ビットマップ、ベイク、法線、バンプ、プロシージャルの texmap を自動的に変換します。

Revit プラグインの改善

このリリースでは、Direct Link Auto Sync が Revit Datasmith Exporter に追加されました。Auto Sync が有効である場合、リンクされた Revit プロジェクトに変更を加えたときに、Unreal プロジェクトが自動で同期されます。

Datasmith 設定は Revit プロジェクト ファイルのカスタム データとして保存されるようになりました。

このリリースでは、Revit から次の情報をエクスポートすることもサポートしています。

  • ビュー: Revit プロジェクトからエクスポートするビューの種類を指定できます。このとき、現在作業しているビューの種類は関係ありません。

  • カスタムの原点: Revit の Base Point (基準点) または Survey Point (測量点) を、Unreal の挿入点として使用するカスタム原点として定義できます。

  • デカール: Datasmith は Revit のデカールを Unreal Engine のデカールとしてエクスポートします。

SketchUp プラグインの改善

このリリースでは、Sketchup 向け Datasmith プラグインの最適化に注力した結果、

Datasmith が複雑な階層をエクスポートする方法が改善されました。グループ ヘッドまたはコンポーネント ヘッドごとに 1 つのアクタをエクスポートしたり、グループやコンポーネントの各メッシュに対して 1 つのアクタをエクスポートしたりする代わりに、Datasmith はグループやコンポーネントで自動的にメッシュをマージします。この結果として Unreal Engine でシンプルな階層になり、SketchUp アウトライナーでの見た目に近くなります。

Color by Tag 機能を使用して SketchUp でオブジェクトの色を設定する場合、Datasmith でそれらの色をエクスポートできるようになりました。

画像サポートも追加されています。SketchUp 用 Datasmith プラグインでは、テクスチャがあるメッシュ アクタとして画像をエクスポートします。

Solidworks プラグインの改善

SketchUp 向け Datasmith プラグインではサポートされる Solidworks 機能が増えました。Solidworks コンフィギュレーション表示ステートを Level Variant Set のバリアントとしてエクスポートできます。ユーザー作成の指向性ライト、スポットライト、ポイントライトも位置、コーン角、輝度、色のデータとともにエクスポートできます。

Visual Dataprep 向けメタデータ処理の改善

Visual Dataprep は、Unreal Engine プロジェクトで最終的なアセットとアクタを作成する前に、シーン要素を再編成、クリーンアップ、マージ、変更できる再利用可能なインポート「レシピ」を作成できるシステムです。

UE 5.1 では、Visual Dataprep でメタデータを扱うときの使いやすさが向上しました。

具体的には、メタデータのキーと値が読み取りやすく、また選択可能になりました。これにより、それらの値を手動でコピーするのではなく、フィルタ フィールドにコピーして貼り付けることができます。

キーに対する新しい文字列マッチング オプションも追加されました。メタデータでフィルタリングするとき、contains 表現を使用して、たとえば、同様のプレフィックスやサフィックスがあるすべてのキーを処理できます。これにより、キーが同じで少し異なる名前を使用するモデルをアプリケーションからインポートするプロセスを作成するときに時間を節約できます。

ユニバーサル シーン デスクリプション (USD) ファイルのワークフロー

Unreal Engine 5.1 では複数の新機能と USD ファイルを処理するためのワークフローの機能向上が導入されています。

LiveLink の統合

Live Link を使用して、外部ソースを Unreal Engine の USD ファイルにあるコンテンツと同期できるようになりました。USD ステージ ウィンドウの新しい [Set up Live Link (Live Linkをセットアップ)] オプション を使用して、DCC アプリケーション (Autodesk Maya など) を、キャラクターがその中にある Unreal Engine の USD シーンに接続できます。さらに、DCC を使用してキャラクターを動かすことができます。Link/USD 統合はモーション キャプチャを扱うときにも便利です。USD を使用して、キャラクターがあるシーンを Unreal Engine にロードし、USD シーンにあるキャラクターをモーション キャプチャで動かします。

コントロール リグの統合

USD ステージ ウィンドウの新しい [Set up Control Rig (コントロール リグをセットアップ)] オプションにより、コントロール リグを Unreal Engine で USD ファイルのキャラクターに接続できます。コントロール リグを使用し、骨格アニメーションを作成し編集して、アニメーション データを元の USD ファイルに保存できます。コントロール リグ アセット をセットアップ、または FK コントロール リグ を生成できます。

プリミティブの編集オプション

USD ステージ ウィンドウでプリミティブを編集するための複数のオプションが追加されました。次のオプションがあります。

  • プリミティブを切り取り、コピーし、貼り付けるコマンド。

  • プリミティブをさまざま方法で複製するオプション。たとえば、合成プリミティブの平坦化複製を作成、または単一レイヤーを複製できます。

  • 分離モード。特定レイヤーを分離して作業できます。これは編集履歴をレビューまたは変更するときに便利です。分離モードで加えた変更は分離したレイヤーに適用されます。

  • USD ステージで参照を追加するとき、参照元ファイルでターゲット プリミティブを指定できます。

  • 参照を追加するのと同じ方法で、ペイロードを USD ステージに追加できます。

グルーム サポート

USD ファイルでの グルーム のサポートが追加されました。グルーム キャッシュやスタティックのグルーム ファイル (アセットなど) をインポートでき、Alembic でインポートされたグルーム アセットと同様に使用できます。USD ステージにそれらもロードできます。

このインポータは Alembic グルーム仕様に従う Alembic グルームをサポートします。つまり USD ファイルで参照された Alembic グルームをインポートできます。このインポータは Alembic グルーム仕様に従う Alembic グルームをサポートします。つまり USD ファイルで参照された Alembic グルームをインポートできます。

グルームをスケルタルメッシュやジオメトリ キャッシュにバインドするために使用できる、新しいグルーム バインディング API スキーマも追加されました。キャラクターにグルームをセットアップし、結果を USD ステージにロードし、Unreal Editor でシミュレーションとキャラクター アニメーションをまとめて再生できます。

その他のデータ形式

glTF

Khronos Group の GL Transmission Format (glTF™) は拡張可能な、オープンの標準ファイル形式で、コンパクトなファイル サイズ、高速なロード、完全なシーンの表現を目指して設計されています。Twinmotion のモデルをインポート/エクスポートするために使用され、Skechfab のツールとライブラリでの推奨交換形式です。

このリリースでは、glTF サポートを改善し、Unreal Engine と緊密に統合されています。

  • glTF インポータを 新しい Interchange フレームワーク に統合しました。 既存の glTF インポータと Datasmith glTF インポータ プラグインは、将来のリリースで除去される予定です。

  • glTF インポータでは次の機能をサポートします。

    • ライティングなしマテリアル

    • khr_texture_transform extension.

    • スケルタルメッシュ、スケルトン、アニメーション シーケンス アセットがあるリグ付きモデルをインポート。

  • glTF エクスポータは、以前は外部プラグインとして利用できましたが、Unreal Engine の一機能になりました。現在は個別に有効にする必要があります。

  • 文字エンコーディングを改善し、英語以外の言語によるアクタやアセットの名前やラベルを正しくエクスポートできるようになりました。

CADKernel

CADKernel は Unreal Engine にインポートする CAD モデルのテッセレーションに対する代替アルゴリズムです。デフォルト アルゴリズムと同じテッセレーション パラメータを使用しますが、より良好な結果が得られる場合があり、放射状の特徴があるモデルで特にその傾向が顕著です。CADKernel は、テッセレーション後にオープン エッジ数を制限する場合にもうまく動作します。

Left: CAD model tessellated with the default Unreal engine algorithm. Right: The same model tessellated with CADKernel

左:デフォルトの Unreal Engine アルゴリズムでテッセレーションした CAD モデル右:CADKernel でテッセレーションした同じモデル

CADKernel をアクティブ化するには、ds.CADTranslator.DisableCADKernelTessellation コンソール変数を False または 0 に設定します。この変数は コンソール変数エディタ から変更できます。

CADKernel をアクティブ化すると、Unreal Engine は CAD モデルをインポートする際にデフォルトでこれを使用します。CAD モデルをインポートした場合は、CADKernel を使用し Unreal Engine で再テッセレーションするために完全な再インポートを実行します。

MaterialX

MaterialX は、オープン標準であり、リッチなマテリアルや見た目を表現し、それらをプラットフォームやアプリケーション間で簡単に転送するために使用されます。UE 5.1 の新しい MaterialX インポータは、次の MaterialX ノードをサポートします。

  • Autodesk Standard Surface マテリアルのすべての入力

  • ポイント ライト、スポット ライト、ディレクショナル ライト

  • MaterialX 標準データ タイプおよびノードのサブセット

LiDAR 点群の改善

このリリースでは、LiDAR 点群アセット編集ツール を Unreal Engine 5 フレームワークに移行しました。メイン ツールバーの [Select Mode (モードを選択)] ドロップダウンから、新しい LiDAR モードにある点群編集ツールのすべてにアクセスできます。

この更新により、メッシュ編集のような他の Unreal Editor ワークフローと点群編集ワークフローが同様に操作できます。使用する点群アセットでコリジョンを選択、マージ、編集、作成でき、レベルで結果をプレビューできます。

ワークフローの改善点

点群選択ツール (たとえば、投げ縄ツール、ポリゴン選択ツール) を使用して、選択項目にポイントを追加したり選択項目からポイントを除外したりできます。点群からポイントを取り除くことに加えて、選択ポイントからスタティックメッシュを作成できます。

点の法線に対する新規オプション

点群アクタには Point Orientation 設定があり、ポイント カードを常にカメラに向けるのではなく、計算された法線に揃えることができます。法線を揃えたカードではビジュアルが美しくなり、ライティングのインタラクションも向上します。

LiDAR 点群プラグインは、法線データを含む ASCII ファイルと E57 ファイルから法線をインポートできます。

新しいポイント カラー オプション

点群アクタに対して、新しい [Color Source] > [Data with Classification Alpha] プロパティにより、ポイントの RGB カラーとカスタム アルファ値をポイントの分類に基づいて混合できます。分類に基づいて、ポイントのグループ全体を表示、非表示、またはフェードするときに便利です。

Variant Manager

このリリースでは、Variant Manager ツールは Unreal Engine 5 フレームワークに移行されました。ルックアンドフィールは UE 5.1 の他のツールと整合性があります。ユーザー インターフェースも設計フィードバックに基づいてオーバーホールされ、見た目が美しく、使いやすくなっています。

The previous variant manager in Unreal Engine 5.0

The new variant manager in Unreal Engine 5.1

上:Unreal Engine 5.0 での以前の Variant Manager下:Unreal Engine 5.1 での新しい Variant Manager

RAD ツール

Oodle Texture 2.9.7

  • すべてのプラットフォームで同一のビット出力

  • arm64 エンコーダの高速化

共有テクスチャ エンコーディング

  • すべてのプラットフォームが対象

Bink

  • 標準 SRT サブタイトル ファイルのサポート

オンライン

Online Services プラグイン

Unreal Engine 用の新しい Online Services プラグインでは、インターフェースが完全に定義され、ステータスが実験的機能からベータ機能に移行しました。このプラグインは既存の Online Subsystem プラグインと連携し、両方利用できます。

新しい Online Services プラグインでは、次の機能が利用可能です。

  • 整合性と堅牢性が向上した API

  • 強化されたセーフ コール パターン

  • 型安全性の向上

  • 簡素化したデリゲート バインディング

  • 既存の実装を簡単に拡張する機能

共通のフレームワークを共有できるため、独自のオンライン バックエンド システムと連携して使用する独自のプラグインの開発が容易になりました。Online Services プラグインのフレームワークには次の機能があります。

  • 非同期操作の結果のキャッシュ

  • 非同期操作のシーケンス処理

  • バックエンドごとのコンフィギュレーション

  • 実行コマンド ハンドラ

  • 最小限のボイラープレート

  • ログ処理

このバージョンには、次の実装が含まれます。

  • Epic Online Services (EOS) プラグイン実装 (EOS SDK を使用するため)

  • NULL Online Services プラグイン実装 (開発目的)

  • OSSAdapter Online Services プラグイン実装 (新 API を通じて既存の OnlineSubsystem を使用)

新しい Online Services プラグインには次のインターフェースが含まれています。

  • Achievements

  • Auth

  • Commerce

  • Connectivity

  • Leaderboards

  • Lobbies

  • Presence

  • Sessions

  • Social

  • Stats

  • Title File

  • User File

  • User Info

詳細については、「オンライン サービス」のドキュメントを参照してください。

Lyra

  • プレイヤーは、EpicOnline Services (EOS) オーバーレイを使用することで、マッチメイク セッションにフレンドを招待し、参加してもらうことができます。

ネットワーキングとマルチプレイヤー

Iris (実験的機能)

Iris とは、Unreal Engine の新しいレプリケーション システムの実験的実装です。Iris の目標は、大規模でよりインタラクティブなワールドで、多数のプレイヤーとともにサーバーの負荷を削減して、リッチなマルチプレイヤー エクスペリエンスを実現することです。Iris は、次のとおり、現在のレプリケーション システムに対して、レプリケーション パフォーマンスの向上を実現します。

  • コンストレイントがあるアンチパターンを除外することで、スケーラビリティの制限を解消

  • レプリケーションとゲーム スレッド データの分離を通じて、同時並行性を実現

  • 複数のオブジェクトとつながりに対してできる限り対象を共有することで、効率性を向上

Iris はオプトイン システムで、近い将来まで現在のレプリケーション システムと並存します。既存のゲーム コードは、引き続きこれまでと同様に動作します。Iris にオプトインするには、ゲーム コードで新しいエンジン API を使用する必要がありますが、既存のレプリケートされたプロパティと Remote Procedure Call (RPC) 定義は、C++ とブループリントで互換性が確保されています。

サブオブジェクトのレプリケーションの改善

Unreal Engine の Replicated Subobject には、UObject 派生クラスとそれらが含むレプリケートされたプロパティをレプリケートする方法が用意されています。コンポーネントとサブオブジェクトをレプリケートする以前のシステムは、仮想関数 AActor::ReplicateSubobjects を使用します。

新しいシステムでは、アクタが、所有している アクタ や アクタ コンポーネント のリストにサブオブジェクトを登録するメソッドを持つようになり、それらの登録済みサブオブジェクトのレプリケーションはアクタ チャンネルによって自動的に処理されるようになっています。このプロセスでは、サブオブジェクトをレプリケートするタイミングと場所をさらに細かくコントロールできます。

Registered Subobject リストはオプトイン機能です。Registered Subobject リストを有効にするには、アクタまたはアクタ コンポーネント クラスで、プロパティを bReplicateUsingRegisteredSubObjectList = true に設定します。次に AddReplicatedSubObject を、ReadyForReplication または BeginPlay で呼び出すか、新しいサブオブジェクトの作成時に呼び出します。最後に、サブオブジェクトを変更または削除するときは必ず RemoveReplicatedSubObject を呼び出します。

古いシステムはしばらくの間、新しいシステムと並存します。Registered Subobject リストの有効化と新しいシステムでの作業の詳細については、「Registered Subobject」のドキュメントを参照してください。

テンプレートとサンプル コンテンツ

シミュレーション テンプレート

Screenshot of an Unreal Engine project made with a Simulation template

Unreal Engine 5.1 では、新しい シミュレーション テンプレート カテゴリが追加されています。多様なシミュレーション テンプレートは、各種エンタプライズ シミュレーション アプリケーション向けに開始点として利用できます。具体的には、次の事前設定があります。

  • 屋外環境向けの特定の設定

  • リアルな空とライティング。

  • ジオリファレンス ツール。

詳細については、「Unreal Engine テンプレートのリファレンス」のページを参照してください。

プラットフォーム SDK のアップグレード

A grid of logos showing supported platforms in Unreal Engine 5.1

  • Windows

    • Visual Studio 2019 v16.11.5, Visual Studio 2022

    • Windows SDK 10.0.18362

    • LLVM clang 13.0.1

    • .NET 4.6.2 Targeting Pack

    • .NET 6.0

  • ビルド ファームのコンパイル対象の IDE バージョン

    • Visual Studio - Visual Studio 2019 14.29.30146 ツールチェーンおよび Windows 10 SDK (10.0.18362.0)

    • Xcode - Xcode 13

  • GDK

    • Windows SDK:10.0.19041.0

    • GDK:June 2022 Update 2

    • ファームウェア バージョン:Recovery September 2022 10.0.22621.2216

    • サポートされている IDE:Visual Studio 2019

  • Android

    • Android Studio 4.0

    • Android NDK r25b

    • Android SDK

      • 推奨要件:SDK 32

      • UE コンパイルのための最小要件:SDK 30

      • デバイス上で実行する最小ターゲット:SDK 26

      • AGDE デバッグ には、AGDE v22.2.69 以降が必要

  • ARCore

    • 1.22

  • ARKit

    • 4.0

  • Linux

    • ネイティブの Linux での開発

      • 推奨 OS:Ubuntu 22.04 または CentOS 7

      • コンパイラ: clang 13.0.1

    • クロスプラットフォーム開発

      • クロスコンパイル ツールチェーン:v20 clang-13.0.1 ベース (CentOS 7)

  • Oculus

    • 33.0

  • OpenXR

    • 1.0.22

  • Google Stadia (非推奨)

    • 1.82.0.102432

  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 14.3.0 + (任意) NEX 4.6.7

    • 最小ファームウェア バージョン:14.1.2-1.1

    • Nintendo Dev Interface 2.5.5

    • サポートされている IDE:Visual Studio 2019, 2022

  • PS4

    • Orbis SDK 9.508.001

    • システム ソフトウェア:

      • 10.008.001

    • サポートされている IDE:Visual Studio 2019, 2022

  • PS5

    • Prospero SDK 5.00.00.33

    • システム ソフトウェア:

      • 6.00.00.42

    • サポートされている IDE:Visual Studio 2019, 2022

  • macOS

    • 推奨要件

      • 最新版の macOS 13 Ventura、最新版の Xcode 14

    • 最小要件

      • macOS 12 Monterey, Xcode 13.4.1

    • マシン アーキテクチャに関する注意事項

      • ネイティブの Apple シリコンのサポートは、エディタおよびプロジェクト ビルドの両方の macOS ターゲットで利用できます。エディタの Apple シリコンのサポートは実験的機能です。

      • 一部のサードパーティ SDK およびプラグインはまだ ARM64 スライスを備えておらず、互換性の問題が発生する可能性があります。

  • iOS / tvOS / iPadOS

    • 推奨要件

      • 最新版の Xcode 14

    • 最小要件

      • Xcode 13.4.1

    • サポート対象のターゲット SDK バージョン:iOS 15 以降

    • グラフィック API:Metal 2.4 および Metal 3.0

Release Notes

Animation

New:

  • Control Rig now has additional properties exposed to Blueprints and scripting.

  • Added support for in-between Morph Targets when importing FBX files.

    • The in-betweenMorph Targets are now imported as standalone Blend Shapes with their animation curves baked accordingly to preserve the original animation.

  • You can now select things below the ground in preview scene viewports.

    • The floor shown in the preview scene within each persona editor no longer blocks selection of items below ground.

  • You can now set custom bone colors using the Bone Color property in the Editor Preference.

  • Added a new UE_ANIM_REMOVE_DEPRECATED_ANCESTOR_TRACKER definition to remove large deprecated members from FAnimationUpdateSharedContext.

  • Added a new asset information section for Animation Montages when working with blueprints.

  • Added a looping flag property to Animation Sequences and Blend Spaces. This is used to set the default loop value when creating asset player nodes.

  • Blend Masks and Blend Profiles can now be organized in different categories under the Skeleton Tree view.

  • The City Sample's AnimToTexture plugin is now available as an experimental Engine plugin.

  • Fixed a bug that caused an Animation Sequence's cache stats and debug name to not register.

  • Added the new experimental Curve Expressions plugin, that you can use to copy to Skeletal Meshes' animation curves. You can also make adjustments to the copied animation curves using simple text expressions.

  • Added a Copy Context Menu option to copy Curve names from the Timeline editor to the clipboard.

  • The Pose Driver node is now production ready.

  • Added a GetMeshDNA function to SkelMeshDNAUtils in RigLogic.

Improvement:

  • Bone rendering has been consolidated across all Animation Editor viewports.

  • Animation Sequence compression is now asynchronous during cooking.

Crash Fix:

  • Fixed a crash that could occur when playing Animation Montages when the owning Actor is destroyed while executing one of its Animation Notifies.

  • Fixed a crash that could occur by debugging while live coding.

Bug Fix:

  • Fixed a bug that could cause wrong values being set when pasting a bone transform in the Skeleton Editor.

  • Added missing implementation to UMovieScene3DConstraintTrack::RemoveAllAnimationData().

  • Fixed a bug that could cause root motion modes to not be selectable in the animation viewport.

Deprecated:

  • The USkeletalMesh pointer of the USkinnedMeshComponent has been replaced with the new USkinnedAsset base type pointer enabling Unreal Engine to utilize new types of skinned asset components.

Gameplay

New:

  • Motion Warping: Added support when using the animation warping plugin for injecting translations when there is no translation to warp in the animation.

  • Added an animation modifier within the AnimationModifierLibrary to reorient the root bone in an animation while maintaining mesh position and rotation.

  • Added an animation modifier to the AnimationModifierLibrary to copy transforms from one bone to another.

  • Added a new simplified framework within the Motion Warping plugin by removing the node's bInLocalSpace option.

    • Root motion is now always warped in mesh space.

  • The Motion Warping plugin has transitioned from the Experimental stage and is now in the Beta production phase.

  • Added support for Blend Spaces within the Pose Search plugin.

  • Added a new experimental Foot Placement locomotion node within the Pose Warping plugin.

  • You can now disable the Pose Warping plugin's Orientation Warping node when sufficient Root Motion data isn't available to calculate good warping results.

  • Montages played from Linked Animation Blueprint Graphs and Layers will now behave correctly when using Inertial Blending after enabling the debug command: bUseMainInstanceMontageEvaluationData.

  • Montages using Inertial Blends now support Blend Profiles.

  • Added experimental root bone offset property to the Animation warping plugin's Orientation Warping node, that can be used to follow Root Motion rotation more closely during forward-facing turns.

  • The Animation Warping plugin is now production ready.

  • Added a new State Machine Function Library that allows you to query the active state, as well as dynamically transition between states.

  • Added a new experimental Offset Root Bone node within the Animation Warping plugin

Improvement:

  • Animation Notify States can now check if they have reached the end or were canceled before completing, using the new UAnimNotifyLibrary NotifyStateReachedEnd function in the Event Reference data.

  • Improved the behavior of the Stride Warping node at low character movement speeds.

  • Improved the Stride Warping behavior on manual mode when stride scale is 1 and interpolation is also enabled.

  • Improved the Stride Warping behavior for 3x interpolation speed while using manual mode.

Bug Fix:

  • Fixed a bug that could cause the animation graph to avoid updating the entire graph from the game thread when only using root motion from an animation montage asset.

  • Fixed bug that could occur within the Motion Warping plugin that could cause root motion occurring outside the warp window to be stomped during the last tick.

  • Fixed a bug that could occur when using the Motion Warping plugin that would abort warping if the user jumps to a different point in the animation sequence while the warping window is active.

  • Fixed a bug that could cause erratic behavior in Montages during section loops under very specific timing and frame rate conditions.

  • Fixed a bug that could occur with Montage Notifies that would not show the assigned name on the notify tracks.

  • Fixed a bug that can cause sudden flips to existing Orientation Warping angles, when adding Root Motion data to nodes that did not contain any previously.

  • Fixed an issue where the Apply Root Motion Ability Task could restore a movement mode without also restoring the custom movement mode.

  • Fixed a bug that could cause Transition Events to not fire from Conduits.

  • Fixed a bug that could disrupt the prediction behavior of the Motion Trajectory Component when the character is turning on the spot.

Rigging

New:

  • Added an aggregate node type in Control Rig, which will concatenate multiple unit nodes of the same type to allow for a dynamic number of input pins.

  • Added Parameter At Length Percentage Control Rig node, which can be used to return the U parameter of a spline at a given length percentage.

  • New Control Rig Template nodes offer a new way to organize sets of nodes in manageable groups. After grouping a set of nodes with a Template node you can take advantage of wildcard pins which can pass an input into each of the supported nodes' respective compatible input.

  • Setup Events are now called as Construction Event.

  • You can use new Construction events to spawn Bones, Nulls, Controls and more.

  • You can now create and invoke your own Control Rig Events custom triggered logic.

    • You can also invoke Control Rig Events using Python commands or within Unreal Engine Blueprints.

  • Control Rig nodes can now be updated to their latest version with the Upgrade Node(s) context menu option in the graph.

  • Added a new type of execution callback called the Dispatch Factory.

    • A Dispatch Factory can rely on lambdas to generate a callback based on the types passed to it.

  • The Control Rig hierarchy now supports Metadata storage directly within the elements of the hierarchy. The metadata is then readable and writable in the graph using the metadata nodes, Blueprints, or Python using the hierarchy's API.

  • You can now use Profiles when working within the IK Retargeter to store, edit, and apply retarget settings at runtime using Blueprints.

  • You can now invoke events from the top toolbar and context menu in Control Rig.

  • You can now manage Control Rig events in Action Palette.

  • You can now enable Debug Drawing during Control Rig interaction.

  • You can now use the new IK Retargeter hierarchy view to quickly manage and edit bone transforms with a clear visualization of the full skeleton chain.

  • Using the new Control Rig Overlay mode, controls can now be drawn on top of a Skeletal Mesh in the level viewport.

  • Control Rig now supports creating and managing Aim Bones and Two Bone IKs using Python.

  • The IK Retargeter's source and target IK Rigs and meshes are now fully swappable with no need to create separate retarget assets for different source IK rigs.

  • You can use new Control Rig Proxy Controls to interact with animatable, keyable controls, through helper controls. Proxy Controls can not be keyed and are invisible to Sequencer, but offer you the flexibility of using the Interaction even in Control Rig.

  • You can now set a Control Rig component's class in Blueprints.

  • You can now create Control Rig and Rig VM workflows using Python. These workflows can then be registered to operate a specific node or a set of nodes. You can see example workflows in the Control Rig plugin.

  • You can now convert any data type to and from a string using the ToString and FromString nodes.

  • The Control Rig's Spherical Pose Reader node has been optimizatized and now operates with a 5-15% increase in performance.

  • You can now store Metadata within the Control Rig Hierarchy using the new Dispatch Factory system. Metadata can be read and written to and from elements in the Control Rig's hierarchy.

    • By storing Metadata in the Control Rig Hierarchy you can use that data during construction or with blueprints to drive the Control Rig during runtime.

  • You can now index an array in Rig VM using negative values.

    • When indexing with negative values, -1 represents the last element, -2 represents the second to last element, ext.

  • You can now get and set a control shape transform when working with Control Rigs.

  • You can now use new Stride Warping Settings when working with the IK Retargeter. You can use the Stride Warping properties to adjust a character's stride length across retargeted animations.

  • You can now enable a debug visualization of the Rigid Body Animation Blueprint node, that will display the node's physics bodies and constraints.

    • The RigidBody node's physics bodies will be drawn in the Animation Blueprint Editor's viewport when the node is selected. You can enable a visualization of the node's constraints using settings in the node's Details panel.

  • You can now toggle the visualization of individual physics bodies in the Physics Asset Editor's hierarchy tree panel.

    • To toggle the visualization, first enable the option in the Skeleton Tree's Settings menu.

    • After enabling the visualization toggle, you can enable or disable the visualization for each physics body using its associated checkbox.

  • You can now view a synchronized debug visualization of a character's physics bodies and constraints between the Physics Asset Editor and the Animation Blueprint Editor.

    • This unified view also means any debug visualization options are universally set across both editor environments.

  • You can now upgrade Rig VM from struct to dispatch.

  • You can now assign per-element tags within the Control Rig hierarchy.

    • A useful application of tags in the Control Rig hierarchy could be to delineate if an element is on the Left or Right side of a character. These tags can then be used to quickly search for elements later during the Control Rig's execution.

  • You can now use the new Set Default Parent Control Rig node to change an element's parent or identify it as the new default node in a chain.

  • Rig VM now uses a new low-level mechanism for a node's upgrade path, enabling the API to allow nodes to describe their own upgrade path.

    • You can implement FRigVMStruct::GetUpgradeInfo to enable RIG VM nodes to be upgraded automatically.

  • You can now use new Boolean Toggle nodes with Control Rigs.

  • Control Rig now provides you with feedback when changing initial transforms during a forward solve.

    • If you then change the initial transform of a hierarchy element during the forward solve a note will now be issued on the node in question.

  • The first execution index of each node can now be displayed on nodes using the Show Node Instruction Index on any node in the Control Rig graph editor.

    • By enabling the Show Node Instruction Index, it can assist you when debugging a Control Rig graph, by revealing which nodes are being executed by the graph.

  • Added introspection on function arguments to Rig VM.

    • You can now use the FRigVMRegistry's access to FRigVMFunction to list the function arguments for each registered callback function or dispatch.

  • When selecting objects in the Control Rig hierarchy, the hierarchy relationship of the elements is retained if copied or moved.

  • IK Rig and Retargeter assets now have custom icons.

  • You can now use Python getters for shape transform in Control Rig.

  • You can use new Root Settings in the IK Retargeter to control the motion of the retargeted root bone, with the added ability to adjustments to the retargeted root bone independently of the character's feet.

  • You can manually change the pin types on the new wildcard pins in Control Rig.

  • The IK Retargeter now features the new Speed Planting property, that you can useto create retargeted animations without foot sliding, regardless of the size difference between the source and target character.

  • You can now enable debugging watches within Control Rig functions.

  • You can now import poses from pose assets or animation sequences to the IK Retargeter.

    • Additionally you can export retargeted poses as pose assets.

  • Control Rig now supports preferred Euler angles.

    • Euler angles set on Controls or Bones are now preferred over potential quaternion representations during the solve.

  • Using the Advanced Tab on the Control Rig Animation Blueprint Node you can now choose which Events to run during execution.

  • You can now set up multiple connections to the same source variable node in Rig VM.

  • Using the IK Retargeter you can now control any Pole Vector twisting on any retarget chain without needing to set up an IK.

  • Unreal Engine will now issue warnings for unconnected execute pins in Control Rig.

  • The Retarget Pose From Mesh animation node now also copies curve values from the source mesh component.

  • You can now mirror IK Rig retargeted chains.

  • Added the ability to see when an IK Rig retargeted chain's settings have been modified.

  • Deformer Graph node Pins can now specify data sizing that is a multiple of a given execution context. You can also use expressions to fully customize the pin's data sizing.

  • Deformer Graphs can now receive input, bind to, and receive data from, multiple Actor components as inputs.

  • Deformer Graphs now support the execution of multiple graphs. Each Deformer Graph can contain and execute a Setup Graph to perform initialization functions, an Update Graph to perform functions every rendered frame, and Trigger Graphs that can be queued to perform specialized functions and can be called using Blueprints.

  • The Skeletal Modeling tool has been relocated to the new Skeletal Modeling Tools plugin.

  • Exposed the ActorToTrack and ControlRigClass properties to Cinematics.

Improvement:

  • Variable nodes in Control Rig can now reference an input parameter inside a function.

  • Rig element names now support spaces in Control Rig.

  • Improved the performance of Control Rig's Hermite spline.

  • Updated the MLDeformer readme file to clarify install instructions for other non-windows platforms.

  • Control Rig's TypeIndex now operates in typedef for easier debugging.

  • When using the IK Retargeter you can now edit the retargeted pose on both the source and the target skeleton.

  • The IK Retagreter now provides precise numerical input for bone editing and a reworked interface for pose management.

  • Convert debug breakpoints from TSharedPtr to guid based struct.

  • The Control Rig outliner for FKControlRig has been improved.

  • Control Rig and RigVM asset loading performance has been Improved.

  • The Control Rig's performance for cycle checking transforms has been improved.

  • The Print String node can be used to print any data type value to the screen at runtime, for debugging purposes.

  • The Rig VM's Refactor template data-type system now operates using Integers rather than string comparisons.

  • Rig VM has received an API performance increase due to a more efficient registry lookup mechanism.

  • When editing retargeted poses, you can no longer make direct horizontal translations on the retargeted skeleton's root bone.

    • You can instead use the new Horizontal Scaling property to achieve more reliable results.

  • The performance of Control Rig's Constraint nodes has been improved.

  • Rig VM nodes that used to be represented as many different instances and supporting different data types can now be represented as a FRigVMDispatchFactory.

    • See the Print node's improvements for an example of this implementation.

  • Increased the default number of Control Rig nodes that can run concurrently from 64 to 256.

  • The Control Rig Editor hotkey shortcut, used to perform a duplication, has been changed, and is now Ctrl+D.

  • The default Control Rig naming convention has been changed to TemplateName.

    • Additionally, the PrototypeName metadata tag used for FRigVMStruct specializations has been renamed to TemplateName to match the API feature.

  • The visibility of Proxy Controls affects the visibility of other proxies sharing the same driven controls.

  • The Retarget Pose from Mesh node now outputs the character's reference pose when no source component is found.

  • IK Retargeter now auto-populates the Skeletal Mesh property when applying an IK Rig.

Bug Fix:

  • The Category field of Control Rig functions can now be cleared after it is given a value.

  • Fixed Control Rig Blueprint compilations causing the right-click context menu to get slower over time.

  • Fixed the Control Rig AnimGraph Node not being able to accept array pin connections.

  • Fixed Aim nodes causing flipping when the primary and the secondary targets are at a certain angle.

  • Control Rig's template collision message has been changed to a display rather than as a warning.

    • If two collision templates are defined with the same arguments, the second collision will fail during registration, and issue a warning to the log.

  • Fixed a bug that could cause IK Rig retargeted chain to unexpectedly rest to default values.

  • Fixed a bug that could cause bone and name filters within the IK Rig and IK Retargeter hierarchy panels to not function properly.

  • Fixed a bug that could cause the IK Retargeter viewport to not properly frame selections when pressing "F" key.

  • Fixed a bug that could cause vectors in a Control Rig to not export correctly when used on Animation Blueprints.

  • Fixed a bug that could cause a delay in the seamless editing of IK Rig and Retarget assets.

    • Changes to the IK Rig are now immediately reflected in any open Retarget asset.

  • Fixed bug that could cause an IK Rig retarget chain name to add an unwanted suffix when trying to rename the asset.

  • Fixed bug that could occur in the IK Retargeter when editing the translation of a target skeleton's root bone, that would push the character too far if the character was scaled up.

  • Fixed a bug that could cause the IK Retargeter to not properly register Vicon skeletons and other skeletons where the root bone is the pelvis.

  • Fixed a bug that could prevent the renaming of a single item with a case change.

    • It's important to note that both FString and FName operator are case insensitive resulting in misunderstanding when renaming items with altered cases.

  • Fixed a bug that could cause IK Retargeter chains using Globally Scaled translation mode to incorrectly apply scaled root motion when retargeting root motion between characters of different sizes.

  • Fixed a bug that could occur with exported retargeted animation sequences that would not update the Retarget Source Asset without manually updating the asset using the context menu.

  • Fixed a bug that could cause a case-change when renaming goals in an IK Rig.

  • Fixed a bug that could cause curves contained within a Control Rig to not retain the validity flag, and target curves to be declared as invalid if it writes a zero-value.

  • Fixed a bug that could cause Control Rig Display actors to behave unstable.

  • Fixed a crash that could occur when working with spawnables in a sequencer project that contains a Control Rig.

Deprecated:

  • Deprecated bezier nodes in Control Rig.

  • Deprecated Static Mesh Control node in Control Rig. Instead, you should use the Rig Hierarchy panel to create new controls manually or use the new Spawn nodes.

  • Deprecated Transform Constraint node in Control Rig. Instead, you should use the new Constraint nodes.

  • Deprecated the forced tick order dependency between Control Rig component and its mapped Skeletal Mesh components. Instead, you should use tick prerequisite related Blueprint APIs to ensure the mapped Skeletal Mesh components tick after the Control Rig Component.

  • The Deformer Graph Compute Kernel's Parameter array has been deprecated, and its functionality has been implemented into the Input bindings.

Runtime

New:

  • Added the new bUpdateMeshWhenKinematic parameter to Skeletal Mesh Components, that updates Skeletal Meshes using physics bodies when they are set to kinematic simulation, rather than only when set to dynamic or simulated.

  • Added a set of preload dependencies on sparse class data and its archetype for blueprint CDOs.

  • Added track filtering to the Animation Sequence timeline.

  • Added the ability to blend regular animation sequences in mesh space as an option in the Blend Space properties, under Sample Smoothing.

  • Improved the Skeleton Tree children default ordering behavior.

    • The new behavior now lists sockets, preview meshes, and virtual bones ahead of a bone's children.

  • A Skinned Mesh Component's Predicted Level of Detail Level is now accessible from Blueprints.

  • The right-click context menu for Animation assets now has an option to Replace Skeleton, that you can use when a Skeleton asset has become orphaned.

  • The Compatible Skeletons feature is now accessible from the Skeleton Editor's Retarget Sources tool.

  • Added the ability to enable Pose Watching with Aim Offsets and Blend Masks.

  • Skeletal Meshes with a configured Leader Pose Component now will not tick the Animation Pose by default.

    • This default can be changed when calling SetLeaderPoseComponent with the new FollowerShouldTickPose parameter.

  • Added a new orbit camera mode to the Animation Editors camera widget.

    • Additionally you can now set a 'Lock Camera Rotation' and 'Pause On Orbit' options in the Editor Preferences.

  • When creating a new asset in the Content Browser, Level Sequence, Template Sequence, and Camera Animation Sequence asset types are now accessible in a new Cinematics top-level asset category.

  • The Pose Watch icon, that appears on animation blueprint nodes in the blueprint graph, that have been pose watch enabled, has been updated.

  • You can now create event-based transitions within State Machines.

  • The Rewind Debugger, packaged in the Animation Insights plugin, now has Pose Watch support.

  • You can now assign a Skeleton to an Animation Blueprint using the new context menu option Assign Skeleton in the Content Browser.

  • Added the option to strip Additive Base-Poses during cooking to save memory, This function is disabled by default and can be enabled using the console command a.StripAdditiveRefPose.

  • Relocated the Pose Asset editor's Update Source button below the asset field, as it was often hidden, depending on the width of the details panel.

  • Fixed a bug that could cause Notify states to re-trigger erratically when a montage is re-played.

  • Added a new tooltip for the Rewind Debugger curve tracks to preview curve value at cursor position.

  • Added a new TraceFiltering trace channel.

    • Note, the TraceFiltering trance channel will not be enabled by default on builds with the Trace Source Filtering plugin installed.

  • You can now save animation curves from the animation timeline editor in the clipboard.

  • Added new keyboard shortcuts for Rewind Debugger playback controls.

  • Added a new Project Settings section for Rewind Debugger.

  • Double-clicking a Linked Anim Layer node, now also attaches the newly opened Animation Blueprint editor to the corresponding AnimInstance for seamless debugging.

  • Added new Teleport flags to the Rewind Debugger that will return a skeletal mesh component to its original location when resuming the project.

Improvement:

  • Add support for LWC promotion when copying TMap properties via their property access, this change fixes issues experienced when supplying curve values via a node pin on Modify Bone animation blueprint nodes.

  • Improved animation blueprint re-instancing by removing the special case instance in the Blueprint re-instancing pipeline for animation blueprints. This allows linked animation graphs to persist across live-recompilations.

    • The new compiling behavior is opt-out using a console variable, in case your project relies on the old compiling behavior.

  • Improved Blueprint variable permissions filtering.

  • Added a critical section to the Property Access Library to prevent race conditions.

  • The HideBoneByName command now does not stop BoneAnim when TickOption is AlwaysTickPoseAndRefreshBones.

  • ShouldTriggerAnimNotifyState is now public.

  • Template Animation Blueprints can now be used with Skeletal Meshes as a standalone asset.

  • The Animation Budget Allocator can now be used in Blueprint-only projects.

  • Refined the animation asset's Create Asset submenu in the Content Browser, for increased organization and user efficiency.

  • Added expanded filtering options within the Animation Blueprint interfaces.

  • Added the adoption to prevent physics asset creation on import, this functionality is enabled by default.

  • The process of copying the final output pose for animation playback has been optimized by removing any redundant copies of the reference pose.

    • If incorrect pose results persist, you can traverse the bone index array in increasing order and fill in any gaps with the reference pose.

  • Enabled drag and drop functionality to support dragging pure functions from the MyBlueprint panel to AnimGraphs in Animation Blueprints.

    • Blocked all drag and drop functionality of dragging impure functions into AnimGraphs to prevent incompatibility errors.

    • Additionally blocked drag and drop functionality for all functions into State Machines to prevent incompatibility errors.

  • Replaced the message log readout, Compressing Animations with Preparing Animations.

  • Replaced the Animation Blueprint RigidBody node's MasterAlpha property with the new WorldAlpha property.

  • The Morph Target implementation workflow has been significantly optimized. The improvement can be most notably felt when setting up a Skeletal Mesh with many Morph Targets, where there are multiple active simultaneously.

Crash Fix:

  • Fixed a crash that could occur while deleting a blendspace node.

  • Fixed a crash that could occur by canceling an in progress animation sequence export.

  • Fixed a crash that could occur in EDL (Edit Decision Lists) builds caused by accessing sparse class data in Link() before it is serialized.

  • Fixed a crash that could occur when re-instancing UAnimInstance.

  • Fixed a crash that could occur when customizing an Animation Blueprint node that is no longer associated with a valid Blueprint.

  • Fixed a crash that could occur when compiling an animation blueprint that contains an empty state machine.

  • Fixed a crash that could occur when compiling linked Animation Blueprint graphs.

  • Fixed a crash that could occur while working in Asset Editor Mode Manager, by closing Unreal Editor with an open Animation Blueprint editor on screen.

  • Fixed a crash that could occur when opening Animation Sequence in the editor, when the Sequence relies on a compatible skeleton.

  • Fixed a crash that could occur while packaging a project containing a character using a remapped skeleton.

  • Fixed a crash that could occur when using the Rewind Debugger to trace object properties and the object contained a property of type Map.

  • Fixed crash that could occur when loading a Layered blend per bone node that has empty blend mask entries.

  • Fixed a crash that could occur by re-instancing clobbering the size of 1EditFixedSize1 arrays in Animation Blueprint nodes.

  • Fixed crash that could occur when trying to re-instance post-process Animation Blueprint instances on components with no mesh.

Bug Fix:

  • Fixed an issue that could cause property access nodes to report an erroneous error when using split pins in functions.

  • Fixed a bug that failed to allow you to apply permissions to Physics Assets and Control Rigs in the Skeletal Mesh context menu.

  • Fixed a bug that prevented users from enabling smoothing for BlendSpaces.

  • Fixed a bug that could occur while compiling an animation blueprint that contains a Control Rig node that caused a memory stomp.

  • Fixed a bug that could cause users to be unable to set defaults on interface pins.

  • Fixed a bug that caused a blueprint function's thread safe property to not update after a user performed undo and subsequent redo commands.

  • Fixed a bug that could occur causing asset overrides to not work correctly for blendspace and sequence playback nodes that use identical defaults.

  • Fixed a bug that caused the display of the animation compression progress to not occur.

  • Fixed a bug that caused leaking linked animation instances when reinitializing animation.

  • Fixed an issue that could cause LOD issues when baking an animation in Sequencer, including stretched and deformed geometry.

  • Fixed an issue that could cause compiling irregularities with child animation Blueprints.

  • Fixed a bug that could prevent editing of input parameters on input pose nodes in the main animation blueprint graph.

  • Fixed a bug that could cause nested structs that are bound to animation node pins to not display their child values.

  • Fixed a bug that could cause non-editor-ticking skeletal meshes to produce unexpected animation LOD results after compiling.

  • Fixed a crash that could occur in cooked builds where references to editor-only properties were left in the animation blueprint bytecode.

  • Fixed an issue that could occur to a characters reference pose when linking in a new linked anim graph and compiling.

  • Fixed a bug that could cause animation compression settings to preload before any load of game content in editor builds.

    • Additionally Fixes have been made to prevent warnings about calling LoadObject in PostLoad of animation sequences.

  • Fixed a crash that could occur from Layered Animation that are linked from initialization and added runtime warnings for situations when this could cause issues.

  • Fixed a bug that could cause erroneous warnings to occur regarding child animation blueprints.

  • Fixed a bug that could cause a display of animation layer interfaces on content browser tiles.

  • Fixed a bug that could cause renaming issues with linked animation layers where some layer nodes would not correctly pick up the rename.

  • Fixed a bug that could cause a duplication of animation blueprints with custom property bindings producing internal compiler errors.

  • Fixed a bug that prevented ticking of animation instances during reinstancing.

  • Fixed a bug that could cause per-bone sample smoothing to not affect the correct bones.

  • Fixed a bug that could occur when adding or removing an animation layer graph's input pose, the instance will now refresh instances without requiring a manual refresh.

  • Fixed a bug that could occur with the animation blueprint interface falsely displaying in the asset creation menu.

  • Fixed a bug that could produce incorrect collisions when using the URO / budget allocator interpolation combined with the SkipKinematicUpdateWhenInterpolating flag.

  • Fixed a bug that could cause the Layered blend per bone node's Blend Masks to fall out of sync with any present Blend Poses.

  • Fixed a bug that could cause Animation Blueprints that contain Pose Handlers to behave improperly by expanding the asset override tree.

  • Fixed a bug that could cause the blend profiles submenu to not appear on a subsequent opening of a skeleton asset.

  • Fixed a bug that could occur when using mesh-space blending in Blend Spaces, in particular additive or offset Blend Spaces.

  • Fixed a bug that could cause animation node functions to be bound in Layered Animation interfaces.

  • Fixed a crash that could occur when reverting an added bone socket or virtual bone to a Skeleton asset.

  • Fixed a bug that could cause deleted Skeleton assets to still be listed in the Compatible Skeletons list of other Skeletons.

  • Fixed a bug that could cause an Undo/Redo command to not function when performed on a BlendSpaces' "BlendSpaceDetails Axis" properties.

  • Fixed a bug that could cause a tracepoint break from triggering when frame-stepping in the editor with an active Animation Blueprint preview.

  • Fixed a bug that could cause erratic behaviors when attempting to create comments in any Animation Blueprint graph.

  • Fixed a bug that could cause irregular behavior with the Blend Profile slider when making minor adjustments.

  • Fixed a bug that could cause the Pose pin attribute connections to not display properly when routing through a reroute node in Animation Blueprints.

  • Fixed a bug that could occur when copy-pasting nodes dependent upon a source State Machine state to carry over their existing dependencies.

  • Fixed a bug that could cause tags to not display on State Machine nodes.

  • Fixed a bug that could open the 'Create Animation Blueprint' window off-screen when using Windows scale window.

  • Fixed a bug that could cause the Retarget Pose from Mesh node to display an error when compiling, stating the exposed IK Retargeter Asset input binding has not been defined when an asset is assigned using the node properties or graph interface.

  • Fixed a bug that could cause incorrect asset menu actions to appear for Animation Blueprints.

  • Fixed a bug that could cause pin type colors to only appear white in state machines.

  • Fixed a bug that could cause blend profile entries to persist after their parented bones have been removed from a skeleton.

  • Fixed a bug that could cause blend profile names to be reset if you clicked off of the field, rather than committing the name using Enter.

  • Fixed a bug that caused the AnimationStreaming library to use incorrect Low-Level Memory Tracker tags, designated for audio tracking.

  • Fixed a bug that could cause incorrect behavior in Spline IK node.

  • Fixed a bug that could cause the Sequence Player node's start position description to not match its functionality.

  • Fixed a visual bug that could cause Animation State Machine UX to display trailing dots at each option.

    • Additionally, the Add New State Machine option has been renamed to State Machine.

  • Fixed a bug that could cause errors with the auto-wire functionality for non-pose pins on nodes in Animation Blueprints.

  • Fixed a bug that could cause a Skeleton's defined preview mesh to be reset if it comes from a compatible skeleton.

  • Fixed a bug that could cause the Animation Notify Panel to not display the notify selection correctly when working with custom window display scaling.

  • Fixed a bug that could cause Sync Groups to not work correctly during zero-duration/inertial blends.

  • Fixed a crash that could occur if an Animation Sequence is deleted while in use in a Blend Space preview editor.

  • Fixed crash that could occur when Pose Watch has been enabled on a Skeletal Mesh Component.

  • Fixed a bug that could cause the Inspector Panel to not update a node's properties if not explicitly selected.

  • Fixed a bug that could cause a mesh's details text overlay to block mouse selections in the Animation Editors.

  • Fixed crash that could occur when changing an Composite Animation segment's start time, end time, or play rate.

  • Fixed a bug that could cause the Animation Blueprint's Random Sequence Player node to not transition out when an automatic transition rule is active.

  • The FAnimNotifyEvent::IsBlueprintNotify() now supports metadata filtering using the AnimNotifyList.

  • Fixed a crash that could occur after duplicating a State Machine in the MyBlueprint panel, within the Animation Blueprint editor.

  • Fixed a bug that could cause issues when remapping a character's skeleton including incorrectly adding or removing virtual bones.

  • Fixed a bug that could cause Blend Space Evaluators to not generate Animation Notifies during playback.

  • Fixed a bug that could cause proportionally-linked Animation Notifies to not move when the length of the Animation Sequence is edited.

  • Fixed a bug that could cause incorrect clipping behavior of Animation Notifies when the length of an Animation Sequence is edited.

  • Fixed a bug that could cause sync groups to not function properly when using a Transition Leader group across non-zero-length transitions.

  • Fixed a bug that could cause a Skeleton's associated assets to not load properly.

  • Fixed a bug that could cause Sequence Evaluator nodes to not be displayed in the Rewind Debugger's Blend Weights view.

  • Fixed a bug that could cause weapons and other attached objects to not stay attached to the character when scrubbing in Rewind Debugger.

  • Fixed a bug that could occur in Rewind Debugger and Animation insight where, Inertialization node properties were not shown under the correct node in the Anim Graph Debug view.

  • Fixed a bug that could cause the Make Dynamic Additive node to incorrectly respect the ExpectsAdditive flag.

  • Fixed a bug that could cause bone transforms stored on the clipboard to not correctly paste.

  • Fixed a bug that could cause the UI in the animation timeline editor from adding float and metadata curves.

  • Fixed a bug that could cause single frame discrepancy between the information shown by the Rewind Debugger and the previewed Skeletal Mesh on the editor viewport.

  • Fixed a bug that could cause some untagged memory allocations in GameplayInsights and SourceFiltering to include a proper LLM tag.

  • Fixed a bug that could cause a camera Feild of View (FOV) to not replay correctly when scrubbing in Rewind Debugger.

Deprecated:

  • Deprecated the unused bRaiseMaxErrorToExisting with the UAnimationSettings.

  • Deprecated all master and slave terminology, to indicate dependent relationships in the codebase, the new terminology is now Leader and Follower respectively.

Sequencer

New:

  • Added blueprint functions to get and set Control Rig parameter section masks.

  • Animation Sequence sections now contain the Swap Root Bone property, where you can choose to apply root motion animation to the Actor or Component in Sequencer.

  • You can now include or exclude Bones or Curves from being recorded in Take Recorder by using Include Animation Names and Exclude Animation Names.

  • Added several Blueprint functions to LevelSequenceEditorSubsystem:

    • ConvertToPossessable

    • ConvertToSpawnable

    • Copy/Paste Tracks

    • Copy/Paste Sections

    • CopyPaste Bindings

    • Copy/Paste Folders

    • AddActors

    • CreateCamera

  • Added Start at Current Timecode to Take Recorder. If enabled, this makes Take Recorder start recording at the current sequence time as opposed to restarting at the playback start time.

  • Added Swap Buffered Curves which stores the current curve to the buffer and restores the buffer to the current curve. The Store/Swap/Apply options can be accessed when right-clicking on keys or curves in the Curve Editor.

  • Added a new toggle to show or hide Buffered curves in the Curve Editor if the curve is selected.

  • You can now specify a specific bone in a skeletal mesh to record timecodes onto using Animation Attributes. If the bone name doesn't exist, it will fall back to the root.

  • Added functions for evaluating the root bone timecode and subframe attributes in Editor Utility Widget Blueprints.

  • Curves will now automatically frame when pasted in the Curve Editor if Auto Frame is enabled from the Curve Options menu.

  • FMovieSceneGeometryCacheParams is now exposed as a BlueprintType.

  • Mass Scale can now be animated in Sequencer.

  • Added a recording speed field in Take Recorder, where you can set the Time Dilation of the engine when recording.

  • Added SetMaterialIndex and GetMaterialIndex Blueprint Functions for PrimitiveMaterialTrack and ComponentMaterialTrack.

  • Added new commands that can be bound to keyboard shortcuts for Control Rig Controls filter, Control Rig Selected Controls filter and Reset filters.

  • Subsequence and Shot Tracks can now be filtered in Sequencer.

  • Added SetDefaultParameters Blueprint function for Take Recorder.

  • Timecode Subframe values will now display on Animation Sequence sections in Sequencer as a suffix when present in animations.

  • Added an option to Snap Time to Selection in the Curve Editor.

  • Added a tooltip to the Object Binding Track in Sequencer to show the object class that it is bound to.

  • Added the ability to toggle jobs in Movie Render Queue.

  • Added Sequencer GetByteTrackEnum and SetByteTrackEnum Blueprint Functions.

  • Added new marker hotkeys to Curve Editor:

    • Step to Next Mark: Ctrl + Shift + Period (.)

    • Step to Previous Mark: Ctrl + Shift + Comma (,)

    • Create / Delete Mark at current time: M

  • Added an option to TakeRecorderActorSource to show or hide the progress dialog.

  • Added functionality into TakeRecorderSourceHelpers to add or remove Actor sources.

  • Enhanced the Frames Per Second tooltip with the names of the Level Sequences that are not matching when there is a frame rate mismatch between Subsequences and their parent.

  • Added support for the new property setter functions, for example, UPROPERTY(Setter = MyPropertySetter). When evaluating a property keyframe, Sequencer will call this function if it exists.

  • Added an option to show or hide the status bar in Sequencer's View Options menu.

  • Added an option in the View Options menu to automatically expand nodes in the Sequencer Outliner upon the child being selected.

  • Added an option to gather child bindings on FBX export from Sequencer when using Python.

  • You can now render multiple cameras in a scene at the same time. When the experimental feature is enabled, the main camera used for the sequence, in addition to all other camera components rendered in the scene, will be rendered simultaneously as additional passes.

  • Added a new experimental Cinematic Prestreaming plugin that you can use to record certain types of asynchronous streaming requests, such as Nanite and Virtual Textures. You can then playback these streaming requests in a Level Sequence after the initial scene render, but in advance of when the scene is visible to the player.

    • The experimental Cinematic Prestreaming plugin is designed to improve cinematic quality offline rendered cinematics.

    • Offline rendered cinematics are able to avoid Texture resolutions from being visible in the final frames, but requires rendering two passes. The first pass to generate the request list and the second to use the generated data.

  • Added a new experimental flushing mechanism to the sequencer texture streaming system to remove any blurry textures that would be visible when using texture streaming.

    • Using texture streaming significantly reduces VRAM usage when rendering large scenes. This will automatically be enabled if you use the Game Overrides setting to set Texture Streaming to Don't Override. This feature can be disabled by setting bFlushStreamingManagers to false.

  • Added a new lookup table to channel proxies for finding channels by name.

  • Added new Sequencer commands to clear selections in Sequencer and Curve Editor using the Escape key.

  • Added a new Lazy-create for the camera's animation sub-system linker. This simplifies debugging by creating less linkers in simple test levels.

  • When rendering a shot, you can now specify the render to only include the shot in the context of the root sequence.

  • You can now specify Data Layers instead of Editor Layers in the Stencil Layer feature.

  • Sequencer Channels can now be overridden with other types of channels.

    • For instance, you can now change the Rotation.X channel of a transform section, which is normally a keyframed curve channel, to make use of a perlin noise generator channel.

  • Added more system information categories to EXR metadata such as total memory available, total memory used by all processes, cpu vendor/name, and more.

    • It is important to note, not all metadata is supported on all hardware.

  • Added a simplified API for creating renders using Movie Render Queue in game at runtime.

  • Added a new role to sequencer's Entity Component System (ECS) linkers to make it easier to set debug breakpoints in linker code.

  • Added more descriptive statistics for each property type, instead of using Apply Properties for all property types.

  • Added finer control over which systems are included or and which are excluded in a given linker.

  • With the Debug Options property, you can now automatically capture an Unreal Insights trace for the duration of the render.

    • This makes it easy for artists to capture a trace file to send to programmers for further analysis when they see unexpectedly slow performance.

  • The example Python Runtime executor has been updated with a corrected command line argument, and printed warnings about how the script is meant to function as an example and will need editing to be usable in a project.

  • Added a root sequence's name to sequence instance classes for easier debugging.

  • Added a menu extender to sequencer, and to sequencer context menus, so that multiple channels can extend their menus.

  • You can now copy and paste related controls between multiple Control Rigs in the Curve Editor.

  • You can now toggle the IsEnabled state of sequencer properties using Python scripting.

  • The version token can now come after shot_name in the format list and will be treated as a local version of the per-shot folder, instead of a global version, which is shared by all shots.

  • The Exposed UMovieSceneSection::GetAutoSizeRange() property is now exposed to scripting using the UMovieSceneSectionExtensions.

    • For tracks that support auto-sizing, such as animation and audio, you can now query if the auto-size data has a start and end frame, as well as if it receives the data. This simplifies adding assets using Python as you can use a unified function, for all tracks that support GetAutoSizeRange, regardless of underlying asset type. This addition simplifies the need to use a unique way of determining how long an asset is for each type.

  • Added a system to check for valid players in camera cut tracks to fix edge-case crashes when saving a level sequence.

  • You can now add Sequences to Sub-Sequences with the InsertSequence command, similar to the InsertShot command for adding Cinematic Shot tracks.

  • You can now save the UI width percentage between the Sequencer Timeline and the Outliner in Sequencer settings.

  • You can now drag-and-drop Data Layer assets from the Data Layer window or the Content Browser into existing Data Layer sections.

  • Added the new console variable Sequencer.DuplicateLinkedAnimSequence, that you can use to toggle an animation sequence's duplication behavior when the level sequence is duplicated.

  • Added new Tween Tool modes:

    • Push / Pull

    • Blend to Neighbor

  • Added Linked Anim Sequence functions to Blueprints and Python:

    • Create Linked Anim Sequence

    • Get Linked Anim Sequences

    • Get Source Level Sequence

  • Sequencer playback hotkeys now will always function in Animation Mode regardless of panel focus.

  • Game View will now hide Control Rig Controls in that viewport.

  • Added an editor preference to enable drag selection on left mouse click instead of moving the camera: Left Mouse Drag Does Marquee.

  • Created a new Project Setting category for Cinematic Camera where you can set defaults for Lens, Filmback, and Aspect Ratio Crop.

  • Indirect manipulation using Ctrl now works with Control Rig objects.

  • The Orbit camera around selection editor preference now correctly works for Control Rig Controls.

  • Marked up LevelSequenceEditorSubsystem with _API macro to allow for usage outside of the module.

  • Added an option to disable reacting to playback replication changes on the sequence player.

  • Added a native interface for controlling whether the effects of a UMovieSceneSequencePlayer can be observed.

  • Added IgnoreFitlersWhenCollapsed setting so if a section is collapsed and there is a filter, it will only show filtered key areas when that flag is false. Defaults to true to keep existing behavior.

  • Changed template sequence actors to use asynchronous updates.

  • Added a scripting method for deleting root folders from a sequence.

  • Exposed LinkAnimSequence function to scripting.

  • ALevelSequenceActor::LevelSequenceAsset is now a replicated property and initializes the player if it changes.

  • Exposed movie scene sub section / focused sequence navigation to scripting:

    • Focus section

    • Focus parent

    • Get hierarchy

  • Added a GetDescendantSubSections function to MovieSceneCommonHelpers.

Improvement:

  • Moving a keyframe to the same time as another keyframe in the Curve Editor will now remove and replace the old keyframe.

  • The Look at Tracking Interp Speed property on Cine Camera Actors is now animatable in Sequencer.

  • Buffered Curves are now consistently called Buffered Curves in the Curve Editor instead of Stored Curves.

  • Buffered curves now can only apply and swap to the curve it was made on.

  • You can now cancel a Take Recorder recording that is in progress.

  • The Cinematic Viewport timeline range is now synchronized to Sequencer's timeline. This change helps prevent cases where the timeline padding could appear very large and unusable, due to a large working range.

  • You can now add an animation track to the top level Actor binding if the root is a Skeletal Mesh component. This loosens previous restrictions to make it more convenient to add animation without also needing to add Component Tracks first.

  • Added Play/Pause/Stop functions to the Actor Sequence Component.

  • The Track filter button now has a red dot to indicate if any filters are active.

  • Camera Cut tracks are now included in the Cameras track filter.

  • Sequencers main toolbar has been converted to use the Tool Menus framework.

  • Several color changes have been made to curves and keyframes in the Curve Editor.

    • Keyframes are now the same color as the curve.

    • Selected keyframes are white, which can be changed in Editor Preferences.

    • The default color for non-axis curves is now a darker gray.

    • The blue channel for Z and B channels is now brighter to contrast better against the dark background.

  • Locking and unlocking camera cuts can now be performed with Shift-C.

  • Added MOVIESCENETRACKS_API to some MovieScene3DTransformSection Functions so they can be used by other Plugins.

  • MovieScene::SetComponentTransformAndVelocity can now be used by other Plugins.

  • Actors referenced in Sequencer now no longer forcibly show in the Outliner, unless it is a Spawnable.

  • The ExportLevelSequenceFBX Python command is now able to export a Subsequence within a Master Sequence.

  • Added hotkey support for selecting all keyframes forward and backward in the Curve Editor. Ctrl + ] and Ctrl + [.

  • Dragging and dropping Movie Render Queue assets now appends the jobs in the queue to the active queue.

  • The Sequencer tab will now display with an asterix if the asset has unsaved changes.

  • Sequencer Bezier interpolation now occurs on doubles instead of floats.

  • Sequencer can now handle cases in which multiple ECS entities are driving a single transform section. This is a new situation that arises from overridden channels.

  • Sequencer now passes its owning section when evaluating a channel. Some new channel types, such as perlin noise, need the section pointer to look up contextual data, like tick resolution.

  • The Use Camera Cut for Warm Up range detection behavior is now the difference between the Camera Cut Section start, and the first evaluated frame of the Camera Cut section itself. This improvement was made to better handle sub-sequences being clipped by parent ranges.

  • Reduced the amount of concurrent memory required for panoramic blending, by blending it into the final output texture as soon as each sample is done in order to free up more memory.

  • Cloth behavior, when using temporal sub-sampling, has been improved by automatically increasing the sub-step count when needed.

    • It is important to note that Cloth will still present a different result than in viewport due to the increased number of chances to resolve collisions and have physics forces applied.

  • You can now have multiple Control Rig's active at the same time. Using the Outliner, you can now observe and manage all Control Rigs in the active level sequence.

  • Linked Anim Sequences will now save when the Level Sequence is saved.

  • Parent and Child definitions in the Snapper tool will now reset when switching Shots or Subsequences.

  • You should now only be able to snap to a single parent when using the Snapper Tool.

  • Added Evaluate All Skeletal Mesh Components option to AnimSequenceLink.

  • Linked Animation Sequences will now be dirtied at the same time you dirty your Level Sequence.

Crash Fix:

  • Fixed crash with ReplayTracks plugin.

  • Fixed a crash that would occur when modifying a parent asset while recording with Take Recorder.

  • Fixed a crash that could occur when using the Command Line Encoder option if the output directory tree did not fully exist before encoding started.

  • Fixed a crash that would occur when keying onto additive sections with different number of controls due to the hidden track editor variable.

  • Fixed a crash when unresolved bound objects in Sequencer were being deleted.

  • Fixed a crash when calling FindOrGetDefaultSettingForShot when InMasterConfig was null.

Bug Fix:

  • Set Curve Color For Selected now only changes the color for selected and not all curves.

  • Fixed an issue where repeatedly setting custom curve colors would result in broken keyframe coloring in the Curve Editor.

  • Changing curve colors in the Editor Preferences menu now correctly applies the color change immediately.

  • Fixed still being able to add and move Marks if Sequencer was locked.

  • Fixed subtitles appearing even when Suppress Subtitles is enabled in the Audio track section.

  • Fixed a bad cast error when trying to cast to a MovieScenePropertyTrack.

  • Fixed a bug where all Control Rig controls would be selected if you selected the Folder Track that contained them.

  • Fixed an issue where the Sequencer editor menu extensions were shown for sequence types other than Level Sequences.

  • Fixed synchronization issues where curves would not appear in the Curve Editor if you had Selected Control Rig Controls enabled.

  • Fixed an issue where dragging a Control Rig into Sequencer would create a duplicate Control Rig track for the actor and all of its skeletal mesh components.

  • Sequencer: Clamp to playback range before snapping to frames, otherwise the scrubbed to frame could be a subframe when snapping is on.

  • Fixed a bug where all Animation Notifies would fire at once at the loop point when looping animations in Sequencer.

  • Fixed an issue with adding keyframes in the Curve Editor using Ctrl + MMB would still cause slight disturbances to the curve shape if snapping was enabled.

  • Fixed Curve Editor snapping to occur in all view modes: Absolute, Stacked, and Normalized.

  • Fixed an issue with Camera Rig Rail where the mount visual would rotate if Lock Orientation to Rail was disabled.

  • Fixed an issue where muted tracks could be muted forever when deleting tracks.

  • Fixed smoothed replicated playback causing desyncs during looped playback.

  • Fixed an issue when copy and pasting attached spawned objects not correctly binding to the newly pasted bindings.

  • Fixed an issue with Curve Editor bindings for Zoom To Fit All, Zoom To Fit Horizontal, and Zoom To Fit Vertical not working.

  • Fixed an issue where if you select a control in the Anim Outliner or in Sequencer, the transform gizmo wouldn't appear because the Control was not considered selected.

  • Convert to Spawnable now creates a transform track that takes the transform origin into account.

  • Fixed an issue when recording Spawnable Actors in Take Recorder that are children of other Actors not being recorded resulting in the recorded Actor appearing at an incorrect transform.

  • Fixed a crash in Sequencer when dragging "Animation Mode" keyframes.

  • Fixed an issue that caused the playhead to not follow the cursor consistently when dragging it at low speeds.

  • Fixed an issue where deleting a recorded Actor after a Take Recorder recording would cause all Actors to be removed from the source list.

  • Removed interp from RelativeScale3D, which fixes an issue where meshes would flicker between their initial Transform Scale Values and the Relative Scale 3D values on playback.

  • Fixed an issue where not all keyframes would be selected when clicking on a curve in the Curve Editor.

  • Fixed an issue for the Control Rig Snap Tool not taking full world transform into account.

  • Fixed a bug with Control Rig selection where if you select a keyframe on a Control Rig element, the corresponding element would get deselected.

  • Fixed a bug where changing a color on a keyframe using the Color Picker would also reset the keyframe tangent.

  • Fixed an issue where if you select a Control in the Anim Outliner, the transform gizmo won't be updated so you can't click on a gizmo to move it immediately.

  • Fixed an issue where sometimes the clicking and dragging would drag the playback ranges instead of the playhead.

  • Fixed an issue where OnStop would not always fire.

  • Fixed an issue where Spawnable objects can't be retrieved immediately after opening Sequence.

  • Fixed a case where Take Recorder would get confused over which Camera to bind to the Camera Cuts track if another Camera was a Component of an Actor.

  • Fixed an issue with Camera frustum visualizations not updating when lens values update in Sequencer.

  • Fixed an issue where undoing in the Curve Editor would change the current time.

  • Fixed an issue where the Snapper Tool would not correctly work when snapping backwards from your current time.

  • Fixed an issue where deleting the last keyframe would not reset the property to the previously unkeyed value.

  • Fixed an issue where pasting keyframes in the Curve Editor would paste to all curves in view and not the selected one.

  • Fixed an issue where Muted track sections could still have their data changed.

  • Fixed ExponentialHeightFog.SecondFogData properties not dirtying render state when set from Sequencer evaluation.

  • Fixed an issue that prevented saving a Control Rig animation to an Animation Sequence that was currently being referenced in Sequencer.

  • Fixed an issue when copy and pasting tracks with multiple bindings on it.

  • Fixed a bug that could use name-lookups for channels, instead of assuming their type and index.

    • name-lookups is now a potentially invalid assumption when channels can be overridden.

  • Fixed a bug that could cause cloth simulation to not occur if a render was started long after the level was first loaded.

  • Fixed a bug that could cause Control Rig to mark a section as changed when the channel proxy changes.

  • Fixed a bug that could create an arbitrary section range when a new section is created past the playback end.

  • Fixed a bug that could cause high temporal sample counts to have their delta times clamped during Level Tick which created mismatches between calculated component velocities and render thread delta times.

  • Fixed a bug that could cause clamping of looping subsequences.

    • Previously, a compilation's range was clamped by the containing section's range, so some of the sub-sequence's animation would not be taken into account after the last loop and still play.

  • Fixed a bug that could incorrectly initialize a camera's animation sequences upon creation.

    • Previously, sequences were only initialized when the asset was opened in Sequencer for the first time. This could lead to problems if the asset was added to something else, like a camera shake or a level sequence, before edits were made..

  • Fixed a bug that could cause a regression in jpeg or png file's writing times that significantly slowed down large resolution renders.

  • Fixed a bug that could cause a widening of old, single-precision floating point properties on Blueprints.

  • Fixed a bug that could cause an issue with setting default values when the binding ID changed for actor reference sections.

  • Fixed a bug that could cause a visible seam on the right edge of the editor.

  • Fixed a bug that could cause png alpha channels to only register as partially transparent.

  • Fixed a bug that could cause erratic behavior with alpha-in-tonemapper warnings.

  • Fixed a bug that could cause a Trigger Cameras to cut changes between camera cut sections even if the camera actor is the same.

    • This restores a previous edge-case behavior that users relied on for their projects.

  • Fixed a bug that would register the same tick client multiple times.

  • Fixed a bug that could cause default-construct components created by a mutation to prevent corrupted memory from making it into the sequencer evaluation.

  • Fixed a bug that could cause code from getting a component writer to a single entity.

  • Fixed a bug that could cause non-layered EXRs from using the wrong Alpha Allowed property which prevented the property from writing out to alpha channels.

  • Fixed a bug that could cause a project's aspect ratio constraints to not correctly restore.

  • Fixed a bug that could prevent selected infinite sections from being moved or dragged.

  • Fixed a bug that could cause an issue when trying to use png files in combination with the Command Line Encoder failed with some third party encoding software.

  • Fixed a bug that could fail to try and resolve bound actors with component possessables.

  • Fixed a bug that could cause the Command Line Encoder to not use version tokens in the filename.

  • Fixes a bug that could clear delegates tied to destroyed objects that should not be left in the latent actions list.

  • Fixed a bug that could causethe additive-from-base blend type to not perform when recomposing values for keying.

  • Fixed a bug that could cause the project settings class for Render (Local)/Render (Remote) to not properly store references to late-loaded class types such as those defined in Python or in a game's Plugins.

  • Fixed a bug that could cause the 'Write all Samples' to not respect the project_dir format string.

  • Fixed a bug that could cause separately composited Burn In/Widget Renderers to not actually write an alpha channel when the main output was as JPEG or BMP file.

  • Fix bug that could cause a section-preroll to be ignored for camera cut tracks.

  • Fixed a bug that could cause the DetailLighting render pass not apply the correct view modes causing reflections to not display.

  • Fixed a bug that caused the float and double channel context menus to not merge into a single "curve channels" context menu.

    • Previously, the float channels, specifically the channel for transform sections, was not affected by any context menus.

  • Fixed a bug that could cause multiple custom movie renderers to be displayed at once, instead of just the current one.

  • Fixed a bug that could cause the template sequence property multipliers to not always be reliably being taken into account.

  • Fixed a bug that could cause high temporal sample counts being artificially clamped by overriding the minimum timestep for Chaos Physics to zero during renders.

  • Fixed a bug that could cause Tick Resolution migration code to not successfully migrate locked sections and not migrating Marked Frames.

    • This fix also adds the ability to recursively apply the time migration to all child sequences.

  • Fixed a bug that could occur when trying to add a job through the Sequencer UI, then disabling a setting, and then adding the job again, which could result in the disabled settings to duplicate and become active again.

  • Fixed a bug that could cause formatted strings that come from shots to provide the incorrect values, from the Master Configuration, when used in filenames.

  • Fixed a bug that could prevent the use of the job initialization timer when using the year, month and day tags, which would cause files to go into separate folders when a job rolled over midnight in UTC time.

  • Fixed a bug that could cause Video Codecs to function when the Overwrite Existing property was disabled.

  • Fixed a bug that could prevent a saved Queue from showing the correct names for jobs that used Presets for their settings.

    • Fixed jobs with modified presets having the wrong name after being duplicated in the queue.

  • Fixed a bug that could cause the MoviePipelineInProcessExecutor to crash if provided with a bad Sequence path.

  • Fixed a bug that could cause the date and time tags to not resolve in output paths when clicked on in the UI.

  • Fixed a bug that could cause the full path name of template sequences' bound actor classes to not register if only its short name was saved.

  • Fixed a bug that could cause the Animation Custom Mode and Swap Root Bone properties to not be exposed to Blueprints.

  • Fixed a crash that could occur by calling DeleteAllJobs immediately after calling RenderWithExecutor.

  • Fixed a bug that could fail to include a sequence's play rate when computing sequence shake pattern duration.

  • Fixed a bug that could generate duplicates from bindings when first resolved.

  • Fixed a bug that could cause motion blur to get stuck when the Camera Cut track stopped evaluating.

    • This was only an issue if the Motion Vector Simulation system was enabled and the camera being returned to was not a Cine Camera Component.

  • Fixed a bug that could cause an incorrect upkeep of property stats when upgrading floats to doubles.

  • Fixed a bug that could assert on exit if the runner's linker is pending kill.

    • This could happen if the linker is flagged for destruction before whatever owns the runner.

  • Fixed a bug that could cause alpha channels to be speckled due to dithering when using png and jpeg file outputs.

  • Fixed a crash that could occur in the Animation Sequencer animation selection filter, by adding Montages to animation tracks.

    • At this time, only animation sequences are currently supported.

  • Fixed a crash that could occur with Video Codecs when they failed to initialize due to an invalid output file path, such as writing to a hard drive that did not exist.

  • Fixed a bug that could cause mapped Skeletal Mesh to not update the Skeletal Mesh accordingly to the controls.

  • Fixed a bug that could cause all linker evaluations to start with an un-clean capture source, even in cases when there are nested linkers running.

    • This fixes asserts caused by mismatched pre-animated states.

  • Fixed a bug that could cause a custom range for Move Render Queue renders in shipping builds to be incorrectly set.

  • Fixed a bug that could cause a baked Control Rig to include all of the rig's Compatible Skeletons.

  • Fixed a bug that could cause only select Control Rig Controls to deselect when a control isn't clicked.

  • Fixed a bug that could cause Network Level Authentication (NLA) issues with root motion not blending correctly when there are multiple skeletons blending.

  • Fixed a bug that could cause drag-and-drop functionality, when adding animation sequences to the Sequencer timeline, to create a new dedicated track rather than adding the sequence to an existing track.

  • Fixed an issue where copy and pasting Control Rig data would not paste correctly if the Selected Control Rig Controls track filter was enabled.

  • Fixed an issue where orbiting (Alt + LMB) the camera around a selected Control Rig would sometimes duplicate it.

  • Fixed an issue where orbiting (Alt + LMB) the camera around a selected Control would sometimes move the Control instead of the camera.

  • Fixed an issue where duplicating Linked Anim Sequences would point to both the original and the duplicate.

  • Fixed a case where sequencer bindings could be resolved using the wrong PIE instance ID.

  • Fixed replicated sequences that begin at a non-zero start time causing a jump on the first frame.

  • Fixed an issue where Motion Trail keyframes would appear at the level origin, instead of hiding.

  • Fixed derived Cine Camera data not updating when modifying properties from Blueprints.

  • Fixed an issue where very small marquee selections would sometimes select all Control Rig Controls.

  • Fixed an issue with Motion Trail ticks not drawing correctly in multi-viewport scenarios.

  • Curve Editor selection no longer changes which Controls are selected in the Viewport.

  • Fixed bound object pointers not being available to child entity instantiators.

  • Fixed an issue that would cause an Actor with a Control Rig to continuously pop back to its default position in Sequencer when moving the Actor.

  • Ensured that the current Level Sequence closes before opening the next one when switching Level Sequences.

  • Fixed an issue that would cause recorded animations from the Take Recorder to be invalid if spaces were in the name.

  • Fixed an issue where if Selected Control Rig Controls was enabled, Curves would not show up in the Curve Editor.

  • Fixed an issue where undoing keyframe changes on multiple Control Rig Control would have to be done by undoing each keyframe operation per Control.

  • Fixed Actor properties controlled by Actor Reference Tracks not being restored correctly if they were null.

  • Fixed an issue where compression would reset to default compression in Sequence Recorder.

  • Fixed an issue where scrubbing in the Viewport by pressing B and dragging would not cause audio to play from Audio Tracks.

  • Fixed an issue where if you called Job->SetConfiguration(Job->GetConfiguration()) it would remove all of the settings from the MRQ job.

  • Fixed an issue where Sequencer Attach tracks would dirty actors in levels.

  • Fixed an issue where recording into Subsequences using the Take Recorder wouldn't save them if Save Recorded Assets was enabled.

  • Fixed looping point indicators not being correctly positioned on Media Track sections that don't start at 0.

  • Fixed an issue where creating Takes would not respect number padding in your Shot name.

Deprecated:

  • Sequence Recorder is now hidden in favor of Take Recorder. If necessary, it can be re-enabled with the SequenceRecorder console command.

  • Deprecated GetSelectedObjects()/SelectObjects in favor of GetSelectedBindings/SelectBindings which operates on FMovieSceneBindingProxy for consistency with all other Blueprint and Python functions.

  • Deprecated SequencerBindingProxy and typedef it to MovieSceneBindingProxy.

  • Removed the Export to Camera Anim... feature as it is unable to perform any actions without the deleted Matinee Asset Factory.

Removed:

  • Completely removed Matinee from the codebase including the data types and runtime evaluation code.

  • The "InterpEdit" editor mode, asset factories, and other editor support for Matinee.

  • CameraAnims and their sequencer tracks.

  • FBX import/export for Matinee assets is removed. Sequencer is now used for all cinematics and camera animation needs.

Synthesis

New:

  • The new experimental Physics Control Component plugin allows you to add simple, intuitive, and powerful physically-based controls to a Blueprint. With these physics controls, you can take advantage of the emergent physical motion of Static and Skeletal Meshes, while retaining artistic and gameplay control.

  • Added a new frame based animation timeline setting for the ML Deformer editor.

  • Use the new command TSoftObjectPtr for training related properties, and only load them when needed.

  • By defining what parts of the character's mesh will be deformed using a Geometry Cache file, you can now use Skeletal Meshes with more meshes than geometry tracks when generating models using the ML Deformer framework. For example, a Skeletal Mesh character could contain teeth, eyes, etc, while the geometry cache file does not contain those meshes.

Improvement:

  • Added function libraries missing for Mac builds and NumPy to PythonFoundationPackages. This fixes training errors in the ML Deformer on Mac.

  • The Machine Learning (ML) Deformer system has been redesigned as a framework that can handle different models using a new unique editor, assets and components. You can explore this new framework by installing the ML Deformer framework plugin.

  • Improved and simplified the model training process for the MLDeformer VertexDeltaModel.

  • Improved the Neural Network model by switching rotations from Quaternions to 2 columns of the 3x3 rotation matrices.

  • You can now store extra per-individual mesh information from FBX scenes when importing FBX files to Unreal Engine.

Bug Fix:

  • Fixed a bug that could occur if a site packages directory on Mac was not named correctly in PythonFoundationPackages.

  • Fixed a crash that could occur due to a ML Deformer Model that failed to locate and identify a GPU device.

  • Fixed a bug that could cause pose generation to fail when using Python code to generate poses for the ML Deformer poses in AutoDesk Maya 2022.

Editor

API Change:

  • The UAssetToolsImpl::ImportAssetTasks function now properly sets the imported Assets in the FAssetImportTask::Result member of the passed ImportTasks parameter.

  • Any code that was checking for EPropertyChangeType::Unspecified for movement of array items in the property details panel should now use EPropertyChangeType::ArrayMove instead.

New:

  • Adding a UI wrapper around the CSV to SVG Tool command line tool.

    • The arguments are stored as a UObject with reflected properties so you can get a "free" UI by using the property window. Also, this lets you use serialized arguments so you can potentially re-use the settings. You can also programmatically generate the arugment list to pass to CSVtoSVG by iterating the relfected properties.

    • Added SCSVtoSVG widget which contains/owns the arugment UObject, a property window to edit it, and a SStatList.

    • When the CSV file property on the arugment changes we infer an output directory and output file name from the input csv file. These can be overriden.

    • The tool also parses the CSV file to find all the available stats in it to populate a SListView.

    • When you click generate to make the SVG graph we automatically open the graph in a web browser.

    • Save the current arugments to config when you close the editor.

  • FEditConditionContext::GetIntegerValue can now fall back on the underlying property if it is an enum. This allows for bitwise comparison in UProperty EditConditions with enums.

  • Added support for multiple Level templates using the same map package.

  • Added a new DDS loader with better support for D3D10-format DDS files.

  • Added support for loading RGBA8-format DDS files.

  • Added a CanEditChange signature that takes a full property chain to the property in question.

  • You can now use multiple console commands in the editor by using FParse::Line to allow commands to be split with newlines or pipe characters ( | ).

  • You can now add a newline in the console command entry box by using Shift + Enter.

  • Many Anim Dynamics Animation node parameters can now be edited with a widget in the viewport.

  • Parameters for physics bodies in a chain can be edited independently.

  • You can no longer copy/paste bone names in the chain bone array.

  • Added per-level coloring option for the fracture editor outliner and stats details.

  • Allowed colliding body settings are now copied and mirrored when physics bodies are mirrored in the Physics Asset Editor. This means that a mirrored body can now collide with the mirror equivalents of its source's allowed colliding bodies.

  • Bone mirroring in the Physics Asset Editor now recognizes bones that have an "l" or "r" pattern anywhere in their names as 'left' or 'right' bones and will mirror them correctly.

  • The Asset summary text displayed in the Physics Asset Editor viewport now includes the number of potential colliding pairs of bodies, the number and type of each primitive shape, and the number of cross constraints in the current Asset.

  • Added additional editor scripting APIs to modify Blueprint variable flags and metadata in BlueprintEditorLibrary.

  • Added an option to disable collisions with the floor when simulating in the Physics Asset Editor. This option is located in the overflow menu of the Simulate toolbar button.

  • Added a new column mode parameter to the Fracture Editor outliner that displays various information per bone depending on the the selected mode.

  • UBlueprintAsyncActionBase - Made WorldContextObject parameter const in RegisterWithGameInstance.

  • UEditorUtilityBlueprintAsyncActionBase - Made WorldContextObject parameter const in overridden RegisterWithGameInstance.

  • Add an option to use the P4Config in the Unreal Editor.

  • Exposed Asset Migration command to scripting.

  • Added a new GetSelectedFolderPaths function to get the currently selected folder(s) path in utility widgets and Python.

  • Added a new GC section to the Details panel UI which displays properties specific to the geometry collection component.

  • Sounds are now loaded and compressed asynchronously in the Unreal Editor whenever possible.

  • Ctrl + Console Key (` by default) now iterates through active Console Command Executors so you can switch between Cmd and Python using the Ctrl + ` shortcut.

  • Added a new Texture property, ForceRecompressDDCUID, that you can use to manually change the DDC key to force a rebuild.

  • Implemented Python Type Hinting when generating the Python stub.

  • Exposed to Python the option to set a minimum width/height dialog when calling the unreal.EditorDialog.show_object_details_view function.

  • DDS texture import now supports most pixel formats, and all variants of 2D, cube, cube array, and volume textures, with mips.

  • Added access to debug color texture encoding for Oodle from the command line.

  • Added log information for enabling and disabling debug color texture encoding for Oodle.

  • Mip maps are now supported on non-power-of-two textures.

  • Added Conv_StringToInt64 to Kismet string library.

  • VT and UDIM can now export to all supported output image formats.

  • UAssets that store their imported image data as JPEG can export those JPEG bits directly to JPEG output format without decompression.

  • More image formats import floating point data as F32 and store losslessly in UAssets. Floating point data is no longer converted to F16 at import time.

  • Added changelists support to PlasticSCM source control plugin (v1.6.2).

  • Added TRACE_CPUPROFILER_EVENT_SCOPE to Perforce integration plugin to be able to capture some performance metrics.

  • Exposed UStaticMesh::GetNumTriangles as a Blueprint function.

  • Exposed UEnum display name to Python through method get_display_name. For example: print(unreal.TextureCompressionSettings.TC_GRAYSCALE.get_display_name()).

  • Unreal Engine now supports reading the enum entry display name set in C++ as well as the one injected from Python with the @uenum annotation.

  • Added Shared Linear Texture Encoding. When enabled (r.SharedLinearTextureEncoding), an encoded texture for a console that would tile a base texture will detect if it can use the same base texture as windows, avoiding re-encoding the base texture. This greatly speeds up multi-platform encoding.

  • Created a new enum entry, EPropertyChangeType::ArrayMove, to signify movement of items within an array by the property Details panel and other callers to UObject::PostEditChangeProperty.

  • Added a new Texture property, Editor Show Final Encode. Use this property to see the Final-mode encoding of the texture (for example, with Oodle RDO) in the current Editor session, rather than the Fast-mode encoding without RDO.

  • Exposed IAssetsTools::DiffAgainstDepot and IAssetTools::DiffAssets functions to Python.

  • Added a warning dialog when performing a blocking operation.

  • Constraint position and orientation in the Physics Asset Tool (PhAT) can now be viewed and edited in the Details panel.

  • Parent and child transform values in the PhAT can now also be displayed relative to the default (snapped) transforms (set when the Physics Asset was created).

  • The position and orientation components of the parent or child transforms can be independently snapped to defaults using right-click menu options or the reset buttons in the Details panel.

  • You can now manipulate only the child frame transform via a viewport widget by holding down Shift + Alt.

  • Fixed the warning and error message boxes using all the spaces of the source control submit confirmation dialog if too many errors or warnings were present.

  • Added a Keep Checked Out button to the source control window.

  • Added an array of delegates called ShouldDisableCPUThrottlingDelegates in UEditorEngine that can be used to disable CPU throttling for the editor when it doesn't have focus.

  • The Pose Watch Manager in the AnimBP editor has been extended to allow control of other areas of debug visualization. Each pose watch now contains one or more elements which represent different aspects of an anim node's debug visualization, including the output pose, physics bodies, etc. where relevant. Those aspects can be hidden or shown individually, even when a node is not selected, by creating a Pose Watch for a node and toggling visibility of the elements in the Pose Watch Manager window. At present, the Rigid Body Animation Node (RBAN) is the only one to take advantage of this new feature.

  • Added new Texture bool bDoScaleMipsForAlphaCoverage to clarify the feature AlphaCoverageThresholds for older textures.

  • Added a new memory.WindowsPlatformMemoryGetStatsLimitTotalVirtualGB cvar that simulates a lower memory system to lower the chances of out of memory crashes during cooking.

  • Exporting a Level to FBX will now use Actor labels instead of Actor names for improved clarity.

  • The Base Shape Material's Base Color was changed from 1 to 0.9. This change affects all base shapes (sphere, box, cylinder, cone, etc.).

  • Added ASSETSEARCH_API to Asset Indexer classes.

  • Changed default arcball behavior to act more like other DCCs.

  • Added a limit cvar to extend the size of the arcball.

  • Added a Disable Preview Menu option.

  • Added FriendlyNames to all ShaderPlatforms in DDSPI.

  • MenuText now comes from FriendlyNames in DDSPI.

  • Added Units and ForceUnits to ObjectMacros.h for discoverability.

Improvement:

  • The Material Editor now only compiles a fixed number of shaders (fewer than 10 per platform) with WorldGridMaterial.

  • Drastically improved editor performance when selecting a very large number of Static Meshes using the marquee selection tool.

  • Improved job scheduling for parallel texture compression.

  • Increased cut-offs for number of pixels per Oodle Texture encode job to reduce number of tiny worker-thread tasks generated.

  • Restoring expanded items in very large Detail panel hierarchies is now faster.

  • Typing a character while an Asset picker menu is open will now focus the search box if it is not already focused.

  • Added support for calculating chain bones immediately without waiting for the Anim Dynamics Animation node to be compiled.

  • Changing bound bone names no longer resets physics body parameters.

  • PaintedVertices are no longer serialized when collecting object references to avoid needless operations when launching PIE.

  • The Check Out Files dialog now displays the type of Actor and no longer displays just "Actor".

  • The Unreal Editor now supports textures up to 32768x32768.

  • Texture UDIM import now allows mismatched formats.

  • Texture UDIM export preserves naming convention and allows choice of export format.

  • Implemented an 'Unsaved' Editor status bar button that displays the number of unsaved Assets (dirty packages) in the project. Click this button to open the Save Content dialog.

  • Unreal Engine now warns about potential source control issues when saving unsaved Assets.

  • Instrumented Python plugin loading time and saved about 500ms to the total module startup time.

  • Source control changelist window now works better with large changelists (One File Per Actor).

  • Changelist window now supports text search, filtering, and 2-column sorting.

  • You can use two new keyboard shortcuts in the changelist window: Enter to submit the currently selected changelist, and Delete to delete it.

  • P4 changelists are now sorted in ascending order.

  • Operations that don't directly affect Assets, such as creating and deleting a changelist, are now asynchronous.

  • When submitting a changelist to source control, you can now edit and save the changelist.

  • If you add a description to the default P4 changelist while files are checked out, the description and all files attached to that changelist are moved to a new changelist.

Crash Fix:

  • Duplicating array entries in the Details panel containing a null UObject* / TObjectPtr will no longer cause a crash.

  • Fixed an editor crash when removing the last texture source in a texture array.

  • Limited sparse data properties to the common base class when multiple objects with potentially unrelated types are selected into the property editor to avoid a potential editor crash.

  • Improved the memory estimate for building textures, making out of memory crashes during cooking less likely.

Bug Fix:

  • Fix property display in the Details panel for Levels with the ReadOnlyKeys metadata.

  • Editor notifications now only start fading out once the editor starts ticking and no longer disappear when loading takes longer than the expiration time given.

  • Improved FInstancedStruct property editing stability.

  • Fixed a bug where PIE didn't respect editor FeatureLevel Settings when having PIE MapOverride set up.

  • Fixed an issue where modules tab wouldn't reliably be available.

  • FDirectoryPath properties now correctly update the Enabled state of the "..." button.

  • Fixed an issue that caused the Blueprint diff tool to potentially call IsChildOf on nullptr for newly added classes.

  • Components panels now show correctly in the Blueprint diff tool for newly added Blueprints.

  • Scene Outliner selection no longer resets when changing the Level.

  • Fixed an issue where, under certain circumstances, multiple child entries representing the same object could be added to a Scene Outliner tree item.

  • Fixed a visual gap in the header of nested categories in the Details panel, notably in a Blueprint's Class Defaults.

  • Fixed an issue where certain old texture versions had the incorrect compression format set in their internal UAsset data structure.

  • Fixed an issue where the editor would sometimes not create or update the thumbnail of an Asset when requested.

  • Fixed rendering issues with geometry collection for Materials using vertex color when the ShowBoneColors option is disabled.

  • Fixed a bug that caused text boxes created by property row generators to fail to accept multi-line input.

  • Editing a vector using the spinboxes in its vector no longer causes stuttering due to Blueprint reinstantiation.

  • Fixed an editor bug where Actors attached to a static mesh socket inside a blueprint actor weren't updating when the mesh was moved.

  • Fixed ActorFactory overriding custom names given with PostSpawnActor.

  • Fixed initial dynamic state not being properly serialized when set via the outliner context menu in the Fracture Editor.

  • Fixed a bug that caused failures for automated processes (cooking) when the connection to the SCM failed even if the actual process did not need the connection.

  • Focus now correctly returns to the Unreal Editor if the Zip Project command is canceled.

  • Texture stats memory is no longer reported after async texture compilation has finished.

  • Fixed a warning regarding usage of banned words.

  • Upgrade ISPC ASTC encoder to fix a bug where solid-color blocks with very low alpha values would sometimes revert to all black.

  • Fixed a missing FActorInstanceHandle::InstanceUID initialization in Actor.

  • Fixed an issue where CreateNewStreamingLevel scripting function would ignore the NewLevelPath argument.

  • WhitelistConfigFile is now enough to allow for staging individual configuration files from Restricted folders, without having to also specify WhitelistDirectories for that folder as well.

  • WhitelistDirectories now works properly for restricted directories in distributed builds.

  • Fixed FSlowTask automatically canceling when dialogs were created with a delay and ShouldCancel was called before the dialog spawned.

  • UAssetToolsImpl::ImportAssetTasks function now properly adds imported Assets to the FAssetImportTask results.

  • Fixed the source control history window not properly displaying multi-line submit descriptions.

  • Fixed a bug that caused some operations made in the Editor to not be reflected in the changelist window.

  • Fixed a bug that caused validation warning and error messages to show a scroll bar for long messages rather than wrap around.

  • Fixed Python calling the wrong delegate if the same delegate name or type was declared in two different UObjects.

  • Duplicating Assets will no longer keep a Perforce relationship to the original file.

  • Fixed JSON warnings with reference container values in the project launcher.

  • Fixed the Delete operation not getting called for source control other than Perforce.

  • Changed the source control changelist widget tab spawner to a nomad spawner to allow restoring the widget dock position on next Editor restart.

  • Fixed a bug that caused content cooking to hang when TextureFormatOodle was disabled for DXT format.

  • Implemented a workaround to declare valid Python methods when the corresponding UFUNCTION has default parameter values declared in the metadata, but also has further parameters that don't have default values, which is illegal in C++ and Python.

  • The Change Source Control Settings dialog accessed from the Unreal Editor top menu bar now behaves consistently when saving the new settings or canceling.

  • Fixed argument parsing for the HighResShot command.

  • Fixed the RemoteSession message handler proxy calling the wrong function.

  • Fixed AlphaCoverageThresholds that were accidentally enabled for all textures with thresholds = {0,0,0,1}.

  • Added https:// conditions to links in the Plugin Browser.

  • Fixed nested submenus closing unexpectedly, when opening one by clicking it (instead of just hovering it) and then navigating in submenus.

  • Redirected Python stdout/stderr to a buffered text wrapper.

  • The PYTHONUNBUFFERED environment variable now correctly prevents stdout/stderr from buffering when set.

  • Fixed deadlock in the splash screen happening when the main thread goes faster than the splash screen and tries to hide the splash before the splash screen thread even created the window.

  • Fixed Python files being filtered out by the Content Browser.

  • Fixed a Python GIL (Global Interpreter Lock) deadlock that could occur while loading an Asset.

  • Fixed variables named X64 to avoid collision with preprocessor definition X64.

  • Fixed FUpdatePendingChangelistsStatus operation that did nothing if a specific set of changelist was requested.

  • Fixed an issue when serializing an incoming concert transaction in FConcertSyncObjectReader where object pointer properties would get set to null incorrectly if Skip Assets was true.

  • Marked the FAssetData::AssetClass, FARFilter::ClassNames and FARFilter::RecursiveClassesExeclusionSet as 'Deprecated Property'.

  • Changed a Python glue generation error into a warning when a make or a break function signature doesn't comply with Python requirements. Downgrading from an error to a warning, with a message saying that the default make/break will be used instead to make/break the Python object, will prevent licensees from hitting a UE_DEBUG_BREAK every time the debugger is attached.

  • Fixed a memory leak when a long source control operation blocks the main thread while the rendering thread renders to animate the source control feedback popup.

  • Exposed TFieldPath<T> as 'FieldPath' to Python.

  • Removed outdated #define SourceCodeNavigation preventing proper source code navigation if the editor was compiled with clang.

  • Fixed Analytics asserting and crashing the editor when the analytics property store files contained empty key names.

  • UActorEditorContextSubsystem is now validated when unbinding in the SActorEditorContext Destructor due to a race condition where the subsystem may not exist by the time the destructor is called.

  • When importing a FBX file through Import Into Level, the Static Meshes will now have DistanceFieldScale set to 1 instead of 0.

  • Several bugs in the HDR image loader have been fixed.

  • The HDR image loader now uses much stricter validation.

  • When importing a glTF file, the tangent space handedness (w component of the glTF tangent vector) will now be taken into account for meshes.

  • Fixed Asset Search indexing for FSoftObjectPtr representing references to non-Assets (that is, AActor instances).

Removed:

  • Access to the built-in editor VR Mode has been removed. Virtual Scouting is the recommended alternative for all users going forward.

  • Removed GetFriendlyShaderPlatformName.

  • Deleted RHIShaderPlatformDefinitions.inl.

Datasmith

New:

  • Enabled Nanite support on Opaque Std Datasmith Materials.

  • 3ds Max Exporter: sorted material slots to make them appear in the same order in Unreal as in the source Multi/Sub-Object material.

  • Removed the "Reuse identical assets" import option from the USD Stage.

  • Added some example Python scripts that describe some of the new features implemented in Unreal Engine 5.1, and how to interact with USD, for example to import or export. We will continue to add new scripts. You can find all available sample scripts in the "Engine/Plugins/Importers/USDImporter/Resources/PythonExamples" directory.

  • The Level Sequence generated by AUsdStageActors now binds not only the components that the Actor generates directly, but also the Actors that own those components.

  • Exposed the USD.GeneratePhysicsAssets console variable, which controls whether to generate physics Meshes for Static and Skeletal Meshes by default.

  • Added options to the File menu for exporting the open USD Stage to a new set of files. This is analogous to a "Save As" command.

  • When the open USD Stage's framesPerSecond attribute is updated, the generated Level Sequence now automatically updates its Display Rate to match.

  • Alias Import: Added the ds.CADTranslator.Alias.LayersAsActors console variable to convert Alias Layers to Actors on import. When you use the console variable, each Layer is added as an Actor, directly under the Datasmith Scene Actor in the hierarchy. Previously the importer only converted group nodes.

  • Hidden layers are no longer included in the import.

  • [SketchUp] Starting from SketchUp 2020.2, exported Static Mesh names are now persistent, meaning they do not change between exports of the same Component.

  • USD: The import options menu that Unreal Engine displays when you import a USD Stage now contains a tree view, which displays the prim hierarchy of the stage to import. Use the tree view to select and import only a selection or subset of the prims in the stage.

  • USD: Added support for the usdMtlx plugin on Windows and Linux The usdMtlx plugin included with USD adds a file format plugin for reading MaterialX documents and translating them into UsdShade shading networks.

  • [glTF] The Vertex data ByteStride attribute is now supported. This fixes issues that occurred when importing glTF files exported from Autodesk 3ds Max 2023.

  • USD: added support for the usdAbc plugin on Windows, Mac, and Linux.

    • The usdAbc plugin that is included with USD adds a file format plugin for reading Alembic files.

  • USD: added basic support for importing Materials with diffuse driven by displayColor.

  • Added the "USD.MaxInstancesPerPointInstancer" console variable to limit the maximum number of instances parsed from each PointInstancer USD prim.

  • The USD Stage editor now emits a warning when muting USD layers with unsaved changes. Unsaved changes are lost when layers are muted.

  • Disabled Skeletal Mesh sections are now ignored when exporting Skeletal Meshes to USD.

  • Added support for collapsing PointInstancer USD prims into Static Meshes when importing or opening a USD Stage.

  • Improved parsing of USD Materials to better extract the intended textures, especially if there is indirection or additional shader connections.

  • Added partial support for handling the "!resetXformStack!" xformOp when it is specified on the transforms of USD prims.

  • Fixed an issue where Materials baking to USD emitted the "ambientOcclusion" Material input instead of the standard "occlusion" input. The Unreal UsdPreviewSurface base Materials are now used when parsing the "occlusion" material input from USD materials, and support Ambient Occlusion.

  • Attributes parsed from USD prims are now be considered animated even if they contain only a single time sample. This means these prims are bound to the generated Level Sequences, instead of being ignored.

  • All Mesh prims exported to USD now specify no that subdivision scheme should be used to parse them. This ensures that DCCs that can subdivide meshes still display normals as they were exported from Unreal.

  • Enlarged the Actor picker menu in the top right of the USD Stage editor window.

  • PhysicsAssets are now generated automatically when parsing Skeletal Meshes from USD. You can disable this behavior with the "USD.GeneratePhysicsAssets" console variable.

  • The USD Stage editor now prompts you to save any modified USD layers to disk when you close a USD Stage with unsaved changes.

  • Improved handling of Skeleton poses parsed from USD. We now use the restTransforms attribute for the reference USkeleton pose, but account for the USD bindTransforms attribute on the USkeletalMesh itself.

  • Added an option for picking which USD Material purpose is used to parse Material bindings. The option is available from Options menu in the USD Stage editor, as a property on the AUsdStageActor, and as USD Stage import option.

  • [SketchUp] Classification Types are now exported to metadata.

  • [SketchUp] Reduced Actor counts in exported scenes.

  • Adjusted the export options used to export Levels and Level Sequence Assets, and reordered them for clarity. They should now have better defaults.

  • [SketchUp] Component geometry is now merged into single Mesh instead of spawning separate Meshes for every disconnected group of faces.

  • [SketchUp] Image Entity is now supported.

  • When an Asset, Level or Level Sequence is exported to USD, new additional metadata identifies the export and source Asset. The exporters check the metadata when re-exporting the same file to prevent re-exporting identical, unchanged assets unnecessarily. New export options for all Asset types allow you to disable this behavior.

  • The USD Stage editor now emits a warning whenever an opinion is authored and it is not the strongest opinion for that property in that stage.

  • You can now specify which USD layer is the current edit target by clicking the checkmark icons in the "Edit" column in the bottom panel of the USD Stage editor.

  • Right-clicking a layer in the bottom panel of the USD Stage editor now allows you to clear, save or export the layer.

  • MaterialX: upgraded MaterialX to version 1.38.5

  • Implemented drag and drop support to allow reordering or reparenting the layers displayed in the bottom panel of the USD Stage editor.

  • Added an option called "RootMotionHandling" for using transform animations on Skeleton and SkelRoot prims as additional skeletal animation root bone motion when opening or importing an USD Stage. The option is available from the Options menu in the USD Stage editor window, as a property on the AUsdStageActor; and as a USD Stage import option.

  • Added support for new file formats to Datasmith import:

    • CATIA version 5: .CATSHAPE

    • CATIA version 4: .exp, .session, . dlv

    • .sab (ACIS)

  • IFC format is now managed by Datasmith CAD import.

    • The ds.IFC.EnableNativeTranslator console variable enables the deprecated native IFC translator.

  • To prevent the import of CAD files with tessellation parameters that can generate huge meshes, we defined the following limits:

    • Chord error: - 0.03

    • Max angle: - 5 degrees

    • We could not limit edge length because 0 equals no Edge length. If the edge length value is not equal to 0, edge length is limited to 0.5, and a warning message is logged.

    • To set smaller values for metric parameters, use the ds.CADTranslator.MeshingParameterFactor console variable.

  • CAD faces are sometimes duplicated. The sew option sews the duplicated faces together. Because their meshes are identical, all triangles are sewn and then disconnected.

    • To prevent that, you can add a process with the option RemoveDuplicatedTriangle.

    • The ds.CADTranslator.RemoveDuplicatedTriangle console variable, which is set to "false" by default, enables the process.

    • Because duplicate CAD faces are rare, removing duplicate triangles is resource intensive, the option is disabled by default. To fix a StaticMesh with duplicated triangles, you can re-import it with this option.

  • Enabled the glTF exporter plugin by default.

  • Added support for CastShadow property in Actor Elements.

  • The Microstation .dgn file format is no longer available for Datasmith import.

  • Alias import with the Stitching option set to Sew allows the merged boundary representation (BRep) to have more than one material assigned (for multi-material surfaces).

    • The ds.CADTranslator.Alias.SewByMatrial console variable allows you to choose to sew BReps by material (only one material per staticMesh) or not (multi-materials on the staticMesh).

  • Added fallback behavior for UGLTFExporter::ExportToGLTF to export current playing UWorld if no specific object is passed.

  • [3ds Max] The Datasmith 3ds Max Exporter plugin keeps the aspect ratio of baked procedural textures.

  • [3ds Max] The Datasmith 3ds Max Exporter plugin version is now displayed in the Datasmith Messages window.

  • [3ds Max] You can now toggle XRef Scenes on and off when you export or Direct-link sync 3ds Max content.

  • With USD, it is now possible to import basis curves or referenced Alembic grooms as groom Assets or caches by applying the GroomAPI schema. Furthermore, the GroomBindingAPI schema can be applied to a mesh prim to bind a groom prim to it in Unreal.

  • [SketchUp] Parent non-uniform scaling of a rotated sub-component is now enabled in some cases.

  • [3ds Max] There is now a Limit Texture Resolution option for export of baked procedural texmaps.

  • [MDL Importer] Updated the MDL SDK.

  • [3ds Max] Max UV channel ids are now remapped to Unreal UV indexes.

  • [3ds Max] Corona Light Material is now exported as UEPbr Material.

  • [3ds Max] Approximated export for ForestColor texmap.

  • [3ds Max] More stable Static Mesh ID by using the smallest handle value among instance nodes. Reduces needless reimports of Static Meshes.

  • [3ds Max] MentalRay Arch & Design and VRay Light Materials are now exported as UEPbr Materials.

  • [3ds Max] Datasmith 3ds Max exporter plugin provides export diagnostic information. For example, statistics about exported/synced scenes, nodes, Materials, and textures.

  • [3ds Max] Support for CoronaPhysicalMtl with ClearCoat.

  • [3ds Max] XRefMat and VRayBlendMtl are now exported as UEPbr Materials.

  • [3ds Max] Max's Physical Material is now converted to a UEPbr Material.

  • Added a post process to the CAD import process to sew cracks in the mesh.

    • This process can be disabled with the ds.CADTranslator.SewMeshIfNeeded console variable.

    • The sew tolerance is the same as the one use in the stitching step of the CAD import (the StitchingTechnique is Heal /Sew). It can be set with the ds.CADTranslator.StitchingTolerance console variable.

  • [Solidworks] Improved Parts configurations export.

Bug Fix:

  • Fixed a crash that occurred when trying to parse some types of USD scenes with nested SkelRoot prims.

  • The USDImporter plugin now displays a warning and cleans invalid normals found when parsing Mesh prims. Previously, it would silently discard all normals and recompute them. The console variable "USD.MeshNormalRepairThreshold" has been introduced to configure this behavior.

  • Fixed an issue where Level Sequence exports to USD were missing animation tracks when Actors and root Components were bound separately.

  • [SketchUp] The Datasmith Messages window is now localized.

  • [SketchUp] Direct Link: Added layer folder (group) visibility synchronization of individual faces.

  • Fixed an issue where the "Selection Only" Level export option had no effect when exporting Level Sequences to USD. Also added an option to the Level Sequence export options that allows exporting animations of only the selected Actors and Components.

  • Datasmith: Initialized custom node values in the MFAttr_FrostedGlass in the M_StdTranslucentFrostedGlass.

  • [SketchUp] Camera changes are now updated via Direct Link.

  • Fixed an issue where the right panel of the USD Stage editor window wouldn't refresh on some operations, such as clearing the prim selection on the left panel, or switching to another Unreal level.

  • Fixed a color styling issue on the lower pane of the USD Stage editor window that made it difficult to see whether the currently selected Layer was the edit target or not.

  • Fixed missing or incorrect Material assignments when exporting some types of Skeletal Meshes to USD.

  • Fixed an issue where it was not possible to duplicate an AUsdStageActor with a loaded stage.

  • [SketchUp] Transparent Materials that use textures with no alpha are no longer translated as opaque.

  • [SketchUp] Opacity scalar and texture alpha are now properly combined to calculate Material opacity.

  • [SketchUp] The proper texture channel is now used as opacity source.

  • Added support for PointInstancer USD prims that have other PointInstancer prims within their prototypes. We now collapse the prototypes into Static Meshes.

  • Fixed an issue where it was not possible to animate the Preview Actor on the Blueprint editor for a Blueprint class that derives the AUsdStageActor, after an instance of said Blueprint was placed in the Level.

  • Fixed an issue where skeletal animations baked into a Control Rig were not exported when you exported their Level Sequences to USD.

  • Fixed a crash that occurred when opening the Level Sequence generated by a Blueprint that derives the AUsdStageActor class, while the Blueprint editor for that class is open in the editor.

  • Fix build errors that occurred when building monolithic editor targets with the USDImporter plugin enabled, but no global ANSI allocator specified.

  • [SketchUp] Fixed normals when baking transforms into a mesh.

  • [SketchUp] The Datasmith Export Plugin for Sketchup now displays a warning message when the version of SketchUp 2020 is unsupported. The plugin for SketchUp 2020 requires at least version 2020.2.

  • [SketchUp] Fixed Component/instance name change synchronization.

  • [MDLImporter] Fixed crash with baked textures.

  • [SketchUp] Modified the title, tooltip, and status text for toolbar commands to conform to SketchUp guidelines.

  • Fixed an issue where foliage instances marked as "invalid" in Unreal were not exported to USD when the Level was exported.

  • Fixed a crash that could potentially occur when importing using the Actions > Import command in the USD Stage editor windowmenu, and having the corresponding AUsdStageActor's Level Sequence open in the Sequencer.

  • Fixed an issue where toggling visibility on the USD Stage editor for prims with animated visibility opinions did not show/hide child prims.

  • Fix an issue where the AUsdStageActor overwrote its Time with its stage's StartTimeCode whenever its Level was loaded.

  • Fixed an issue where skeletal mesh components generated when you open a USD Stage via an AUsdStageActor didn't animate when going into Play In Editor mode.

  • Fixed an issue where skeletal animations failed to import from USD when the skel:animationSource relationship was specified inside of the Skeleton prim itself.

  • [SketchUp] Removed global variables, and fixed use of chdir.

  • Fixed an issue where glTF variants were not loaded in some scenarios due to name collisions.

  • [3ds Max] Fixed a crash that occurred when exporting RailClone while using a renderer other than the default 3ds Max renderer, for example, Corona.

  • Fixed a crash that occurred when importing a USD Stage with SkelRoot prims, and using the ExistingActorPolicy and ExistingAssetPolicy import options to append Actors but replace Assets.

  • Fixed support for UTF-8 character encoding in the glTF exporter.

  • Fix an issue where right-clicking and deleting a prim with a reference in the left pane of the USD Stage editor could cause the referenced prim to be deleted with it.

  • Fixed an issue with the glTF exporter determining texture coordinates for certain combined material properties (Metallic/Roughness and Clear Coat Intensity/Roughness).

  • Fixed a crash that occurred in some scenarios when exporting skeletal meshes to USD.

  • Fixed a crash that could occur when logging multiple import errors or warnings during a multi-threaded step.

  • Fix an issue where values for Light elements were skipped when they were very high or very low.

  • DatasmithContent: Updated triplanar mapping, normal fixup, and parallax occlusion mapping.

  • DatasmithContent - Changed the default Opacity Mask Clip Value from 0.333 to 0.5 to support path tracing.

  • Fix an issue that occurred when importing or opening a USD stage, where no animation tracks would be generated for animated cameras if the Camera prim had both animated transforms as well as animated camera attributes.

  • Fixed issue that prevented cameras with infinite projection from exporting correctly in glTF exporter.

  • Fix an issue where materials generated when importing or opening USD Stages used non-virtual texture samplers, even when the textures used were imported as virtual because they had high resolutions.

    • [Solidworks] Assembly configuration export fixes.

    • [Solidworks] Lights export fixes for light names and spotlight direction.

  • [3ds Max] Various fixes for CoronaLight Cylinder orientation, Photometric light attenuation, Arnold light intensity, CoronaSun color/temperature, and VRaySun color/temperature.

  • [3ds Max] Updated the Forest Pack API to the latest version, and fixed some stability issues.

  • Groom and groom cache import settings specified in Python scripts are now applied properly. If you want to import a groom Asset and groom cache from the same file, and you need to specify their respective import settings, you must import them in separate import tasks..

  • [Solidworks] Display state change now correctly updates Materials via Direct Link.

  • [3ds Max] RailClone object transform math fix.

  • [3ds Max] Fixed export of animated transforms when the parent of an animated node is hidden.

  • Fixed a loading issue with groom caches that were imported in UE4.

  • Fixed a quantization issue on groom with guides groom cache with large displacement.

    • [3ds Max] The Datasmith 3ds Max Exporter plugin no longer changes the names of Max Materials.

    • [3ds Max] Fixed crash for Blend Material with null input Material.

  • Fixed an issue where the import options window was missing when re-importing an Asset from Alembic.

  • Fixed a playback syncing issue between groom cache and geometry cache when rendering in Movie Render Queue.

  • [3ds Max] Only textures referenced in exported Materials are exported.

  • [Solidworks] Default directional lights are excluded from export.

  • [3ds Max] Fixed export of camera parameters for standard cameras.

  • Alembic files imported as Skeletal Meshes are no longer imported if the Meshes are too big or the animations are too long. Both issues caused crashes during import.

  • Fixed an issue where groom caches were not being updated when rendering through remote MRQ.

  • Fixed an issue where Alembic geometry caches imported without "Flatten Tracks" had broken Meshes because the time offset computation was wrong.

  • [3ds Max]: Fixed reimport of RailClone objects.

Deprecated:

  • Removed support for custom extensions EPIC_animation_hotspots and EPIC_camera_controls from glTF exporter.

  • Removed support for creating proxy materials from runtime in glTF Exporter.

Framework

New:

  • Added support for redirecting DataTable row structs in the DataRegistry.

  • Actors can now change which Asset they browse to.

  • Actors can now only browse to Assets who only have an alias exposed.

  • Added a config option to disable the enable / disable checkbox for plugins in the plugin browser.

  • Updated plugin templates to be driven from data.

  • UEditorLevelLibrary::GetGameWorld now returns the editor world instead of the game world.

  • Added delegates in EdModeInteractiveToolsContext that allow UEdModes to receive Render and DrawHUD calls.

  • Added a new UInteractiveToolManager::PostActiveToolShutdownRequest function that allows a Tool to request that it be shut down (for example, a Tool that wants to apply an action and exit on-click).

  • Added a new UInteractiveToolManager::OnToolShutdownRequest delegate. If bound, PostActiveToolShutdownRequest will call this delegate first to allow higher-level code to handle the shutdown request (for example, by forwarding to EdModeInteractiveToolsContext::EndTool).

  • Added Toolstack support to tool menus.

  • Added PIE callbacks to the editor utility subsystem.

Crash Fix:

  • Fixed a crash if no group Actor is selected when attempting to add Actors to a selected group.

Bug Fix:

  • Fixed a bug that caused UEditorLevelLibrary::GetGameWorld to return the editor world instead of the game world.

  • Fixed bug with conflicting GameInstanceIDs used by NetTrace when running multiple sessions in PIE.

  • Fixed a problem when using iris replication where a NetConnection's ViewTarget was not properly updated.

  • Actors and components that aren't in the current editing context can no longer be selected.

  • Actors are no longer considered initialized when running deferred construction scripts due to pending Asset compilation.

  • The editor now forces outstanding Static Mesh compilation when saving a world to prevent construction scripts to be deferred.

  • The editor now tests if the world is valid before running deferred Actor construction scripts.

  • When considering compilation for games specifically, the editor now force compiles Static Meshes of unregistered components. This also prevents unnecessary deferring of construction scripts.

  • Fixed an issue where child Actor components were unable to be selected in the viewport when a user is selecting components inside an Actor.

Deprecated:

  • Deprecated the typed element selection set on the tool builder state. This can be replaced with the context object that exposes the typed element set within an asset editor. This fixes CIS errors and sets us up to remove this next release.

UI

API Change:

  • The FGenericAccessibleMessageHandler::RaiseEvent() function no longer takes a list of parameters and instead need to take a FAccessibleEventArgs struct. Users that use this API must upgrade the parameters to the new struct params.

New:

  • UStructs can now provide a CanEditChange override by setting the TStructOpsTypeTraitsBase2::WithCanEditChange trait.

  • The Reset to Default button is no longer hidden when a details row is disabled. Instead, it is grayed out.

  • Exposed SBorder's protected methods GetBorderImage() and GetBorderBackgroundColor().

  • KiB/MiB/GiB/TiB are now accepted spellings for the Units/ForceUnits metadata.

  • Added TAttribute::CreateStatic() to disambiguate in cases where Create() does not correctly detect that additional arguments are meant to be forwarded to the function.

  • You can now drag EQS queries from the content browser and drop them into the editor world. Additionally, the EQSTestingPawn will be auto-created and set up with the selected EQS query.

  • Added Widget List to Widget Reflector, which lists all currently active widgets, grouped by the location where they were created. This can be useful for pinpointing SWidget leaks. This requires UE_WITH_SLATE_DEBUG_WIDGETLIST to be defined, since it makes use of the functionality in FWidgetList.

  • Created a global name filter for asset paths that external code can assign.

  • SBorder now can be constructed with the .Padding(1,2,3,4) declarative style, just like SBox and widget slots.

  • Added SBox overrides for setting Padding() without constructing an FMargin, as is the case with slots.

  • Details view's IsPropertyReadOnly delegate is now evaluated every frame instead of only when refreshing the tree, similar to how IsPropertyVisible now works.

  • Added support for changing value of a SSpinBox using the mouse wheel. This can be enabled using the EnableWheel argument.

    • Added a new metadata property called WheelStep to specify the step value. The default step is either 1.0, or 0.1 if clamp range is less than or equal to 10.0.

    • Step can be modified by holding Control (1/10) or Shift (10x).

    • Both the internal SSpinBox of SNumericEntryBox and SPropertyEditorNumeric now use this new feature.

  • Added the owning struct name to EditCondition error messages to make it easier to find which property is breaking.

  • Changed UWidget::GetRenderTransform() to return a const reference instead of a copy.

  • Added a filtering mechanism to MainFrame's MRUFavoritesList and LevelEditorMenu's 'Open Recent Level' through an optional DoesMRUFavoritesItemPassFilterDelegate.

  • Timecode properties in details panels now support partial entry.

  • Fixed the SetRowFill RowIndex parameter name.

  • Editor Utility Widgets now use theirDisplay Name in the menu.

  • Section buttons have been changed from a segmented control to a wrap box of buttons instead.

  • Sections can now be multi-selected by holding down the Ctrl key.

  • Section selector visibility can now be toggled from the options dropdown.

  • Exposed SVirtualJoystick::FControlInfo to Slate API.

  • UWidget::IsVisible now checks for render opacity to determine widget visibility.

  • WidgetNavigation Resolve and TryRename now allow for customization of navigation behavior in a plugin for UMG.

  • Added a GetTextLineCount to SMultiLineEditableText and SlateEditableTextLayout to be able to get text line count.

  • Added AddVerifiedEditableText to FMultiBoxBuilder to expose SEditableTextBlock::OnVerifyTextChanged.

  • For list views, created a new delegate called OnFinishedScrolling that fires when an animated scroll finishes.

  • Added new blueprint nodes to set font materials for all types of text, the default style for rich text, and editable text blocks.

  • Added new options for Common Text Blocks to start and stop scrolling text through blueprint such as when a widget becomes hovered and unhovered. This also works with the overflow policy of ellipsis to turn on and off ellipsis when scrolling is active or not.

  • Added new blueprint node to create a dynamic material from a rich text block's default text style.

  • Refactored FGenericAccessibleMessageHandler to raise accessible events that include user Id and additional arguments. This allows more information to be passed around for modules that require more accessibility information, such as User or Controller Id. This creates the basis for multiple users to use the screen reader at the same time.

  • Added SlateScripting plugin, SlateScriptingCommands module and UICommandsScriptingSubsystem.

    • Enables registering commands dynamically within existing UI Command Lists through scripting.

    • Sequencer, Curve Editor, Content Browser, Main Frame, Level Editor and Level Viewports are currently the only systems exposing the command lists.

  • New methods have been added to SOutputLog.h and SOutputLog.cpp to create a new timestamp menu item and submenu in the output log settings menu.

  • The screen reader plugin can now support multiple users at the same time. Developers can provide key bindings to allow players to opt into the screen reader framework for accessibility functionality.

  • Introduced screen reader navigation policies. This allows the screen reader to navigate around UI elements on the screen separate from regular Slate navigation similar to how commercial screen readers behave.

  • Screen reader plugins refactor to use the new accessible focus API to support multiple simultaneous users.

Improvement:

  • Menu searching now works for Material attribute properties.

Crash Fix:

  • Fixed a case in the DrawLine Blueprint API where a crash would occur when points overlapped.

  • Prevented a crash when opening the Static Mesh Editor when using nullrhi.

  • Fixed a crash that occurs when using "Replace With" in the Hierarchy panel. This occurred when selecting a Blueprint that extends a Widget class in the Library.

  • Division by zero in SScaleBox::OnArrangeChildren is now prevented.

  • Fixed nullptr dereference when the level editor module is being unloaded since the tab's parent is already de-allocated if the engine is exiting. This bug is also prevented in Slate altogether.

  • Fixed a crash that would occur when auditing static meshes with no static lighting enabled.

Bug Fix:

  • Increased Content Browser item description width to 700 in tooltips.

  • Property matrix now correctly displays EditCondition checkboxes only when applicable to the row. Property matrix rows also hide if the EditConditionHides metadata is set.

  • SEnumCombo now only dismisses its own menu when an option is selected.

  • Expanding the Advanced subcategory no longer causes previously collapsed nodes to re-expand.

  • When multiple components of an actor are multi-selected and edited at the same time, all of them will now receive a PostEditChangeProperty() call.

  • Details row TitleProperty values are now retrieved recursively. This was a regression from UE4 that caused issues in cases that should have worked, such as with an array of instanced objects, because the category node would cause the search to end.

  • Viewport overlay widgets are now visible even when rendering a full-screen UMG widget.

  • Color picker for color properties on externally added FStructOnScope properties now resets and cancels correctly.

  • Show Only Modified now accounts for the visibility of a custom reset to default handler provided to FDetailWidgetRow::OverrideResetToDefault().

  • Scrolling a row out of the visible region of the Details view now commits any changes that were being made to that row.

  • Numeric properties can have ForceUnits metadata specified for them even inside containers.

  • The FPrimaryAssetId selector now respects DisplayThumbnail metadata.

  • Removed the Create menu's "Blendables" category.

  • The UObject::IsSelected on UVisual is now hidden to avoid confusion with UI selection state.

  • It is no longer possible to dock tabs into docking areas that are contained inside the tab.

  • Added Bengali, Gujarati, Odia, Kannada, Malayalam and Tamil to the list of character ranges that require complex text shaping.

  • You can now search for basic shapes in the Add Component list.

  • EditDefaultsOnly properties on UUserWidgets now appear in the UMG Designer details panel.

  • Fixed an issue preventing edits to Timecode properties in the Details panel from being correctly recognized in the undo system.

  • DefaultGameMoviePlayer now makes sure that a loading screen shows the User Widget until the end of the loading screen.

  • Fixed a case where ContentBrowserDrawer is not marked as the primary content browser when selected in ChooseNewPrimaryBrowser.

  • Correction to SceneViewport to use the cached display metrics instead of the Initial ones which could cause issues when monitor settings or resolution changes when the engine is running.

  • Correction to BP node Play Animation with Finished Event to correctly trigger the finish event on the next frame even if the game is paused and prevent from triggering it if the widget no longer exist.

  • Fixed issues when multiple Widget Interaction Components focus on the same widget.

  • When replacing a binding with new widgets, UMG will move the content of the old binding to the new one rather than reuse the existing binding. This fixes issues where UMG would incorrectly keep old possessable bindings.

  • Curve Editor Stacked View now properly renders labels.

  • Re-enabled color override for the Editor window title bar.

  • The Rendering > Advanced > TextureStreaming/LOD/etc. categories now use the correct display name.

  • NameContent in Details panel rows now correctly respects user-defined HAlign, allowing for labels to contain a HorizontalBox with both left and right aligned slots.

  • Details value widgets are no longer stretched due to property rows having a minimum height.

  • Advanced dropdowns in the Details panel no longer randomly disappear when scrolling.

  • Fixed a bug that caused some calculations with shadow offset not to consider font scale.

  • Fixed an issue where nested utility widgets could cause the open Level to be dirtied since they wouldn't properly be marked transient like the outermost utility widget.

  • Fixed issue where string table selection combobox wouldn't show the filter text box anymore if there were no results, making it impossible to clear.

  • Fixed a bug that would occur in List Views when changing the Consume Mouse Wheel setting to "When Scrolling Possible". This bug caused mouse wheel input to fail being consumed when scrolling up.

  • Fixed an issue where timestamps in asset auditor would use month instead of minute.

  • Fixed an issue where timestamps in the asset auditor would incorrectly clear when a custom audit is cancelled.

  • Fixed typos in "toggle screen messages" outputs.

UX

New:

  • Projects and plugins can now provide enhanced tooltip content for the editor, and they can override the default tooltip content.

    • If you use the SDocumentationTooltip widget, or standard UI items such as menus that create SDocumentationTooltip widgets, you can provide content for enhanced tooltips in the Documentation/Source folder of your plugin or project.

    • You can override default enhanced tooltip content by providing files with the same path and excerpt names as the default ones in Engine/Documentation/Source.

    • If an enhanced tooltip excerpt contains a variable named [VAR:ToolTipOverride], the content of that variable overrides the default content for the initial simple tooltip.

    • If you have documentation that you want to link to from editor widgets or enhanced tooltip content, you can now provide your own custom base URLs. You can define these programmatically by calling IDocumentation::RegisterBaseUrl(), or in the *Editor.ini file as follows: [/Script/Documentation.DocumentationSettings] +DocumentationBaseUrls=(Id="ID",Url="http://myBaseUrl/{PAGEID}").

    • You can specify the base URL ID any time you provide a page ID for a documentation link. For links in code, the methods in IDocumentation now accept an optional parameter. For links in enhanced tooltip files, specify the ID in the tooltip file in either the BaseUrl metadata at the top of the file, or in the [VAR:BaseUrl] variable within the excerpt.

  • VR Editor: Added a dropdown menu to the VR Mode toolbar button which you can use to quickly change between the standard VR Editor Mode and specialized modes such as Virtual Scouting.

  • Rather than specifying VR interactor or teleporter class overrides directly in editor preferences, these are now determined by selecting a blueprintable subclass of VREditorMode.

  • The "experimental" warning popup no longer displays if the Virtual Scouting class is active.

  • You can now use Shift+ left-click to duplicate-drag a pin connection.

  • Scene Capture render targets now start with the alpha channel disabled.

  • Created the experimental Landscape Texture Patch Component to apply repositionable, texture-based landscape height and weight map edits (editor-only).

  • Added proper support for property change type in the spline component visualizer (interactive changes when manipulating spline points, non-interactive change at the end of the drag operation).

  • Added Project Settings to deactivate landscape or water mesh updates during interactive changes of water body or island splines.

  • Reorganised Water Editor Project Settings.

  • Unified landscape brush command shortcuts with other modeling tools

  • Added a command to change both the brush size (left-right mouse move) and falloff (up-down mouse move). The default keyboard shortcut is Ctrl + Alt + right-click drag.

  • Added a DoesCommandSupportInput function to the editor viewport client in order to centralize copy/paste logic.

  • Improved formatting of landscape notifications.

  • Added BP setters for ForcedLOD and LODBias on landscape components.

  • SetLOD can now be called both at runtime and in-editor.

  • Added buttons to select all landscape spline segments or control points.

  • UWaterMeshComponent::ShouldRenderSelected is now editor-only.

  • Added visual logs for when the cache data is accessed and when the cache is expanded.

  • Cache area is now aligned on the whole landscape to avoid expanding the cache when expanding the cached area within the limits of an already sampled landscape component.

  • Decoupled the rendering of the water information texture (flow, depth, and shape data) from the landscape.

  • Implemented separate render passes leveraging the SceneRenderer interface to draw the water data at runtime.

  • Added a new optional Water LOD system which replaces water mesh tiles at a distance with simplified, non-dynamically tessellated meshes. This allows the water rendering system to scale for large worlds without needing to increase the resolution of the Water Info texture.

  • Added functionality to open other Content Browser instances by right-clicking on the tab of a Content Browser.

  • Changed the Close Tab keyboard shortcut from Ctrl + F4 to Ctrl + W.

  • Checkboxes in filter menus now show an indeterminate state when items in the sub-menu are a mix of enabled and disabled.

  • The Details Panel now shows a modified badge when any view option that filters down the results is active.

  • Renamed Select Mode in the Level Editor toolbar to Selection Mode.

  • Add functionality to the Outliner to see the current hierarchy of items stacked at the top. This can be enabled by enabling the Stack Hierarchy Headers option in the Outliner.

  • Exposed a function to sync to the current folder in the Content Browser to scripts.

  • Added a notification for when all Content Browsers are locked and the user tries to open one.

  • Redesigned the Physics Asset Profiles panel to be aligned with the UE5 style.

  • Added functionality to scroll to the current selection on pressing the F key in the Outliner.

  • Updated the column view in the Content Browser to use similar workflows as other column views in the editor (like the Outliner).

  • Water bodies with null materials can now cut holes in the water mesh quad tree.

  • When an item in the Outliner is selected and collapsed, the parent items are now highlighted.

  • Updated async notifications to be consistent with the UE5 style for all notifications

  • Added support for collision view mode for landscape heightfield collision components. The collision data is displayed when the CVar ShowFlags.Collision is set to 1. The CVar "landscape.ShowCollisionMesh" is used to determine which heightfield is displayed: 1 corresponds to the complex heightfield, 2 to the simple heightfield, and 3 to the editor-only heightfield.

  • Added a one-time popup for a user's industry for analytics. This popup can be suppressed either by turning off all analytics or specifically with bSuppressIndustryPopup on UAnalyticsPrivacySettings.

  • The Level Editor now supports up to 4 Outliners that can be enabled from the main menu (Window > Outliner).

  • Added a dedicated set of icons for Plastic SCM.

  • Added an edit layer insertion dialog prompting the user to choose where a new edit layer should be inserted in the current edit layer stack.

  • Added options to expand or collapse all items to the Outliner Settings menu.

  • Changed the Save and Browse buttons on Asset editor toolbars to icon-only.

  • Added filters for Material Layer Instances and Material Layer Blend Instances to the Content Browser and Reference Viewer

  • Disabled the Pinned Column and Context Menu options in the Outliner on maps with World Partition disabled.

  • Renamed the Level Column to Package Short Name in the Outliner on World Partition-enabled maps.

  • Adding BoldItalic and Italic font style to FStyleFonts. These are used in the AnimCurve viewer and Class Viewer respectively.

  • You can now use the Shift + Click shortcut to copy / paste in the Details panel.

  • Added support to copy / paste between different color types.

  • Added AllowCreate to SObjectPropertyEntryBox / SPropertyEditorAsset to prevent creating new Assets from the asset picker. This behaves similarly to NoCreate metadata on UPROPERTY, but allows on a non-property based customization.

  • The editor now allows painting on the edges of landscape components.

  • Added option to export a single file for grid-based worlds.

Improvement:

  • Landscape scene proxies are now only refreshed if CVarLandscapeShowCollisionMesh has changed from the previous value. This prevents hitches when unrelated CVars are modified.

  • The details section API has been rewritten so that categories can now be part of multiple sections simultaneously.

  • Sections are now sorted alphabetically. General and All are special-cased to be the first and last categories respectively.

  • Reference Viewer now indicates when the breadth limit has been reached.

  • Reference Viewer Overflow nodes can now be expanded by double- clicking.

  • Reference Viewer UI is more responsive when changing the search depth on large scenes.

  • Edit layer heightmaps and weightmaps are now properly deleted when deleting landscape components.

  • Landscape notifications have been reworked for better readability and to improve notification clutter issues.

Crash Fix:

  • Fixed a crash that happened when trying to access the visibility landscape mask on mobile: when the mobile mesh path is enabled, there's no such texture. This means that GlobalDistanceField will not support landscape visibility.

  • Fixed a crash that occurred when deleting components because the deleted components were still referenced in the shared weightmap texture usages.

  • Fixed a crash that occurred when using an invalid scale factor on the landscape copy/paste gizmo.

  • Fixed a crash that occurred when invalidating the lighting cache on landscape components.

  • Fixed a crash that occurred when adding spline points to oceans with non-zero shape dilation.

  • Fixed a crash when saving an existing, already-saved map containing a dirty landscape using Save As to rename it.

  • Fixed a crash when loading some Landscapes with ES3.1 preview render mode enabled.

  • Fixed a crash that occurred when copy/pasting landscape and water bodies across levels.

Bug Fix:

  • Fixed multiple issues with highlighting and deleting links using Alt + left-click when both ends had multiple links.

  • Ctrl + mouse wheel in Foliage editing mode now correctly adjusts size in 5% increments per mouse wheel click.

  • Fixed GetCompleteBounds calculation in World Partition worlds when the Landscape is composed of only a single streaming proxy.

  • Fixed a bug that caused Scene Capture render targets to display as a checkerboard in Texture Editor.

  • Fixed the "change landscape brush size / falloff / strength" commands that couldn't work with default chord values nor secondary key bindings.

  • Fixed "cmd" modifier not being taken into account all the time in copy/paste logic.

  • Fix an empty notification being shown when all remaining undo / redo transactions expired.

  • Fixed missing render dependency in Landmass (noise texture), which could lead to blockiness when the brush was running without the texture being fully loaded.

  • Fixed viewport not updating when switching landscape visualization modes.

  • Fixed Painting Restriction not appearing when there's no active paint layer.

  • Fixed "Use target value" in the landscape UX being displayed for sculpt tools while it's only valid in paint mode.

  • Sanitized suggested landscape layer info package name when creating a landscape layer info file associated with a layer name (which doesn't have the same restrictions that package names have)

  • Added support for non-square heightmaps in landscape edit layers local merge

  • Landscape edit layers local merge fixes.

  • Fixed assert when updating heightmaps of different sizes

  • Protected double-click behavior in the Outliner against deleted actors.

  • Fixed incorrect removal of IsGameWorld check in world partitioned-worlds.

  • Fixed a bug where ActorDescReferences was incorrectly used for PIE worlds.

  • Fixed various places where components within the LandscapeComponents member of ALandscapeProxy could potentially be null (they are null in the dedicated server).

  • Unified text formatting of double properties on set.

  • Fixed a delay of many frames while the landscape BP brushes were asynchronously waiting for the required materials to be compiled.

  • Added support for subsections in landscape edit layers local merge.

  • Fixed bHasLayersContent not being set properly for the main ALandscape actor in distributed landscape setups (One ALandscape, multiple ALandscapeStreamingProxy actors), which incorrectly dirtied the Level.

  • Fixed water brush letting the user change the list of affected weightmap layers while it's actually automatically populated by the list of layer names specified in the water bodies.

  • Fixed weightmap changes on water bodies not triggering the appropriate water brush updates.

  • Fixed landscape tools using ShowForMode not displaying properties when in weightmap mode with no active paint layer (Use Target Value and Painting Restriction).

  • Made landscape edit layers read-only, removed related context menu and prevent layer reordering in non edit layers-related landscape tools (Component Add/Delete/Move/Select,Mask,New/Resize Landscape).

    • Don't use a modal error message box when the currently selected edit layer is locked in those tools (since they're not edit layers-related)

  • Fixed transaction localization for landscape resolution change * Fixed New Landscape - Fill World not being transacted

  • Fixed assert when iterating over components from a parallel (game) thread.

  • Delayed the call of CustomBrush_Landmass's GetBlueprintRenderDependencies so that it doesn't start updating it until the brush is ready.

  • Memory reports now properly account for landscape collision.

  • The editor now logs an error when reading inavlid texture data on the CPU with SplineFalloffModulationTexture for Layer Info Object and doesn't apply modulation.

  • The editor now logs an error and reverts to the default texture when reading invalid texture data on the CPU for the alpha brush's AlphaTexture.

  • Fixed undo/redo for Layer Info Object not triggering an update of the landscape splines.

  • Landscapes no longer incorrectly start updating before their textures and materials are streamed in and compiled.

  • Landscapes with Landmass no longer flatten the first time they update when On Demand Shader Compilation is enabled.

  • Fixed data caching function used in the Smooth and Flatten tools when using combined layers.

  • Fixed ASan issue with dirty data (weightmap/heightmap texture resolving debugging code) by removing usage of lambda in favor of direct call to the dirty function.

  • Fixed redundant ifdefs and invalid comments.

  • Removed overallocation of material instances array (was previously done to account for hardware tessellation which doesn't exist anymore).

  • Renamed FLandscapeEditLayerReadbackResult to FLandscapeEditLayerComponentReadbackResult to better match what it actually is and changed the output type of readback results from ResolveLayersTexture from a map to an array.

  • Water Body components now have custom scene proxies which contain the geometry describing that water body as well as a small dilation region to solve undersampling issues with the water info texture.

  • Fixed an issue with resizing of new or imported landscapes by dragging the boundaries not working.

  • Fixed a bug causing no visual indicator highlighting the current selection when using arrow keys to navigate dropdown menus.

  • Fixed default water brush and water zone spawn behavior to more intelligently choose the correct landscape, support multiple landscapes, and set the zone bounds to properly match the landscape.

  • Fixed a bug where top-level menus would draw over tabs in certain situations.

  • Fixed curl noise being applied in both jump flood and cache distance field materials for water bodies, causing deep pockets near the shorelines.

  • Z scaling and non-Z rotation is now allowed for water bodies not rendered by the water mesh.

  • Fixed issue with lingering river mesh components after performing an undo operation.

  • Fixed missing Water in Water Waves Asset Editor.

  • Added a minimum size to the Sources Panel headers in the Content Browser to prevent overlap.

  • Fixed an issue causing drag on the splitters to fail in certain situations

  • Fixed Landscape.DumpLODs console command not producing output.

  • The editor now correctly sets the ParentTab for StaticMeshEditorViewport on spawning that tab, and also checks SEditorViewport::IsVisible for StaticMeshEditorViewport visibility, as it takes into consideration last time on screen.

  • Fixed a bug causing search text in the Content Browser context menu to disappear sometimes.

  • Fixed a bug in the Outliner causing an item to get deselected if it was collapsed.

  • Fixed an issue where frame notifications couldn't be dismissed if they would also time out because the pointer would reset.

  • If dismissing a toast created by the message log, the toast's expire duration is now correctly set to 0.

  • Fixed a bug that affected single-file export for heightmaps/weightmaps.

  • Fixed a problem where users couldn't import a single heightmap/weightmap file if it was named with the same prefix as the grid-based ones located in the same folder (for example, Heightmap.png with Heightmap_x0_y0.png, etc. being present in the same folder).

  • Fixed an assert when generating grass while there's actually no grass data.

  • Altered the ContentPadding of the WrapButton ComboButton so that the button appears as a circle, instead of the football shape that appeared previously.

  • Added the access specifier to Variables under the My Blueprint view.

  • Landscape preview settings no longer affect actual Landscape rendering.

  • The editor now checks that LastOuter is valid before dereferencing.

  • Fixed a bug where a map load triggered navmesh rebuild.

  • Fix an Asset importing error after deleting MobileStarterContent.upack.

  • Fixed an issue with water textures being generated in-editor at insufficient resolution.

  • Fixed landscape not updating on changes to water on Mac and Linux.

Deprecated:

  • The old WaterVelocityTexture has been deprecated and no longer contains data.

  • Renamed EditorViewport.SubMenu.Layouts in StarshipStyle to Icons.Layout and moved it to StarshipCoreStyle.

Foundation

New:

  • A Force reload option has been added for the AutomationOpenMap function.

  • Support for individual test exclusion for different RHI when parent suite does not exclude all RHI Enhanced management of RHI through the UI If a RHI is specifed, any child test can be excluded on an additional RHI by clicking on edit exclusion.

  • Made AFunctionalTest's Author and Description public properties.

  • Used dot syntax to name Blueprint functional tests instead of using the full package path. (replacing / by .)

  • Added an option to keep Play-In-Editor(PIE) open in the advance settings of the Test Automation Window.The Default behavior is off, however this behavior can be changed through project config settings.

  • Improved test exclusion list mechanic.

  • Renamed blacklist to excludelist.

  • Support has been added for the section exclusion rule to be able to exclude entire section of tests.

  • Marked excluded test as skipped in the report instead of entirely removed for test list. A check has been added for exclusion just before running the test.

  • Added support for exclusion management from the Test Automation window and added a column at the end of each row.

  • Exposed device information to the UE test report.

  • Added support for metadata in Gauntlet test report for Horde Limitations.

  • Management through the UI is limited to which tests are available through the active worker node. This means Runtime only tests are not listed from a worker that is Editor and platform specific, and are not clearly identified.

  • Added support for Blueprint Editor Utilities in UE functional tests

  • Added a SetFilter command to the Automation framework.

  • Debug Hud - Stat rendering optimizations. This cuts the cost of DrawStatsHUD by about half.

  • Added Draw text effects (shadow, outline) in same pass as main text draw to avoid calling draw several times.

  • Updated the CharacterList to cache the FCharacterEntry's directly to avoid creation/copying of them.

  • Updated FBatchedElements::AddVertex function to takes float vectors to avoid expensive LWC conversions.

  • Only set SImage MouseDown and DoubleClick event if bound. This can save memory when there are many widgets.

  • Added bAutoCollapseWithEmptyText to UCommonRichTextBlock to mirror UCommonTextBlock.

  • Adding ForEachLoadedAsset to FStreamableHandle. This allows for operations on the loaded assets without creating an intermediate array.

  • Tabs can now be inserted into the tab list.

  • Added the TabIndex parameter to RegisterTab. If a new tab is being inserted before the end of the list, the tab list will rebuild the tabs in correct order.

  • Added the option to defer rebuilding till next tick.

  • Added GetTextStyleSet function to URichTextBlock.

  • Set ConfigCache GetXOrDefault to return value from the config or default value.

  • Set OodleDataCompression to use one OodleScratchBufferCount per core in tools. It will still default to 2 Buffer counts per core for game runtimes. This results in a significant speedup in iostore compression at fast compress levels.

Bug Fix:

  • Avoided duplicates of Screenshot comparison artifacts when producing automated test html/json report.

  • Automated Test report path will now log only if it was generated.

  • Fixed Previously Excluded Test from not inheriting exclusion settings from the parent suite.

  • Added a Fix for incorrect return values for FUntilCommand.

  • Fixed Functional test from not running when the Navigation System is disabled.

  • Validated that the item at the tail of the automation latent command is the item that is completed before removing it.

  • Fixed Automation Worker Instance Name from not being unique for some console platforms.

  • Fixed const in FAutomationTestBase::TestEqual function signatures.

  • Fixes for UCommonActivatableWidgetSwitcher. If the switcher has an owning activatable widget, only activate switcher child if the owning widget is active.

  • Fixed issue in UPlayerInput where analog values weren't cleared when flushing pressed keys.

Deprecated:

  • Deprecated FAutomationTestBase::SetSuccessState and FAutomationTestBase::GetSuccessState functions.

Removed:

  • Disabled exclusion editing on remote sessions.

  • NotEnoughParticipant state in favor of Skipped.

  • Implicit conversions from large world coords to floats by explicitly using float vector types.

  • Direct index cache from the CharacterList as it didn't actually make it faster due to the complex logic when getting a character.

  • Unnecessary include libraries.

Build

New:

  • Added .so and .dylib as files to consider as library files to help reduce relinking on Mac and Linux.

  • Added the ability to compile specific files while a live coding session is active. The output is sent to a different location to prevent conflicts with overwriting object files for the live coding session.

  • Updated EpicGames.Build to be a .NET 6 project.

  • Added Unreal Build Tool plugin support. It is currently only used by C# UHT.

  • Added XGE config bUnavailableIfInUse to allow falling back to a different executor if XGE is in use.

  • Added XGE config MinActions to avoid using XGE for small groups of tasks.

  • Modified assembly cache to not include "ref" or "refint" directories which contain the reference dlls.

  • Added an option to include the CPP/WinRT language projection headers and set the TargetWindowsVersion to the configured value when using Windows 10 SDK.

  • Deprecated bCompileForSize UBT Target option and replaced with OptimizationMode enum to fine tune a balance between speed and code size.

  • Rewrote the GenerateClangDatabase mode in UBT to work with the clang tools like IWYU.

  • Updated the unity file logic in Unreal Build Tool to merge generated cpp files and module cpp files into the same unity files to improve compile times. This can be disabled globally by setting bMergeModuleAndGeneratedUnityFiles in the target to false or in a module by setting bMergeUnityFiles to false.

  • Extended BuildLibForMac.command with more options and better option parsing.

  • Added support to inline the generated cpp files into the module cpp files using a new macro UE_INLINE_GENERATED_CPP_BY_NAME. This improves compile times because less header parsing is required.

  • Added support for targeting arm64 on Win64 with VS2019 in the UAT BuildCMakeLib command.

  • Added a mode called PrintBuildGraphInfo to Unreal Build Tool. This mode prints out build information that can be used to help guide compile time improvements.

  • Added the ability to override the NumIncludedBytesPerUnityCPP from the module rules. This can be used to improve compile times by breaking up large unity files into smaller pieces.

  • Updated several modules to use shared precompiled headers to improve compile times.

  • Added support for targeting the Unix platform group in the UAT BuildCMakeLib command.

  • Added a "deprecation" path for engine includes to allow types to be moved without breaking licensee module builds.

    • Non-engine modules and targets will have to specify the version of includes from IncludeOrderVersion in TargetRules or ModuleRules. This setting will control the value of UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX where XXX is the version of the engine.

    • When moving types out of a header, Users will need to include the new location of the type in the header it was removed from but only if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX is set.

    • If a target does not change its IncludeOrderVersion to the latest version, UBT will print out a message telling users how to upgrade.

    • This change introduces a new set of SharedPCH permutations to make sure modules with older versions get the PCH with UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_XXX set correctly.

Improvement:

  • Updated several modules to compile with unity files to improve compile times.

  • Updated several modules to use shared precompiled header files to improve compile times.

  • Optimized Unreal Build Tool's startup time.

Bug Fix:

  • Enabled the reference assembly to be generated in the old location for all projects that include the UE C# props file.

  • Marked UnrealBuildConfiguration to be serialized to json as a string.

  • Ignored compile actions that aren't using the C++ compiler when doing live coding. Resolves issues where changes that would contribute to the resource file would cause live coding to fail.

  • Fixed issue where compiling script modules in UAT where all modules were up-to-date would result in extra assemblies being returned.

  • Properly exclude build records which fail to parse from the active set of build records.

  • bStressTestUnity will now supersede adaptive unity.

  • Fixed an issue where the generated cpp files were not including the needed headers for the types that were marked in the header file.

Removed:

  • Removed several private precompiled headers to improve compile times.

Core

API Change:

  • FMath::Min/Max now rely solely on a definition of operator < instead of needing overloads for operator <= and >= respectively, so uses of these functions with custom types will now require operator < to be defined.

  • Experimental support for C++ Coroutines which can be used by setting bEnableCppCoroutinesForEvaluation to true

  • The default type for all integer types remains int32.

  • The base-global-module argument is now expected to be in the format --base-global-module=ModuleName.

  • The API previously allowed names up to 256 characters. Callers using longer names will need to use shorter names to avoid a failed assertion.

  • Replaced PanicFlushThreadedLogs with Panic when the program will be forced to terminate, and with Flush otherwise.

New:

  • Added the trace.bookmark console command which emits a TRACE_BOOKMARK. You can provide the argument with a single string which then becomes the bookmark name.

  • Added descriptions for various stat EngineStat commands. The stat description has been added to the output of stat help. Using the command - stat detailed will display the build string version (which includes changelist).

  • Added support for symbols such as "%c" width formatting in FGenericWidePlatformString. Supports "+" and "-" followed by digits as well as "*" for integer value argument.

  • Changed definition of FMath::Min/Max to be based on less-than comparisons. This both improves code generation in certain situations and makes it easier to use them with custom types.

  • Implemented a quick workaround to allow munmaps to happen with Mutex unlocked. Currently, We can't define UE_ALLOW_OSMEMORYLOCKFREE on Linux as we'll deadlock with the OsAllocatorCacheLock.

  • Mutex locks Munmap calls on Linux can take quite a bit of time (few ms in some cases). This should allow these to happen without the Mutex and remove some hitching.

  • Added context to PostCDOCompiled and call it for skeleton-only compiles

  • Support for serialization of TVariants has been added.

  • You can now optionally allow Blueprint class property GUIDs to be included in a cooked build.

  • Added "OnConfigSectionsChanged" delegate to FCoreDelegates, notifying bindees when the config is updated.

  • Added boolean bIsRegeneratingOnLoad to PostCDOCompiled context.

  • Allowed the meta-data for generated types to be cooked as optional data, for use with cooked editors.

  • Added FCoreUObjectDelegates::OnObjectPostCDOCompiled.

  • Added debugger visualizer for FIoStoreTocCompressedBlockEntry.

  • Refactored reference chain searching to handle multiple objects at once to reduce time spent scanning all objects and creating/deleting temporary structures.

  • Added ShortestToGarbage option to prevent duplicate reference chains by the root reference and the first garbage object encountered.

  • Added Special cases for the FGCObject referencer to avoid unhelpful deduplication.

  • Defined a new Tag for PluginBrowser allocations.

  • Added a struct FTopLevelAssetPath to represent the path of an object whose direct outer is its containing package. For example: /Path/To/Package.AssetName

  • Improved support for TVariant visitors that use rvalue-reference function parameters.

  • Added tagging for unassigned allocations.

  • Added TEnumFlagsRange which enables iteration over each flag set in an enum flags variable.

  • Unified a Play-In Editor(PIE) world leak that was reporting with LoadMap leak reporting.

  • Added metadata to crash context for hung thread or present hangs.

  • FNames containing full object paths have been deprecated across the engine. These strings are redundant and can take as much as 30mb of memory in a large project.

  • Added a TIdentity_T<> alias for typename TIdentity<>::Type.

  • Added Peek to TSpscQueue and TMpscQueue.

  • Added append to FString overloads for BytesToHex[Lower], FSHAHash, FGuid and optimized them.

  • Added a command line argument for underrun mode.

  • Added automatic bool-to-integer property conversions.

  • Added UE_ prefixes to math macros, and conditionally deprecated the old macros with a preprocessor switch.

  • Added TArray::Append which takes a parameter for any contiguous range.

  • Added a IsEmpty function to TSpscQueue and TMpscQueue.

  • Always log out config console variable settings when the last write to the console variable was from the constructor.

  • Added FGCObjectInfo::IsGarbage function to check Garbage and PendingKill flags.

  • Renamed garbage streaming levels before GC so that new copies of them can be reloaded when leaks occur with GC reference elimination (pending kill) disabled.

  • Moved TIsCharEncodingCompatibleWith, TIsFixedWidthCharEncoding and TIsCharEncodingSimplyConvertibleTo traits into their own header files.

  • Added conversions for UTF32CHAR-to-UTF8CHAR to FGenericPlatformString::Convert.

  • Windows memory mapping improvements have been added.

  • Added extra information to fname.stats command for hash table memory usage.

  • Fixed units for fixed overhead.

  • TArrayView is no longer passed by a const reference in TSet::Append

  • Added a TSet::Append overload for TArrayView of const argument type.

  • Added a component-wise multiplication operator to FIntVector.

  • Added Support for RotationVector conversions to Quat.

  • Added additional TCString<UTF8CHAR> functionality.

  • Added GET_VARARGS_RESULT_UTF8 macro.

  • Moved TMakeSigned and TMakeUnsigned into their own header files.

  • Added TasksInsights visualization for parent tasks.

  • Updated UE::String::Find* to accept UTF8CHAR views.

  • Added TCHAR<->UTF16 and TCHAR<->WCHAR support in StringConv.h for UTF-8 mode.

  • Added support for FGenericPlatformString::Convert and ::ConvertedLength with null-terminator.

  • Added UTF16TEXT macro.

  • Added MakeUniqueForOverwrite.

  • Added MicrosoftPlatformCrashContext and MicrosoftPlatformStackWalk to share code between Microsoft platforms.

  • When sync loading a package, Zen Loader will only execute nodes required for that package to finish loading.

  • Enabled interface support for AddDynamic and BindDynamic on delegates.

  • Added a minor improvement to deadlock detection in Tasks System. It will now detect waiting for task completion from inside that task execution, even if inside its inner task.

  • Added functionality to Tasks Insights tracing task destruction and a context menu item to jump to task's DebugName in IDE if it's a source location.

  • Added a mode for garbage collection to report a sample of garbage references rather than all of them. This mode can be enabled by setting gc.GarbageReferenceTrackingEnabled to 2.

  • Renamed leaked packages in in LoadMap during GC reference elimination. pending kill is disabled so that new copies of those maps can be loaded as free memory allows.

  • Fixed a missing log in LoadMap when ensures are compiled out.

  • Added ConstCastWeakPtr and StaticCastWeakPtr functions to match the SharedPtr and Reference equivalents.

  • Added nodiscard to relevant sharedptr-related functions.

  • Downgraded failure to obtain package name from file name to a warning in IoStore.

  • Platforms can now opt-in to all-thread backtraces, defaulting to on for Windows and Mac.

  • Fixed WaitUntilTasksComplete function to tolerate null tasks to TaskGraph.

  • Moved support for adding all thread callstacks to crash context from Windows to Microsoft.

  • Added TObjectPtr support to delegates.

  • Added FORCEINLINE to TIndexedContainerIterator dereferencing operators.

  • Added missing LLM tracking tags. Untagged Allocations went from > 40000 untagged allocations to 4400.

  • Instrumented new ParallelFor tasks for Tasks Insights. Markers for ParallelFor tasks now show task lifetime events, and point to which ParallelFor they belong to.

  • Added Extra GC logging from gc.GarbageReferenceTrackingEnabled . Logging will be completely removed in shipping builds regardless of the settings of the console variable.

  • New updates for TasksInsights. When selecting a ParallelFor timer it will draw arrows to and from its ParallelFor tasks.

  • DepletableMpscQueue - a multi-producer/single-consumer concurrent atomic queue that consumes all items at once, atomically, and leaves the queue in a usable empty state.

  • Added support for custom allocator for TSpscQueue and TMpscQueue.

  • Added Math constant constexprification and outlining to reduce massive code bloat.

  • Added delegate FCoreUObjectDelegatess::GetGarbageCollectReportGarbageReferencers for adding additional debug information to garbage reference tracking in GC.

  • Added GarbageObjectsToVerify function to world context to verify that important objects are cleaned up on world transitions.

  • Added commands -DebugCoreRedirects and -FullDebugCoreRedirects to the command line parameter that writes to the log when reading and applying core redirects.

  • Included referencing property information in HandleGarbageReference since it's guarded by a console variable. Allow ENABLE_GC_OBJECT_CHECKS to be overriden outside of GarbageCollection header file.

  • Added command-line options for -EnablePendingKill and -DisablePendingKill to override config setting.

  • Added ForwardAsTuple function as a mirror of std::forward_as_tuple.

  • Added C++ Coroutine Task implementation and support classes.

  • Added support to cross-compile editor plugins through the runUAT BuildPlugin.

  • Improved struct packing for TCounter from 32 to 20 bytes, and FScopedDetailTickStats from 32 to 24 bytes.

  • Added a lower case digits mode for FGuid::ToString.

  • Improved scoped cpu timers for FEngineLoop.

  • Added cpu timers for FEngineLoop::Tick, HeartBeat, TickHotfixables and TickRenderingTickables.

  • Added a scoped cpu timer for FStats::AdvanceFrame.

  • Made TVector2::Normalize function return a bool indicating whether the normalization was successful, matching the TVector::Normalize function.

  • Added FloatCastChecked and FloatFitsIn for runtime validation of acceptable precision loss when casting between floating point types.

  • Added support for signed and unsigned variants of FIntVector, FIntPoint, and FIntRect types.

  • Added support for 32 and 64 bit variants of FIntVector, FIntPoint, and FIntRect types.

  • Added functions ToHostLineEndings and FromHostLineEndings for FString converting between different platform line endings.

  • Updated Oodle to version 2.9.8. Several Oodle Texture encoder improvements to quality and performance, much faster encoding on M1 Macs.

  • Added log highlighting, based on log category and log search string. It uses the following Command line commands: -LogHighlights="LogNet Cyan, LogTemp Green" -LogStringHighlights="UNetConnection::Close=Purple, NotifyAcceptingConnection accepted from=DarkGreen"

  • Added AssetSizeQuery commandlet for rapidly getting asset size breakdown by class. The class summary and assets can now be saved to a .CSV.

  • Assets can be filtered by a wildcard match. This requires the compressed size to have been written back to the asset registry after staging.

  • Added FTopLevelAssetPath struct to represent the path of an object whose direct outer is its containing package.

  • Moved utility functions related to linker tables from FLinker to FLinkerTables to be able to have access to these functions from the AssetRegistry code

  • Garbage Collector can now store information about traversed references which can then later be searched through with FReferenceChainSearch.

  • FReferenceChainSearch will no longer store raw pointers to UObjects when constructing reference chains, instead it will only preserve basic information about UObjects that are separate from UObjects themselves so that FReferenceChainSearch objects can be used more than one frame.

  • Expanded LoadMap world leak tracking to add configurable severity and separate console variables for shipping configuration. This reduces memory usage and adds a low memory usage option for approximate direct reference and outer chain checks.

  • Added support to writing platform specific tags to the asset registry during cook by the book.

  • Allow command line arguments to the engine in LowLevelTests.

  • Added ParallelForWithExistingTaskContext, which is similar to ParallelForWithTaskContext except it takes a pre-allocated array of task contexts and launches one task per context.

  • Limited derived data cache bucket names to 63 characters.

  • Updated FSoftObjectPtr values stored in the asset registry tags to match the current format returned by FSoftObjectPtr::ToString.

  • Added IRequestOwner::LaunchTask to DDC to easily chain together tasks and cache requests.

  • Updated Mac and Linux to use libcurl 7.83.1.

  • Added a partial derived data cache record propagation to the hierarchy.

  • FEditorBulkData can now attempt to read payloads from package files without a valid attachment to the file on disk.

  • Added specializations of TValueOrError for void value and error types.

  • Added TryReadLock and TryWriteLock to FRWLock.

  • Added functions to serialize derived data cache types to and from compact binary, including strings wherever appropriate.

  • Serialized PKG_Cooked and PKG_ContainsNoAsset in the package flags in the FPackageFileSummary.

  • Restricted the giant FGCCSyncObject and FUObjectHashTables locks to the reachability analysis phase.It is possible to toggle to the previous legacy behavior with the command gc.LockBehavior=1.

  • Changed the CppStructOps registration code to use struct path names instead of short names. This allows identically named native structs to be registered in different modules

  • Printing references to stale objects will now take into account GarbageCollectorKeep flags that can prevent an object from being Garbage Collected even though it's not referenced.

  • Added UStruct::GetStructPathName and UClass::GetClassPathName functions that return an FTopLevelAssetPath type instead of an FString. This means that the engine is now enforcing UClasses and UStructs to be 'top-level objects'. Their Outer object can only be a UPackage object which has a null Outer object.

  • Added new utility functions that can be used to fix ANY_PACKAGE deprecation warnings. These functions include:

    • UClass::TryFindTypeSlow

    • UClass::TryFindTypeSlowSafe

    • UClass::TryConvertShortTypeNameToPathName

    • UClass::TryFixShortClassNameExportPath

  • Converted hardcoded short class and enum names to pathnames due to ANY_PACKAGE deprecation.

  • Added EPropertyFlags::CPF_NonNullable that can be used with FObjectProperty to ensure that setting nullptr to the property is a no-op and the set has no effect.

  • Added empty directory deletion to derived data file system cache store maintenance

  • Added automated startup tests to check if class / struct / enum / property metadata contains values with short type names to help with deprecating the ANY_PACKAGE macro.

  • When an assertion fails, logs will now be Flushed to provide more details in the debugger and log files.

  • Per object config sections can now also contain class path names.

  • Added the Packaging Reference Chunk Database system. This allows projects with iostore containers that have already been deployed to customers to upgrade or change packaging compression settings and avoid re-deploying content to end users.

  • This provides the previously deployed containers, and chunks containing the same data will be re-used instead of re-compressed.

  • Added Asset Bulk Data Diff Commandlet.

  • Added "Diff Tags" support. Commandlet and Diff Tags provide a way to understand why the bulk data for a given asset has changed. Changes are grouped by which diff tags caused the change which allow for rapid understanding of large patch sizes.

  • Added LoadFromCompactBinary as a standardized way to load from compact binary.

  • Added derived data cache replay functionality A cache replay can be created from any program that uses the cache, and can be replayed through any cache graph in any program that uses the cache.

  • You can save a cache replay by adding -DDC-ReplaySave=PathToReplay.ddr to the command line.

  • You can load a cache replay by adding -DDC-ReplayLoad=PathToReplay.ddr to the command line one or more times.

  • You can modify the cache priority on loaded replays with -DDC-ReplayLoadPriority=Priority. - For example, -DDC-ReplayLoadPriority=Lowest will queue replayed requests to execute asynchronously.

  • You can modify the cache policy on loaded replays with -DDC-ReplayLoadAddPolicy=CachePolicy and -DDC-ReplayLoadRemovePolicy=CachePolicy.

  • -DDC-ReplayLoadAddPolicy=SkipData will make the replay prefetch into the cache stores earlier in the cache hierarchy.

  • -DDC-ReplayLoadRemovePolicy=QueryLocal will make the replay query only remote cache stores.

  • You can Filter, save, or load operations by combining arguments. -DDC-ReplayMethods=Get+GetValue+GetChunks will process requests of the corresponding methods.

  • -DDC-ReplayTypes=Type1[@Rate1][+Type2[@Rate2]...] will only process requests of the corresponding types.

  • -DDC-ReplayRate=Rate will only process Rate% of the requests that do not match one of the type filters.

  • -DDC-ReplaySalt=Salt configures the salt used to filter by type and rate, which makes them match consistently between sessions instead of being random.

  • You can Load a cache replay with the console command: DDC.LoadReplay ReplayPath [Priority=PriorityName].

  • Added a compact formatting mode to the conversion of compact binary to JSON.

  • Added FindObject function overloads that accept FTopLevelAssetPath struct as the object path name.

  • Extended -DDC-MissTypes with more options to simulate cache misses. In the examples below, is the name of a node in the cache store graph, or you can use All to apply to every node.

  • -DDC-<Node>-MissTypes=StaticMesh+Texture will simulate a miss on every access to to static mesh and texture keys.

  • -DDC-<Node>-MissTypes=StaticMesh@12.5+Texture will simulate misses on 12.5% of accesses to static mesh keys and every access to texture keys. -DDC-<Node>-MissRate=5

  • -DDC-<Node>-MissTypes=Texture will simulate misses on every access to texture keys and 5% of other keys.

  • -DDC-<Node>-MissRate=5 will simulate misses on 5% of keys.

  • -DDC-<Node>-MissSalt=PositiveInt32 will set the salt used to match keys to simulate misses on. A key always has the same simulated miss behavior with the same salt.

  • Added EngineConsoleCommandExecutor to provide IConsoleCommandExecutor outside of the editor.

  • Set UnsafeTypeCastWarningLevel to Error for several widely-used modules. Projects with changes to these Epic-provided modules will need to fix any of these warnings in the modified code in order to build.

  • Unreal logging functionality is now used in LowLevelTests instead of LocalPrint.

  • Upgraded to BLAKE3 1.3.1.

  • Enabled the experimental Unreal Cloud DDC on Mac and Linux.

  • Added FCompositeBuffer::EqualBytes function to compare the contents of two composite buffers.

  • Added ConvertLegacyCacheKey to construct new cache keys from legacy cache keys.

  • Added a commandlet to export an asset registry database to a sqlite database, which allows sql queries of assets, types, and asset tags. This commandlet is in the plugin AssetRegistryExport and must be enabled to be used.

  • Updated zlib to 1.2.12.

  • Added IsInheritedInstance to exports.

  • Added missing generated public hash entries to ArchiveStackTrace.

  • Added support for writing back compressed asset size to an asset registry during or after iostore packaging.

  • Added iostore chunk hashes to the asset registry during cook.

  • Added a dedicated thread for logging.

  • Added -DDC-Verify arguments to control cache determinism verification.

  • -DDC-Verify will verify determinism on every access to the cache.

  • -DDC-Verify=StaticMesh+Texture will verify determinism on every access static mesh and texture keys.

  • -DDC-Verify=StaticMesh@12.5+Texture will verify determinism on 12.5% of accesses to static mesh keys and every access to texture keys.

  • -DDC-VerifyRate=5 -DDC-Verify=Texture will verify determinism on every access to texture keys and 5% of other keys.

  • -DDC-VerifyRate=5 -DDC-Verify will verify determinism on 5% of keys.

  • -DDC-VerifySalt=PositiveInt32 will set the salt used to match keys to verify. A key always has the same verification behavior with the same salt.

  • Added AppendChars(TStringBuilderBase&) to allow string builders to work as the output of algorithms.

  • Reduced stack usage of assertions, crashes, ensures, and fatal logs by between 8 and 24 KiB.

  • Replaced PanicFlushThreadedLogs() with the new GLog->Panic() that switches logging into a mode that the panicking thread takes over log flushing and only redirects logs to panic-safe output devices.

  • Utility functions like FindFirstObject or UClass::TryFindType have been introduced to provide similar to ANY_PACKAGE functionality in scenarios where providing an Outer object or object path name is not possible.

  • Added String/RemoveFrom.h

  • Cleaned global Engine header dependencies by removing includes of "Engine/NetSerialization.h" from global headers.

  • Minor dependency cleanup in ComponentSourceInterfaces.h

  • Added a softobject path table to the package summary header This is to felicitate validation by inspecting the header and allow asset patching by using the header without export loading.

  • Dependency cleanup in Chaos focused on removing includes from ChaosSolverConfiguration.h.

  • Added FStringView constructor to FStringFormatArg.

  • It is now possible to override system guids, which are often used for derived data versions, on a per stream basis allowing the guids to be changed in separate streams without causing merge conflicts.

  • Modified FlushTree to FlushRequest. It will now Automatically propagate explicit package load request association to package dependencies which allow flush requests to process only related packages while skipping others.

Improvement:

  • Optimized the FGCObjectInfo::TryResolveObject function to use only FNames instead of FStrings to search for objects.

  • Improved performance for FLinearColor to sRGB and UNORM conversions.

  • Refactored to store book keeping and allocations separately, including matching allocations to pools with pointer arithmetic.

  • Improved Blueprint API for soft object paths. They can now be easily created from path strings and loaded objects.

  • Renamed related Blueprint functions for clarity.

  • Optimized AssetDataGatherer cache load.

  • Optimized performance by limiting a contention between consumer and producers.

  • Improved AssetRegistry loading optimization.

  • Optimized macro WITH_CASE_PRESERVING_NAME FName loading to help editor startup time.

  • Core constexprification pass to reduce code bloat, improve performance and simplify searching for non-constexpr constants.

  • Optimized BuildCacheKey using FAsciiSet.

  • Improved several TArray comments.

  • Optimization in the LinkerLoad, when it has many bulk data loaders. Turned the TArray into a TSet. This speeds up loading certain geometry caches significantly.

  • Optimized the output redirector to process concurrent logging about 25 times faster

  • Optimized the derived data file system cache for network file shares.

  • Optimized formatting FDateTime to be about 7 times faster.

  • Optimized formatting of log messages to be about 3 times faster.

  • Refactored compiled-in FProperty constructors so that they have the same signature.

  • Improved ensure error message during package save when a name isn't mapped.

Crash Fix:

  • Fixed an unbound delegate crash in the directory watcher.

  • Added crash fixes with small iostore containers by changing the calculation of number of partitions for iostore containers to use the end of the last block rather than the start of last block.

  • Fixed a crash during package reload when failing to purge the old package.

Bug Fix:

  • Blueprint object and field names can now be used with core redirects.

  • Used pass by reference instead of pass by value for TArray to eliminate a copy in the UNetDriver::ServerReplicateActors_PrioritizeActors function.

  • Memory image determinism fixes: When building name patches, compare names case sensitively.

  • Fixed UObject::GetPreloadDependencies not gathering from C++ classes

  • Reserve byte array for FUniqueNetIdRepl::ReplicationBytes to minimize allocations and wasted space

  • Garbage Collection locks are no longer acquired when GIsInitialLoad is true.

  • Fixed an overflow issue where very large float A values would sometimes results in pixels with A=0 on FLinearColor to sRGB conversion.

  • Allow methods that can only be invoked from a constructor be available when fetching vtable addresses for HotReload and Live Coding.

  • Fixed FInstancedStruct edits not propagating to instances when editing a Class Default Object.

  • Fixed bugs in crash malloc. When a small pool was exhausted it became impossible to free any allocations in the pool, because Free used the same search function as Malloc which only considered pools with space available.

  • Fixed FName debug visualizers on clang and gcc platforms.

  • Fixed divide by zero in vectorized TTransform<T>::InverseTransformPosition and TTransform<T>::InverseTransformVector functions that were causing floating point exceptions.

  • When the engine renames a garbage package that cannot be freed because of GC reference elimination pending kill is disabled, removed those packages and their exports from the async loading thread's caches.

  • Fixed a compile error in static analysis builds when copy constructing a 2-tuple of different, but compatible types.

  • Marked packages as garbage in PrepareStreamedOutLevelsForGC so that weak pointers to them in the net driver's guid object cache become invalidated even if they are not freed because of dangling references when GC pending kill is disabled.

  • Fixed LaunchFixProjectPathCase assuming that TCHARs are WIDECHARs and fixed FOutputDeviceStdOutput::Serialize in UTF-8 mode.

  • Fixed memory corruption when converting a null-terminated string via StringConv<UTF8CHAR> where the string ends with two high surrogate pairs.

  • Give DEFAULT_SERVER_FAKE_FORKS a default value for all games/builds.

  • Fixed many invalid uses of TCHAR and TEXT in UTF-8 mode.

  • Fixed FString and TStringBuilder appending UTF8CHARs.

  • Made FFilteredActorCollector keep weak pointers to Actors in order to support disabling GC pending kill reference elimination.

  • Fixed FMapProperty::IsPermutation and FSetProperty::IsPermutation functions.

  • Replaced nullptr_t with TYPE_OF_NULLPTR to prevent errors being reported in IDEs utilizing clangd, like QT Creator.

  • Fixed UTF-8 decoding from emitting multiple chars for a correctly parsed codepoint but invalid value.

  • Fixed TNonRelocatableInlineAllocator leaking heap allocations.

  • Various Niagara class fixes for compiling under C++20.

  • Release pointers to components in FParticleSystemWorldManager when they are marked as garbage.

  • Fix EGuidFormats::Short so that it uses Base64 encoding as the documentation states

  • Fixed compile error in TIsInvocable when given a member function pointer and an incompatible target type.

  • Made TTransform trivially-copyable in vectorized mode.

  • Removed useless ANSI->UTF8 conversions. Fixed incorrect sign extensions during to-UTF8 conversions.

  • Fixed FGenericWidePlatformString asserting and going into an infinite recursion when setting PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION=1 in Windows.

  • Marked LocalPlayer as garbage when removing it from GameInstance to track outstanding references when GC reference elimination (pending kill) is disabled.

  • Disabled the use of PersistentGarbage flag because for removing reported garbage references.

  • Fixed TNonRelocatableInlineAllocator leaking heap allocations.

  • Fixed output when converting a string with an orphaned high surrogate at the end of the input.

  • Added UObject::GetImplementingOuter, an interface counterpart to UObject::GetTypedOuter.

  • Added header with state of editor-only-data-stripping to saved asset registry to allow properly loading cooked asset registries from a WITH_EDITORONLY_DATA binary.

  • Fixed a hang on shutdown of UELibrary caused by the trace thread not being shut down.

  • SceneCaptureComponent releases pointers to garbage Actors pre-GC.

  • Fixed broken assert strings in TArray64 and TArrayView64.

  • Made formatting functions FString::Printf capable of taking char* formatting strings in UTF-8 mode.

  • Fixed incorrect memory ordering in TSharedPtr::IsUnique in ThreadSafe mode.

  • Remove FAndroidPlatformString::Strncmp, which read out of bounds for unterminated string, and fall back to the faster FGenericPlatform algorithm.

  • Inserted dummy values into memory images for names like vtable pointers.

  • Fixed archetype flag from not being set during object duplication during text import of a UObject property preventing serialization and PostEditProperties from reading it.

  • FThread now supports the -nothreading command-line argument.

  • Fixed reversed ordering of mounted containers in the FilePackageStore.

  • Unified the alignment behaviors of FMallocTBB::TryMalloc and FMallocTBB::TryRealloc functions.

  • Made UClass::Implements private to prevent accidental misuse.

  • Added a scope object IModularFeatures::FScopedLockModularFeatureList to easily lock and unlock the list of modular features when accessing it.

  • Fixed render capture provider from firing an assert when accessing IModularFeatures from outside the game thread.

  • Avoid locking the modular features list when calling GetEngineCrypto, since the IEngineCrypto is only accessed once and stored in a static member.

  • Check the IsValid flag when comparing Tboxes, and more generally take the flag more often into account.

  • fixed implicit 64-bit to 32-bit conversion in ParallelTransformReduce.

  • Added CORE_API to FComplexStatUtils struct for games usage.

  • Fixed forwarding of -DDC=<Graph> to child processes to avoid initializing DDC and only forward non-default graph names.

  • Refactored initial load in AsyncLoading to remove the Zen loader dependency on the prebaked script object blob located in the global.ucas. This will rely on NotifyRegistrationEvent callbacks.

  • Made initial loading more robust when Blueprints are referenced by native Class Default Objects.

  • Fixed missing logging of callstacks for failed assertions.

  • Restored the functionality of the command DEBUG OOM. By default the command will leak 1MiB of memory per frame in 64KiB chunks, but these values can now be overridden by entering additional values after the command.

  • FAutomationTestBase::bSuppressLogs will now default initialize to false and keep its value if a derived class change it.

  • Nested subobjects that have overridden properties in a Blueprint are now initialized correctly from their archetype, and not the native default values.

  • Nested subobjects that are part of Objects created from a template will now correctly initialize their properties from the supplied template.

  • Fixed a regression that incorrectly flagged nested template objects as inherited instanced subobjects in the package export map.

  • The correct object will now be looked into when determining if the inherited instance should be instantiated.

  • Fixed CreateFileReader to respect the flags passed to it.

  • We now propagate the necessary object flags when duplicating an instanced subobject to another owner.

  • Calling Rename on a UPackage will no longer reset the loaders for all currently loaded packages which caused memory bloating in the editor.

  • Added support for structured bindings to UE_LOG, checkf, ensureMsgf.

  • Ensure that editor-only subobjects are instanced on load for cooked packages when running on platform targets that include editor-only data.

  • Fixed FObjectPtrProperty::Identical from not respecting deep comparisons.

  • DirectoryWatcherWindows will now handle ERROR_INVALID_PARAMETER when buffer size is too large to watch a network file share.

  • pendingkill flags will now properly clear to prevent asserts when duplicating Actors.

  • Fixed a data race in FAsyncWriter that was in the file output device.

  • AsyncLoading will no longer reconstruct existing destination subobjects in cooked packages, they should always have been created from the correct up-to-date template.

  • Fixed the console command obj refs -history=1 from not looking in Garbage History when it's enabled.

  • Fixed AssetManager ModifyCook to correctly apply cook rules to asset bundles so it handles labels properly.

  • Added ensure to set GIsGarbageCollecting=true for the complete IncrementalPurgeGarbage phase since we always want BeginDestroy to behave the same even if it is called from a full blocking Garbage Collection or from an incremental Garbage Collection step.

  • Fixed destroying a ChildActorComponent from failing an assert in the UObjectBase destructor that was checking for NAME_None.

  • Made GetTransientOuterForRename more available. This can be used to fix a crash when changing a class if that class needs to be within.

  • Fixed the use of FORCENOINLINE and UE_DEBUG_SECTION macros for logging and assertions.

  • Class verification is now being deferred to package import creation time on load whenever appropriate, so that load linker warnings don't emit false positives.

  • Fixed code generation for TFieldPath property in UFunction params.

  • Added propagation of derived data cache records that contain metadata with no values.

  • Fixed deadlocks during crash reporting by avoiding allocations in the FAsyncWriter::SerializeBufferToArchive function on platforms that use FPlatformMallocCrash.

  • Fixed IsDefaultObject to not return true for Class Default Objects.

  • Fixed compilation manager duplicating a subobject when one of the same name already exists.

  • Fixed instanced variable defaults from not duplicating on copy paste.

  • Moved exported symbols from TokenizedMessage to the .cpp file.

  • Fixed data loss that was caused by a failure to look up component templates during reinstancing.

  • Fixed incorrect assignment of GIsConsoleExecutable that caused performance degradation when stdout is redirected to a file or pipe.

  • Removed non-suppressible warnings from SetTimeStamp.

  • Fixed String Tables from not loading Metadata.

  • Fixed an edge case where objects could be post loaded during async loading without having been deserialized.

  • When saving an ini file, the SourceIniHierarchy wasn't being configured correctly, causing things like array clearing to not be handled correctly.

  • Previously an errant heartbeat present hang could be triggered if the macro PLATFORM_PRESENT_HANG_DETECTION_ON_BY_DEFAULT was disabled. This change resolves the initialization of present hang detection settings preventing a race condition that triggered the errant hang.

  • PLATFORM_PRESENT_HANG_DETECTION_ON_BY_DEFAULT can now be safely disabled.

  • Fixed a compile error when STATS is disabled.

  • Fixed potential deadlocks when serializing objects while holding the object hash lock and async building meshes.

Deprecated:

  • Removed out of date CEF content.

  • Deprecated FDateTime plus FDateTime operator.

  • Delegate nested binding types.

  • Deprecated UE_SECURITY_LOG and CLOSE_CONNECTION_DUE_TO_SECURITY_VIOLATION macros.

  • FBlueprintContextTracker::GetScriptStack which returned a TArray copy of the script stack is deprecated in favor of FBlueprintContextTracker::GetCurrentScriptStack and FBlueprintContextTracker::GetCurrentScriptStackWritable which return a TArrayView of the script stack

  • Deprecated PLATFORM_COMPILER_HAS_IF_CONSTEXPR.

  • Replaced DEPRECATED_MACRO with UE_DEPRECATED_MACRO.

  • Deprecate and remove the usage of FUntypedBulkData. Users should use the generic FBulkData or the typed TBulkData.

  • Deprecated StartAsyncLoading and CreateStreamingRequestForRange.

  • Deprecated and replaced the usage of StartAsyncLoading and CreateStreamingRequestForRange with a new batch API for requesting bulk data. The new API fits better with the I/O dispatcher API and does not assume that the bulk data resides in the same I/O chunk. The new API also removes state handling away from the bulk data instances.

  • Bulk Data - deprecate GetPackagePath/PackageSegment

  • Deprecated the public string view literals _SV, _ASV, _WSV, and _U8SV. which have been changed to TEXTVIEW, ANSITEXTVIEW, WIDETEXTVIEW, UTF8TEXTVIEW.

  • Removed aggressive subobject replacement. Replaced with a toggleable audit to report any cases where the aggressive replacement was in use from the replacement archiver.

  • Deprecated ANY_PACKAGE macro support for looking up UObjects using the ANY_PACKAGE macro. Programmers are encouraged to provide the Outer object or object path names when upgrading their project, such as FindObject<UClass>(nullptr, TEXT("/Script/Engine.Actor")) whenever possible.

  • Deprecated FolderName in UPackage and replaced it in PackageSummary with the PackageName.

Removed:

  • Ensure from FName about unfreezing names that were created for a case-insensitive target. We rely on the archive used for serialization to save names with their case intact.

  • References to Actors to help ensure partial GC when there are outstanding references.

  • Removed ignored calculated values from TBigInt::ToInt, FGenericPlatformMallocCrash::InitializeSmallPools and FArchive::SerializeCompressedNew functions.

  • Deleted SavePackage1. It has been replaced by SavePackage2 and is no longer supported.

  • Removed TObjectPtr.IsNull, TObjectPtr.IsNullNoResolve, FObjectPtr.IsNull and FObjectPtr.IsNullNoResolve.

  • Removed deprecated PackageGUID and Dynamic Type from FObjectExport

  • Removed rendering includes from PhysicsPublic.h in favor of forward declarations.

Dev Tools

New:

  • Added commands to open File History, Revision Graph, and Timelapse views from the UnrealVS.P4 menu.

  • UHT will now warn the user if any form of GENERATED_BODY is used in code that is being skipped.

  • Added warnings when C++ UHT is used. These warnings include the reasons why C++ UHT is being used. The warning is currently disabled but informational messages will still be generated.

  • Console feedback is now provided when starting live coding fails packaged builds.

  • Added compile PCH with -fpch-instantiate-templates in Unreal Build Tool if compiling with clang 11+. This flag has shown to improve compile times by 10-20% when using PCH.

  • Added support for deprecation macros for enum values in UHT.

  • Added support for final keyword on structure definitions.

  • Added --include argument to sync subcommand to limit the files synced in Unsync.

  • Added --files flag to info subcommand to list files in manifests in Unsync.

  • Added support for syncing subsets of files in a directory in UnsyncUI. File group is activated by finding any file that matches the regex, then groups from the regex can be used to populate the --include argument to Unsync CLI.

  • Added option to CSVInfo to extract specified stat values from the CSV.

  • Added -showAllStats which outputs all stat samples to the json file as an array.

  • Added -statFilters which lets you specify what stats to output values for.

  • Added additional info to the help text. + Added option to write events with their frame numbers.

  • Added the name of the platform when dumping the Manifest into FinalCopy_XXX.txt.

  • Added a new delegate to the CSV profiler that fires once on frame 0 of the capture so we can send the pause event as soon as valid.

  • The PerformanceTrackingSubsystem now handles sending the pause/resume events.

  • Added option to remove programs when generating project files.

  • Generate a .vsconfig that recommends Visual Studio components to be installed, this will prompt the user to run the installer in the Solution Explorer.

  • Allow custom output directory using -OutputDir= in Generate Clang Database with Unreal Build Tool.

  • Added support for specifying the C Standard when compiling plain C files.

  • Added the ability for an individual UObject class to change how its name is reported in stat IDs. This allows us to change stats like PlayerPawn.NiagaraComponent to PlayerPawn.FootstepFX.

  • Added a few implementations of the ANSI overload of FExternalProfiler::StartScopedEvent. This enables using the ANSI external profiler on all platforms.

  • Added import_text / export_text to wrapped structs in the PythonScriptPlugin. Any struct can now be exported to text or imported from text — similar to what you can do in C++ using the UScriptStruct.

  • Changed "named events enabled" text to render regardless of which path enabled it, instead of only when using the "stat namedevents" path.

  • Added metric for percent of frames where the game thread is over some budget in PerfReportTool. This metric can be added to summary tables.

  • Added OnCSVProfileEndRequested delegate that is called immediately before ending a capture that allows any final information to be written.

  • Added FVector4 support to Unreal.natvis so the W component appears in preview windows without manually expanding.

Improvement:

  • Improved support for contextual logging in UHT.

  • Updated Live Coding to Live++ 1.6.10.

  • Cleaned up formatting in both C++ and C# UHT.

  • Improved logging to show the object type being reloaded.

  • Updated PerfReportTool to treat extra links starting with '/' as links instead of link templates.

  • Changes to the Histogram summary table in PerfReportTool:

    • Removed the hitch table since the tool has a separate hitch summary.

    • New option to suppress the averages table.

    • Reversed from under to over budget.

  • Improved support for PreBuildSteps generating files.

Crash Fix:

  • Fixed a reliability issue with Live Coding where it could crash on startup.

  • Fixed a crash issue when LiveCodingConsole is run independently.

Bug Fix:

  • Fixed net enabled properties when would prevent properties from finding their getter/setter methods.

  • Classes that are detected by live coding that do not change in structure will no longer invoke the reinstancing system since it isn't needed. Changes to default values will be mantained.

  • Fixed an issue where project plugins would not compile with an installed engine.

  • Fixed wrong API macro from being used in C# UHT.

  • Fixed an issue where C# UHT was not catching some Blueprint properties contained in editor only sections.

  • Fixed UHT from failing to add enum metadata to a fixed array when a space appears in the array size.

  • Fixed an issue with LiveCoding reload where a fatal error would be generated even if a class had not changed.

  • Fixed issue where packaged Blueprint builds would not be able to start live coding without first having to clear the live coding source project variable.

  • Fixed a C# UHT issue where unterminated strings were not detected properly and could result in an infinite loop.

  • Fixed an issue in C# UHT where if an old style enum was returned from the "Implementation" method, the zero value would not be wrapped in the TEnumAsByte.

  • Fixed issue where Live Coding could remove properties from a class that contained delegates.

  • Fixed UHT error when class name contains only a prefix.

  • Fixed an issue where C# UHT would not declare shadowing errors where C++ UHT would.

  • The CoreNet header file will now be automatically included in UHT generated code when needed.

  • Fixed an issue where live coding would warn that a plugin was not enabled for live coding. This would happen if the plugin was not explicitly enabled by the project, but was loaded by another plugin.

  • Refactored HotReload/Live Coding re-instancing to re-instance classes more orderly and support the referencing of the new default object prior to the class being re-instanced.

  • Initialized UseShellExecute to the default of the .NetFramework to avoid issues. The default used to

  • Added ShortNames to Code Access plugins to reduce the pressure on path length.

  • Fixed the creation of multiple packages\platforms in a single call in BuildCookRun. The upluginmanifest file needs to be platform specific. It will prevent some of the packages from running otherwise.

  • Fixed csv profiler pause event not firing at start of capture.

  • The skipClient option in Unreal Automation Tool resulted in internal exceptions and infinitely looping test runs. Fix includes:

    • NullAppInstance only completed on WaitForExit, but some tests have completion criteria other than exit. To resolve this, NullAppInstance tests are now considered complete upon creation.

    • IDeviceUsageReporter now takes a platform reference and correctly handles a null platform. No events will be logged when given a null platform.

  • Fixed a C# Unreal Header Tool issue where struct properties were not performing all required validations.

  • Fixed a C# Unreal Header Tool issue where struct serializers were appearing in the wrong place.

  • Fixed the Rider project generator in the presence of platform extension specializations in Unreal Build Tool.

  • Added all files under Unreal Build Tool output directory to fix an issue running build setup on linux builders.

  • Fixed HelmTask in BuildGraph:

    • No longer modify the global kubecontext, but rather pass the context to use into helm.

    • Added an option to specify which kubeconfig to use.

    • Fixed an issue with values not being handled correctly.

  • Fixed an issue with HelmTask in BuildGraph not handling the situation when there were no values files.

Deprecated:

  • Enabled C# UHT by default. Set UEBuilderConfiguration bUseBuiltInUnrealHeaderTool to false to force C++ UHT to be used. C++ UHT will automatically be run if ScriptPlugins are enabled when a C# UBT plugin isn't detected in the same module.

Insights

API Change:

  • Added TraceAnalysis LLM tag which captures all memory allocated by the FAnalysisProcessor.

  • Added Trace/CpuProfile LLM tag which captures allocation of per-thread buffers used by the cpu profiler trace.

  • Unreal Insights: Added Exec function API to IUnrealInsightsModule and to IInsightsComponent.

New:

  • Added "FVirtualWinApiHooks::" and ".*/ConcurrentLinearAllocator.*" to symbol filters.

  • Added support for stats counters with the ShouldClearEveryFrame flag to reset to 0 at the beginning of each Game frame during analysis.

  • Added separate counters for frame variants of stats counters with a ShouldClearEveryFrame flag.

  • Added Open Source in Visual Studio option for any callstack frame of any allocation item, in the Allocs Table/Tree view.

  • Added the Trace.Screenshot command to that creates a screenshot and sends it to the trace file.

  • Added TraceAnalysis and Trace/CpuProfile LLM_SCOPEs to reduce Untagged allocations.

  • Extended the command line argument -ExecOnAnalysisCompleteCmd to be used without AutomationTesting and to run custom commands exposed by Insights components.

  • Added custom response file support for -ExecOnAnalysisCompleteCmd command line argument.

  • Added Tag column to the 4K Page Breakdown view preset.

  • Set the initial sorting mode to Descending for most numeric columns in Timers, Counters, Net Stats, Mem Allocs, and generic table/tree views.

  • Added Auto Open Live Trace toggle option in the main menu. If enabled, the analysis starts automatically for each new live trace session, replacing the current analysis session.

  • Added time limit for updating metadata for a trace. If the time limit is exceeded, the current metadata analysis stops, allowing other traces to update metadata, then it will retry with an increased time limit.

  • Added infinite symbol for End Event Index and Event Distance table columns in Allocs Table.

  • Added sorting for all columns in the trace sessions list view.

  • Changed Ctrl+C when copying the selected CPU/GPU timing event to copy the duration and the metadata of the timing event.

  • Added custom commands exposed by the TimingProfiler: - TimingInsights.ExportThreads file, - TimingInsights.ExportTimers file, - TimingInsights.ExportTimingEvents file [-columns="..."] [-threads="..."] [-timers="..."] [-startTime=...] [-endTime=...], The "..." params defines filters for list of columns, threads or timers; it supports *?-type wildcards.

  • Added Platform, AppName, Build Config, and Build Target of trace session being analyzed to the application title name.

  • Added LLM_SCOPE in FSlateApplication::OnSizeChanged in an effort to reduce untagged allocations.

  • Split the "Stats" column into 4 separate columns: Discovered, Cached, Resolved and Failed.

  • Added sorting for all columns.

  • Added Rename option in the context menu for a trace session. Allows renaming for the selected utrace file. The ucache file is also renamed automatically.

  • Added Delete in option context menu for a trace session. Deletes the selected utrace file. The ucache file is also deleted automatically.

  • Added Insights.Enumerate10K and Insights.Enumerate100K tests that can be run from Unreal Insights on any utrace files.

  • Added filtering for the list of trace sessions by Name, by Platform, by App Name, by Build Config, and by Build Target.

  • Added stats.NamedEvents 0/1 and stats.VerboseNamedEvents 0/1 console commands to be able to force enable or disable the NamedEvents. The existing stat NamedEvents and stat VerboseNamedEvents are still available with toggle state behavior.

  • Added error checking for large memory traces.

  • Added Insights memory scope in various places to capture untagged memory when Insights is running in the Editor.

  • Enabled SameValue aggregation for the Memory Tag column of the Memory Allocations table/tree view. The Aggregated value is equal with it's children value if all children have exactly same value, otherwise the aggregated value is empty.

  • Added Class Name column to the Allocs Table together with a custom view preset.

  • Added more UObject memory scopes to reduce the Untagged allocations.

  • Added F5 key shortcut to refresh the list of trace sessions.

  • Added the console command Trace.SnapshotFile. This command saves a utrace file with content of the trace tail buffers.

  • Added Empty Callstack for callstacks traced/resolved with zero stack frames.

  • Added Asset column and Asset view preset to the Memory Allocations table view.

  • Added "Path Breakdown" grouping for all string columns.

  • Added a toggle button to choose between searching and filtering the list of trace sessions by Name or by the Command Line. Added highlights for searched text.

  • Added LLM_SCOPEs in PythonScriptPlugin to reduce the Untagged allocations.

  • Added TraceUtilLibrary to control Insight traces from Blueprints.

  • Added MemoryTrace function name prefix to ignore callstack frames when detecting the top function of a callstack.

  • Updated icon for the UnrealTraceServer.exe.

  • Added new TimingInsights.ExportTimerStatistics command to the ExecOnAnalysisComplete parameter. This will export statistics for all timers to a CSV file and supports specifying a range inside the trace file through bookmarks.

  • Added "Session Browser" in the main menu. Opens the Unreal Insights Session Browser window.

  • Added "Open Trace File / Open in New Instance..." in the main menu. Starts analysis for a specified trace file, in a separate Unreal Insights instance.

  • Added "Open Trace File / Open in Same Instance..." in the main menu. Starts analysis for a specified trace file, replacing the current analysis session.

  • Added "Top Source File" and "Callstack Size" columns in Mem Allocs table and improved tooltip for "Top Function" column.

  • Updated description of some memory rules to avoid confusion.

  • Added LLM_SCOPEs to each analyzer in TraceServices and Insights plugins to reduce the Untagged allocations.

  • Added memory tracing for D3D11 and D3D12 using the "video memory" root heap / address space to match LLM stats.

  • Added GetTraceDestination, IsConnected and GetActiveChannelsString to public interface.

  • Added tracing for the cooking profiler.

Improvement:

  • Memory insights performance fixes for a large hash bucket in the backtrace.

  • Improved the performance and memory usage for sorting the Function column in the Allocs Table and in the sorting of text columns.

  • Implemented micro-optimizations to sorting code for Timers and Counters.

  • Improved coloring to highlight modules with failed status.

  • Improved performance of sorting,filtering, and grouping operations involving the top function of an allocation's callstack.

  • Improved performance of memory analysis (processing of live allocations in AllocationsProvider) with up to 50%.

  • Switched the short living allocations to use only the linked list, with a reduced size.

  • Improved metadata update by prioritizing the newer trace sessions. enabled parallel update for metadata.

  • Improved analysis of scoped memory events by avoiding a "strlen" for each scoped event.

  • Improved analysis of mem tag events.

  • Improved performance of filtering and grouping.

Crash Fix:

  • Fixed a crash in Unique Values grouping for string columns.

  • Fixed a crash when closing Unreal Insights while having a minor tab undocked in Timing Insights, Memory Insights, Asset Loading Insights or Networking Insights.

  • Fixed TraceStats crashing when the stat name is a wide char FName.

  • Workaround for crash in TRACE_LOG_MESSAGE when encounters string arguments are not null-terminated.

  • Fixed a crash when a CPU timing event has metadata with zero fields.

  • Fixed crash in the analysis of timing events emitted just before EndThread trace event.

Bug Fix:

  • Fixed the command line argument -AutoQuit to work without AutomationTesting.

  • Fixed a bug where changing a preset resulted in hiding the Hierarchy column.

  • Fixed "Audio" LLM child tags for Audio_Analysis, Audio_MetaSound and Audio_SpatializationPlugins.

  • Multiple fixes and improvements to TPagedArray and its iterator.

  • Fixed trace analysis to continue reading at least one more loop after encountering a SYNC point.

  • Fixed case where SourceCodeAccessor remains in a started state and does not respond anymore to more requests.

  • Fixed support for unicode file names for trace files in the UnrealTraceServer.

  • Fixed session name when a trace name contains a dot char.

  • Fixed deadlock for analysis thread when session completes.

  • Fixed issue where the number of Discovered symbols for a module was lower than Resolved and Failed.

  • Disabled Profiler if STATS is not enabled.

  • Fixed the order of GPU and GPU2 tracks.

  • Merged tags that had the same name but different id, when grouping by Tags in Memory Allocs table.

  • Fixed grouping by Tags in the Memory Allocs table when all tags are unknown/untagged.

  • Fixed StatsTrace from incorrectly tracing disabled stats.

  • Fixed callstack tracing not capturing correct backtrace for majority of allocations in Editor Win64 Debug.

  • Fixed analysis of timing events with metadata.

  • Fixed the full name of LLM tags to include parent names when there are multiple levels of inheritance.

  • Fixed track invalidation when a track filter is changed.

  • Fixed TextureProfiler to emit the inline stat spec events only once. The spec events are "important" trace events. These events are cached by the trace system, so they should not be emitted continuously.

  • Fixed Important Events cache stats displayed by Trace.Status console command.

  • Fixed allocations analysis to safely ignore errors re invalid MemoryScopePtr scoped events.

  • Fixed max width for the search boxes.

  • Fixed initialization of Platform Events.

  • Fixed missing tree items when multiple groupings are added in a generic Tree Table view. Groupings are now recursively applied correctly when a grouping creates a hierarchy of node.

Removed:

  • Removed Unique Values grouping for StartEventIndex, EndEventIndex and Count columns.

  • Removed Path Breakdown grouping for Top Function column.

Framework

New:

  • Added support for multiple concurrent devices in RawInputPlugin.

  • Increased the number of Axis to 24 and the number of buttons to 96.

  • Added support for objects being managed by the Significance Manager without reference elimination.

  • Cleaned up references between scene components when Actors are destroyed or streamed out, to avoid holding reference to garbage objects. On destruction, attachments are cleared between components owned by different actors. On un-initialize component, attachments are cleared between components in different outer hierarchies, i.e. different streaming levels. Note that this changes behavior so that attachments between scene components in different levels will be broken when either level is streamed out (made not visible) even if the level is not unloaded and garbage collected.

  • Added query functions for Blueprints to check if there were modifier keys held (Alt, Shift, etc.) given a key state struct.

  • Added logging to indicate when log levels have been raised to verbose levels to help track down log spam.

  • Unified how we modify GCycleStatsShouldEmitNamedEvents so that we guarantee it won't drop below zero.

  • Made FAssetData ~16 bytes smaller (technically 20, but there's an odd number of 32-bit structures now, so we'll shrink 8 when deprecated AssetClass is deleted). This saves about 5MB if the project has 300K+ assets. Ensure you switch any manual manipulation of ChunkIDs to use the helper methods.

  • Optimized code size and overhead for Insights markers generated for scope cycle counters. Down from 213 bytes per marker, to 142 bytes.

  • Added UE::LWC::NarrowWorldPositionChecked run time validating narrowing cast for FVector world positions.

  • Enabled ISPC on more supporting platforms and subsystems.

  • Added a UStruct-type parameter to TStructTypeBitSet type to further improve its type-safety.

  • Added Blueprint Graph Support for FInstancedStruct.

  • Added an "index iterator" to TStructTypeBitSet, allowing iterative retrieval of non-empty indices of a given container.

  • Added UPropertyBag and FInstancedPropertyBag, which allow users to configure and edit custom structs inline via UI or code.

  • Added a function to TStructTypeBitSet to fill an instance with an amount of false or true values corresponding to the number of known types tracked by a given bitset specialization.

  • Extended TStructTypeBitSet to support UClasses as well.

  • Added SetLineThickness() to UBoxComponent.

Bug Fix:

  • Fixed incorrect parent class in data only blueprints if parent class was changed without compiling.

  • Fixed crash after using LiveCoding to remove an interface function while the blueprint editor was open.

  • Fixed an issue where the SceneComponent hierarchy on component destruction was attaching the to-be-destroyed child components to new parents, and did not attach living child components to to-be-destroyed parents.

  • Fixed an issue where there was a possible division by zero in FHistogram::GetAverageOfAllMeasures.

  • Fixed an issue where strong pointers for UGameFrameworkComponentManager::AllReceivers were being stored, so failure to remove actors prevented world cleanup after PIE when GC reference elimination (pending kill) was disabled.

  • Removed the reference from Player to PlayerController when PlayerController removes its reference to Player in OnNetCleanup.

  • Fixed an issue where there was duplication of implemented interfaces in parent Blueprint classes.

  • Fixed an issue where references from LODActor where not being released when SubActors were destroyed.

  • Fixed an issue where user widgets were not being allowed to remove themselves from the player layers in the viewport even if the associated player controller was destroyed.

  • FComponentReference::OtherActor was converted to a weak object reference.

  • Fixed an issue where StructTypeBitSet.StructTracker was not being instanced per module.

  • Converted serialized external actor/component references to weak object references in the debug camera controller so that they don't prevent garbage collection.

  • Fixed the Reset to Default button behavior on Instanced Structs.

  • Fixed several truncation warning to the Engine module and its dependencies.

  • Fixed several issues with MassReplication when adding and removing clients.

AI

New:

  • In MassEntity, shared fragments have been changed from being unique per archetype to unique per chunk.

  • Added MassEntity optimization when new archetypes are added to the system. When a new Archetype is added, the queries will now only check against the newly added Archetypes, instead of running against all available Archetypes.

  • Removed the MassEntity Archetype filter because the system no longer shares fragments per archetype (fragments are shared per chunks). Users should now use Chunk filters on shared fragments.

  • Added a button in the property grid that validates the Mass Entity Config asset.

  • Added code that detects an infinite loop in BTDecorator_ConditionalLoop, just like in BTDecorator_Loop.

  • Added a new console command that freezes any Mass Movement. This helps users debug Mass Movement.

  • Added functionality to Mass Trait to allow users to specify fragment ownership and dependencies.

  • Added option where the user can specify to incur most of the Mass Fragment initialization cost in the first frame, instead of spreading the cost throughout the first period.

  • Added a pop up toast that informs the user that no errors were detected during the MassEntityConfig validation process.

  • Stopping a Behavior Tree during processing is now supported. The request is queued until the Behavior Tree processing is completed.

  • ANavigationData now supports external packaging. This prevents sublevel navigation data from being discarded when using OFPA.

  • Added a warning to UNavigationSystemV1::GetNavDataForProps when using invalid FNavAgentProperties.

  • The NavMesh tile pool can now be resized when being built through the UWorldPartitionNavigationDataBuilder (ignoring bFixedTilePoolSize).

  • A warning will now appear when tiles cannot be added to the NavMesh because the tile limit has been reached.

  • The NavMesh debug display property bHeightfieldSolidPostRadiusFiltering has been renamed to bHeightfieldSolidPostInclusionBoundsFiltering. In addition, several properties were given descriptions.

  • The initialization of dtNavMesh parameters have been moved to the init() and the parameters are now serialized in ARecastNavMesh. This provides safer initialization flow and fixed potential mismatches between the NavMesh Actor and the serialized NavMesh data.

  • Changed bAutoDestroyWhenNoNavigation to be false by default in the NavMesh.

  • The NavMesh FGameplayDebuggerCategory_Navmesh can now display navigation data name, even if not a ARecastNavMesh.

  • Added log tracking to FRecastNavMeshGenerator RebuildAll(), independently of hte loading time.

  • Changed OnNavigationGenerationFinished() to display the Actor label and full name, instead of the package name.

  • Extracted FNavigationDirtyElement from NavigationTypes.h and removed all include dependencies.

  • Copying cache data when filling navigation data chunk actors for Navmeshes using the Dynamic Modifiers Only mode.

  • Upgraded to use FVector::FReal rather than floats.

Improvement:

  • The NavMesh will only include the navigation relevant components when computing UNavModifierComponent navigation bounds.

  • Navigation will only update Actors and its components in the Navigation Octree if the Actor has been initialized.

Crash Fix:

  • Fixed a bug in ARecastNavMesh::InvalidateAffectedPaths where a pointer could be pointing to an invalid memory location resulting in a crash.

  • Fixed a bug that would result in a crash when the EQS Details panel was closed while selecting a Test or Generator in an EQS query.

  • Fixed a bug in FEditorBuildUtils::TriggerNavigationBuilder() where a missing package would cause a crash.

  • Fixed an issue where using the World Partition Static Navmesh would cause a crash.

Bug Fix:

  • Fixed an issue where a new stimuli was added while processing the existing ones and this was causing issues.

  • Fixed an issue in the Behavior Tree where a search would result in a Decorator or Service being ticked twice in the same frame.

  • Fixed a bug where the range loop of the AI Perception component would change while iterating through stimuli.

  • Fixed a bug where a Behavior Tree would crash when the Actor destroyed itself while inside a Behavior Tree notification (e.g.: Tick, BecomeRelevant, CeaseRelevant, etc).

  • Fixed a bug where UAIPerceptionSystem UnregisterSource(Actor, SenseClass) would not do anything if a null SenseClass was passed in. Now it correctly unregisters the source Actor from all senses.

  • Fixed a bug where sometimes a Behavior Tree would select the wrong node, if the selected node was a subtree.

  • Fixed an issue in the Behavior Tree where a queued request during a transition would be executed, even if the requestor was not active anymore.

  • Fixed a bug where the Mass Processors Config values that are edited via the Project Settings were not saved correctly.

  • Fixed a bug in the Visual Logger cone macro where the Origin parameter did not match its function definition.

  • Fixed the low height span filtering during navmesh generation (Fixed bugs where the NavMesh would not be generated under low height objects).

  • The World Partition NavMesh builder will now avoid saving empty packages, as the delete operation is already saving them.

  • Updated dtClosestHeightPointTriangle() to check the denominator to prevent NaN results. In addition, this change improved precision and calculation speed.

  • Fixed a bug where the World Partition NavMesh would not generate because of incorrect settings.

  • Recently added Hierarchical Instanced Static Meshes log will not be displayed to reduce clutter.

  • Fixed a bug where the transformed convex collision was generating an incorrect NavMesh.

  • Fixed a bug where the NavMesh would not generate correctly for Landscape Mesh Collision Components.

  • Fixed a bug in dtRandomPointInConvexPoly() where it would return an incorrect value when the s parameter is equal to 1.

  • Fixed an issue where RecastNavMeshGenerator was dirtying tiles if dirty areas overlapped them.

  • Fixed a navigation issue where using bShouldBuildNavigationData and UResavePackagesCommandlet would check out non-navigation data-related assets.

  • Fixed an issue in World Partition Navmesh where WorldPartitionNavigationDataBuilder was checking out packages that were being deleted, overriding their delete status.

  • Fixed an issue in the Navmesh where using int32, instead of FNavTileRef for updated tiles would result in tiles being reused from the tile pool while still being referenced in the updated tile lists

  • Fixed an issue in the Navmesh where using the bShouldDiscardSubLevelNavData property was not working in some use cases. This property now takes effect in ARecastNavMesh::PostLoad(), instead of ARecastNavMesh::PostInitProperties().

  • Fixed an issue where Foliage instance static meshes were not affecting the Navmesh.

  • Fixed an issue where UResavePackagesCommandlet was not waiting for Static Meshes to be compiled before generating navigation data.

  • Fixed an issue with the Gameplay Debugger Navmesh rendering where using bRestrictBuildingToActiveTiles and GetDebugGeometry() would gather data for all active tiles for each tile in the TileSet, instead of doing this once. This was causing high framerates.

  • Fixed an issue with Hierarchical Instance Static Meshes where they were not modifying the Dynamic Navmesh if there were no instances on the component register and the instances were added later on.

Deprecated:

  • Remove some deprecated methods and members in navigation.

AI Debugging

Crash Fix:

  • Fixed an issue where the GameplayDebuggerPlayerManager's editor-time ticking was getting its game-world tick via the tickable object mechanic. This was causing a crash in cases where GameplayDebuggerPlayerManager tried accessing UWorld.

Bug Fix:

  • Fixed an issue where users were not able to summon VisualLog while in the ‘-game' mode. This still requires ENABLE_VISUAL_LOG to be true.

AI EQS

New:

  • Changed the EQS Test's Reference Value to have the opposite effect matching its description and designed function. This change ensures the proper fix up of existing assets in PostLoad.

Crash Fix:

  • Fixed an issue with EQSTestingPawn where undoing editor-time actor movement from a "No EQS query results" location to a "some results" location was causing a crash.

Bug Fix:

  • Fixed an issue where EEnvTestScoreOperator::Multiply was not initializing the ItemScore value.

AI Navigation

New:

  • Added the ability to build navigation for runtime data layers.

  • Added options to select and display internal Navmesh tile generation steps by setting properties on a Navmesh actor.

  • Added the OnNavigationInitDone delegate to UNavigationSystemBase.

  • Added the FindOverlappingEdges() method to get wall edges that intersect a convex polygon.

  • Added debugging code to track when Navmesh regeneration is taking longer than the desired maximum time allocated per frame during the time-slice operation. Slow time sliced tiles are logged both in normal log files and the visual logger. See FNavRegenTimeSlicer::TestTimeSliceFinished().

  • The Navmesh recast ledge span filtering code now supports time slicing.

  • Removed dtOffMeshSegmentConnection::height because it was not being serialized. This variable is currently unused.

Improvement:

  • The corridor now caches navigation data around the path and allows smoother path following, with less access to the navigation data during the path following.

Bug Fix:

  • Fixed an issue with client-side dynamic Navmesh generation.

  • Fixed an issue where the bounds passed to FNavigationOctree::AddNode were not being validated properly.

  • Fixed an issue where the Navmesh rendering colors were not displaying correctly when originating from a recast.

  • Fixed an issue where building the Navmesh by using the chunky region partitioning included the remaining non-divisible cells into the last split.

  • Fixed an issue where CalculateMaxTilesCount() was not changing correctly per platform and target.

  • Fixed an issue where the Navmesh rendering was not displaying some triangles.

  • Fixed an issue where the warning "Can't load actor" would appear when building a World Partition Navmesh. This was caused by Actors being deleted but World Partition not being notified and trying to load deleted Actors.

  • Fixed an issue where the message "The Navigation Mesh needs to be rebuilt" was appearing when running a Listen Server and Client.

  • Fixed an issue where building the NavMesh with disconnected single cells would not build contours.

  • Fixed an issue where the message "The Navigation Mesh needs to be rebuilt" was appearing when there was no navigation being built.

  • Fixed an issue where UInstancedStaticMeshComponent's navigation relevancy could result in removal from the Navigation octree if UNavigationSystemV1::UpdateActorAndComponentsInNavOctree was called after the first ISM instance got added.

  • Fixed an issue where cell size was clamping incorrectly in the RecastNavmesh.

  • Fixed an issue where some memory in FNavigationMemoryStat was not being tracked correctly. We were calling FDefaultAllocator::ForAnyElementType instead of FNavigationMemoryStat::ForAnyElementType and we were not logging memory used via STAT_NavigationMemory.

  • Fixed an issue where the navigable areas were not checking that their recast tile indices would fit into an int32.

  • Fixed an issue where a missing Crowd Manager would result in a nullptr de-reference.

  • Fixed an issue where collision boxes would have their Navigation Area Class reset to NavArea_Obstacle on project load.

  • Added a fix for Server Assert at FNavRegenTimeSlicer::TestTimeSliceFinished upon initializing a session.

AI Perception

New:

  • Added a log message to make it clearer when a perception component is not attached to a controller.

  • Added the ReportTouchEvent() function for touch sense.

AI Smart Objects

New:

  • Added a method to retrieve a Behavior Definition from a request result.

Crash Fix:

  • Fixed an issue with the SmartObjectSystem where trying to register a SmartObjectComponent without a SmartObjectDefinition set would result in a crash.

Bug Fix:

  • Fixed an issue with SmartObjectCollections and Smart Object registrations not working correctly when Smart Objects were placed in a persistent map before the collection was built. The collection building keeps its role as a component-independent Smart Object entity collection.

Audio

New:

  • Added the AudioMotorSim plugin that provides a generic way to compose vehicle behaviors from a set of tunable, reusable components.

  • Added a Source Effect variation of Convolution Reverb.

  • Added a new Reverb AudioGameplayVolume Component, which controls reverb effects upon entering or exiting the associated volume.

  • Added a new Submix Override AudioGameplayVolume Component, which controls submix effect chain overrides upon entering or exiting the associated volume.

  • Added the Absolute Value MetaSound node.

  • Added OnListenerEnter and OnListenerExit Blueprint events for AudioGameplayVolumes.

  • Added the QToBandwidth MetaSound node that converts filter parameter values for ease of use with the Biquad Filter node

  • Added a name field to Audio Gameplay Volume Filter Proxy.

  • Added a name field to Audio Gameplay Volume Attenuation Proxy.

  • Added timecode rate and drop frame data reading from RIFF iXML for Sound Waves.

  • Added the au.Debug.Streaming console command to support audio stream profiling.

  • Added the Ring Modulation MetaSound node.

  • Added the ability to default AudioModulation ModulationControlMix stages to the value of a bus' parameter when changing a mix stage's associated ModulationControlBus.

  • Added the Trigger Select MetaSound node to support passing input triggers to output triggers based on given input indices.

  • Added Trigger On Threshold MetaSound nodes for Float and Integer types.

  • The WavePlayer MetaSound node now supports surround sound audio channel configurations.

  • Constructor pins have been added to allow you to set constant values for the lifetime of a MetaSound asset.

  • Added Bink Audio decoder libraries for Stadia.

  • Added low-level memory tracking for audio spatialization plugins.

  • MetaSound Sources now support surround sound audio output.

  • SoundWave Cue Points can now be accessed from Blueprints.

Improvement:

  • AGVListener tracks active proxy mutators to allow for a removal step.

  • AGVListener tracks owning audio device ID (instead of world ID).

  • Added detail customization to the AudioGameplayVolume Reverb component.

  • Renamed FillMutator to CopyAudioDataToMutator in the AudioGameplayVolume system to better reflect functionality.

  • Restructured creation code path in the AudioGameplayVolume system to remove the need for Super calls.

  • Renamed AudioGameplayVolumeProxyComponent to AudioGameplayVolumeComponent to reduce name length and to better reflect intent.

  • Renamed UAudioGameplayVolumeComponentBase to UAudioGameplayVolumeMutator.

  • AudioGameplayVolume Components may now be added at runtime.

  • Added profiling information for Audio Gameplay Volume Proxy types.

  • Reduced the baseline runtime memory footprint for MetaSounds.

  • Source Data Override plugins can now be implemented for all of our supported platforms.

  • Improved low-level memory tracking in audio-related code to provide more accurate data for analysis and debugging.

  • Re-enabled support for visualizing sound source attenuation shapes with the au.3dvisualize.attenuation console variable.

  • Renamed UMetaSound to UMetaSoundPatch for clarity and in response to community feedback.

  • Audio Modulation destinations now support sets.

  • Audio Modulation sources now support unions and can be mixed with each other at runtime.

  • Audio parameter transmitters will no longer be generated for SoundWave asset types which do not support parameters.

  • Improved support for 3rd party and plugin-defined DataTypes within MetaSounds.

  • Submix sends can now be performed before or after attenuation.

Crash Fix:

  • Fixed a crash that occurred when calling certain Audio Bus Blueprint nodes without input assets.

  • Fixed a crash that occurred in AudioCapture when no audio devices were enabled.

  • Fixed a crash that occurred when undoing changes to AudioVolume assets.

  • Fixed a crash that would occur when using the submix spectrum analyzer with an unclamped hop size.

  • Fixed a crash caused by the Flanger MetaSound node.

Bug Fix:

  • Adjusted Audio Gameplay Volume Proxy activation timing so that other components have a chance to initialize first.

  • Fixed an AudioGameplayVolume issue concerning an uninitialized listener at the origin.

  • Fixed an issue where Audio Gameplay Volume Listener Enter and Exit messages would propagate to disabled components.

  • Fixed errors in several tooltips.

  • Fixed an issue in GameplayStatics involving ownership assignment of new Audio components.

  • SynthComponent will now avoid taking destroyed component pointers when creating audio components.

  • Fixed unexpected Actor lifecycle behavior due to Sound Library holding strong references.

  • Generator nodes in MetaSounds will no longer behave incorrectly when given negative frequencies.

  • Fixed a frequency modulation issue in MetaSounds that would result in frequencies going above the Nyquist frequency.

  • Fixed an issue where the submix buffer listener would erroneously receive audio with sibling submix audio mixed in.

  • Fixed an overflow warning in the Soundscape system.

  • Changes made to virtualized MetaSound parameters from Blueprints or C++ will now be respected.

  • Fixed an incorrect calculation of real values of spectrum in AudioFFT.

  • Fixed an issue where setting the Wet/Dry value on the Compressor MetaSound node would introduce phasing.

  • Mixed values will now be properly passed in the associated parameter's units when using the Normalized Boolean option on a MetaSound Modulator Mix node.

  • Importing a 16-bit .wav file will no longer send a warning to the output log.

  • Fixed an issue where a Modulation Parameter's unit would not display correctly when used in a Control Bus Mix.

  • Undo and redo actions will now function properly when adding and removing MetaSound interfaces.

  • Fixed streaming seek failures in LPCM decoder.

  • Fixed a bug where MetaSounds did not properly virtualize if the WaveInstance's Volume Modifier value is set to 0.

  • Fixed a bug where putting large values in the Bitcrusher MetaSound Node's Bit Depth value would occasionally produce unexpected distortion.

  • Sample count in the Bink decoder is now properly updated when seeking.

  • Correctly modulating a parameter on a SoundWave or MetaSound will no longer display a mismatch warning.

  • The Parameter and Destination mismatch warnings now display all mismatches on the SoundWave or MetaSound.

  • The MetaSound Editor meter values and channel count now display correctly for mono MetaSound Sources.

  • Fixed an issue where MetaSound input nodes would create unexpected connections when renaming.

  • Fixed an issue where using multiple submix spectral analysis delegates would produce incorrect output values.

  • Fixed an issue where MetaSound nodes contained within comment nodes could produce unintended movement.

  • MetaSound assets with non-spherical attenuation will now virtualize properly.

  • SoundWave asset thumbnails will no longer disappear when dragging and dropping.

  • Fixed an issue where enabling the base submix toggle would not affect previewed MetaSounds.

  • Fixed an off-by-one error causing looping SoundWaves within MetaSounds.

Deprecated:

  • The MatchDevice option for Sound Wave Sample Rate Quality has been deprecated.

Blueprint

New:

  • Minor QoL improvements for Blueprint stack traces.

  • Warnings will always display the name of the function that tripped the warning.

  • Complete stack traces have an additional <--- to highlight the top of the stack.

  • Full paths are used, which helps track down the package that has the Blueprint.

  • Exposed UCurveBase class to Blueprint.

  • Move Blueprint extensions to private and exposed getters and setters.

Crash Fix:

  • Fixed crash in the script disassembler.

  • Fixed CompileAllBlueprints from crashing on a Blueprint function that contained a delegate input.

Bug Fix:

  • Tooltips for floats were not the same in the My Blueprint window for floats, the display should now include either a single-precision or double-precision next to the float type.

  • Event Dispatcher Inputs will now inform and warn the end-user when there is an existing matching input name.

  • Fixed a missing warning when macro pins have a name conflict.

  • Updated code comment on FScriptMapHelper and FScriptSetHelper FindInternalIndex functions. The API will now redirect potential callers to the more efficient method for iteration.

  • Exposed on spawn properties which use a BlueprintSetter if available.

  • Fixed Loss of precision with String to Float Real conversion.

  • Fixed a regression which caused the root transform to be discarded on a serialized Actor-based Blueprint's instanced component hierarchy after inserting a new root component into its native parent class.

  • Fixed FAssetData from reporting that a UBlueprintGeneratedClass is a UBlueprint which was causing the wrong ActorFactory to be selected.

  • The tooltip for float map values in Blueprint Structures will now show precision Similar to GetToolTipForComboBoxType and GetToolTipForComboBoxSecondaryType.This ensures that we can see the precision of the float type when it's a map value.

  • Fixed an Infinite Loop that was caused from Macros setup not being detected.

  • Fixed a regression that could block property value serialization of import text from creating a placeholder linker object in lieu of a deferred Blueprint class asset at editor load time.

  • Fixed a legacy pin default value mismatch warning check on node reconstruction to handle string diffs that convert to identical values.

  • Blueprint Class Default Object package export creation is now deferred on load so placeholder dependencies can be resolved prior to invoking the native base class Actor. This allows for proper component type override support at the Blueprint editor level.

  • Fixed a CIS Content Error where unhandled implicit casts were found during compilation of a function. The BP compiler had erroneously reported that python nodes might be missing implicit casts.

  • Delegate fixup was not working when bound functions are not in the current Blueprint. A consequence of using doubles in Blueprints is that delegate binding can fail if a native delegate signature uses floats. The proxy function graph will now read this property when it calls the original function.

  • Vector literal pins had lacked precision with high values Similar to other numerical Slate widgets. SGraphPinVector now has a template so that it can choose between a float and double representation. Currently, only the BP editor will use the double variant, while other tools continue to use a float.

  • SGraphPinVector2D and SGraphPinVector4 have been updated to use a template.

  • Fixed FBasicTokenParser::GetToken function to support double literals.

  • Added support for resolving weak references to placeholder linker objects created in deferred Blueprint object serialization paths on editor load.

Deprecated:

  • Deprecate Make Literal Double node Instead of having two float-related literal nodes, we should only have one.

  • Deprecated ClassNames and RecursiveClassesExclusionSet pins on make and break nodes for the native ARFilter struct type.

  • Deprecated UBlueprint::bHasAnyNonReducibleFunction.

Removed:

  • Removed engine plugin test assets that were no longer in use.

Blueprint Compiler

Crash Fix:

  • Fixed a crash when adding or removing variables from a Blueprint that inherits from another Blueprint.

  • Fixed a Blueprint compiler crash that occured after deleting a default instanced subobject element from a set or map variable.

  • Removed a redundant second-stage compilation pass after duplicating a Blueprint with a missing or invalid parent class, which could lead to a crash in certain scenarios.

  • Serializable data is now purged before consigning child function objects to the trash container during Blueprint class compilation. This avoids crashes related to serializing object references after they may have been freed.

  • Fixed a Blueprint compiler crash that occurred when struct type dependencies were missing

Bug Fix:

  • Delegate bindings are now fixed after renaming a custom event node without requiring a full Blueprint compilation pass.

  • Fixed the Blueprint compiler to generate a well-formed bytecode expression for a struct literal term when the struct type declares one or more fields of a type that does not have Blueprint support.

  • Fixed regression when reinstancing Blueprints that have complicated child object graphs.

  • Updated cache dependent lists prior to reloading and/or unloading a Blueprint's outer package.

  • No longer attempt to re-instance artifacts from a previous re-instancing pass when reloading a Blueprint asset.

  • Inherited component template overrides are now being included in Blueprint data validation.

Removed:

  • Removed the Blueprint editor project setting: "Force All Dependencies to Recompile". The command BP.bForceAllDependenciesToRecompile 1 can be used at the console for debugging if still needed.

Blueprint Editor

New:

  • Added a Break This Link command to graph editor, which is displayed instead of the Break Link submenu when there's only one link to display.

  • Exposed enum EAssetEditorOpenLocation to Blueprint

  • Blueprint namespace editor features are now enabled by default.

  • Blueprint graph pin value inspection tooltips are now expandable by default when debugging in PIE.

  • Reportedadditional context to the log without crashing the editor.

Crash Fix:

  • Fixed the source of a potential editor crash during Blueprint namespace harvesting.

  • Fixed a regression that led to an editor crash when right-clicking a Blueprint delegate variable without an active function graph tab.

  • Fixed an editor crash that would occur when replacing one or more references to a conflicting variable name after reparenting a Blueprint class.

  • Fixed a crash that occured when undoing an Add Event operation in the Blueprint Editor.

Bug Fix:

  • Enabled external DLL linkage for SFindInBlueprints (and related) Blueprint editor APIs.

  • Unloaded type assets are now included in the member type selector in the User-Defined Structure asset editor.

  • Blueprint-added component names are now validated on entry to conform to UObject naming conventions.

  • We now defer re-running construction scripts until after we fix up the template hierarchy when duplicating a component in the Blueprint editor.

  • Removed some unnecessary computations in FEdGraphPinReference::GetTypeHash.

  • Excluded override flag members from the optional input pin set on MakeStruct nodes. An "override flag" is an inline toggle-style Boolean edit condition.

  • Inline toggle edit conditions can no longer be exposed directly as an input on a MakeStruct node. This brings the MakeStruct node UX closer to parity with the Property Editor UX.

  • Composite nodes can no longer be pasted into Blueprint graphs that aren't schema-compatible with the node's subgraph.

  • Fixed a regression that could trigger an ensure when editing inherited variable default values in the Blueprint editor.

  • Fixed a regression that caused subobjects instanced from non-native archetypes to fail export creation, which led to some data loss on load.

  • Added guard code to catch invalid Blueprint node spawner references during Garbage Collection.

Blueprint Runtime

Bug Fix:

  • A stub function is now emitted if the Blueprint compiler backend raises an error during translation of compiled script statements to bytecode. This avoids a potential ICE report at runtime.

  • Blueprint execution will now bypass development-only nodes in a Blueprint function graph when a project is configured to compile them out at cook time.

  • Fixed latent call site targets in a compiled Blueprint ubergraph to avoid re-entry when the latent info term is declared as the first argument in the native API signature.

Gameplay

API Change:

  • Now Ability Tasks should make sure to call Super::OnDestroy only after they do anything needed to the Ability pointer, as it will be nulled out after calling it.

New:

  • Added support for Gameplay Effects to add blocked ability tags.

  • Exposed APlayerState::IsSpectator to Blueprints.

  • Added console variable for Blueprint Action Filter Caching. (set BP.EnableActionMenuFilterCaching to true to speed up right click menu in Blueprint graphs)

  • Converted FGameplayAbilitySpec/Def::SourceObject to be a weak reference.

  • Made a Ability System Component reference in the Ability Task a weak pointer so Garbage Collection can delete it.

  • Added WaitGameplayTagQuery nodes. One ia based off of the UAbilityTask and the other is of UAbilityAsync. This node specifies a TagQuery, and will trigger it's output pin when the query becomes true or false, based on configuration.

  • Added a templated version of the GetCharacterMovement function.

  • Added color coordinated outlines to changed nodes/pins in the Blueprint diff window to reflect their diff state.

  • Added virtual method to controllers to control if they participate in seamless travel.

  • Modified AbilityTask debugging in Console Variables to enable debug recording and printing to log by default in non-shipping builds (with ability to hotfix on/off as needed).

  • You can now set AbilitySystem.AbilityTask.Debug.RecordingEnabled to 0 to disable, 1 to enable in non-shipping builds, and 2 to enable all builds (including shipping).

  • You can use AbilitySystem.AbilityTask.Debug.AbilityTaskDebugPrintTopNResults to only print the top N results in log (to avoid log spam).

  • STAT_AbilityTaskDebugRecording can be used to test perf impact from these on-by-default debugging changes.

  • Added the ability to override the list of default Blueprint categories. These can be configured in the Blueprint Editor settings.

  • Exposed functions for fetching a scalar material parameter index and then setting the parameters by index to Blueprint in order to optimize cases with extreme amounts of material parameters where many are set each frame.

  • Made UDataAsset types diffable in editor rather than from text.

  • Removed redundant enum EWaitGameplayTagQueryAsyncTriggerCondition.

  • Removed AActor::DetachFence reducing size of AActor by 16 bytes. It's not necessary to prevent the Actor from being deleted before the component finishes its destruction. In Garbage Collection all objects must complete FinishDestroy before any objects can be freed, and UPrimitiveComponent's fence will ensure both objects live long enough.

  • Added a new Initialization State System to the Game Framework Component Manager. This system allows individual components to register with a global subsystem for handling initialization state changes for an Actor without requiring that the Actor knows about all possible components.

  • Components can broadcast their state during initialization and other components can listen for callbacks on state changes. This is designed to be used with Game Feature Plugins to build game-specific initialization flows that work properly in multiplayer situations.

  • Fixed typos with type name, FMinimapReplicationTagCountMap to match the type name FMinimalReplicationTagCountMap.

  • Added a new PreLevelRemovedFromWorld callback for cases where the handler needs to act on the level while it still has its OwningWorld.

  • Added support for preloading data registries and sources in the editor when a game feature is registered instead of waiting for full activation. This will show the valid keys in the picker UI but can result in missing errors for invalid accesses in PIE. This is currently opt-in with PreloadInEditor on the game feature action.

  • Updated the SignificanceManager which maintains lists of objects to update rather than rebuilding each frame. Previously we would build up the lists of objects to update, and the list of objects requring sequential post work each frame. We now update these lists in Register/Unregister to keep them in sync with ManagedObjects.

  • GameplayTasksComponent and AbilitySystemComponent now support the registered subobject API

  • Moved some replicated members to private access. Derived classes should use the Get/Set functions instead. By default these components keep replicating their subobjects from the ReplicateSubObjects function.

  • Added support for removing plugin-added gameplay tags when a gameplay feature is unregistered. With default settings this will only happen in the editor as removing tags at runtime is much riskier.

  • Added the Blueprint Header View plugin, a new tool to assist developers in converting Blueprints to C++.

  • Create the Platform Input Device Mapper. This provides an interface that platforms can use to create a map of Input Devices to their owning PlatformUser. This will allow for granular control of how many input devices are mapped to a single user, which some platforms want to do differently than others.

  • The API can be used to query what devices are mapped to which user, so that you can easily determine which controller should recieve a force feedback event, or which user has pushed a certain button.

  • Created the FInputDeviceID struct, which represents a single input device such as a gamepad, keyboard, or mouse. These are globally unique, and allocated by the Platform Input Device Mapper. This struct will replace the old "int32 ControllerID" that is used in various places to provide some type safety and maintainability.

  • Added Functions to query all the currently connected devices on a given platform, as well as get their current state and owning platform users. These can be exposed to Blueprints from the local player, game instance, or a subsystem in the future.

  • New delegates for the ConnectionChange and PairingChange of a gamepad device that utilize the new FInputDeviceId and FPlatformUserId.

  • Added functions to the GenericApplicationMessageHandler for the "OnController_X" functions.

  • Added visibility for local function variables inside the Blueprint diff tool.

  • Added debug recording of camera shakes.

  • Added a debug command to filter GameplayCue events.

  • Fixed Typo and format in K2Node_IfThenElse.

  • Added a showdebug Devices command that will display debug info about all current platform users and their connected input devices. This will display some basic information on the screen that will be useful while testing on different platforms.

  • Added an Input Setting to toggle motion controls. This can be useful if you want to enable/disable any logic inside of UPlayerInput::InputMotion. Adding this setting in the Input Settings will make it a config variable that you can simply set per-platform from the DefaultInput.ini, which will be useful when shipping on multiple platforms.

  • Added this flag on the player controller so that you can enable or disable motion controls per player if desired.

  • Added a boolean bShouldFireDelegatesInEditor property to the Enhanced Input Component. This will make sure that only Input Components that have the flag specifically set when they are created will fire in-editor delegates with an Editor Script Guard. This ensures that no game-only input actions will be fired as editor delegates while keeping the implementation details hidden from the editor users.

  • Added Register and unregister camera stand-in property accessors on module load and unload.

  • Added GameplayStatics functions for getting the player's platform user id instead of the older int32 controllerID.

  • Added a ShouldFlushKeysWhenViewportFocusChanges function to the player controller, which allows the GameViewportClient to check if the PlayerController keys need to be flushed when the viewport changes depending on the Input Mode you are in.

  • Blueprint Debugger's search field will now search for actual variable names as well as display names

  • Renamed UMatineeCameraShake to ULegacyCameraShake.

  • Added ability to check if a UInputComponent is in an APlayerController's input stack.

  • Added Override properties for the Player Input and Input Component classes on the Pawn and Player controller. This will give you the capability to override the input classes at the Blueprint level so that you don't need native C++ to override it.

  • Created accessors on the Enhanced Player input for the currently applied mapping contexts and mappings. These functions will make it easier for users to extend this class, while still keeping the AppliedInputContext and EnhancedActionMappings properties const and non-mutable.

  • Added the Enhanced Input Editor Subsystem. The Enhanced Input Editor subsystem will allow you to bind to Input Delegates in Editor Utility Actors or other Editor-time objects. The input is driven by an InputProcessor, and this subsystem will only incur any cost to the user if they manually enable it.

  • Added an input component to the Editor Utility Actor so that you can bind to enhanced input and other runtime input delegates in editor utilities outside of PIE. This will make it easier for virtual production teams to bind input of physical camera equipment to Actors in the level. Listening to input is opt-in per utility, and would currently only be triggered if you create an associated Input Action that is available to the Editor.

  • Made the TickForcedInput function protected on the EnhancedInputSubsystemInterface. Without this, the only place that you can tick the input on the Enhanced Input subsystem would be from the Enhanced Input module itself.

  • Added Degree ATan and Degree ATan2 to the k2node_mathexpression, as well as DegreeToRadian and RadianToDegree functions.

  • Added UTimelineComponent::GetScaledTimelineLength function, which returns the timeline's length divided by the play rate.

  • Changed the default behavior for variable name collisions with a native parent class, Blueprint variables will now be removed and all references in Blueprints will point at the native variable.

  • Added Enhanced Input developer and Platform settings which will allow you to specify per-platform input data. Created a "UEnhancedInputPlatformData" base class that can be subclassed in a Blueprint and placed on specific platforms. By default, this object has a map of Input Contexts that will "redirect" one context to another. This makes it possible to swap out Input Mapping Contexts on specific platforms, with an asset that will simply be added to the input ini of the game.

  • Added Gameplay cameras world subsystem for an easier way to start and stop animations.

  • Added a flag for flushing input when you change the UI mode on a player controller. This will ensure that any input actions get properly canceled and have their key state reset if desired.

  • Added new debug commandsAbilitySystem.DebugAbilityTags, AbilitySystem.DebugBlockedTags, andAbilitySystem.DebugAttribute to the Gameplay Ability System.

  • Automatically upgrade projects with the default input class to use Enhanced Input when the project starts. Enhanced Input is fully backwards compatible and users that were previously using the DefaultInput classes will not see any behavioral change. By default this behavior is on, but it can be turned off with the console variable EnhancedInput.bEnableAutoUpgrade.

  • Added a function to allow you to get the mapping context priority from the Enhanced Input subsystem.

  • Added a Scale by delta time input modifier. This can be useful if you wanted to have your look input implemented, then you don't need to add an additional deltatime call in your input code every time.

  • Added a ControlMappingsRebuiltDelegate delegate to the Enhanced Input local player subsystem. This allows you to listen for changes to control mappings or bindings for the UI and rebuild them.

  • Added support for input pins with multiple connections to the PinValueInspection tooltip.

  • Allow Debugging of Transient Blueprint object instances.

  • Added functions on the game instance and local player to create players based on a platform user id instead of the older int32 controllerId.

  • Fixed the Enum to String Node to not display as a compact node, which was making it look different from a Byte to String for clarity.

  • Added a menu bar to Blueprint Debugger for opening closed tabs.

  • Added better logging to indicate why Gameplay Abilities failed to be activated.

  • Added a project setting to suppress deprecation warnings for specific properties or functions in Blueprints.

  • Added helper methods in the engine to get the local player from a FInputDeviceId.

  • Added an FText action description to UInputAction.

  • Changed the category of the Input Mapping Context description field to be consistent with the input action's.

  • Created a new UnmapAllKeysFromAction function to be more explicit.

  • Added a Blueprint function to get a debug string representation of a Gameplay Attribute.

  • Allow calls to CreateChildActor to supply a function to manipulate properties before the construction script is run.

  • Extended Enhanced Input with a combo Input Trigger. This allows users to trigger an Input Action through the completion of a series of Input Actions that are specified by the user. Users can specify times to complete Input Actions and Input Actions that cancel/stop the combo.

  • Added support for dragging variables onto pins to automatically convert/promote them.

  • Added a new Gameplay Task resource overlap policy to cancel existing tasks.

  • Fixed a comment in the Gamemode class when ending the match.

  • Made action mappings within an input mapping context reorderable in Enhanced Input.

  • Added new ObjectIsA method that is Blueprint pure.

Improvement:

  • Optimized padding in AActor to reduce size from 664 bytes to 640.

  • Improved diff messages for local function variables inside the Blueprint diff tool.

  • Optimized sequencer camera animations by excluding unnecessary systems from the linker, and by using a much simpler bound object instantiator.

  • Refactored component instance data cache to be able to store actor or component instance data

Crash Fix:

  • Fixed a crash that occurred when opening a collapsed node after undoing the creation of a second execution pin.

  • Fixed a crash that occurs when splitting then recombining connected pins.

  • Fixed a potential crash in FBluepirntEditorUtils::FindAndSetDebuggableBlueprintInstances.

  • Fixed a crash when expanding Set Properties in the Blueprint Debugger.

Bug Fix:

  • Fixed issue where replicated loose gameplay tags were not replicating to the owner.

  • Fixed AbilityTask bug where abilities could be blocked from timely garbage-collection.

  • Fixed inconsistencies in the Blueprint diff tool where graphs wouldn't move together when you click a diff entry.

  • Fixed a bug where hovering over variables in the Blueprint diff tool caused them to jump around

  • Fixed a bug where the Add components list search didn't compare non-beautified component names.

  • Fixed an issue when a gameplay ability listening to activate based on a tag would fail to be activated. This would happen if there were more than one Gameplay Ability listening to this tag, and the first one in the list was invalid or didn't have authority to activate.

  • Destroyed the smart object collection Actor rather than using MarkAsGarbage so the level doesn't keep a garbage reference to it.

  • Variables marked EditInstanceOnly inside UStruct variables are no longer visible in the Blueprint details view.

  • Fixed a bug where changing a variable type inside of a Blueprint Structure caused a cannot parse value error.

  • Fixed bug where characters were repeatedly enter falling mode during lateral root motion due to gravity being inverted.

  • Members of structs in instanced objects in components are now correctly displayed.

  • Added an option to the game feature plugin creation template to allow setting EnableByDefault and properly show that in the plugin UI. This is used in Lyra to create default enabled game feature plugins.

  • Fixed a warning about the simulate options of the character's arrow component not being valid.

  • Fixed an issue where Blueprint callable functions on native interfaces were incorrectly detected as invalid.

  • Changed Game Feature plugins to load the DefaultPluginName.ini using the same method as normal plugins so it works on arrays. The old code to load PluginName.ini still runs with a log message.

  • Moved some Gameplay plugins with Blueprint hooks to initialize in PreDefault so they are ready for early Blueprint loads referenced by native code.

  • Changed the Common UI game viewport to check the override delegate before letting the UI block input.

  • Fixed a memory leak that occured when composite data tables have sources with conflicting rows.

  • Fixed editor UI when adding the first game feature plugin to a project, validation would always fail if Plugins/GameFeatures didn't already exist.

  • Fixed GameplayEffects that use Data Registries correctly from warning on load and improved the warning text.

  • Removed code from UGameplayAbility that was incorrectly only registering the last instanced ability with the Blueprint debugger for breakpoints.

  • Fixed NetworkPredictionCVars cmd description mismatch so that the commands match up with their proper functions.

  • Fixed a bug where UAnimDataModel would cause the debugger to hang while generating debug info.

  • Stop and discard camera shakes that are getting recompiled while they're in the previewer tool.

  • Only create a new default subobject when destroying a component if the owner's class is not native. Native owner classes do not have to have a DefaultSceneRoot when you drag in the C++ class directly from the content browser into the level.

  • Fixed BindAction function from not accepting additional function parameters.

  • Added a default console key for Hungarian keyboard layout.

  • Changed FCachedKeyToActionInfo::PlayerInput pointer to a WeakObjectPtr. In order to be Garbage Collected on level transitions.

  • Added a null check on the PlayerInput in OnInputOwnerEndPlayed because it is a weak pointer and not guaranteed to be there.

  • Do not allow pass by reference to be changed for array properties as they are implicitly always pass by reference.

  • Align Client names in Blueprint Debugger with PIE window titles.

  • Created camera shake instances using the world. The parent sequence is running in. This fixes missing context for camera animation sequences inside camera shakes.

  • Fixed SetupAttachment false positive ensure that occured when called on a component that already had an AttachParent.

  • Added a special case to FKismetDebugUtilities::FindClassPropertyForPin for reroute nodes.

  • Fixed Gameplay Ability System Ability getting stuck if EndAbility was called during the lock inside ApplyGameplayEffectSpecToTarget.

  • Fixed BP Debugger Step Over not behaving correctly with Sequence nodes with a branch as the end of the exec line.

  • Fixed a bug where delegate pins in LatentGameplayTaskCall nodes were not correctly compiled with delegates from super classes.

  • Fixed a bug where Debugging mode was not ended if the PIE Window was closed.

  • Fixed a jump resimulation issue that occured on the character movement component.

  • Input Action instance data that is flagged to trigger with StartedAndTriggered will now ensure that the Started delegate will always get called before the Triggered delegate.

  • Fixed sequence camera shakes not being torn-down correctly in some situations.

  • Fixed a bug where MultiLine metadata was applied to all new Blueprint variables.

  • Prevented abstract classes from being used by create object from class nodes

  • Fixed a bug where Step Over would sometimes break inside the function you're trying to step over.

  • Fixed a bug where the Blueprint Debugger would not find debuggable objects in a WorldPartition sublevel.

  • Fixed incorrect documentation of the FNodeHandlingFunctor function.

  • Fixed camera manager's BlendParams keeping outdated information.

  • Changed Make and Break nodes for the FInputActionValue struct in Blueprints to correctly take in a EInputActionValueType enum instead of the incorrect FInputActionValue struct.

  • Call the correct "OnController" function from the SVirtualJoystick. Before it was only calling OnControllerAnalog, which will result in normal FKey's never having their "Released" input be triggered. This fix calls OnControllerButtonPressed and OnControllerButtonReleased for non-analog keys, which will give the correct behavior.

  • Fixed the wrong serial on the first camera animation handle.

  • Fixed character movement data that could be left with dangling UObject references.

  • Fixed a bug in Network Prediction Examples plugin where locally-predicted Actors could exhibit stuttering motion.

  • Fixed deprecated Event Dispatchers on components that do not throw a warning on their attached Actors.

  • Fixed a bug that could allow stale Root Motion Source objects to stay in memory indefinitely.

  • Fixed issue where player pawns would not be spawned from the function RestartPlayerAtTransform.

  • Fixed a bug that prevented Network Prediction Insights tool from showing trace data samples.

  • Clamp the local pixel mouse position to the range of an int32 to prevent invalid casting bounds.

  • Fix to allow users to coerce a BlueprintImplementableEvent with no return value to treat the override as a function rather than an event.

  • Fixed a bug where the jump apex height could vary if root motion was active while a character jumped.

  • Fixed an ensure in FPreviewScene when using a GameMode that derives directly from AGameModeBase.

  • Fixing issue where private functions could be overridden in the "My Blueprint" tab.

  • Collision visibility option in the Blueprint editor.

  • ChildActorComponent now registers to the ChildActor's OnDestroy event. This allows the component to clean up its references if the ChildActor is destroyed through a path that doesn't involve the component itself.

  • The Blueprint callstack will now be dumped when the MostRecentPropertyAddress is null.

  • Fixed empty Actors having a root component with an Edit in Blueprint hyperlink.

  • Fixed issue where Enhanced Input Action node trigger events were incorrectly flagged as unsupported.

  • Updated icons for Enhanced Input assets so they display correctly.

  • Made ClearActionBindings and ClearBindingsForObject virtual on the UInputComponent and overrode the UEnhancedInputComponent to ensure the additional Enhanced action bindings are cleared. Previously calling ClearActionBindings on an EnhancedInputComponent would still leave some bindings uncleared.

Deprecated:

  • Demoted BlueprintSnapNodes plugin to Experimental.

  • Deprecated the IsPrimaryPlayer function on the APlayerState. This function always returned "True" incorrectly. Instead of using this function on the player state, you can use the Player Controller or ULocalPlayer's Platform User ID and check if that is the platform's primary user in the IPlatformInputDeviceMapper.

  • Deprecated UInputMappingContext::UnmapAction.

  • Deprecate the core delegates for OnControllerConnectionChange and OnControllerPairingChange in favor of the new IPlatformInputDeviceMapper versions that will allow you to get info about what gamepad specifically has sent input events.

  • Update SlateApplication and the message handler to take in FInputDeviceId and FPlatformId instead of the old int32 controllerid for controller input.

  • Deprecated the old version InputKey on the base UnrealClient. All Input functions on the client have been upgraded to take in a FPlatformUserId and FInputDeviceId in favor of a single int32 ControllerId.

  • Deprecated the GetPawnPhysicsVolume query in favor of new GetPhysicsVolume query that can be called on any Actor.

  • Made rerun construction scripts editor only.

  • Moved UCSModifiedProperties into sparse storage as only a small percentage of all components stored data in it.

Removed:

  • Removed the UEnhancedInputEngineSubsystem. This will be replaced in favor of a World subsystem after the player input has been separated from the player controller.

  • Removed "Within=PlayerController" on the Enhanced Player Input. This allows you to spawn a new player input without an owning player controller, such as with the editor input subsystem.

  • Removed AbilitySystem.Debug.NextTarget and PrevTarget commands in favor of global HUD NextDebugTarget and PrevDebugTarget commands.

  • Deprecated 5.0 functions from Enhanced Input. Enhanced Input was experimental when these functions were deprecated.

  • Old version of AddMappingContext.

  • Old version of RemoveMappingContext.

  • Old version of RequestRebuildControlMappings.

  • Removed float result components and the float blender system. Implemented double precision and handled float to double conversion during property instantiation.

  • The Default value to the name of the action with the common "IA_" prefix and replaced underscores with white spaces.

  • Removed MultiLine metadata tag instead of setting it to false in Blueprint variable details customization.

  • Unused local variables in Blueprint graph nodes.

Mass

API Change:

  • MASS_DO_PARALLEL is now enable for all non-UE_SERVER builds.

  • All the FMassEntityQuery hosted as properties by processors need to be registered at construction time.

New:

  • Made Mass's multithreading enabled by default.

  • Introduced a MassDebugger UI tool. The tool contains information on:

    • All registered Processors.

    • At runtime shows all Archetypes present at the time of data gathering (which can be manually instigated).

    • Archetypes display their composition

    • Comparisson between archetype compositions is supported.

    • Summary information is displayed when multiple archetypes are selected including total number of entities and memory allocated.

    • Mass Processing Phases' processing graphs along with dependency information

    • The views are synchronized meaning clicking an archetype or a processor in one view will reflect in other views marking relevant elements.

  • Marked a number of Mass or Mass-used systems as save to be accessed off-game-thread. Also added a dedicated traits template for shared fragments.

  • Added a TSharedPtr<FMassEntityManager> member to MassExecutionContext. This change has long been coming, we always use given execution context with only a single entity manager instance, and the lack of connection between context and the manager required some use cases to cache the manager.

  • Mass's original procedural Farm Test has been brought back and can be found in MassEntityTestSuite module.

  • Modified FMassArchetypeSubChunks to support archetype-less entities (i.e. built but not created).

  • Enriched MassEntityQuery with capability to declare USubsystem requirements, that then can be fetched at runtime via the MassExecutionContext. MassEntityQuery requirements are declared just like other requirements with a dedicated AddSystemRequirement call. MassExecutionContext supplies functions for fetching subsystem instances checking if active query declared them as dependency in a given mode (ReadOnly or ReadWrite).

  • Added another flavor of FMassEntityManager::GetOrCreateConstSharedFragment that makes for more consistent hash calculation (the function itself is calculating it).

  • Exposed parts of MassEntityTestSuite for reuse in other test-focused plugins.

  • Mass's gameplay debugger category now displays fragment composition of a selected entity.

  • Added mass.LogKnownFragments console command that prints out all "known" tags and fragments.

  • Added API functions to batch-change entity collection's tags.

  • Separated "entity management" and USubsystem elements of UMassEntitySubsystem. Now UMassEntitySubsystem hosts a shared ref of newly created FMassEntityManager type, and users are free to create their own FMassEntityManager instances to create isolated entity pools.

  • Added a way to mark up MassEntityQueries as owned by a processor and auto-registering such queries. Also added some verification code that ensures all queries run as part of processors are properly marked up as such. This change supports automated, resource-based processor dependencies.

  • Switched UMassEntitySubsystem.FlushedCommandBufferQueue from TQueue<T, EQueueMode::Mpsc> to more efficient TMpscQueue<T>.

  • Resource-based Mass processor dependency solving resulting in finer-grain dependencies resolution. The main change is that if a processor P in group A depends on a processor R in group B we no longer infer group A depending on group B (which was the case previously). In fact, groups are no longer represented outside of dependency solving step - once dependencies are solved we end up with a list of processors ordered in a way respecting both declared "execute after" and "execute before" dependencies but also dependencies resulting from requirements declared by Processors' queries.

  • Added debug name to Mass archetypes.

  • Made Mass gameplay debugger category's use of UMassDebuggerSubsystem optional and instead require UMassEntitySubsystem.

  • Changed how we treat missing dependencies in Mass dependency solving - used to be an error, now we create dummy temporary nodes to maintain before-after dependencies even if used in reference to a non-existing item.

  • Cut UMassDebuggerSubsystem's capability to host entity handles to be debugged and replaced the only use case (in Mass gameplay debugger category) with a custom query to fetch location-owning entities. The old approach had the downside of allowing to pick only entities that had a special debug fragment in their composition, which resulted in confusion while trying to pick entities.

  • Added MassProcessor.ProcessorRequirements to track subsystems (and potentially other elements) accessed by a given processor outside of MassEntityQuery.ForEachEntityChunk.

  • Added support for declaring subsystem requirements to MassEntityQuery and fetching subsystem instances from MassExecutionContext using TSubclassOf.

Bug Fix:

  • Made UMassSignalProcessorBase::OnSignalReceived thread safe.

  • Made MassEntityQuery.ForEachEntityChunk's path for entity collections utilize stored requirements mapping if given archetype is "known" by the query (i.e. its one of the cached archetypes). This is the most common case and reusing mapping save nontrivial of work.

Deprecated:

  • Renamed GET_MASS_CONFIG_VALUE macro in MassSimulationSettings to GET_MASSSIMULATION_CONFIG_VALUE to avoid confusion with the MassEntitySettings' one

  • Renamed FMassCommandAddFragment and FMassCommandRemoveFragment to FMassCommandAddFragments and FMassCommandRemoveFragments respectively.

  • Mass batching-focused API changes. "Old" mass commands completely removed and reimplemented as batched commands using the new batched API. Other renamed types:

    • FMassArchetypeSubChunks to FMassArchetypeEntityCollection

    • FSubChunkInfo to FArchetypeEntityRange

    • FArchetypeChunkCollectionWithPayload to FMassArchetypeEntityCollectionWithPayload

  • Extracted MassExecutionContext into a separate header/cpp files.

  • "System" and "Subsystem" names' use has been made consistent across Mass's code, favoring "Subsystem". A number of function and parameter names has been affected.

  • UE::MassEntity namespace has been renamed to UE::Mass, for consistency with overall Mass namespace naming.

  • Renamed MassProcessingPhase.h/cpp files to MassProcessingPhaseManager.h/cpp

  • MassSchematic and MassSimulationLocalCoordinator have been removed due to no longer being used.

  • Removed UMassLODProcessorBase due to it not serving an actual purpose.

  • Got rid of DECLARE_ENUM_TO_STRING-declared EnumToString functions declared for Mass enums. Use UEnum::GetValueAsString instead.

  • Constified FMassReplicationContext's LOD subsystem access

  • Cut FMassEntityQuery::ParallelForEachEntityChunk as defunct and no loner being used. We consider bringing it back, but it will be a brand new reimplementation to match current subsystem requirements accessing model.

  • Switched MassEntity from supporting interaction with USystems over to UWorldSubsystems. The main reason for the change is to avoid non-UWorldSubsystems special cases we don't utilize nor test at this time. The change is reversible once we have a non-UWorldSubsystem use case.

  • Introduced a FMassDebugger struct to host all debug-time API and avoid polluting other Mass classes with those. Existing debug-time functions will be moved over with time.

  • Renamed FMassExternalSubystemBitSet to FMassExternalSubsystemBitSet

Networking

New:

  • Updated to openssl-1.1.1n on all platforms. The Mac version contains arm64 support.

  • Enabled explicit base names when creating graph nodes in ReplicationGraph. This can improve readability when using logging and debug cmds like RepGraph.PrintGraph.

  • Added -forkautostatsport command-line option that automatically sets a unique port for each forked child with PerfCounters. Ports used will start at statsPort+1.

  • Setting net.AllowPIESeamlessTravel 1 will now enable experimental support for seamless travel in Play in Editor networking.

  • Added cheat to validate the old and new methods of replicating subobjects. Enabled via net.SubObjects.CompareWithLegacy. The comparison is run only for actors that converted to the new list. This calls the ReplicateSubObject virtual so the method still needs to be implemented for the validation to work.

  • Actor classes can officially control which of their ActorComponent get replicated or not.

    • Classes that want to control component replication need to override AllowActorComponentToReplicate to do so.

    • Classes can also return a ELifetimeCondition in the new function and set a net condition to specific components.

    • The override and net condition only work for classes that set bReplicateUsingRegisteredSubObjectList to true.

  • Added option to manually control untracked class reporting in ReplicationGraph.

  • Added optional config that will prevent Actors from replicating if they are not in the BeginPlay state.

    • Enabled via the net.ReplicateOnlyBeginPlay console variable.

    • The only exception is if a RPC is called on an actor before BeginPlay and opens the ActorChannel. This is because when opening the channel to send the RPC, we need to serialize the actor entirely for the client channel opening. If the actor has not begun play yet we will set up their components for replication and serialize them anyway. Note that sending RPCs this early is not recommended if the BeginPlay on the authority sets replicated variables that the client needs in his BeginPlay also.

  • Implemented optional support for assigning a TransactionId for LevelStatusUpdate and ServerUpdateLevelVisibility requests. This is used in multiplayer to allow servers to rely on level visibility status reported by clients to know what data to replicate to clients. Behavior is controlled by two CVars (by default, both are disabled):

    • LevelStreaming.ShouldClientUseMakingInvisibleTransactionRequest — if enabled client will send a request to server and wait for an ack before making a streaming level invisible.

    • LevelStreaming.ShouldServerUseMakingVisibleTransactionRequest — If enabled server will associate a transaction id to each call to ClientUpdateLevelStreamingStatus and wait for the response from the client of that particular request before updating LevelVisibility for replicated data. This is to solve some issues where we might have multiple requests in flight.

  • Added ActorComponent::ReadyForReplication virtual function to ActorComponent initialization flow.

    • This function will be called between InitComponent but before the component's BeginPlay.

    • It can be used to register pre-existing replicated subobjects or set up replicated properties early.

    • This is useful in situations where a component might call an RPC on itself very early inside BeginPlay and trigger the first replication of all its network properties.

  • Added a console variable that controls if actors and actor component classes use the new subobject replication by default or not.

    • net.SubObjects.DefaultUseSubObjectReplicationList needs to be enabled to opt-in to the new method by default.

    • Classes can still choose their own method by setting bReplicateUsingRegisteredSubObjectList in their constructor.

  • Added multiple console variables to control how much time is spent on each step of the replay recording process per frame.

    • demo.ForcePersistentLevelPriority: always record the persistent level first when using level streaming fixes and prioritization

    • demo.DestructionInfoPriority: allow destruction info be to prioritized lower than max int32

    • demo.LateDestructionInfoPrioritize: prioritize destruction info after the active actor set

    • demo.ViewTargetPriorityScale: scale view target replay priority

    • Demo.MaxDesiredRecordTimeMS: update MaxDesiredRecordTimeMS on the current world's demo driver

    • Demo.CheckpointSaveMaxMSPerFrame: update CheckpointSaveMaxMSPerFrame on the current world's demo driver

    • Demo.ActorPrioritizationEnabled: update ActorPrioritizationEnabled on the current world's demo driver

    • Demo.SetLocalViewerOverride: update SetLocalViewerOverride on the current world's demo driver

    • demo.MaximumRecDestructionInfoTime: cap the percent of a budgeted frame that can be spent replication destruction info

  • Added additional recording metadata to replay headers:

    • CheckpointLimitInMS

    • FrameLimitInMS

    • MinRecordHz

    • MaxRecordHz

    • Platform

    • BuildConfig

    • BuildTarget

  • Added -skipreplayrollback to not generate startup actor rollback state.

  • Added network granular memory tracking to multiple replay data structures.

  • Added networking granular memory tracking to multiple data structures.

  • Provided a delegate for game code to listen to for Replay ID updates.

  • Added support for using poll instead of select in BSD sockets. Sockets will use poll by default (if supported by the platform), but this can be toggled with the USE_SOCKET_FEATURE_POLL macro.

  • Added configurable limits for replay event sizes when loading save game replays.

  • Added configurable limits for the maximum number of network exports to read from a replay file during playback.

  • Added net.AllowPIESeamlessTravel to control seamless travel in single process PIE.

  • Added random data to handshake packets in an attempt to work around potential ISP packet-filtering issues.

  • Exceeding the maximum allowed replication size for an object now generates an ensure for improved visibility.

  • Make servers send close-reasons/NMT_CloseReason to client, for log-info/debugging.

  • Added more NetDriver/Beacon close reason coverage.

  • Added logging to help debug amortized replay replication times.

  • Added an API to retrieve the changelist a replay was recorded on while playing back the replay.

  • Use UWorld RemoveNetworkActor instead of directly calling NetDriver RemoveNetworkActor during seamless travel tick in case there is no NetDriver.

  • Improved LLM tag coverage for networking memory.

  • Added a compile time option for inclusion of the sub-object replication key feature.

  • Added a compile time option to remove usage of the replication graph ForceNetUpdate delegate.

  • Added checks for unsupported nested NetDeltaSerialize structs.

  • Added more comments and a warning around dependent actors in RepGraph.

  • Added Session ID's and Client ID's (Connection ID's) to packet protocol.

  • Added net.QueuedBunchTimeoutSeconds to replace a hardcoded value.

  • Added logging when the value of net.QueuedBunchTimeoutSeconds is exceeded.

  • Added a network driver setting for the maximum number of channels per connection.

  • Added a connection flag to control whether replication size limits can be ignored.

  • Prevent world settings for temporary transition maps from replicating in order to prevent warnings during seamless travel.

  • Exposed NetworkProfiler API for linking.

  • Added '-LogDebug=MatchStr' command-line parameter and 'LogTrace AddDebug MatchStr' console command to NetcodeUnitTest to trigger debugging on a particular log line pattern.

  • Added logging to assist in debugging actor channel failures.

  • Added replay result codes for failure to decrypt and missing event data.

  • Set an engine default for the net.PartialBunchReliableThreshold console variable to improve network performance of large bunches when there is packet loss.

Improvement:

  • Statsport/exec listener now returns a different error message when the exec callback is not registered, the cmd itself was not processed by the exec or the cmd is missing the 'c=' param.

  • Clamped replay priority into a valid range before rounding.

  • Adjusted recording CSV stats around actor vs destruction info.

  • Modified custom property replication conditions to be stored outside of any active network driver, and provided an API to modify them at any time.

  • Cleanup of sub-object references in replay recording.

  • Improved memory usage of shared serialization data.

  • Improved the memory usage of fast array replication states.

  • Adjusted the replay streamer interface to make it easier to add common analytics attributes.

  • Modified replay scrubbing to reduce memory allocations.

  • Improved memory allocation of the local file replay streamer.

  • Increased default value for NetPackedMovementMaxBits.

  • Refactored log tracing and added ability to trigger console commands on certain logs.

    • Command-line example: -LogCommand="ReadContentBlockPayload failed=obj list class=ShooterGameState"

    • Console command example: LogCommand Add ReadContentBlockPayload failed=obj list class=ShooterGameState

  • Changed subobject outer ensure to a log, so it now falls back to the default behavior (actor as outer) if outer is unavailable.

Crash Fix:

  • Fixed issue with ConnectionId assignment that could cause server crash.

  • Fixed multiple crash issues with asynchronous replay recording property validation.

  • Fixed handling of replication history when the maximum replicated size was exceeded for an object, which would often lead to a crash.

  • Fixed crash referencing spectator controllers when loading replay checkpoints.

  • Fixed a crash when using out parameters in RPC calls.

  • Fixed a replication graph crash in the ShooterGame sample when seamless traveling.

  • Fixed a replay crash when attempting to load a map that no longer exists.

Bug Fix:

  • SupportsMultithreadingPostFork will not assert if the command-line has not been set when called, instead, it will return true/false based on the DEFAULT define and hope the cmdline override will not break anything later.

  • Export FStreamingLevelActorListCollection to external modules.

  • Prevented actors outside the destruction radius but inside the current OutOfRange radius check from being added to the OutOfRange list in ReplicationGraph, and, instead keep actors in the PendingDestructionList until they get inside the send radius or outside the OutOfRange radius.

  • Marked NetDriver and related objects as garbage as much as possible when destroying the net driver. Released references to objects from open channels on clients during net driver shutdown.

  • Fixed grid cell node doubling child node actors.

  • Invalidated replicators on the client as soon as their object becomes garbage.

  • Cleaned up the replicator so it doesn't leak through AllOwnedReplicators. Handled the case where subobjects are marked as garbage during the channel update, or where the ability system marks a replicated subobject as garbage on the client.

  • Explicitly enforced bReplicateUsingRegisteredSubObjectList to false for classes for which we will not convert their ReplicateSubObjects function to the new method.

  • Actors flagged for serialization will now be serialized just before we call destroy on them with Replay Recording. This allows them to be serialized in a state where they still have most components and properties intact.

  • Fixed off by one bug in DisableAllReplicatedPropertiesOfClass which did not properly disable all properties.

  • Fixed an issue where NetConnection->ViewTarget was not properly updated prior to replicating data.

  • Released object references from dormant replicators when levels are streamed out or actors are destroyed.

  • Fixed NMT_Failure early disconnects from missing NMT_CloseReason.

  • Reduced the number of forced property comparisons when using SetReplicates.

  • Fixed a replay checkpoint recording issue when using push model dirty state tracking.

  • Fixed servers not ignoring the destruction info net messages.

  • Fixed uninitialized vector data when receiving new replicated actors.

  • Fixed a case where replicated sub-objects would not be recorded into replay checkpoints.

  • Fixed handling of invalid package paths received from clients that could cause a crash.

  • Use Owner instead of AttachmentRoot Actor for AttachParent when replicating attachment.

  • Fixed handling of actors destroyed in the middle of an amortized replay checkpoint save.

  • Fixed an issue where replicated scene components could be added to the AttachChildren array at the indices of unmapped references, leading to the component being overwritten when the reference was mapped.

  • Have UActorChannel::KeyNeedsToReplicate check if the subobject is pending dormancy in order to prevent cases where an unchanged key prevents the channel from going dormant.

  • Fixed potential package map name mismatch warnings in PIE.

  • Prevent stale/garbage LastViewTarget actor being added to Replication List.

  • Fixed missing call to PostReplicatedChange on the fast array serializer, when mapping previously unmapped objects (Items PostReplicatedChange calls were not affected). Fixed for both 'net.SupportFastArrayDelta' on/off paths.

  • Fixed a race condition in replay recording of torn off actors.

  • Fixed a case where recording a new replay would not stop an existing recording first.

  • Fixed a missing level name remap in PIE that prevented seamless travels from succeeding.

  • Changed the ensure for destroying a NetDriver during its tick to not trigger for PendingNetGames.

  • Fixed incorrect timestamp check, preventing disabling of challenge ack resend code path server side.

  • UNetReplicationGraphConnection::PrepareForReplication now checks if the connection is in the correct world.

  • Fixed RemoteViewPitch being generated incorrectly.

  • Fixed levels unnecessarily tracking destroyed actors during replay playback.

  • Fixed replays recording multicast RPCs from only relevant to owner actors.

  • Call NotifyControllerChanged from ClientRestart in case it is received with the valid pawn before APawn::OnRep_Controller is called.

  • Handle emptying the map name if CurrentMapName == DestinationMapName when no transition map is specified in order to prevent issues when seamlessly traveling to the same map.

  • Fixed compiling in shipping with stats enabled.

  • Fixed an issue where tracking and validating replicated subobjects would be skipped if custom subobject replication was used.

  • Replicated FSoftObjectPtrs to dynamic, spawned-at-runtime replicated objects now resolve properly on clients.

Deprecated:

  • Removed support for replay network smoothing mode in network playback data.

  • Deprecated the AES ECB packet handler component in favor of the AES GCM handler.

Removed:

  • STAT_RepLayout_AddPropertyCmd

  • Removed a strong level reference from replay scrubbing state.

  • Removed replay backwards compatibility handling for versions prior to the minimum supported version.

  • "LastCompletedSeamlessTravelCount == SeamlessTravelCount" check was removed from APlayerController::HasClientLoadedCurrentWorld to prevent issues when client finishes travel before the server.

Level Design and Art Tools

Bug Fix:

  • Fixed an issue when computing the distance of a full spline segment that uses constant interpolation. Function incorrectly returned a distance of 0 for all partial distances, however when computing the "full" distance with p=1 it should have returned the true distance between the points. This fixes another issue with generation of the Spline Curve's Reparam Table where spline keys would map to incorrect distances if a spline had any number of constant interpolation points.

  • Implemented an actionable message on load to create the water collision profile when it is not defined, rather than checking the DefaultEngine.ini on load.

  • Fixed default-enabled Editor modes showing up in random order, by giving the modes prescribed priorities.

  • Fixed an issue where the spline visualizer wasn't taking into account the list of enabled/supported spline point types for the given spline component.

  • Fixed Actors being attached to a Level Instance that is not being edited.

  • Fixed metallic, specular, and roughness being packed into a single texture.

  • Fixed import descriptor not refreshing when toggling Flip Y Axis setting from ImportExport tool. Also made option to flip coordinate on Y axis available when exporting tiled landscape.

Geometry Core

New:

  • Created a 'contain(other interval)' function to TInterval1.

  • Add a "prevent tiny triangles" option to Remesher. Currently the area threshold matches the threshold used when creating a cloth simulation mesh.

  • Exposed an optional second importance weight to the FPriorityOrderPoints class

  • Added FColliderMesh::FindNearestHitTriangle() and FColliderMesh::FindNearestTriangle() wrappers around mesh AABBTree functions.

  • Renamed ::GetAABBTree() to ::GetRawAABBTreeUnsafe() to discourage usage.

  • Added new oriented box fit variant that starts from the fast DiTO box and optimizes the fit iteratively, and changed modeling tools oriented box fits to use the new algorithm.

  • Improvements to the FMeshBevel operation, which resolves many failure cases in higher-level Beveling operations in Modeling Tools and Geometry Scripting.

  • Updated Degenerate triangles to now be filtered out when creating Complex Collision geometry for UDynamicMeshComponent, to avoid warnings in the physics system.

  • Added a new FMeshPlanarSymmetry class for detecting and applying planar symmetry to mesh vertices.

  • UDynamicMeshComponent now supports the Visible In Ray Tracing Component setting. However this does not currently override the UDynamicMeshComponent-specific Enable Raytracing flag.

  • Added FDynamicMesh3::EnumerateEdgeTriangles() function, which has the same API as ::EnumerateVertexTriangles().

  • Added function UE::Geometry::TrianglesToOverlayElements() in MeshIndexUtil.h which collects elements from triangles in a mesh attribute overlay.

  • Added FDynamicMesh3::EnableMatchingAttributes() function to expose FDynamicMeshAttributeSet::EnableMatchingAttributes() at the Mesh level.

  • UpdatedUDynamicMeshComponenttonow support a separate "transient" flag for disabling collision updates, configurable via SetTransientDeferCollisionUpdates(). This setting allows C++ code, such as code that implements a live 3D transform of mesh vertices, to temporarily disable collision re-generation without modifying the serialized bDeferCollisionUpdates UProperty.

  • Added a new FMeshResolveTJunctions class that attempts to fix situations in meshes where a boundary vertex lies on the interior of some other boundary edge (a "T-Junction"). Exposed this capability in the Weld Tool in Modeling Mode.

  • Updated Morphology.h to use sparse SDF due to memory savings over the dense SDF. The AutoLOD tool and the Morphology tool use this class, but the behavior shouldn't change.

Bug Fix:

  • Made GteMinimumVolumeBox3 robust to failing to find a convex projection for some faces.

  • Fixed a bug that made the fit always ignore results from the ProcessEdges pass, and added an option to always skip that pass (for a faster method that matches the previous behavior).

  • Fixed incorrect float casts in FAxisAlignedBox3d and FAxisAlignedBox2d when casting to FBox and FBox2D, making this cast function correctly at large world coordinates.

  • UDynamicMeshComponent now supports overrides to the color/material and normals, allowing display of vertex colors, group colors, or a (configurable) custom color, as well as facet normals (flat shading). These settings can be configured for any such Component in the Actor properties. The wireframe color is now also configurable.

  • Added an fp:precise pragma to the MSVC compile of XAtlas, giving more consistent results across platforms and build settings.

Deprecated:

  • We deprecated the timestamp on TDynamicPointSet3, as it was unused.

Geometry Script

New:

  • Added InvertMeshSelection function.

  • Added Geometry Script function SetMeshSelectionVertexColor, sets vertex color on selected faces/vertices, optionally creating "creases" in the vertex color overlay around the selection border

  • Added ThickenShells option to ApplyMeshSolidify function.

  • Added AppendMeshTransformed function that appends N copies of a mesh to another mesh, with a custom Transform applied for each.

  • Added ExpandContractMeshSelection function, which can grow or shrink a Mesh Selection based on mesh connectivity.

  • Added ApplyUniformRemesh function, which applies remeshing algorithms to a UDynamicMesh similar to the Remesh Tool in Modeling Mode.

  • Added ApplyMeshOffsetFaces function.

  • Added ApplyMeshInsetOutsetFaces function.

  • Added a 2D Voronoi diagram generation function.

  • Added ResolveMeshTJunctions function that exposes the new T-Junction Resolution algorithm.

  • Added AppendSweepPolygon function which takes the sweep path/curve as a list of FTransforms, instead of FVectors, giving the caller more control over rotation and scaling along the sweep. This function should replace usage of AppendSimpleSweptPolygon.

  • The CopyMeshFromStaticMesh Geometry Script function now works on UStaticMesh assets at Runtime, if the bCPUAccess flag was enabled on the Asset at cook time.

  • Added "Frozen" flag on GeneratedDynamicMeshActor. Users can disable expensive mesh recomputations when not editing procedural mesh generation parameters/settings.

  • Add support for optional Mesh Selection to:

    • TranslateMeshUVs

    • ScaleMeshUVs, RotateMeshUVs

    • SetMeshUVsFromPlanarProjection

    • SetMeshUVsFromBoxProjection

    • SetMeshUVsFromCylinderProjection

  • Add support for optional Mesh Selection to RecomputeMeshUVs.

  • Add a new GetMeshUVSizeInfo function that can be used to get UV Area/Bounds, and 3D Area/Bounds, for a given selection.

  • Added support for optional input Mesh Selection to ComputeMeshConvexHull function.

  • Added a new ComputeMeshConvexDecomposition function that exposes new automatic convex decomposition strategy.

  • Added SplitMeshBowties function.

  • Added RepairMeshDegenerateGeometry function.

  • Added GetMeshInfoString function.

  • Added support for optional Mesh Selection to:

    • ApplyPerlinNoiseToMesh

    • ApplyIterativeSmoothingToMesh

    • ApplyDisplaceFromTextureMap

    • ApplyDisplaceFromPerVertexVectors

  • Added ApplyMeshDisconnectFaces function.

  • Added ApplyMeshDuplicateFaces function.

  • Added a new ApplyMeshLinearExtrudeFaces function that supports linear extrusion of entire mesh or selection. Redirect previous ApplyMeshExtrude function to ApplyMeshExtrude_Compatibility_5p0.

  • Added a new ApplyMeshBevelSelection function, which supports various ways to interpret the MeshSelection as set of faces or edges to bevel

  • Added ComputePolygroupsFromPolygonDetection functionthat exposes new quad-detection algorithm (currently only quad polygons are detected).

  • Added an Auto-Compact option to Simplify and Remesh functions, that when enabled will automatically Compact the output mesh. This new setting is enabled by default, to reduce the chance of users hitting errors when passing the output simplified/remeshed mesh into downstream functions.

  • Added CopyMeshUVLayerToMesh and CopyMeshToMeshUVLayer functions. These can map a UV layer to a separate mesh, editing it, and then transferring the edited positions/topology back to the UV layer of the source mesh.

  • Added SampleSplineToTransforms functionthat computes a set of FTransforms at points along a USplineComponent, using various sampling strategies.

  • Added AppendSweepPolyline function, similar to AppendSweepPolygon but sweeps an open 2D profile curve instead of a closed 2D polygon.

  • Added a new FGeometryScriptMeshSelection type that can store/represent Vertex, Triangle, and Polygroup "selections" on a UDynamicMesh.

  • Add various functions for working with this new type, including:

    • CreateSelectAllMeshSelection

    • ConvertMeshSelection

    • CombineMeshSelections

    • ConvertIndexArrayToMeshSelection

    • ConvertIndexSetToMeshSelection

    • ConvertIndexSetToMeshSelection

    • ConvertIndexListToMeshSelection

    • ConvertMeshSelectionToIndexList

    • SelectMeshElementsInBox

    • SelectMeshElementsInSphere

    • SelectMeshElementsWithPlane

    • SelectMeshElementsByNormalAngle

    • SelectMeshElementsInsideMesh

    • ExpandMeshSelectionToConnected

    • GetMeshSelectionInfo

    • DebugPrintMeshSelection

    • GetMeshSelectionBoundingBox

    • GetMeshSelectionBoundaryLoops

  • Add various new Geometry Script functions for editing a mesh based on a mesh selection:

    • DeleteSelectedTrianglesFromMesh

    • TransformMeshSelection

    • TranslateMeshSelection

    • RotateMeshSelection

    • ScaleMeshSelection

    • SetPolygroupForMeshSelection

    • SetMaterialIDForMeshSelection

  • Added CopyMeshSelectionToMesh, which copies triangles identified by the selection to a new UDynamicMesh.

  • Added Geometry Script functions for manipulating FGeometryScriptIndexList, UVList, and ColorList objects, to bring up to parity with functions for Scalar and Vector lists.

  • Added options for the Geometry Script AppendMesh node's attribute handling.

    • Now by default, if meshes do not have the same attributes enabled, any attribute enabled on either mesh will be enabled on the result mesh. The caller can optionally make the result only enable the attributes on the source or the target mesh.

Bug Fix:

  • Added Geometry Script function CopyCollisionMeshesFromObjectwhich extracts meshed collision shapes, or the complex collision mesh, as a UDynamicMesh from various object types (StaticMesh, Volume, and DynamicMeshComponent).

  • Updated Geometry Script functions that read or sample from a UTexture2D to now work at runtime, but only if the texture format is VectorDisplacementMap.

    • If this is not the case, errors are now gracefully handled instead of hard crashing.

  • The Geometry Script function AutoGeneratePatchBuilderMeshUVs now gracefully handles a non-compact input mesh, and prints a warning if such a mesh is passed.

GeometryCore

New:

  • Added a vertex-based connected components class that can be used with any TriangleMeshType and supports connecting based on spatial proximity as well as triangle topology.

  • Made FMeshBoolean's automatic mesh simplification code optionally avoid simplifications that would noticeably change the vertex normals. We also enabled this feature when computing fractures, to prevent the fracture code from generating results with incorrect normals.

Bug Fix:

  • Fixed failure cases in the exact predicates library.

  • Adjusted FindNearestCurveToRay when processing segments in a curve, to balance the distance-to-ray-origin against the ray-segment distance to find the optimal segment.

  • Fixed issues with the GeometryCore FPriorityOrderPoints class:

    • It now uses the SpatialLevels argument.

    • The early-stopping optimization is fixed, so it no longer causes spatial 'clumping' of points when enabled.

    • The code no longer incorrectly refers to some of the importance weights as "curvature," as the class is general-purpose and other features are often used for importance weights.

    • An 'OffsetResFactor' (Offset Resolution Factor) parameter was exposed, to allow more control of how clumpy the distribution is; we recommend a value of 1 or 2 to best distribute the input points.

  • Fixed instability in initializing GeometryCore's TQuaternions almost aligned to -Z axis, or generally rotating almost 180 degrees with a TQuaternion::FromTo() call.

  • Fixed a few unsafe typecasts.

GeometryScript

New:

  • Added a Async Physics build for Dynamic Mesh component.

  • Added SRGBToLinear node for transforming vertex colors of dynamic meshes in GeometryScript.

  • Added LinearToSRGB node for transforming vertex colors of dynamic meshes in GeometryScript.

  • Added CopyMeshToSkeletalMesh node to GeometryScript.

  • Added CopyMeshFromSkeletalMesh node to GeometryScript.

  • Added BakeTexture node to GeometryScript.

  • Added BakeVertex node to GeometryScript.

  • Added CreateNewTexture2DAsset node to GeometryScript.

  • Updated Geometry Script functions to automatically fix mesh orientation when transforming meshes with negative scales.

  • Adjusted LineSegmentGenerators to use the given box center when computing box lines.

  • Added a PolyPath class to Geometry Script, which provides an (optionally-closed) polyline/polygon with 3D vertices, and a set of associated utility functions. The utility functions include one to generate a PolyPath from a USplineComponent.

  • Added the Spectral Conformal UV Solver option to the Geometry Script RecomputeMeshUVs function.

  • Added the Spectral Conformal UV Solver option to the Geometry Script RecomputeMeshUVs function.

Bug Fix:

  • Fixed transform handling in Geometry Script functions, by making them use ApplyTransformInverse() and InverseTransformPosition() rather than trying to invert an FTransform.

Modeling Tools

New:

  • The BakeAll tool now supports skeletal and dynamic meshes as source meshes.

  • Added sample filter mask support to the BakeTexture tool.

  • Added sample filter mask support to the BakeAll tool.

  • Added Object Space Normal bake support to BakeAll tool.

  • Added Position bake support to BakeAll tool.

  • Added Selective Tessellation Options to the Displace Tool to only tessellate and displace those triangles that belong to a specific material.

  • Added a Random Colors option to the collision geometry visualizations in the PInspct and Msh2Coll tools.

  • Initialized implementation of optional boundary constraint projection for the Remesh tool.

    • Constrained edges along a boundary can collapse, and vertices can move, but they are projected back to the original boundary curve geometry.

    • Vertices at boundary "corners" (defined using an angle threshold criterion) are constrained to not move or be deleted.

  • DynamicMesh3: Add comments to AppendTriangle functions saying the vertices must exist and the indices must be distinct

  • Added a Detail Customization class for AutoLOD properties to enable HintText to be used in some text entry fields when the field is empty.

  • Updated AutoLOD tool's UI to validate group layer name and weight map layer name when specified by the user. Issues a warning if the specified layer doesn't exist

  • Adjusted AutoLOD tool's UI to not clear the warning area if there is a non-empty result.

  • Turn selection checkboxes into buttons in PolyEd and TriEd modeling tools.

  • Added the Spectral conformal parameterization option to the Unwrap UVs tool.

  • Support running various tools only on limited selections in the UV editor, and support multi-asset selections.

  • Support seam edges to be collapsed by the remesher if Preserve Sharp Edges in unchecked in the Remesh tool.

  • Added a Smooth Boundary operation to the Mesh Selection tool.

  • Added convex decomposition options to Msh2Coll tool and Geometry Script collision functions.

  • Updated PolyEd to work better on many common open-boundary cases by placing extra selectable corners on sharp group edge bends.

  • Adjusted the Add Primitive tools accept/cancel so that the initial click can place the mesh and then the settings can be modified before accepting the tool.

  • Allow users to set specific extrude distance in PolyEd tool.

  • Allow users to create a new asset in CubeGrid tool if the underlying asset is deleted.

  • Various CubeGrid tool improvements. - Made the tool Accept/Cancel.

  • Added the ability to set block size at current power

  • Added ability to initialize the grid from a given actor, initialized to the current target.

  • Added the option for the grid sizes to follow the default editor grid (1, 5, 10, 50, 100, etc).

  • Allowed global mode for gizmo manipulation, to allow editor grid snapping to work.

  • Add Select All and Invert Selection actions to PolyEd.

  • Enable selection support within the UV Editor's Layout tool.

  • Enabled support of selection within the UV Editor's Unwrap tool.

  • Implemented support for snapping on gizmo initiated transforms in the UV Editor.

  • Added a new toolbar in the 2D viewport that resembles the snapping controls found in the main level editor.

  • Added support for selection mechanics within the 3D viewport.

  • Updatedthe 3D UV Editor viewport to support mouse picking and marquee selection modes, just as in the 2D viewport.

  • Provided a new Select All command bound to Ctrl + A. The Escape key will unselect all selected elements.

  • Added a bridge edge action to the PolyEd tool, which creates a face between two boundary edges. If the two edges being bridged are connected by edges at either end, this action will not weld the edges of the new face to the existing edges, potentially leaving holes in the mesh.

  • Made the transform gizmo in the PolyEd tool visible by default - appearing automatically when any portion of the mesh is selected.

  • Support for creating DynamicMeshActors in Modeling Mode is now enabled by default.

  • Mesh Booleans and CutMeshesWithMeshes. When filling holes, generate normals and UVs for the new patches

  • Updated the UV Project status bar message to include information about Shift+Ctrl+Click for repositioning without reorienting.

  • Adjusted the PivotAct tool to now show the active transform position and rotation in the tool's details panel.

  • Extended the edge weld action in the PolyEd tool to group edges. Edges that have vertices other than their endpoints can be welded by sequentially welding their simple edges automatically. If the two group edges being welded have different numbers of vertices, then the group edge with fewer vertices is split until the two have the same number.

  • Added support for symmetric mesh vertex sculpting in the VSculpt tool. Symmetry is detected and applied via vertex/point-set symmetry rather than topological symmetry. The Symmetry Plane is auto-detected (implemented in FMeshPlanarSymmetry) and currently cannot be specified by the user.

  • Added a "Find Quads" mode to the Polygroup Generation Tool in Modeling Mode ("GrpGen"). This mode attempts to reconstruct the source quads of a triangle mesh as Polygroups by incrementally finding pairs of triangles. The implementation of this algorithm is in the FPolygroupsGenerator::FindSourceMeshPolygonPolygroups() function.

  • Added support for creating and selecting a target Polygroup layer in the Polygroup Generator tool (GrpGen).

  • Added support for setting target groups from an existing layer. Users can perform operations such as copying groups between layers and duplicating an existing layer.

  • The Edit Normals Tool in Modeling Mode now allows the user to specify alternate Polygroup layers to define normal creases.

  • Added support for Spectral Conformal unwrapping mode in the UV Editor's Unwrap tool to match functionality existing in the Modeling Mode version of the tool.

  • Changed the selection gizmo placement in the UV Editor from being the centroid to the bounding box center of the selected elements.

  • Added support for a new launcher for the UV Editor to appear in the Modeling Mode UVs tools category.

  • Added a new ISM Editor Tool. Users can select and manipulate Instances in all the InstancedStaticMeshComponents of the selected Actors.

  • Added new high performance rendering components for handling mesh highlighting on large meshes in the UV Editor.

    • Includes 2D and 3D variations of Point Sets, Line Sets, and Triangle Sets. These are considerably stripped down from the previously used component classes, designed with the intent on reducing needed memory bandwidth to move data to the rendering thread.

  • Made the following mesh creation tools generate tangents for their created meshes:

    • PolyExt

    • PathExt

    • PathRev

    • BdryRev

  • Allowed selection mode changes even if the mechanic is not currently enabled in the UVEditor.

  • Added drag alignment mechanic to the plane control gizmo in PolyExt tool, enabling translational and rotational snapping when moving or rotating the plane used for drawing the profile to extrude.

  • UVEditor: Cleaned up options for the various UV Unwrap algorithms to only be visible to the user when the appropriate method has been selected to reduce confusion in the UX.

  • Added hotkey R to hide plane control gizmo in the PolyEd tool.

  • Added toggleable corner point visualization to the PolyEd tool.

Improvement:

  • Adjusted UVs to always stay aligned in the same orientation when using the CubeGrid tool.

  • Updated CubeGrid's UVs to be contiguous when performing multiple steps with the same selection.

  • Updated CubeGrid sides to maintain the same groups with repeated steps of the same selection.

  • Added support in CubeGrid for scaling UV's.

  • Added support in CubeGrid for focus hotkey.

  • Improved performance and runtime speed of rebuilding the UV overlays and meshes when edits or channel switches are performed, particularly on high polygon count meshes.

  • Cleaned up warnings in the UV Editor related to type truncation and loss of precision issues in adherence with coding best practices.

  • Improved WeightMap support in many tools in Modeling Mode, such as Duplicate and where possible Combine. In cases where weight map layers with duplicate names could be created, unique names are now auto-generated/enforced.

Bug Fix:

  • Improved Mesh Boolean and Self-Union (MshBool and Merge tool) results to better handle nearly-coplanar sliver triangles.

  • Fixed issue where the TargetMesh property was incorrectly set for skeletal and dynamic mesh targets in the BakeAll tool.

  • Fixed MaterialID bakes to overwrite pixel buffers instead of accumulate.

  • Fixed incorrect tangent normal bakes in the BakeAll tool by ensuring that the normals are transformed into the correct space for each source mesh.

  • Fixed issue where the preview material in the BakeTexture tool was not reset when output type was modified.

  • Fixed issue where the preview material in the BakeAll tool was not reset when the output type was modified.

  • Fixed correspondence strategy in FMeshMapBaker when input meshes are the same.

  • Fixed an issue where the error material was not shown when BakeTexture tool had invalid inputs.

  • Fixed an issue where the error material was not shown when BakeVertex tool had invalid inputs.

  • Fixed an issue where the error material was not shown when BakeAll tool had invalid inputs.

  • Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeTexture tool.

  • Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeAll tool.

  • Fixed the error material not being shown when output types are restored on tool startup with invalid inputs in the BakeVertex tool.

  • Fixed an issue where vertex colors were incorrectly encoded when converting between static and dynamic meshes.

  • Fixed bugs with how the CubeGrid tool deals with materials.

  • Made the Msh2Coll tool use a background thread to compute collision shapes, so it will not lock up the editor while it computes.

  • Prevented BakeRS tool UI from allowing user to try baking only rotation, when the input's transform included both rotation and non-uniform scale, as UE transforms don't support this.

  • Fixed a crash when Displace tool tries to read WeightMap data from a deleted StaticMeshAsset.

  • Fixed PolyEd performance regression on highly tessellated mesh regions.

  • Fixed a bug where the number of the vertical slices being generated is always off by one in the Sphere Primitive Tool.

  • Corrected Lattice tool to hide the gizmo only if constrained vertices are selected.

  • Fixed PolyEd modeling tool failing to deal with certain bowtie group topologies.

  • Fixed a bug in the Displace tool where undoing changes to the Perlin noise properties would not update the mesh in the viewport.

  • Adjusted PolyEd offset and inset to work in pathological bowtie-related cases.

  • Fixed DisconnectTriangles in cases of bowties.

  • Fixed normal generation in CubeGrid tool.

  • Fixed crash in CubeGrid if gizmo is dragged without ever having selected anything.

  • Fixed PolyCut tool's handling of non-uniform scale

  • Fixed various UV editor undo/redo transactions not being expired when the editor is closed.

  • Fixed the exact predicates code accessing an index past the end of its local stack arrays.

  • Resolved the Lattice tool's handling of negative scales.

  • Fixed issue where converting a selection type resulting in an empty selection would cause an ensure to be thrown in the UV Editor.

  • Fixed handling of some transforms with a negative scale in the modeling tools and geometry script functions for managing collision geometry.

  • Adjusted the BdryRev tool to snap to the local mesh pivot if its rotation axis is 100,000 units (1000 meters) away from the target shape when the tool starts. This reduces the likelihood of confusing cases where the axis is too far away to be useful or visible.

  • Resolved bug where undoing a selection would continue to transform the previous selection using the interactive gizmo.

  • Fixed vertex sculpting brush alpha's "RotationAngle" display name not fitting in the available space, by changing the display name from "Rotation" to "Angle".

  • Resolved handling of negative scales for a number of modeling tools and geometry script functions.

  • Fixed issue in the UV Editor where activating some tools resets the selection mode, causing the user to re-select their desired mode after using the tool.

  • Made the PathRev tool warn the user if the draw plane and axis is far from the camera position, with an explanation of how to place the draw plane in the view.

  • Resolved issue where a crash would occur when a dynamic mesh is loaded into the UV Editor and then deleted externally before exiting the UV Editor.

  • Prevented crash upon opening the UV Editor if the live preview tab was closed prior to last exiting the UV Editor. Also forces the live preview tab to be opened automatically upon UV Editor startup.

  • Fixed issues where starting Play in Editor (PIE) mode wouldn't prevent the UV Editor from performing unwanted actions, such as saving assets.

  • Added a bSRGBConversion parameter to ProceduralMeshComponent's CreateMeshSection and UpdateMeshSection functions. The caller can control whether sRGB conversion is performed. To keep current results unchanged, the default values of this parameter for the two functions is different (Create doesn't convert, but Update does).

  • Corrected issue in the UV Editor where polygroups were being incorrectly set on operation factory instances in the Unwrap Tool.

  • Fixed for PolyEdit and PolyPath tools not rendering preview results when at Large World Coordinate scales.

  • Made vertex sculpting's symmetry detection more robust, so it should detect vertex mirror symmetry for arbitrary (non-axis-aligned) mirror planes.

  • Resolved issue in the UV Editor where displaying background texture incorrectly handled textures that need non-color samplers in materials, such as normals.

  • Fixed the level editor gizmo lurking invisibly, still clickable, in the HitProxy buffer after modeling tool start

  • Resolved crash when right-clicking on the asset tab in the UV Editor would fail an assertion.

  • Fixed a corner case in the BSP lightmap code causing a divide by zero and triggering an 'ensure' when the input spans zero range and exactly aligns to Scale. This happens at large-world-coordinate scales due to float precision.

  • Removed ability for the Editor Viewport Camera Controller to affect the UV Editor's 2D viewport. This solves the issues around keyboard navigation causing unexpected lockups in the editor during extreme zoom instances.

  • Fixed issue where the UV Editor's UI was in a semi-broken state after an autosave event occurred.

  • Fixed Merge tool not working at large world coordinate scales.

  • Fixed crash bug due to selection hover behavior in the UVEditor not being correctly handled by the Input Router during shutdown conditions.

  • Fixed the modeling mode split tool's "from output" material selection method for inputs with multiple materials.

  • Made sculpt tools focus on the sculpting brush using hotkey 'F', rather than the whole model.

  • Fixed crash bug occurring when selecting elements while multiple assets are loaded in the UV Editor.

  • Made PlanePositionGizmo use double precision to compute plane intersections, and not crash if plane intersection fails.

  • Fixed VoxBlnd, VoxMrph, and VoxWrap tools not showing a live preview of their result at large world coordinate scales.

  • Prevented "No Action" item from appearing in the Action dropdown for the Channel edit tool.

  • Fixed Lattice tool's Dimensions setting becoming editable on control point movement redo.

  • Corrected handling of negative scales in UDynamicMeshComponent::ApplyTransform.

  • Disabled cast shadows for the Preview UV Layout square.

  • Fixed Hole tool and Boundary Revolve tool from seeing polygroup boundary edges instead of mesh boundary edges.

  • Fixed the Boundary Revolve tool skipping the last vertex on open boundaries.

  • Stopped auto-loading settings from switching the target preset in AutoLOD. Users can now choose whether they want to instead write their current settings to that target.

Deprecated:

  • Deprecated the unused Timestamp and GetTimestamp function on TPolygon2 and TPolyline3. Any code that needs to track timestamps for polygons or polylines should do so separately from these structs.

  • The UPersistentMeshSelectionManager along with related functions and classes. This is replaced by new experimental functionality in the UGeometrySelectionManager class (disabled by default).

  • Removed UV Island Conformal Unwrap action, now that its functionality is superseded by the Unwrap tool having selection support.

World Building

New:

  • Added feature to move (Left Alt down) actors from Data Layer(s) to another data layer in the Data Layers Outliner.

  • Prevented most common cases of UV generation failure when performing material baking when using World Partition - HLOD.

  • Enabled Nanite on landscape HLODs if the source landscape proxies are Nanite-enabled when using World Partition - HLOD.

  • Added support to World Partition - HLODs for automatic texture sizing for Merged & Simplified HLODs and reused existing code to share it between all HLOD generation methods

  • In World Partition - HLOD, automated ScreenSize computation for "Simplify" HLOD method. ScreenSize option is now deduced from the meshes bounds and the configured draw distance.

  • Added "-DebugCapture" option to the WorldPartitionMinimapBuilder, which writes bitmaps of all captured tiles & the final minimap.

  • Instancing HLOD layers now has a "Disallow Nanite" option. This is necessary on Nanite meshes that have multiple LODs, otherwise the setting of the mesh's last LOD as the component ForcedLOD will not work.

  • Exposed HLOD options on landscapes when using World Partition - HLODs.

  • Added support for Approximate simplification method to Level HLODs

  • Changed HLOD actors folders & labels naming in the scene outliner

  • Unified autosubmit code for World Partition Builders

  • Added auto submit support to existing builders

  • Added auto submit tags support to allow scripts to provide robomerge tags for a CL

Improvement:

  • Fixed and Improved World Partition Spatial Hash Grid Preview editor material used to preview grids in the world.

  • Added highlighting full grid cells crossing the loading range radius .

  • Added loading range circle.

  • Extended the grid un-highlighted past the loaded area.

  • Added a small circle to identify the center point.

  • Fixed offsets.

Bug Fix:

  • Fixed screen percentage warping by setting the post-process to pre-tonemapping.

  • Fixed a bug where the World Partition minimap wouldn't capture LevelInstance since it never is able to UpdateStreamingState to load the actors in that LevelInstance before being captured.

  • Fixed a crash occurring in the HLOD builder commandlet when hashing landscape texture source data while potentially asynchronously building textures.

  • Fixed a few places where the FTextureSource's data was not being used.

  • Fixed crash in world browser when unloading a World Composition level that cannot be unloaded because of lingering reference.

  • Compute HLOD bounds in Z by using the subactors bounds rather than relying on the world's min/max Z when using World Partition - HLODs.

  • Improved error handling for the Merge Actor - Mesh Approximate Tool.

  • Ensure that child actor components are marked as HLOD relevant if the child actors are HLOD relevant for World Partition - HLODs

  • In the minimap builder, fixed stretched tile capture when tile wasn't square.

  • Fixed an issue where World Partition: Actors ActorGuid must not be reset in AActor::Serialize() when duplicating for PIE.

  • Fixed an issue where IMeshMergeUtilities::CreateProxyMesh() returns a single static mesh when it could return multiple meshes.

  • Makes sure skydome actors are excluded from HLOD in all Engine map templates.

  • Improved outdated HLOD detection

  • Excluded some HLOD builder subclasses from editor dropdowns.

  • Fixed an issue with ISMC custom primitive data being stored in the HLOD proxy descriptor.

  • Marked level packages created through UWorldPartitionLevelStreamingDynamic::LoadInEditor() as transient. This prevents the editor from asking to save those temp packages.

  • Fixed custom primitive data not taken into account in some specific cases with World Partition - HLODs.

  • Prevented false positive when testing for outdated HLODs

  • Hide texture size property unless texture sizing type is "Use Single Texture Size" or "Use Automatic Biased Sizes" in World Partition - HLOD: Material Proxy settings.

  • Avoided deleting World Settings from retained sublevels when using the World Partition - Conversion Commandlet.

  • Deleted HLOD actors from retained sublevels when using the World Partition - Conversion Commandlet.

Level Design and Art Tools /GeometryScript

New:

  • Added vertex color bake support to the BakeVertex tool.

  • Added CreateCircle and CreateArc functions to Geometry Script's new PolyPath class

Localization

New:

  • Expose ENGINE_API for QueueSubtitles.

  • Added support for preview versions of the localization manifests to be generated and deleted during a preview localization run.

    • This addresses false positives for localization warnings that can arise from comparing gathered strings to a stale manifest file.

    • Added a preview parameter to the Localization Unreal Automation Tool command which allows the command to run in preview mode.

    • Localization commandlets now generate *_Preview.manifest files during a run into the destination path specified by the config files.

    • The localization automation script will delete all files that end with _Preview.manifest at the end of the gather run.

    • Improved checks for manifest filename extensions to ensure no malformed manifest filenames are passed into the commandlet.

  • Introduced a Preview cmd line arg to GatherTextCommandlet to allow the gathering of source and asset files without checking out or writing any localization files. This makes dry runs to print all localization warnings much easier for debugging.

    • Introduced the -Preview arg and -GatherType param to UGatherTextCommandlet.

      • The -GatherType param can have values of All, Source, Asset or Metadata. Source will only gather source files, Asset will only gather Asset files, Metadata will only gather Metadata and All will gather all 3.

      • The -GatherType param is only supported in preview mode right now. This is because manifests are updated every single gather and we do not want the manifest to only reflect partial gathers.

      • Added additional logs to display when the commandlet is run with -Preview and -GatherType.

    • Refactored parts of UGatherTextCommandlet to reduce hard coded switch and param names.

    • Introduced a virtual function in UGatherTextCommandletBase to allow commandlets to be conditionally skipped in preview mode.

Bug Fix:

  • Inserted a no-break space between the currency code and the numeric value to improve readability when formatting a foreign monetary value.

    • When a currency is not from the current locale, the currency formatter may prepend or append the ISO currency code to disambiguate. However, this may cause readability issues. For example, 1500 Japanese yen is formatted as "¥1,500" in ja-JP, but it was formatted with its ISO currency code as "1 500 JPY" in es-ES or as "JPY1 500" in es-MX. In the last case, readers may mistakenly think that the price was 500 yen at a glance due to the spacing.

    • We inserted a no-break space between the currency code and the numeric value, so that it is now formatted as "JPY 1 500".

Online

New:

  • The callback of the gdk function XNetworkingRegisterConnectivityHintChanged is now called from the game thread, where we can safely call XNetworkingGetConnectivityHint.

  • Make Party Invite Reject a virtual method in SocialUser.

  • Only enable multiplayer subscription (which creates RTA connection) when create/join MPSD session.

  • Added callback to handle xbl multiplayer connection id change, to make sure connection id in MPSD sessions is up to date.

  • Added callback to handle xbl multiplayer subscription lost (lost connection to RTA), to stop multiplayer and delete all MPSD sessions.

  • Added USocialSettings::GetSocialPlatformDescriptionForOnlineSubsystem to get a social platform description by OnlineSubsystem name.

Bug Fix:

  • Fixed the potential playfab net driver initialization failure by delaying the authentication check of playfab user.

  • Cache the sanitized text only when successful, because it can fail to sanitize when becoming offline. When back online, we need to sanitize it again instead of getting it from the cache.

  • Fixed the connection failure of non-seamless multiplayer map travel on gdk when using playfab, listening server will no longer recreate the PlayFab EndPoint, so the URL of the EndPoint will not change.

  • Fixed the random playfab authorize failure when retry, now it depends on the waiting time to receive the custom session data change (contains new invitation data), not how many times it has retried.

  • Fixed the potential stuck issue when using playfab, now when error happens it will be returned to NetDriver, so it can be handled by map travel code.

  • Fixed UWebAPIDefinition class to use AutoCollapseCategories instead of CollapseCategories.

  • Fixed issue with H.265 being played using DX12 or Vulkan using WMFmediaPlayer.

  • Fixed DX12 playback with WMFmediaPlayer (H264/5, HAP, ProRes).

  • Fixed ElectraPlayer's close/shutdown code so it can also succeed during the engine's shutdown (PreExit) phase.

  • Made social user list keep weak pointers to users to fix GC errors when leaving PIE with GC reference elimination (pending kill) disabled.

  • Converted SocialToolKit LocalPlayerOwner to weak pointer.

Removed:

  • Removed PartyPackage.h. The PACKAGE_SCOPE usage caused issues with subclasses trying to override PACKAGE_SCOPE virtuals.

Crash Reporter

Bug Fix:

  • Stage Base.ini into crash reporter pak files to fix issues with missing configuration.

HTTP

New:

  • Added Verbose logging to track progress of HttpManager::Flush.

  • Added an option to increase HTTP log verbosity when a request is being retried.

Online Subsystem

New:

  • Added getter for EOS platform handle in OSSEOS, enabling sharing the platform with other systems.

  • Updated Android to EOS-SDK-Android-21924193-v1.15.3, and swapped to using the libc++_static variant.

  • Added IOnlineSubsystemEOS public interface header.

  • Changed BucketId in EOS Sessions to use BuildUniqueId to fix compatibility issues.

  • Updated CreateLobbyOptions fields:

    • Addition of lobby id override and lobby host migration options.

    • Removed hard coded search parameters from sessions and lobbies.

    • Refactored DestroyLobbySession to make use of lobby host migration logic.

  • Increased verbosity level for logs in FSonyHTTPRequest::TickSendState and FSonyHTTPRequest::TickThreadedRequest from Verbose to VeryVerbose.

  • Updated Steam SDK to version 1.53a (with native Mac M1 support).

  • Changed the default gamertag mode to Classic to reflect changes in GDK guidelines.

  • Added USocialToolkit::CanAutoRecreatePersistentParty to control whether we should automatically recreate a persistent party on unexpected loss.

  • Added a Compare method to party rep data that can compare a specific value without needing a full party rep data wrapper.

  • Added an overload Checkout method that does not return receipts to the IOnlinePurchase interface.

    • It is recommended to be used if the product (game) processes purchases via backend services, and the clients do not need to know about the purchase information.

    • Implemented for all supported platforms.

Improvement:

  • Refactored of logic surrounding Epic Id queries to construct UniqueIdEOS for lobby members. All logic making such queries now waits for them to finish before triggering any completion delegates. Refactored logic to mirror API Lobby data into OSS Lobbies.

  • Refactored session object captures in session methods to avoid errors in lambdas.

  • Moved support for account portal login to the base FEOSHelpers class for subclasses to use on Android.

Crash Fix:

  • Fixed some crashes caused by converted strings being moved prior to use.

  • Refactored of FOnlineAsyncTaskGDKRedeemCode to not end prematurely on app reactivation, causing a crash.

  • Added fix for crash in CopyLobbyData when the session data was outdated.

  • Fix for crash in FGDKAsyncBlock destruction.

Bug Fix:

  • Fixed some occurrences of unterminated string conversions.

  • Fixed OnlineStoreEOS to use the DecimalPoint value from EOS, not the one from UE I18N, as they disagree on the number of minor units in Chilean Pesos (Centavos).

  • Fixed no core affinity being set for GameChat audio thread on GDK platforms.

  • Fixed OSSEOS checking the data field of an auth token for validity, and ignoring the string field.

  • Update Win64 binary to EOS-SDK-21924193-v1.15.3, to fix inability to fall-back on browser for account portal login flow.

  • Fixed warnings about EOSSDK failing to load, when the SDK does not exist in the first two places we check.

  • Fixed OSSEOS headers so they are includable outside the plugin.

  • Fixed error/warning logging noise on LogEOSSDK when platforms are created and destroyed without being ticked, especially in commandlet runs.

  • Fixed CompoundSubsystemEnum ignoring ESocialSubsystem::Primary and not creating a unique value for a given combination of subsystems.

  • Added missing CREATE_MIRROR_PLATFORM_SESSION checks in OnlineSessionEOSPlus.

  • Added logic to cache the updated Auth Token after a refresh in UserManagerEOS.

  • Addition of logic to make FUserManagerEOS robust to callbacks returning after module shutdown.

  • Added logic to return canceled error if an EOS purchase was canceled.

  • Added missing early error exit to FUserManagerEOS::QueryExternalIdMappings.

  • Fixed CacheDirectory issue with Android EOSSDK initialization

  • Fixed the purchase validation issue on OnlinePurchaseInterfaceCrossgen that was caused by initializing the OnlinePurchaseInterfaceCrossgen before the OnlineIdentityInterfaceCrossgen.

Deprecated:

  • The OSS Oculus plugin has been deprecated in UE 5.1 and is no longer supported. The Meta QuestPlatform plugin can be found on either the UE Marketplace or Oculus Developer site.

Removed:

  • Code for unused and deprecated GooglePlay Billing library. Actual dependency is brought through gradle.

  • Deleted deprecated OnlineSubsystemTwitch.

Voice

New:

  • Added getter for EOS platform handle in EOSVoiceChat, enabling sharing of the platform handle with other systems.

  • Reimplemented SetPlayerVolume for EOSVoiceChat, now there is SDK support.

Bug Fix:

  • Fixed a voice over IP problem on Android and, more generally, if the platform does not implement GetMicrophoneAmplitude.

WebSockets

New:

  • Added optional/opt-in webserver to WebSocket server using the already available functionality from the underlying libwebsockets implementation.

  • Added serving static content through the websocket server without taking an extra port for a webserver.

  • Added ability to serve directories on disk as http mounts.

Bug Fix:

  • Fixed memory leak in FWebSocketServer where some manually created arrays were not using delete.

Platform

API Change:

  • The use of an integer "Controller Id" to refer to both a logical user and a specific input device is being deprecated in favor of the new FPlatformUserId and FInputDeviceId types.

    • In 5.1 it is possible to convert between those types and the deprecated Controller Id, but this will not be available in a future version of UE when full support is added for multiple input devices under a single user.

New:

  • Don't add messaging endpoint unless Xbox console is available to avoid long hang.

  • Added support for PlatformUserId to clearly differentiate between logical users and input devices. Instead of using raw integers for both the controller Id and the user index, there are now different types for users and devices. To support this conversion there are utility functions in GenericPlatformMisc and the online identity interface that allow conversion between the new types and integer indexes.

  • Added pool support in MallocBinned3 for larger than default alignment (16). Previously these allocations would allocate in page-sized blocks which could lead to large memory waste.

  • Load DP on demand when using dp.override.

  • Added Getters for ShaderPlatform Name, the Shader Format of the ShaderPlatform, and the ShaderPlatformPropertiesHash as defined in DDPI

Bug Fix:

  • GDBPrinter bug fixes: Fixed TSparseArray printer. Fixed FName printer so that it doesn't use a hardcoded value to determine if it's a valid FName or not. Disabled broken TMap and TSet printers, but you will see output from the TSparseArray printer so you can see the stored values.

  • Remove XboxCommon implementation of PublishSymbols so it uses the same implementation as Windows and don't attempt to compress pdbs. Fixes issues with failing to publish large PDBs that the compression format does not support.

  • Fixed valid SDK filtering in Turnkey by adding missing fields to SDKDescriptor declarations.

  • Fixed a problem that was preventing Platform Extensions from calling StartupModule on new extension modules.

  • Fixed IterateDirectory() method on Unix, iOS, and Mac so it's behavior matched other platforms (Windows, etc.).

  • Disabled PLATFORM_ALLOW_ALLOCATIONS_IN_FASYNCWRITER_SERIALIZEBUFFERTOARCHIVE on platforms which use FPlatformMallocCrash during crash handling.

Desktop

New:

  • Adding FirstMove events to windows. This is enabled with WindowsApplication.EnableFirstTouchEvent.

Linux

New:

  • Improved process for exporting to Raspberry Pi 4.

    • Added a new vendor ID for Broadcom.

    • Split ASTC and ETC2 support into separate texture formats for Vulkan, as ASTC may not be supported.

Bug Fix:

  • Added support for IsGamepadAttached on Linux.

  • Added support for Linux to search (using "which") for CLion outside of the default expected location.

  • Linux windows now have a reasonable minimum size, and no longer can be scaled down to 1 pixel wide/tall.

  • UE on Linux now locates any standalone Rider installation if it is either installed to the default location "/opt" (Rider Installation Guide), or anywhere else that is on the PATH.

  • Fixed an issue where global shaders would get cooked for Linux Server platforms if it had any targeted RHIs enabled.

  • The Chromium Embedded Framework (CEF) library that powers the Web Browser Widget has been updated to use Chromium's "Ozone" rendering backend under Linux. As a result, the Web Browser Widget now renders correctly in Linux environments that lack an X11 server, such as desktops running Wayland without the XWayland compatibility layer, and headless environments such as containers.

  • Fixed missing quotes in GenerateProjectFiles.sh.

  • Fixed QMake project generator defines.

Mobile

Bug Fix:

  • PipelineCaches directories are no longer trimmed in pak memory optimization. These need to be queried to discern when it is appropriate to kick off shader loads while installing data.

  • PipelineCaches directories are no longer trimmed in .pak memory optimization, as they need to be queried to tell when it is appropriate to begin shader loads when installing data.

Online

New:

  • Script added to retrieve Pixel Streaming Samples files from new repository in PixelStreaming/Resources.

  • Added Editor Streaming module for compositing and streaming of the Unreal Editor.

  • Pixel Streaming now uses WebRTC codec negotiation.

  • Pixel Streaming now supports custom protocols.

  • Pixel Capture plugin created which can capture pixel buffers and sample them at independent rates.

  • Added support for arbitrary audio input into Pixel Streaming.

  • Added a compute shader for faster I420 conversion when using VPX, this is faster than CPU readback and conversion in our tests.

  • Added peers can now swap roles between P2P and simulcast mid-stream. To test this new feature:

    • Simply toggle the PreferSFU toggle in the settings panel.

    • Click the new restart stream button in the settings panel.

  • The editor can now resize appropriately if requested by the front end when Pixel Streaming the editor.

  • PixelStreamingVCam supports camera control with ARKit.

  • Streamer will now attempt reconnection after a set delay instead of instantly.

  • Added embedded C++ signaling server, used for unit testing and some limited use cases where we cannot download servers (for example, offline usage in virtual production).

  • Added a new module in Pixel Streaming plugin called "PixelStreamingServers" that is the C++ API for launching a signaling server (embedded or downloaded).

  • Added datachannel support to SFU.

  • Added WebRTC C++ client behavior to pixel streaming system. This is used for developing unit tests.

  • Added a unit test that will start streaming, connect a client and check that a data channel message can be sent.

  • Added the ability for a user to start/stop streaming as needed through the use of PixelStreaming.StartStreaming and PixelStreaming.StopStreaming.

  • Added the ability for the stream resolution to be changed at runtime.

  • Added a ForceKeyFrame blueprints and C++ method which forces the module's default streamer to send a keyframe.

  • Added support for use of WebRTC version 96 with Pixel Streaming. Note: There are noticeable performance regressions introduced with this version that are being investigated. Version 84 remains the default.

  • Added the ability to stream the main Level Editor window to the browser.

  • Added a Pixel Streaming specific toolbar for starting and stopping streaming in the editor, as well as configuring some basic plugin settings.

  • Added ARKit transform support for controlling PixelStreamingVCam cameras with ARKit transform data received from the LiveLink app. See PixelStreamingVCamSession for handling of this data.

  • Added stat pixelstreaminggraphs that show real time graphs of Pixel Streaming stats.

  • Added -PixelStreamingInputController=Host (or Any) to optionally restrict stream inputs to a single host peer. The default is -PixelStreamingInputController=Any.

  • Added PixelStreamingServers utility to launch PixelStreaming servers from C++. (Added accompanying test too).

  • Added tests for FPixelStreamingSourceFrame, FPixelStreamingFrameMetadata, FPixelStreamingFrameAdapterProcess and FPixelStreamingFrameAdapter.

  • Added the ability to override the default InputDevice.

  • Added the ability to have multiple streamers.

  • Added support for LeftTriggerAnalog and RightTriggerAnalog to be sent as acceptable button press options in Pixel Streaming — even though they are analog inputs, some use cases require mapping them as buttons.

  • Added launch arg -PixelStreamingNegotiateCodecs to enable negotiating Pixel Streaming video codecs with the browser.

    • Default case: Negotiating video codecs is disabled and Pixel Streaming will only send a single selected codec, which can be configured using -PixelStreamingEncoderCodec=H264/VP8/VP9.

Improvement:

  • WebRTC version upgraded to 4664 (M96) on Windows.

  • Allow Editor dimensions to be set at launch time when Pixel Streaming editor with "-EditorPixelStreamingResX= and -EditorPixelStreamingResY=", or "-EditorPixelStreamingRes=".

  • Implemented more accurate Pixel Streaming frame time stats.

  • Fixed match viewport resolution browser side option.

  • Changes to improve performance of editor when Pixel Streaming plugin is enabled but not streaming.

Crash Fix:

  • Fixed PixelStreaming module state cleanup that was causing packaging crashes.

Bug Fix:

  • Fixed resolution changing which was broken in 5.0.

  • Fixed cirrus.js emitting ugly error message if config file was read only..

  • Fixed PixelStreaming controller input. PixelStreaming is now compatible with the new FGenericApplicationMessageHandler controller interface.

  • Fixed Pixel Streaming FPS CVar so that it correctly enforces FPS.

  • Fixed to make current Pixel Streaming compatible with older versions of UE signaling protocol where "playerConnected" message is not sent.

  • Fixed for format requests locking forever.

  • Fixed multi-peer Pixel Streaming not working with VPX codec.

  • Fixed so that NVENC now only needs to scale frames as needed, there was some extraneous scaling happening before.

  • Fixed on screen hud stats on startup that were not dismissable.

  • Fixed bug where SFU peers were unable to receive data channels messages from the streamer.

  • Fixed failing "connect" test where quality & input controller messages were being sent too early (before datachannel was established) for P2P peers.

  • Fixed PixelStreamingAudioComponent finding trying to find audio sink on a data-only peer and crashing.

  • Fixed PIXELSTREAMING_API exports on some files.

  • Fixed PixelStreaming.build.cs that was too harsh about excluding any file with 'node' in the name.

  • Fixed PixelStreaming.build.cs to exclude packaging the platform_scripts/cmd/coturn directory.

  • Fixed Vulkan fast texture copy codepath to not crash in some edge cases.

Removed:

  • Removed Pixel Streaming Samples as it has been moved to its own repository on GitHub.

  • Removed unnecessary CVarPixelStreamingWaitForTextureCopy due to refactor.

XR

API Change:

  • In an unlikely case you relied on the previous behavior, set FSceneViewExtensionContext::bStereoEnabled=true in your code before calling FSceneViewExtensions::GatherActiveExtensions()

New:

  • OpenXR: Expose xrGetCurrentInteractionProfile to blueprint

  • Added setting to specify which PIE instances get the VR headset if multiple PIE instances are used.

  • Added PrimaryPIEClientIndex setting to Editor Preferences > Level Editor > Play > Multiplayer Options > Client.

  • Added features related to play area bounds to OpenXR.

  • Added a Blueprint to get the bounds and their origin in UE world space.

  • Added a Delegate to respond to play area updates.

  • Added basic support for blink and pupil info in eye tracking. Will be false/0.0 if this feature is not supported by the platform.

  • XR: Added keyword "HMD" to IsHeadMountedDisplayEnabled, and IsHeadMountedDisplayConnected

  • OpenXR: Added OnDestroySession to IOpenXRExtensionPlugin.

  • Added haptic Soundwave support for stereo sounds.

  • Added Support for Gauntlet automation to launch on HoloLens devices

  • Exposed parameters of a fake stereo device for tweaking in UI (PR #9224 contributed by ppchavan001).

  • Initial change to support setting PixelDensity in OpenXR.

  • Added pipelined access to PixelDensity, and checks to ensure that app-set PixelDensity is not more than the runtime actually supports.

  • OpenXR: Register with FCoreDelegates::VRHeadsetRecenter Now that FOpenXRHMD supports ResetOrientationAndPosition correctly, we can register with the FCoreDelegate for those clients.

  • Added support for multi-viewport on PC (D3D11/12, Vulkan) for stereo rendering and enabled by default.

  • Added mono pass from plugin driven views in OpenXR.

  • HMD extensions are now opt-in rather than opt-out when setting up a view family.

  • Added protected access to AllocateDepthTexture

  • Added Emulated world/tracker locked quad layers for OpenXR

  • Translucency light volume textures are now shared between both views of a stereo pair.

  • Made VSM debug view work in both eyes.

  • Removed Omni-Directional Stereo Capture (experimental)

  • Added "Emulate Stereo" level play option for standalone games for easier testing of rendering issues in VR without a headset.

  • Added pipelined support for NativePresent in FOpenXRRenderBridge

  • Added more ways to enable OpenXR validation (-openxrdebug, -openxrvalidation)

  • OpenXR PixelDensity: custom quantization of width In the scenario where we have an atlased stereo texture, we need to make sure each half of the texture is aligned by 8 (new Strata requirement). We can do this by manually quantizing the texture after applying pixel density.

  • Added Lumen hardware raytracing in VR.

Improvement:

  • Extracted MicrosoftSpatialAudio from WindowsMixedRealityInterop so that it can be used with OpenXR rather than WMR.

  • Changed CalculateRenderTargetSize assert so that it tolerates Game or Rendering thread.

  • Improved tooltip for ShadingRate Material attribute.

Bug Fix:

  • Fixed a typo in Epic_openxr.h

  • Fixed MicrosoftSpatialAudio when using MicrosoftOpenXR -

  • Fixed hololens target settings ini lookup.

  • Fixed code that used to run while the RenderThread did not exist, and thus ran on the game thread, this code now runs on the render thread.

  • Fixed FScheduler members being shadowed by FHoloLensRunableThread

  • Fixed SceneTextures.cpp using module lookup functions in the render thread that are only safe to use without locking on the game thread.

  • Added an accessor for this information to IStereoRendering.h and cached the values in the oculus HMD implementation. This cached value can be safely read on any thread.

  • VectorVM fix for arm64 Neon -Need return type of MakeVectorRegisterInt64 for Neon to match SSE.

  • OpenXRAR - avoid assert in GetDisplayTime when the openxr session is not synchronized. -Checking IsFocused before trying to get time. xrLocateSpace is only supposed to work when in the focused state. Our pins will retain their last known position. During pin creation they won't locate at all which should result in them maintaining their unreal world position.

  • Fixed AR Tracked Geometry 64 bit FVector.

  • VR PIE now correctly resizes the viewport

  • Fixed thread safety of XR LockModularFeatureList.

  • Fixed OpenXRHMD initialize space locations to avoid bad quaternions.

  • Changed OpenXR xrGetReferenceSpaceBoundsRect make ensure on failure into a warning.

  • Changed FPostProcessRectParams to support 2DArray textures

  • Fixed shadow rendering using multiviewport in VR.

  • Fixed translucency artifacts in VR.

  • Fixed SingleLayerWater in Instanced Stereo in VR

  • Fixed issue where ValveIndex_Left_Trackpad_Touch would never call release.

  • Enable ISR + multi-viewport for PSVR2

  • Fixed the Editor Viewport not restoring correctly after exiting VR Editor Mode

  • Fixed properly pipeline frame state from Game Thread to Render thread

  • Pass SV_ViewID to VIEW_ID as uint, no more casting to float

  • Fixed volumetric cloud rendering in stereo.

  • Fixed too dark mobile preview.

  • Fixed volumetric fog in VR.

  • Fixed artifacts with the distance field shadows in VR.

  • Fixed XR scene textures to use requested extents more uniformly.

  • Fixed crashing in forward when velocity output in base pass and MSAA are enabled.

  • Fixed Nanite rendering in VR

  • Fixed bind InstancedViewUB independent of active stereo rendering The shader compiler will enable ISR or Mobile Multi-View in shaders, independent of whether they are actively engaged in stereo rendering.

  • Fixed support for the left texture for the Quad stereo layer.

  • Disable max viewport resolution

  • Fixed crash in ImgMediaMipMapInfoManager with -stereoenabled.

Deprecated:

  • Remove GetScreenPercentage blueprint function deprecated since 4.19.

  • The XR system click/touch FKeys, which cannot be bound in OpenXR, have been deprecated.

Platform Mobile

New:

  • Added r.Mobile.DesiredResX/Y for Android and -mobileresx and -mobileresy commandline overrides as alternative to using r.MobileContentScaleFactor.

    • Set either r.Mobile.DesiredResX or r.Mobile.DesiredResY to a value greater than 0, otherwise r.MobileContentScaleFactor will be used. If you set both, r.MobileDesiredResX will be used. These values are in pixels, and X and Y correspond to the current orientation of the device. Whichever dimension you set, the other one will be automatically calculated to preserve the aspect ratio. The final resolution used will be clamped to the device window resolution for the orientation.

  • Fixed Shader Complexity Preview ES31.

  • Added the static method ShouldCompileShaderFrequency to filter frequencies for mobile platforms. This can be used to only allow vertex, pixel or compute shaders.

Bug Fix:

  • APlayerController now enables motion controls by default.

  • Mobile platforms have UE_COMMONINPUT_PLATFORM_SUPPORTS_TOUCH set to true for the CommonUI plugin.

  • Mobile Texture Lookup Scene Depth now outputs WorldZ instead of DeviceZ.

  • Vulkan Shader Compiler now checks the Shader Format instead of the Shader Platform.

  • Added a method to check if Mobile post-processes should allow flipping. This is used to prevent Scene Captures from being flipped, as they are used as textures and sampled in the main scene.

  • Backbuffer now sets the TexCreate_ResolveTargetable flag for cases when MobileHDR is set to false and MSAA is enabled.

Removed:

  • SceneDepthAux removed from certain platforms.

Android

New:

  • libUnreal.so is now built against static libc++ due to issues with overriding new and delete. All our out of the box dependencies were updated to reflect this change. This was necessitated due to the engine upgrading to NDK 25b. Unreal Build Tool will scan for dependencies and throw an error if they require libc++_shared.so. You can disable this check using the bDisableLibCppSharedDependencyValidation option. You should update all dependencies in your project to build against static libc++, as mixing both static and shared libc++ within one app is unsupported by NDK and known to cause startup crashes. We still include libc++_shared.so in your .apk by default to give provide room to upgrade your project. If you have successfully upgraded your project to eliminate any dependencies on libc++_shared.so, you can skip packaging it using the bSkipLibCpp option within the /Script/AndroidRuntimeSettings.AndroidRuntimeSettings group of your .ini file.

  • To reduce binary size in Android shipping builds, all symbols except the ones called from Java are now hidden by default. Debug\Development\Test builds still have default visibility to allow symbolication of crashes and asserts.

  • Updated libunwind to the latest version from Github.

  • Android toolchain now supports both full and thin LTO options. You can enable these with any of the following options:

    • TargetRules

    • bAllowLTCG or bPreferThinLTO

    • UBT command line arguments: -LTCG/-ThinLTO. Please note that you have to enable both options if you want to enable ThinLTO. On Android, unlike on other platforms, PGO doesn't assume LTO, so if you have PGO builds and want to have LTO enabled, you'll need to enable LTO manually. This is due to toolchain issues, as having PGO assume LTO can cause extremely long build times and out of memory linker crashes.

  • Added Clang Analyzer support to Android toolchain. This can be enabled using the -StaticAnalyzer UBT command. Refer to TargetRules.cs for more information.

  • Added Android Toolchain option to disable stack protector. It can be disabled using the bDisableStackProtector option in the /Script/AndroidRuntimeSettings.AndroidRuntimeSettings group of your config file (*Engine.ini).

  • Added file and line number logging for UnrealPluginLanguage (UPL) warnings and errors.

  • Raised minimum Android version supported to 8.0 (SDK level 26).

  • Set the minimum Java compile SDK level for Android to 30.

  • If the -BypassGradlePackaging option is passed to UnrealBuildTool, Android packaging will be faster when only libUnreal.so changes.

  • Individual OpenGL uniform buffers now have the option to force using real uniform buffers instead of emulated uniform buffers.

  • Added Mobile Fidelity FX FSR as a plugin.

  • Added support to SPIRV to generate structs from arrays with constant access which allows OpenGLShaderCompiler. This improves packing of shader data.

  • Added ANDROID_SDK_HOME for AGDE to the SetupAndroid script.

Crash Fix:

  • Added SPIR-V patch pass to fix driver crashes on Android 10.

  • Fixed a possible crash on Macs where the editor would not properly shut down due to missing Turnkey support for Android.

Bug Fix:

  • Android builds macOS now uses the rootProject path for AFSProject construction for AndroidFileServer. This fixes broken build processes.

  • Because JCenter is now a read-only repository, mavenCentral repository is now preferred before JCenter. This is in compliance with Google's guidance regarding JCenter.

  • Removed deprecated AppCache settings calls from WebViewControl.

  • Fixed issues with Adreno version checks in MediaPlayer. These now use a more detailed regex search instead of parseInt to determine the modelnumber.

  • Fixed misnamed functions for background and foreground delegates in Android media plugins.

  • Added a check for ro.soc.model for ConfigRules chipset matching.

  • Fixed installing of the overflow OBB file for Android.

  • Fixed a null reference exception when running Turnkey on an installed engine build without Android support.

  • Android: Prevent hang during pause by flushing GT before blocking RT During Android Pause, the Event Thread (ET) will block the Rendering Thread (RT), followed by waiting for a Game Thread (GT) command to complete. With Vulkan enabled, there could be a scenario where the game thread (GT) is waiting on the RT to flush. If the GT is waiting on RT while the ET blocks the RT, the ET will then deadlock waiting for GT. Instead, the ET can wait on the GT to finish first, with an unblocked RT.

  • Added PropagateAlpha when generating the manifest for Android.

  • Android: Prevent hang during pause by flushing GT before blocking RT During Android Pause, the Event Thread (ET) will block the Rendering Thread (RT), followed by waiting for a Game Thread (GT) command to complete. With Vulkan enabled, there could be a scenario where the game thread (GT) is waiting on the RT to flush. If the GT is waiting on RT while the ET blocks the RT, the ET will then deadlock waiting for GT. Instead, the ET can wait on the GT to finish first, with an unblocked RT.

  • Changed the SDKManager check order for the SetupAndroid script.

  • Added missing support for Turnkey for Android on Mac.

Deprecated:

  • Removed legacy Visual Studio and NVidia Tegra Nsight Android project generators. These are now replaced by Google's AGDE.

iOS

New:

  • Fixed IMappedFileHandle::MapRegion to map files or regions smaller than the page size.

iOS, tvOS, and iPadOS

New:

  • Ignore iTunes DLL if the version number cannot be parsed expected.

  • Added tvOS Bink Audio Decoder library.

Bug Fix:

  • Fixed multiple bugs in MallocBinned, the default allocator for iOS.

  • Fixed iOS Remote Mac toolchain cwrsync home directory detection. This was causing issues with SSH key generation in some Windows Active Directory environments.

RAD

New:

  • Added the latest Bink binaries.

Rendering

New:

  • Added a reference motion blur mode to MRQ In this mode, the post-processed motion blur is ignored and the Path Tracer accumulates frames across temporal samples instead, denoising only once per-frame instead of once per-temporal sample. This can be used to workaround limitations of the post processed motion blur effect, and allows pushing the temporal sample count higher than otherwise possible.

  • Added experimental temporal denoising for offline path tracing that is spatially denoised. It gives a final touch to mitigate the temporal instability while preserving fine details. Enable the temporal denoiser in MRQ by adding the console variable 'r.PathTracing.TemporalDenoiser 1' when Path Tracing Denoising is enabled in the Post Process Volume Path Tracing settings when Denoiser is enabled.

  • Hair strand rendering now allows a negative threshold to disable the Path Tracer invalidation to work around cases where the hair simulation does not fully settle. It also removes the clamp so the threshold can be increased past 1cm without fully disabling it.

  • Added console variable r.SkinCache.SkipCompilingGPUSkinVF which enables you to skip compiling all GPU Skin Vertex Factor variants (except the pass through) if you are using GPU Skin Cache. The idea is that if you are using GPU Skin Cache and all Skeletal Meshes can fit within the cache at runtime, you only need the global compute shaders to perform GPU skinning. This means you will never need any GPU skin factory variants for any material, so they can skip compiling these shaders for significant savings.

  • Don't compile GPU Skin Virtual Factories for special materials when 'r.SkinCache.SkipCompilingGPUSkinVF' is enabled. This accounts for roughly a couple thousand shaders across all our special engine materials, and these shaders will not be used, even for special cases in the engine, so it is safe to skip them.

  • Only compile ‘FTrivialMaterialCHS' when the proper console variables have been turned on. This saves on having to compile this shader variant for every material. In internal test projects, this saves ~2,000 shaders of ~3% of all shaders, and saves 15 shaders from being compiled in WorldGridMaterial in that same project.

  • Avoid calling ‘Get Material With Fallback' which was forcing compiling of shaders for materials even when On Demand Shader Compile (ODSC) was turned on. In CitySample, we went from compiling 125,000 shaders down to 9,000 shaders, which went from spending 13 minutes submitting shaders down to ~15 seconds. Calling ‘GetIncompleteMaterialWithFallback' is safe to do in this case, since we don't actually need shaders from the material and are simply querying it for blend mode and for certain ray tracing flags.

  • When running with On Demand Shader Compilation (ODSC), do not try to fetch fully completed shader maps from the DDC, which improves latency.

  • MRQ will submit remaining jobs for compilation for all the materials in the world and block on the results before rendering.

    • MRQ

      • When running with ODSC in the editor Materials can have incomplete or partial shader maps. Shaders might be missing and we need to ensure all of them are compiled so we don't ever render a frame with the default material.

      • This logic will run before every render frame to properly handle new materials being loaded.

      • If there are no incomplete materials this logic is a no-op and very lightweight. ~600us.

    • UMaterialInterface

      • Added a function to UMaterialInterface to query if we have a complete set of shaders.

      • Made CacheShaders and IsComplete part of the public interface of UMaterialInterface.

    • Optimizations

      • 31x speedup to 'SubmitRemainingJobsForWorld'when there is no work to do. This went from 20ms down to 0.645ms. It only performs the material update context (which flushes rendering commands) when there are materials that actually need to do work.

      • This turns 'SubmitRemainingJobsForWorld' into a no-op when there is no work.

    • Misc

      • When blocking on all shader map be sure to spawn a slow dialog so we can see the progress of shader compilation. - Only spawn the dialog (a heavy operation) if there are jobs.

      • Always show the dialog even in PIE.

  • Enabled Editor On Demand Shader Compilation, which drastically reduces the number of shaders compiled when working in the editor. On average, a 1.6x speedup when opening the editor and a map in various projects. Best case, a 2.23x speedup.

  • Added a way to override the Sky Atmosphere visual sun disk radius from the material graph independently from the directional light radius.

  • Volumetric fog now handles height fog start distance.

  • When running with ODSC in the editor Materials can have incomplete or partial shader maps. In other words, some shaders might be missing. If a render system requires all shaders to be present and can't use ODSC functionality to compile the necessary shaders we need a mechanism for compiling just the missing shaders.

    • Added UMaterialInterface::CacheShaders which is implemented for UMatetrial and UMaterialInstance. The call is just forwarded along to CacheResourceShadersForRendering and InitStaticPermutation respectively.

    • You can call CacheResourceShadersForRendering multiple times (even with a completed shader map) and it will not recache uniform expressions. If the Resource's shader map is complete the function is a no-op.

    • FObjectCacheContext can accept a UWorld and will only return primitives that are in that world.

    • Added a function SubmitRemainingJobsForWorld(UWorld* World, EMaterialShaderPrecompileMode CompileMode) that will iterate all materials used by primitives in the world and compile the missing shaders.

    • SubmitRemainingJobsForWorld() is used in various scenarios in the editor to ensure al shaders are compiled for all materials before proceeding.

    • Explicitly try to compile UI and PP materials. Since we don't know which ones are used in the given world we just have to iterate all loaded ones. This is a potential area of optimization.

    • If there are already complete shader maps (if you are not running with the shader job cache), SubmitRemainingJobsForWorld is fast and results in a no-op for each material.

  • Added an ‘illuminance meter' to the HDR (Eye Adaptation) visualization mode that shows mean and accounts for viewport rect.

  • Fixed shadowed local lights looking dull at high exposure inside the volumetric fog.

  • Fixed a typo in RayTracingMaterialHitShaders.usf.

  • Added Vulkan external memory support.

  • Added scoped CPU markers to various D3D shader compiler functions to make this easier to profile when shader compilation is done in process.

  • Added Global Shader Types to the ‘DumpMaterialShaderTypes' commandlet. This sorts global shaders alphabetically so diffs between output is stable. Also, added stats for scanning the asset registry and dumping the stats, and added a separate global shaders histogram, but it is currently not being dumped into the output log. The full asset path is reported for materials and material instance constants to make them easier to find in the editor.

  • Added Sky Atmosphere transmittance on forward shaded translucent when per pixel mode is selected on the atmospheric Directional Light.

  • Added an analytics provider to ‘DumpMaterialShaderTypes' to track nightly statistics across various projects. It calculates the total shaders in the Default Materials as a good metric. This impacts editor startup time and is the default materials are the worst case scenario for usage flags. It only gathers analytics if passed in on the commandline.

  • Added the ability to pass ‘-analytics' through automated testing. The following analytics are reported: ProjectName, BuildVersion, Platform, ShaderPlatform, TotalShaders, TotalMaterials, Total MaterialInstances, TotalGlobalShaders, and TotalDefaultMaterialShaders.

  • Added an automated test to run the DumpMaterialShaderTypes commandlet, which is useful for catching shader count regressions on projects.

    • Added a new test called "ShaderTypeRegressionTest" which can be run with the command line: RunUAT BuildGraph -Script=Engine/Build/ShaderTypeRegressionTest.xml -Target="Shader Type Regression" -append:Projects="EngineTest" -append:Projects="CitySample" -append:Projects="Lyra" -append:Projects="MedievalGame[UnrealEditor]"

    • The results are saved to Engine\Programs\AutomationTool\Saved\...

  • Volumetric Clouds is now precompiled through DXC. This accelerates volumetric domain materials (cloud shaders) compilation time by at least 6x.

  • Replaced UE4 references with UE5 in related UnrealLightmass files.

  • Added DumpGPU viewer script for Linux and Mac. Currently requires the Chrome Browser to view the dump files.

  • ‘Set Source Cubemap Angle' for Skylight components is now exposed in Blueprints.

  • Added a warning when the maximum number of active ray tracing lights is equal to or greater than ‘RAY_TRACING_LIGHT_COUNT_MAXIMUM'.

  • Exposed ‘BuildLightMaps' command to Python and Blueprint Utilities.

  • Stat Groups are added to the list of stats printed when running "stat help"

  • Changed default value for World Position Offset culling distance in ray tracing to 120m.

  • Added support for multiple reflection captures for Single Layer Water materials.

  • The GPU Dump Viewer now dumps both .sh and .bat so a dump can be opened either on Mac, Linux, or Windows regardless of the platform the files were dumped from.

  • Added UE-DumpGPUPath environment variables to dump across Perforce workspaces at the same location by default on a dev machine.

  • Implemented proper support for togglable Stationary direct lighting on mobile and deleted 'baked Stationary as Static' path. This change makes high quality and low quality lightmaps have unified lighting content and now they differ only in encoding.

  • Added support for CustomDepth in Translucency pass on Mobile LDR.

  • Refactored mobile Custom Depth and Stencil to line up with Desktop on all mobile platforms.

  • Clustered local lights and reflections are now supported on Mobile Forward and Deferred rendering paths. Local light shadows are supported on Mobile Forward and Deferred, and need to enable full depth prepass to generate the ShadowMaskTexture.

  • Disabled Simple Lights when using the Mobile Forward Renderer.

  • Mobile now supports additional shading models, such as Two Sided Foliage, Cloth, and Eye. They use the same shading models as the dynamic lighting code path on Desktop.

  • Reduced the size of UParticleModuleSpawn to 224 bytes to fit in a smaller FMallocBinned2 pool.

  • Reset UniqueTables instead of emptying it to reduce allocator churn. Reset FCommandListResourceState::ResourceStates instead of emptying it to reduce allocator churn.

  • Changed the Reflection Capture's encoded HDR data to RG11B10 format.

  • Skip reflections for simple translucent materials for both Mobile Forward and Deferred rendering paths. Translucent materials will fall back to single reflection or sky capture on Mobile Deferred if clustered reflection is disabled.

  • Enabled Ambient Occlusion on Mobile LDR.

  • Initial work to support rendering with LWC-scale position. The basic approach is to add HLSL types FLWCScalar, FLWCMatrix, FLWCVector, and so on. Inside shaders, absolute world space position values should be represented as FLWCVector3. Matrices that transform into absolute world space become FLWCMatrix. Matrices that transform from world space become FLWCInverseMatrix. Generally, LWC values work by extending the regular float value with an additional tile coordinate. Final tile size will be a trade-off between scale and accuracy. Value represented by a FLWCVector thus becomes V.Tile * TileSize + V.Offset. Most operations can be performed directly on LWC values. There are HLSL functions like LWCAdd, LWCSub, LWCMultiply, LWCDivide. The goal is to stay with LWC values for as long as needed, then convert to regular float values when possible. One thing that comes up a lot is working in translated (rather than absolute) world space. WorldSpace + View.PrevPreViewTranslation = TranslatedWorldspace. Except 'View.PrevPreViewTranslation' is now a FLWCVector3, and WorldSpace quantities should be as well. So that becomes LWCAdd(WorldSpace, View.PrevPreViewTranslation) = TranslatedWorldspace. Assuming that we're talking about a position that's "reasonably close" to the camera, it should be safe to convert the translated WS value to float. The 'tile' coordinate of the 2 LWC values should cancel out when added together in this case. Materials are fully supporting LWC-values as well. Projective texturing and vertex animation materials that I've tested work correctly even when positioned "far away" from the origin. Lots of work remains to fully convert all of our shader code. There's a function LWCHackToFloat(), which is a simple wrapper for LWCToFloat(). The idea of HackToFloat is to mark places that need further attention, where I'm simply converting absolute WS positions to float, to get shaders to compile. Shaders converted in this way should continue to work for all existing content (without LWC-scale values), but they will break if positions get too large. General overview of the changes are as follows:

    • LargeWorldCoordinates.ush - This defines the FLWC types and operations GPUScene.cpp, SceneData.ush

    • Primitives add an extra 'float3' tile coordinate. Instance data is unchanged, so instances need to stay within the single-precision range of the primitive origin. Could potentially split instances behind the scenes (I think) if we don't want this limitation HLSLMaterialDerivativeAutogen.cpp, HLSLMaterialTranslator.cpp, Preshader.cpp

    • Translated materials to use LWC values SceneView.cpp, SceneRelativeViewMatrices.cpp, ShaderCompiler.cpp, InstancedStereo.ush

    • View uniform buffer includes LWC values where appropriate

  • Added Blueprint function "Resize Render Target 2D" to support changing the resolution of a Render Target.

  • Added an editor utility script function "Set LOD Screen Sizes" in "Static Mesh Editor Subsystem" to set the LOD screen size for static meshes. Useful for batch modification of LOD settings.

  • Scene Capture: Added Blueprint function node "DeprojectSceneCaptureToWorld" to support translating UV coordinates in scene capture space to a world space ray, similar to "DeprojectScreenToWorld" which operates on the player camera. Allows hit tracing operations into scene capture surfaces without requiring C++ code. A typical approach involves feeding "DeprojectSceneCaptureToWorld" the output of a "Find Collision UV" node (requires "Support UV From Hit Results" enabled in Physics Settings). The "Find Collision UV" node receives a Hit reference from a "Line Trace By Channel" node. You can then use the output World Position and World Direction as a secondary ray to feed into another call to "Line Trace By Channel" to find the collision in the Scene Capture.

  • Added a new console variable r.SkeletalMeshClothBlend.Enabled, which is set true by default. When the variable is false, the cloth weight used in skin rendering is set to 0 and the rendered mesh will effectively ignore the output of the cloth simulation.

  • With Vulkan, a UE4 specific fix has been disabled on UE5 that was causing performance hitches.

  • Move VulkanMemory.h to Private for easier hotfixing in the future.

  • Refactored Layers and Extensions for the following on Vulkan:

    • Split code for layers and extensions.

    • Keep string arrays for layer management, and share as much code as possible between device and instance layers.

    • Create a new class for extensions and manage them through a single flow.

      • Package the code for the extension and its features+properties together in a single place, so the device code only iterates on loops of generic classes.

      • Keep distinct states to track if an extensions: is supported by the engine, is enabled in the engine, is supported by the driver at runtime, is activated at runtime.

      • If an extension is present but a required feature isn't, disable the extension.

      • Remove feature structs from Vulkan Device when they were only used for init.

      • Track promotion status of extensions (for future dev).

    • Revisit some 'per platform' extensions that were enabled on all platforms.

  • Read Skeletal Mesh render data from streaming bulk data so the editor can load the cooked data that is not cooked in line. This fixes editor-only renders the highest LOD when using cooked data as only the highest LOD is cooked inline.

  • Added validation for invalid custom water bodies (no water mesh specified).

  • Added support for Large World Coordinates (LWC) on GPUSkinnedVertexFactory and SkinCache shaders.

  • Implemented GPUSkinCache debug visualization modes. 'Overview' mode shows skin cache on/off, recompute tangents on/off. 'Memory' modeshows skin cache memory consumption per sk mesh, includes RT if sk mesh uses a separate RT entry *) 'RayTracingLODOffset` shows RT LOD index offset from raster LOD index.

  • Fixed skeletal mesh previous frame local-to-translated-world position in large world coordinates for both GPUSkinVF and LocalVF PassThrough.

  • The r.UseLegacyMaintainYFOVViewMatrix console variable can now be set in config files.

  • Implemented support for asynchronous creation and deletion of FRenderResource. The resource list uses a thread local free list that is coalesced later.

  • Added support for FUintVector3 & FQuat4f as shader parameters.

  • Added support for callbacks to simulate any-hit and intersection shaders in inline ray tracing.

  • Added new ray tracing debug modes. ‘Dynamic Instances' mode shows instances that go through a dynamic path. ‘Proxy Type' mode shows instances colored by proxy type hash. ‘Picker' allows picking instances/triangles with a mouse to show BLAS and instance info.

  • Added support for "Distant Lights" to Virtual Shadow Maps (VSM), making it possible to support far more local lights with VSM shadows enabled by forcing caching, reducing page-table size, and round-robin updates on lights with a small screen-space footprint. Disabled by default, it can be enabled by setting r.Shadow.Virtual.DistantLightMode=1.

  • Virtual Shadow Maps now support split screen rendering with caching and correct page marking.

  • Changed how cards guides are generated at import time. This improves accuracy for picking the correct principal direction used for generated guides.

  • Changed hair cards guide to have a root/tip color to make debugging easier.

  • Added planar reflection support for hair strands.

  • GatherRayTracingWorldInstancesForView was split into several parts in order to run most of the work asynchronously. This saves up to two-thirds of the GatherRayTracingWorldInstancesForView rendering thread critical path time in large projects. The main rendering thread cost is now FPrimitiveSceneProxy::GetDynamicRayTracingInstances(), which currently can't be moved to a task.

  • The NVidia UReflexBlueprintLibrary API is now available to other modules.

  • Added Rect Light texture atlas support. This allows a single texture binding for all textured area lighting.

  • Added a project setting to disable per-object translucency shadows (disabled by default). To use translucency self-shadowing you must now enable this project setting. The Console Variable for this setting is r.Shadow.TranslucentPerObject.ProjectEnabled.

  • Improved groom decimation accuracy and fixed invalid hair decimation when the decimation factor is larger than 0.5.

  • Added Order Independent Transparency per-pixel sorting support for translucent Materials (experimental). Order Independent Transparency must be enabled in Project Settings and is off by default. It is currently only supported on PC Dx12. This is the initial step for fine grain/per-pixel sorting.

  • Added precomputed BSDF directional albedo path for non-editor target. This avoids running the BuildTable pass which is too long on low-powered platforms.

  • Changed the representation of hair strands from a cross to a quad cylinder to avoid self-shadowing artifacts and prevent discontinuities between segments.

  • GPU texture formats for 32 bit float uncompressed pixels are now available (R32F and RGBA32F). Some platforms only support point/nearest sampling of 32 bit floats.

  • Added previous position support for geometry cache and fixed hair strands motion vector when continuous level of detail (CLOD) is used.

  • Added Groom Binding listing, preview, and skeletal mesh animation, within the Groom Asset Editor.

  • Moving some of the FRayTracingScene initialization work into an asynchronous task which:

    • Adds FRayTracingScene::BuildInitializationData, which builds FRayTracingSceneWithGeometryInstances.

    • Adds FRayTracingScene::CreateWithInitializationData() that consumes FRayTracingSceneWithGeometryInstances data.

    • Runs BuildInitializationData as soon as ray tracing instance culling tasks finish.

    • Waits for scene initialization data in FDeferredShadingSceneRenderer::DispatchRayTracingWorldUpdates, which saves ~0.2-0.3ms of rendering thread time in large scenes.

  • Unified the 8 separate variations of WriteRawToTexture_RenderThread into a single function on FTexture2DDynamicResource.

  • Implemented and enabled two-pass Hierarchical Z-Buffer (HZB) occlusion culling for Virtual Shadow Maps when using Nanite geometry, making it render correct shadows under all forms of disocclusion. The console variable for this setting is ‘r.Shadow.Virtual.UseHZB'.

  • Improved and simplified 'ShaderPrint' to be the unique interface for outputting debug information from shaders. It regroups string printing, line, triangles, and widget (experimental) drawings into a single interface.

  • Added Groom Alembic supports for GroupName.

  • Added RootUV, Color attributes, Roughness attributes, and Precomputed Guide Weights information when importing a Groom Asset.

  • Added r.Shadow.Virtual.Cache.ForceInvalidateClipmaps that can be used to force invalidation for Virtual Shadow Map clipmaps, even when caching is enabled. This is useful when the light is constantly invalidating (moving sunlight, for example) to reduce cache-management overhead.

  • Changed voxelization to use an adaptive voxel size based on screen projection. This significantly reduces the cost of voxelization, shadow masks, and transmittance masks when grooms are further away from the camera.

  • Reduced groom binding data size by deduplicating unique triangle data. The data size of the resulting binding asset type is reduced to approximately 1/5 of the original.

  • Ray Tracing static primitive LOD calculations are now run asynchronously, as results are only needed much later for the FRayTracingSceneAddInstancesTask. This allows GatherRayTracingWorldInstancesForView() to start earlier on the rendering thread.

  • Disabled primitive octree culling (console variable 'r.UseVisibilityOctree') by default as this causes visibility culling issues because of the limited extent of the tree (HALF_WORLD_MAX).

  • Added tangent debug mode to the Groom Asset Editor.

  • Added ray tracing Material evaluation to hair strands and custom primitive intersection.

  • Fixed hair strands shadow culling when a hair instance is not visible in the primary view.

  • Added per-object triangle sorting per view in order to improve translucent ordering artifacts.

  • Implemented Large World Coordinates (LWC) support of Mesh Distance Fields data and related techniques.

  • Batch Top Level Acceleration Structure (TLAS) builds on platforms that support it.

  • Ray Tracing LightGrid is now calculated in translated world space.

  • More than one PreviewPlatform can now use the same ShaderPlatforms.

  • Improved expand bias in Distance Field Shadows by calculating the bias applied to two-sided meshes proportional to voxel size. You can adjust this bias with the console variable 'r.DFShadow.TwoSidedMeshDistanceBiasScale.'

  • Global Signed Distance fields are now updated in translated world space. The clipmap center is used as the origin of translated world space during the update.

  • Added console variable flags that automatically modify the KeyString when modified. The following KeyStrings are modified based on platform. The console variable r.MobileHDR is using this system now and others will follow in future releases.

    • ECVF_GeneralShaderChange = 0x200 modify the Shader KeyString for All Platforms.

    • ECVF_GeneralShaderChange = 0x400 modify the Shader KeyString for mobile Platforms.

    • ECVF_GeneralShaderChange = 0x800 modify the Shader KeyString for Desktop Platforms.

  • Create loose parameters uniform buffer to encapsulate GPUSkinPassThroughVertexFactory PreviousPositionBuffer. These changes ensure failure in MessPassProcessor.cpp in debug_editor build, due to PreviousPositionBuffer being a loose SRV parameter.

  • Enabled Hardware Ray Tracing (shadows, reflections, ambient occlusion, global illumination) and the Path Tracer to now work in large worlds.

  • Added support for capsule shadows in Large World Coordinates (LWC).

  • Added support for multiple layers in FRayTracingScene.

  • Added epsilon trace support in Raytraced Shadows to avoid self intersections.

  • Changed ShaderArchive, GlobalShaderCache, ShaderDebugInfo and Autogen to use ShaderPlatformName and not ShaderFormat when naming their output files.

  • Updated MeshUtilities::GenerateStratifiedUniformHemisphereSamples to use concentric disk sampling.

  • Support specifying MaxAttributeSizeInBytes in FRayTracingPipelineStateInitializer instead of always using RAY_TRACING_MAX_ALLOWED_ATTRIBUTE_SIZE.

Improvement:

  • Updated the Base Shape's material in Engine Content because it could cause invalidation of automatic image tests. The base color was changed from a value of (1, 1, 1, 1) to (0.9, 0.9, 0.9, 1.0). This change affects all base shapes (sphere, box, cylinder, and so on) that use the base shape material. Having a base color of 1.0 represents a physically unrealistic material that reflects 100% of all incoming light, which can create strange results where light never attenuates.

  • Increased the Sample Per Pixel limit in the user interface for ray tracing passes.

  • Adds a viewer console for GPUDumpViewer that can detect errors in the dump, such as incomplete dump.

  • Improved the velocity precision on Android GLES platforms by using UINT format instead of FLOAT format.

  • Improved the quality of AlphaToCoverage on mobile.

  • Upgraded Vulkan SDK from 1.2.162.0 to 1.3.204.0.

  • Improved VulkanRHI GPU rendering with earlydepthstencil.

  • Added texture address mode member to volume textures to allow control of all three axes at once.

  • Offloaded GPU scene uploads to an async task.

  • The HDR tonemapper is now using ACES 1.3.

  • Converted volumetric lightmap textures to RenderDependencyGraph (RDG).

  • Ported GPU scene buffers to RenderDependencyGraph (RDG).

  • Improved BuildHiddenComponentList performance by ~2ms in split-screen by expanding the hidden actor's components directly instead of doing it every frame.

  • Removed cases of AddCopyToResolveTargetPass which either weren't necessary or weren't performing multisample resolves.

  • Converted scene reflection capture path to RenderDependencyGraph (RDG).

  • Conversions from the working color space (as set in rendering settings) are now correctly accounted for in the CombinedLUT and tonemapper.

  • Improved water body map check error messages.

  • Renamed the editor experimental setting bEnableAsyncSkeletalMeshCompilation to bEnableAsyncSkinnedAssetCompilation.

  • Moved scene texture config and parameters into the Engine Library.

  • Moved scene renderer deletion off the render thread.

  • Moved RenderDependencyGraph (RDG) builder destruction off the render thread.

  • Moved dynamic mesh passes and BeginSceneOcclusion off the render thread.

  • Replaced thread-local MemStack with ConcurrentLinearAllocator across the renderer.

  • Refactored the ray tracing geometry update logic for Skeletal Mesh to simplify its process. This includes:

    • All skin cache entries needing RT geometry update are processed altogether in end-of-frame update whether batch dispatching or not, simplifies the logic.

    • Transition buffers to read immediately after skin cache DoDispatch calls, simplifies the logic.

    • No longer cache the flag to indicate whether RT geometry needs to be rebuilt, the logic is calculated directly when updating RT geometry.

  • Improved hair strands root UV precision.

  • Improved the performance of heightfield distance field management.

  • Added the Frequency name to the "Unrecognized shader frequency" Shader Compiler error.

  • Improved support for callable shaders.

  • Reduced memory usage during RayTracingScene setup.

Optimization:

  • Reduced GPUSkinPassThrough vertex factory shader permutations by merging it into local vertex factory. PassThroughVF is kept as a wrapper class.

  • Reduced morph target vertex factory shader permutations by merging it into the GPUSkin vertex factory.

  • Reduced multi influence cloth vertex factory shader permutations by merging with single influence cloth vertex factory.

Crash Fix:

  • Fixed a potential crash where deleted primitives could potentially be put into the ray tracing mesh command cache even though their resources were already released.

  • Fixed a potential crash in Movie Render Queue from null pointer dereference when searching MRQ setting classes.

  • Made some Volumetric Fog console variables safe from causing a crash to occur.

  • Fixed a crash when attempting to load ray tracing shaders when ray tracing is disabled.

  • Removed an assert that was firing when rendering hair.

  • Fixed an assert triggering because baked depth data was found to be invalid.

  • Fixed a debug crash when GPUScene and modulated shadow are enabled.

  • Fixed a crash while cooking Android with Lightmap Virtual Texturing enabled.

  • Fixed a crash that could occur when using High Resolution Screenshot with ‘Use custom depth as mask' enabled on Mobile Preview.

  • Fixed crash on Vulkan when trying to read data from TextureCubeArray.

  • Fixed a rare Vulkan RHI crash caused by an incorrect instance count when drawing indirect lines.

  • Fixed random crash occurring in HLOD builder commandlet, where we're hashing landscape texture source data while potentially asynchronously building textures. UTexture2D::GetSizeX() / UTexture2D::GetSizeY() should be prevented in those cases, since unlike in the landscape editor, nothing ensures that FinishCachePlatformData() is called on those textures and the returned sizes end up being wrong / thread-unsafe. Also fixed a couple of places where we were not using the FTextureSource's data (even though those calls should be fine since they happen in a place where texture compilation is done)

  • Fixed a crash that occurred when the bone name setup in a GroomComponent was incorrect.

  • Fixed a crash with Hair when per-pixel linked list (PPLL) rendering is enabled, and hair groom are selected, proxy geometry is queried/rendered.

  • Fixed a crash when using Materials with the UseHairStrands option enabled on a non-groom geometry.

  • Fixed a crash when rendering hair strands with the Path Tracer when hair length scale was lower than 1.

  • Fixed a crash that occurred when hair strands were rendered without any voxelization.

  • Fix a crash that occurred when setting curve decimation above one.

  • Fixed a crash that occurred when the number of DistanceField Mips was higher than DistanceField::NumMips.

  • Fixed crash in FHZBOcclusionTester when MapResults is called before Submit.

Bug Fix:

  • Fixed some issues that could occur when ‘ShowFlag.Rendering' is disabled.

  • Fixed Sky Light Capture not working correctly when toggling effect quality level.

  • Fix an issue with ‘GetMaxNumInstructionsForShader' that reported the incorrect instruction count for the given shader type. The function was not checking to see if the shader type in the pipeline was the same as the shader type we are asking for.

  • Applied fix for Volumetric Cloud to work with Large World Coordinates (LWC).

  • Ensure slow task dialog is shown when blocking ‘on all shader' maps to be compiled. This way we can see the progress on how many shaders are being compiled.

  • FFloat16 is not currently included in TShaderParameterTypeInfo, and increasing its array count will not increase its NumRows as intended. Simply hardcode correct values.

  • Do not allow ‘r.SkinCache.SkipCompilingGPUSkinVF=1' on mobile platforms (FeatureLevel == ERHIFeatureLevel::ES3_1). Some mobile platforms have a limit on how big buffers can be for skin cache positions. If we ever exceed this amount on a specific mesh, we skip the skin cache operation and need to fallback to a GPU Skin Shader. Since we don't know which shaders will be needed on a per-mesh basis, we must disable this feature and assume we need GPU Skin Shaders for ‘all materials'.

  • Fixed LoadAction to keep previous FinalLightingAtlas content if it was produced earlier (fix issue in Vulkan).

  • Prevent shifts by a negative value, which addresses static analysis warning: warning V610: Undefined behavior. Check the shift operator <<. The right operand is negative ('....' = [-1..254]) - Texture Resolution will be 1.

  • Fixed Sky Atmosphere not updating correctly the cached camera aerial perspective buffer settings after console variable tweaks.

  • Fixed a potential NaN in cloud depth texture with half float.

  • Applied a fix for broken fog due to Large World Coordinates (LWC).

  • Fix Game Thread and Render Thread access issues when performing shader compilation using FMaterial.

    • SubmitCompileJobs was assumed to be render thread only. Make this explicit in the function name and add a render thread check.

    • Added SubmitCompileJobs_GameThread to perform shader compilation submitted from the Game Thread safe.

    • Keep a ref to a GameThreadPendingCompilerEnvironment because the one on the GameThreadShaderMap goes away after we clone.

    • Added render thread check to GetRuntimeVirtualTextureOutputAttibuteMask_RenderThread.

    • Move simple enum types from ShaderCompiler.h to ShaderCompilerCore.h so we can access EShaderCompileJobPriority in MaterialShared.h

    • Fixed incorrect usage SubmitCompileJobs that was submitted from the Game Thread using the Render Thread maps.

  • Further reducing the geometry collection BLAS build count. a) Move the build out of the section loop so that we add one BLAS per geometry collection. b) Create the ray tracing geometry but delay the BLAS build later to dynamic raytracing geometry update.

  • Fixed geometry collection performance issue by creating one TLAS per geometry collection instead of one per transform.

  • Fixed a shader issue that was evident with SpeedTree foliage.

  • Fixed an issue with DumpGPU when only the 32-bit version of Chrome Browser is installed.

  • Fixed an issue with calling the DumpGPU command on mobile platforms.

  • Fixed an issue with DumpGPU's resource search by saving all resource descriptors into a single Base/ResourceDesc.json file.

  • Added dump timing measurement details to log when using DumpGPU.

  • Fixed an issue with ‘OpenGPUDumpViewer.bat' when a parent directory has a space in the file path.

  • Fixed issues with ray tracing translucency looking overly bright when the tonemapper is disabled.

  • Fixed an issue with missing GPUDumpViewer files from a packaged build on Android and iOS.

  • Fixed black mip 0 in DumpGPU when a texture has a mip chain on D3D11 by using the capture by compute shader.

  • Avoid divide-by-zero in GetLightMapColorLQ.

  • Fixed Lightmass wrong string formatting.

  • Ray tracing now takes into account the ‘Visible In Scene Captures Only' flag.

  • Fixed an issue where Static Lighting was broken when using Forward Rendering. The lightmap build data would get invalidated incorrectly while cooking.

  • Fix DumpGPU file write error.

  • When having lines that use world and screen space scaling in the same batch, OrthoZoomFactor can get overwritten, causing following vertices to potentially be generated wrongly.

  • Fixed an issue where ray tracing could accidentally be enabled when disabled in render settings.

  • Fixed incorrect Hierarchical Instance Static Mesh culling in ray tracing because bounds are not always initialized when the culling happens.

  • Fixed FNiagaraRendererMeshes::GetDynamicRayTracingInstances fails to use Reserve, MoveTemp, or Emplace_GetRef to avoid copies and reallocations.

  • Automation tests that do not have ray tracing enabled will now disable ray tracing explicitly to avoid enabling it by accident when D3D12 is active.

  • Fixed a bug with Cascaded Shadow Map caching on mobile.

  • Fixed a bug with DepthAux corruption on Mobile OpenGL.

  • Fixed an issue where the indirect lighting of translucency is too bright on mobile.

  • Fix an issue with depth of field jittering when the anti-aliasing method on mobile is set to Temporal Anti-Aliasing.

  • Fix a shader bug on mobile with pixel projected reflection.

  • Fixed an issue with stencil testing in Post Process Materials if MobileSupportFetchBindedCustomStencilBuffer

  • Fixed an issue with fetching depth in mobile's separate translucent pass with Vulkan subpass.

  • Fixed an issue with alpha detection in Virtual Texture builder causing tiles in the same virtual texture to use different formats.

  • Fixed an issue that the Multi-Sampling Anti-Aliasing (MSAA) was broken on Android.

  • Changed the precision of length2 from half to float to fix artifacts on Mobile Vulkan.

  • Fixed an issue with reflection being too bright on Mobile Deferred renderer with Static Lighting disabled.

  • Fixed an issue with mobile alpha coverage when the material is masked but writes every pixel.

  • Fixed an issue with resolving Multi-Sampling Anti-Aliasing (MSAA) texture on IOS.

  • Fixed an issue where the GlobalClipPlane doesn't work on depth-only vertex shader on Mobile Preview Shader platform.

  • Fixed an issue where the brightness was not consistent when using Multi-Sampling Anti-Aliasing on iOS.

  • Resolved an issue where depth content was not being kept when Temporal Anti-Aliasing was enabled. It was because the bKeepDepthContent was false if CameraCut is used and the SceneDepthTexture could be a dummy black texture (RGBA8 format) and a RenderDependencyGraph (RDG) validation failed at creating StencilTexture SRV which was expecting PF_DepthStencil format.

  • Fixed an issue when Multi-Sampling Anti-Aliasing (MSAA) is enabled, it would only output SceneColor for SunMask on iOS.

  • Fixed an issue with dark screens with Vignette enabled on Android.

  • Fixed an issue with counting Skeletal and Static Meshes memory with mesh streaming enabled. The IncrementMemoryStats was called at the FSkeletalMeshLODRenderData::InitResources and FSkeletalMeshStreamIn::DoFinishUpdate.

  • Fixed light flickering issue on Mobile Vulkan that could happen on Cloth and Hair assets.

  • Fixed an issue with Cascaded Shadow Maps when using split-screen on mobile.

  • Disabled GPUScene for landscape on mobile since it is not supported.

  • Fixed an assert on Vulkan when a texture is created from TransientHeap with Discard as its initial state.

  • Fixed CmdBuffer->IsSubmitted() assert on Vulkan.

  • Implemented changes on Vulkan RHI to avoid the automatic clearing of new targets when they are allocated in transient memory since it gets put in the upload command buffer that can execute earlier in the frame (when the same memory is potentially used by a different transient resource).

  • Resolved a bug that caused flickering in the Editor when using Vulkan.

  • Make it clear that PlatformData can't be null when creating texture cube array, fix static analysis warning.

  • Fixed a Scene Capture issue so editor-only components aren't created when running a commandlet.

  • Fixed 16 byte alignment of array elements for Vulkan. There are a few macros to help with conversion of cases where a single scalar is used in shader parameter arrays (and cannot be packed with other scalars).

    • [C++] SHADER_PARAMETER_SCALAR_ARRAY(MemberType,MemberName,NumElements): adds an automagically packed array of scalars to shader parameters.

    • [C++,HLSL] GET_SCALAR_ARRAY_ELEMENT(PackedArray, ElementIndex): returns the value at that index in the scalar array.

    • [HLSL] DECLARE_SCALAR_ARRAY(ScalarType, ScalarName, ElementCount): declares an automagically packed array of scalars.

  • For Vulkan, we fixed an occasional layout error in Virtual Textures depending on which pass runs first after it is resized.

  • Fixed an issue where a GameThread would stall (waiting for render thread) whenever a console variable was changed during gameplay.

  • Fixed a NaN error introduced by fog when it is used on materials used by DrawCanvas

  • Fixed mem report texture usage computation for landscape components. This includes:

    • HeightmapTexture / XYOffsetmapTexture, which are only used on the non-mobile path, were artificially increasing the ref counts on platforms where mobile and non-mobile paths are enabled (in mobile mode).

    • Weightmap[0], which contains the normal map in mobile mode, was not accounted for by the material instance's GetUsedTextures call, since it uses inlined HLSL code to sample it, rather than a texture sample material expression

  • Fixed the visual calibration (device-encoding-only) viewport passes for HDR in scRGB mode.

  • Fixed data race and potential double delete in FCanvas deletion path.

  • Enabling HDR in the Editor now supports use with both HDR and non-HDR monitors.

  • Fixed the "Selected Morph Target Vertices" Editor visualization, which was broken.

  • Bug Fix: User Interface HDR composition in the Editor is now consistent with in-game HDR composition.

  • Implemented a fix in the usage of ERayTracingPrimitiveFlags::UnsupportedProxyType. Its value is 0, so it must not be used with EnumHasAnyFlags().

  • Fixed "Primary Rays" Ray Tracing debug view mode by renaming ERayTracingPrimaryRaysFlag::ConsiderSurfaceScatter to PrimaryView and using it to initialize the first ray instance inclusion mask in the RayTracingPrimaryRays Ray Generation Shader (RGS).

  • Changed how hair strand textures are computed. These changes process hair strands textures in tile, and split computation over several frames to avoid Timeout Detection and Recover (TDR) on large grooms.

  • Fixed an issue with HighResShot not clipping the rectangle to image bounds, and allowing memory to be read out of bounds.

  • Changed groom bound computation when attached to a parent skeletal mesh, depending on whether it is attached relatively or not. The relative attachment is done based on attachment bone naming.

  • Implemented a fix to exclude primitives that are meant to be hidden in game from the ray tracing scene when game view is enabled or in Play in Editor mode.

  • Fixed an issue with hair strand shadows when Ray Traced Shadows is enabled. Ray Traced Shadows are now done in translated world space, replacing a previous temporary workaround for computing transversal in world space.

  • Fixed a crash when r.RayTracing.Shadows is enabled dynamically. Previously FScene contained an array of Ray Trace Shadowed lights, which was updated when a light was added or removed. However, this is incorrect as the light's Ray Traced Shadow state depends on console variables that may be changed dynamically. The solution is to check if the scene currently contains any lights with Ray Traced Shadows during rendering. This is more expensive but robust. The array of RT-Shadowed lights is removed as it was not used beyond checking if it's empty.

  • Fixed a reentrancy bug by making FSimpleMeshDrawCommandPass only run SetupDrawCommands the first time BuildRenderingCommands is called. This fixes a check in groom rendering.

  • Fixed a hair selection issue under certain camera position and view resolutions.

  • Fixed texture arrays with mip chains and streaming by adding an access point to texture arrays to get the mip data.

  • Texture2dArrays now stream properly, correctly handling LODBias and packed mip tails.

  • Platform Linux for the LiveLinkOverNDisplay Plugin was whitelisted in nDisplay.

  • Fixed hair strands support for light functions by ensuring that light functions evaluated for hair strands will fetch the correct scene depth value.

  • Fixed an issue where ACompositingElement could not initialize properly because Super::BeginPlay was not called.

  • Fixed "Single Sample Shadow From Stationary Lights" by propagating the flag to GPU-Scene.

  • Fixed the estimate for how many streaming texture mips to prefetch to avoid a blocking cache fetch on the main thread in the Editor.

  • Implemented a fix for depth bounds setting outside of valid range on fog pass. The Render Hardware Interface (RHI) validation layer now has checks to catch such issues in the future.

  • Fixed a leak when using the Null renderer (primarily for autotests), by implementing a valid Sync method.

  • Fixed a memory leak relating to UpdateTextureRegions inFRemoteSessionARCameraChannel::UpdateRenderingTexture.

  • Added support for root UV in hair card Groom Assets.

  • Fixed the visualization of Cards guides so they are only available when simulation is enabled.

  • Fixed missing update of hair ray tracing geometry when hair radius / tip / root / ray tracing scale are updated on a static groom.

  • Fixed hair LOD colorization on cards and meshes geometry.

  • Fixed a typo in the Blueprint action-menu category for composure export functions.

  • PR #9127: Corrected a typo in an FLiveLinkLog warning message.

  • Implemented code to use a conservative vertex count to initialize ray tracing geometries with multiple segments. The value of Segment.MaxVertices must be at least as large as the maximum value in the index buffer, plus 1. Previously this was initialized to per-segment vertex count, which can be too small.

  • Fixed a bug to hide the shadow of primitives with "hidden shadow" enabled when the actor is hidden in the Editor UI. Previously, the shadow would remain even if the primitive was hidden in the Editor.

  • Fixed Texture Profiler compiler errors.

  • Apply "Get Ray Tracing Quality Switch," "Get Path Tracing Quality Switch," and "Get Lightmass Replace State" functions to ray tracing callable and miss shaders.

  • Fixed an issue in FTextureLayout3d causing higher than expected memory usage.

  • Fixed an issue with the availability of heightmap visibility when building the Global Distance Field in cooked builds.

  • Fixed issues with Distance Field Shadows in water when using async compute.

  • Fixed issues with Distance Field Shadows when using split screen.

  • Fixed GlobalDistanceField corruption that occurred when a scene contained only heightfields.

  • Fixed issues with materials applying vertex offset or modifying opacity based on DistanceToNearestSurface.

Deprecated:

  • Deprecated bOverrideWaterMesh (WaterMeshOverride is enough to override the water mesh, no need for an additional boolean).

  • Deprecated the view uniform buffer from MeshPassRenderState.

Removed:

  • Removed all flip-y completely and only flip-y at the end on Android GL with a native window API since there is no need to handle flip-y on high level.

  • Removed the limitation of having a max of four local lights when using Mobile Forward Renderer.

  • Removed the ‘High Quality Reflection' option when using the Mobile Forward Renderer.

  • Removed the division of Pi on Mobile Directional Light's color in C++ to line up with desktop in shaders.

  • Removed the Mobile rendering project setting to set ‘Max Movable Spotlights / Point Lights'. On Mobile, this forces Movable Point Lights to be Static.

  • Removed view uniform buffer from ray tracing mesh draw commands and deleted FPersistentUniformBuffers::ViewUniformBuffer.

  • Crunch and zlib compression support on Virtual Texture tiles was removed from the engine.

  • Removed the r.CachedRayTracingInstances.CacheLocalTransform/LazyUpdate console variable.

  • Removed the deprecated FRayTracingSceneInitializer codepath.

Architecture

New:

  • Virtual Shadow Map cache can optionally be allocated per view. Can be a significant performance win by avoiding constant cache thrashing when rendering multiple view families (for example, this is used for nDisplay). Enable the feature on the FSceneViewStateInterface using AddVirtualShadowMapCache. See also the related RemoveVirtualShadowMapCache and HasVirtualShadowMapCache functions.

  • Added Virtual Texture warmup frames for Material baking. The number of warmup frames is controlled by the MaterialBaking.VTWarmupFrames Console Variable and defaults to 5. Warmup will only happen if the Material samples Virtual Textures.

  • Added support for updating the Virtual Texture system when using DrawTileMesh. This allows systems that capture or bake Materials to warm up source Virtual Textures correctly.

  • Added a renderer project setting to enable Virtual Textures to be used in opacity masks. This setting defaults to off, which is the current behavior.

  • The Groom system now supports reading the skinned mesh geometry cache from the deformer graph system. This allows Groom to stay synched to the animated mesh when deformer graphs are used.

  • Compression settings for Runtime Virtual Texture (RVT) streaming mips are now stored in the RVT Component instead of the RVT Asset.

  • Decal components are now exposed to Blueprints.

  • Added support for velocity vector output for objects that are marked as Static but have Materials with World Position Offset.

  • Translucency Sort Priority is now used to sort Mesh Decals.

Bug Fix:

  • Fixed sphere geometry vertex buffer to use FVector3f, rather than FVector.

  • Fixed a bug that caused a failure when setting a Material Instance Dynamic on a decal after World Partition streaming has already happened.

  • Removed an unnecessary warning that nothing will be written to virtual texture for empty foliage actors.

  • Implemented changes to force a depth prepass when Virtual Textures are enabled for a project. This fixes an issue where masked Materials could not be used with Virtual Textures when the depth prepass wasn't enabled.

  • Fix a bug with no velocity being written for Unlit Materials.

  • Fix a bug with Virtual Textures not updating correctly in debug view modes.

  • Fixed an issue where Adaptive Virtual Textures would read from pages that weren't fully mapped, which could lead to flickering or sampling errors.

  • Implemented changes to disable parallel Render Dependency Graph if it's not running in a dedicated render thread.

Lighting

New:

  • The Path Tracer now invalidates the path-traced out when decals are added, removed or transformed.

  • Implemented Subsurface Scattering support for the eye shading model.

  • Implemented Alpha Holdout blend mode.

  • Enabled progress display by default and reduced the default Samples Per Pixel value to 2048 in the Post Process Settings.

  • Dithered opacity masked Materials should now ignore the clip value.

  • The Path Tracer now takes the normal map into account at the exit point of the random walk for better detail preservation in Subsurface Scattering.

  • Added support for Light Functions in the Path Tracer. This also includes colored light functions when using them with the console variable ‘r.PathTracing.LightFuntionColor'.

  • Invalidate Path Tracer when Sequencer time changes This change also allows the Path Tracer to be used in the Niagara editor (with constant invalidation, but avoiding blurring).

  • Improved filtering of which scene proxies should impact Path Tracer invalidation.

  • Add support for path tracing in the Material Editor and Static Mesh Editors.

  • Added Light Function support for ray tracing. Lights with assigned light function materials will now show up correctly in raytraced reflections.

  • Implement Sky Atmosphere and Exponential Height Fog in the Path Tracer.

  • Added support for Distance Field Shadow on water materials using Single Layer Water. Set the console command ‘r.Water.SingleLayer.ShaderSupportDistanceFieldShadow' to enable it. This change requires restarting the editor.

  • Implemented Ray Tracing support for the Image Plate plugin.

  • Added support for a Light's ‘Source Length' setting in Ray Tracing.

  • Added functions on UExponentialHeightFogComponent to allow users to set Second Fog variables in code along with FSecondFogData struct to allow setting them through Blueprint.

  • Implemented a workaround for incorrect shadow ranges in directional lights due to the changed default values in the Unreal Engine 5.0 release. Old defaults are no longer loaded if they are part of Blueprints, regardless of the engine version used to create the Blueprint.

Improvement:

  • Improvements to Virtual Shadow Map static caching categorization. Primitives are still categorized initially based on mobility, but if a static primitive invalidates the virtual shadow map (usually due to the use of world position offset in a material) it will be transitioned to dynamic automatically to avoid continually invalidating the static cache.

Optimization:

  • Several optimizations to light loop for shadowed lights that together lead to some gains in scenes with several local lights, and large gains when using virtual shadow maps one pass projection with many local lights.

    • Reduced barriers and GPU idle time for small lights.

    • Decoupled virtual shadow map one pass projection from clustered shading. When only a virtual shadow map is present for a light and no light functions are used, it can now take a fast path in the light loop.

Crash Fix:

  • Fixed an assert on Light count when there are no lights in the scene.

  • Fix potential crash when ray-traced shadows are disabled for the project but there is still a Light in the scene that enables ray-traced shadows.

Bug Fix:

  • Applied a fix for potential NaNs in the hair shading model.

  • Fixed Moveable Lights not invalidating the Path Tracer.

  • Avoid invalidating the Path Tracer when a Moveable Light transform has been set but did not actually change.

  • Fixed a constant invalidation in MRQ renders when camera depth of field is animated.

  • Fixed missing scene invalidations when changing skylight or moving atmosphere / fog components.

  • Fixed a constant path tracer invalidation being caused by Post Process Material blending.

  • Fixed an issue with MRQ where the post-processed output is not accumulated properly when using the Path Tracer.

  • Applied a fix for Reflection Captures sometimes showing up black in packaged games.

  • Fixed the bug that Gizmos are affecting global illumination. Added translucent editor primitives support. Top view mesh elements with translucent materials will go through editor primitive rendering instead of the standard translucency pass.

  • Applied a workaround for potential GPU timeouts when raytracing procedural hair primitives from a long distance.

  • Fixed sky and cloud issues that could occur in split-screen.

  • Fixed skylight intensity not updating through Sequencer.

  • Volumetric fog history and pre integrated light froxel texture are now pre exposed to avoid smearing artifacts at super low exposure.

  • GPULightmass should complete shader compilation before building lighting. The alternative is to have lightmass constantly restart as new shaders complete.

  • Implemented code to avoid Distance Field Ambient Occlusion self shadowing when using the console variable r.AOQuality >= 2.

  • Fixed incorrect distance field indirect self shadowing.

Lumen

New:

  • Lumen support added for Scene Capture 2D. By default Lumen is disabled for Scene Capture to save memory, but can be enabled via post process override settings in the Scene Capture Actor (override Dynamic Global Illumination Method and/or Reflection Method to Lumen). Lumen requires persistent state to function properly, so Lumen for Scene Capture requires either bCaptureEveryFrame or bAlwaysPersistRenderingState to be set to true. Lumen will be disabled if both are false. The persistent memory usage for Lumen is significant, from 300 to 600 MB or more, depending on quality settings. The Texture Editor has been upgraded to display GPU memory usage for Scene Capture 2D to allow the overhead to be observed. By default the quality is set to minimum, but can be overridden with the Scene Capture Cache Resolution Scale post process setting under Lumen.

  • Surface cache generation algorithm is now more robust and able to cover a higher variety of meshes, including having surface cache for tiny scene elements.

  • Distance field stochastic semi-transparency for foliage Software Ray Tracing. This gives a more accurate representation of foliage, less over-occlusion.

  • Added Lumen Diffuse Color Boost to Post Process Volume. It allows brightening indirect lighting by calculating DiffuseColor for indirect lighting as pow(DiffuseColor, 1 / DiffuseBoost). Values above 1 (original diffuse color) aren't physically correct, but they can be useful as an art direction knob to increase the amount of bounced light in the scene. Best to keep below 2 as it also causes reflections to be brighter than the scene.

  • Enabled Lumen Radiosity on High GI settings.

  • Lumen Scene Direct Lighting now supports Rect Light Source Texture.

  • Added Skylight leaking control for Lumen as a new Post Process Volume setting that allows skylight to leak intentionally to prevent areas from going fully black with global illumination. It's useful for art direction, as it is a non-physical control, although it should be kept very subtle (.005 or less) to avoid losing HDR lighting contrast. Skylight leaking ramps up over distance, which creates Ambient Occlusion and keeps it from looking flat.

  • Lumen now supports the Two Sided Foliage shading model by accumulating irradiance for the backface, giving much higher quality foliage shading. The High GI scalability level disables r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse to avoid overhead. Also, improved Screen Probe hardware tracing biasing on two sided materials

  • Removed ray dithering fade at the end of trace distance when far field isn't used

  • When lighting surface cache pick N most important lights instead of N first lights. It improves lighting quality and fixes nondeterministic surface cache lighting as sometimes lights may be added to a scene in a different order. Control this with r.LumenScene.DirectLighting.MaxLightsPerTile.

  • Added an AffectIndirectLightingWhileHidden property to the Primitive Component, which allows hidden primitives to be injected into Global Illumination (GI) and Reflections. This is useful as an extra art direction tool to create cheap invisible area lights through GI.

  • Increased the Global Signed Distance Field (SDF) resolution when using Lumen Software Ray Tracing.

  • Added support for lighting channels for analytical lights.

Improvement:

  • In Software Ray Tracing mode voxel lighting volume has been replaced with an object grid, which allows sampling of the surface cache directly instead of a low resolution and leaky resampled voxel representation. This improves secondary bounces, reflections and GI from small emissive surface elements.

  • Optimized radiosity card tile memory size by allocating based on the update atlas size instead of a physical atlas size.

  • Added UPrimitiveComponent::InvalidateLumenSurfaceCache() to support manual surface cache refreshing on any material change.

  • Raised Lumen GI's intensity clamp (firefly prevention) by a factor of 2 now that Lumen has less noise.

  • Lumen lighting propagation is now faster while using editor movement widgets and toggling directional lights and skylights.

  • Lumen GI now uses Spatiotemporal Blue Noise, which gives much cleaner indirect lighting, especially when the camera is still and in screenshots. 'High' GI scalability quality in particular is improved.

Crash Fix:

  • Fixed a crash which occurred when reallocating surface cache pages with a modified aspect ratio after an object scale transform.

  • Fixed crash which occurred when enabling reflection hit lighting with a surface cache project setting.

Bug Fix:

  • Fixed Emissive Light Source not correctly encoded to be injected into the Voxel Lighting.

  • Lumen Screen Traces now skip hitting foliage materials to fix noise that could occur around grass.

  • Fix Radiance Cache leaking in Software Ray Tracing mode due to rays starting inside geometry.

  • Fixed randomly missing mesh cards from cook

  • Fixed mesh distance field volume interpolation on consoles.

  • Disabled Octahedral Irradiance format for Screen Probe Gather on Epic GI scalability settings as it doesn't handle gradients well.

  • Fixed Lumen GI and Reflections being culled at 1 million Unreal Units.

  • Invisible shadow casters are now filtered out from Lumen Scene.

  • Fixed an infinite loop that would occur when generating mesh cards for huge meshes.

  • Fixed area and capsule lights to respect source radius and length when lighting the surface cache.

  • Fixed non-Nanite per ISM surface cache generation.

  • Fixed an issue with indirect light rendering when the Lighting Complexity View Mode is enabled

  • Fixed missing Global Illumination energy on AMD GPUs.

Materials/Shaders

API Change:

  • The DirectX Shader Compiler (DXC) no longer allows duplicate semantics in shader signatures. Particularly using SV_InstanceID requires careful examination of vertex factories input as it will likely be already defined there.

New:

  • Exposed azimuthal roughness on hair through the scatter (Metallic) parameter. The default value of 0 corresponds to 1.0 azimuthal roughness (current behavior) while increasing the scatter amount makes the hair more and more forward scattering, leading to a softer appearance. The lowest possible roughness is limited to 0.1 to limit noise.

  • Implemented support for Per Instance Custom Data for non-Nanite use cases (including ray tracing shaders).

  • When switching between rendering preview modes, On-Demand Shader Compilation (ODSC) should be used. AllMaterialsCacheResourceShadersForRendering now accepts a parameter to decide whether to fully cache and complete all shader maps. By default this is true to maintain previous behavior. When switching preview materials this behavior defaults to false and we let ODSC in the editor handle which shaders need to be compiled, resulting in far fewer shaders compiled.

  • Set InstructionCount when compiling shaders with DXC, which fixes an issue where all compiles of SM6 shaders were reporting 0 instructions.

  • Implemented single shader file compilation for cooked platform On-Demand Shader Compilation (ODSC). For example, recompileshaders /Engine/Private/Lumen/LumenVisualizeHardwareRayTracing.usf which would result in: 1) the game sends the shader file string across the network to the cooking server, 2) cooking server finds all shaders of that type, 3) cooking server flushes those specific types from the global shader map, and 4) cooking server recompiles just those shaders and sends them back to the game. There is still work to do in this regard to refactor duplicate code in RecompileShadersForRemote, and to implement the ability for material shader maps to compile just specific shader types requested (which doesn't yet exist).

  • Added UCompileShadersTestBedCommandlet which is meant as a simple way to profile/test/optimize shader compilation. Currently, it only compiles the global shaders. Having a commandlet is faster and easier to run repeatable tests than dealing with starting up the editor. You can run your projects with this commandlet with ‘ProjectName -run=CompileShadersTestBed -ddc=Cold -ddc=NoShared -noshaderddc -trace=default,counters', which ensures you don't get results in any DDC and that you always compile shaders.

  • Added more information to the DumpMaterialShaderTypes commandlet output.

    • Keep track of a map from static parameter hash to a list of all mat instances that share the same hash (currently this data isn't being printed out.)

    • Print the full path to the parent material. Some assets have the same name making it hard to track down which asset we were referring to.

    • Generate and print out the static parameter hash for each material instance.

    • Added material instance function to generate a string which contains a comma separated list of base property overrides for material instances. These cause shaders to be stored with material instances.

    • Generate and print out the base property override string to see which material instances also cause shaders. This output looks like the following:

      • Base Property Overrides: True

      • bOverride_OpacityMaskClipValue_0, bOverride_BlendMode_1, bOverride_ShadingModel_0, bOverride_TwoSided_0, bOverride_DitheredLODTransition_0, bOverride_CastDynamicShadowAsMasked_0, bOverride_OutputTranslucentVelocity_0

  • Volumetric Cloud conservative density is now a float4 (conservative density in x and side float3 side payload in yzw).

  • Dump DDC keys for global shaders. The console variable r.Material.DumpDDCKeys has been renamed to r.ShaderCompiler.DumpDDCKeys. The directory they output to changed from "MaterialDDCKeys" to "ShaderDDCKeys." Break getting the global shader map DDC key string out into a function to make it easier to call when we dump DDC keys. Global Shader map section files are named "GlobalShaderMap-%s" where %s is the name of the section (usually a global shader type). Editor and Game shaders are dumped to separate directories. Exposed ShouldDumpShaderDDCKeys function so material code can see if dumping is enabled.

  • Added command line parameters to specify a specific shader model and material quality level to cook for. This is used to limit what cooking shadermaps to a single shader model and/or material quality level. It's useful for locally cooking or specific situations where you want to cook a minimal set of shader maps. Each command line parameter can be used independently. Also, added -CacheShaderFormat that when specified during a cook, the cooker will only compile this shader model if supported for each material. Added -CacheMaterialQuality that when specifying this during a cook, the cooker will only compile this quality level and default for each material. For example, -CacheShaderFormat=PCD3D_SM5 and -CacheMaterialQuality=[0,1,2,3]

  • Output the WorldGridMaterial's human readable DDC key string to the log. This is done for diagnostic purposes on users' machines, and for the build machines.

  • Added new shader compilation editor analytics.

    • ShadersCompiled: The number of shaders compiled.

    • ShaderDDCMisses: How many times we missed shader maps in the DDC. This is a measure of how many times we didn't find Global and DefaultMaterial shaders.

    • ShaderDDCHits: How many times did we successfully find shaders in the DDC.

    • TimeShaderCompilationWasActive: Wall clock time of how long shader compilation was active across your whole editor session.

  • Added better output to COTF + ODSC. Prints out what command is being run (global, material, changed, singleshader) and prints out exactly how many shaders were compiled.And added a function to convert command type enum to a string.

  • Added an exec command "Material DumpDebugInfo" which dumps debug information for each shader in the material given as an argument. It can be run like the following: "material dumpdebuginfo WorldGridMaterial". It can also be used to see which shaders get invalidated when changing shader code:

    • "material dumpdebuginfo WorldGridMaterial", change the shader usf/ush file, run "recompileshaders material WorldGridMaterial", then "material dumpdebuginfo WorldGridMaterial", and diff the outputs of the two.

    • The filename follows the following format: Engine\Programs\AutomationTool{ProjectName}++UE5+Main-CL-20942948-WorldGridMaterial-2022.07.05-16.11.42.csv

    • The file output looks like:

      • Frequency, Target, VFType, ShaderType, SourceHash, VFSourceHash, OutputHash, IsShaderPipeline SF_Pixel, PCD3D_SM5, FGPUSpriteVertexFactory, TShadowDepthPSPixelShadowDepth_PerspectiveCorrect, 2DD4725EA72D0498EB6B1E656F35564D97083FC8, 920506EE58508D22D29046DCE7DF15BF34940059, EC976B76E986CB7E5235B154F9A0B3AF3AB9B1AD, false SF_Vertex, PCD3D_SM5, FGPUSpriteVertexFactory, TVirtualTextureVSBaseColorNormalRoughness, A3C811C874410080F3138AEF4489CCA932D7395A, 920506EE58508D22D29046DCE7DF15BF34940059, CD25F583872C5ECF0E156EA8F50AF96B6B199BDA, fal

  • Water geometry now works with Pixel Depth Offset (PDO).

  • Added the ability to specific material and material instances to cook using the command line to the CompileShaders commandlet. This adds the ability to specify which -targetplatform we should compile shaders for. You can specify multiple platforms by adding them together. For example, "-targetplatform=Windows+MyNewPlatform - Call BeginCacheForCookedPlatformData" to compile shaders instead of CacheShaders since the former allows you to specify platform. The following are some additional usage examples:

    • Specify collection EngineTest -run=CompileShadersTestBed -targetplatform=Windows -collection=MyCollectionName

    • Specify material list EngineTest -run=CompileShadersTestBed -targetplatform=Windows -materials=/Game/MyNewMaterial.MyNewMaterial+/Game/Tests/Materials/CoolMaterial.CoolMaterial

    • Specify both a collection and material list EngineTest -run=CompileShadersTestBed -targetplatform=Windows -collection=MyCollectionName -materials=/Game/MyNewMaterial.MyNewMaterial+/Game/Tests/Materials/CoolMaterial.CoolMaterial

  • Reduced the size of UMaterialInstanceDynamic by 8-bytes to drop into a smaller FMallocBinned2 pool.

  • Added the control to turn on / off Screen Space Reflections on translucency dynamically using showflag and ‘r.SSR.Quality'.

  • The new HLSL translator supports Virtual Texturing.

  • The Material Editor colors wires based on data type when using the new HLSL generator.

  • Input and output data types are tracked for node connections in the Material Graph. Pins and wires are now color-coded by data type.

  • Run two passes of PrepareExpression. The first pass to determine types, and second pass to flag expressions that are used. This way we can skip flagging constant/zero expressions (which we don't know about during the first pass)

  • Added 'Total Thread Preprocess Time' for shader compilation. This instrument shows how long shader preprocessing takes for each shader compilation job, keep a running total in our shader stats per shader type, add logging to track total thread preprocessing time for all shaders, and fixup local variable names to match the output log names.

  • The new HLSL translator supports structs in preshaders, which enables constant folding to be tracked across struct assignments.

  • Implemented changes to optimize GetMaterialShaderMapKeyString during cooks.

  • The new HLSL Material translator now supports automatic mip bias input.

  • The new HLSL Material translator now supports flow control in preshaders.

  • ShaderDebugPath now respects the material quality level for '...\Saved\ShaderDebugInfo\PCD3D_SM5\WorldGridMaterial\Default\FLocalVertexFactory\FHitProxyPS' or '...\Saved\ShaderDebugInfo\PCD3D_SM5\WorldGridMaterial\Epic\FLocalVertexFactory\FHitProxyPS' :

    • Use 'LexToString(EMaterialQualityLevel::Type QualityLevel)' to convert the quality level enum to a string.

    • This specifically appends to the DebugName the material quality at the level in the code where we "know" about the material. I wanted to avoid changing the parameters to the function, 'GlobalBeginCompileShader', because it is material agnostic.

  • Generate if{}/else{} control flow rather than ?: for material switch expressions. Added non-static bool MCT type to allow plugging bool expressions into switch nodes when using new HLSL translator.

  • Support matrix types in new HLSL translator Other various fixes/additions.

  • Added support for Material Layers with new HLSL translator.

  • Implemented const-correctness changes in new HLSL translator. 1) FExpression* is mostly always 'const'. 2) Since expressions should not change after creation, UMaterialExpression::GenerateHLSLStatements/Expression are const-methods.

  • Some fixes for rules around promoting scalar values in new HLSL translator which supports some new node types.

  • Texture values are no longer generated as HLSL code directly. Instead, they are replaced with a new 'Object' type system, which allows expressions to generate C++ objects of arbitrary type. This gives the texture sample expression full visibility into the texture object being sampled, which simplifies some code generation. More importantly it will allow virtual textures to work, which wasn't really possible with the previous system

  • Added the "DumpMaterialExpressions" commandlet to dump an info table of all material expressions in the engine and the plugins enabled on the project to a plain text file which includes the following output material expression fields:

    • Name for the name of the UMaterialExpression class (shows in material editor node search).

    • DisplayName for the optional display name set on the class (shows in material editor node search and overrides Name).

    • Caption to show text displayed on the material expression node.

    • Description

    • Tooltip Output location <Project>\Saved\MaterialEditor\MaterialExpressions.txt

  • The experimental CFLAG_RemoveDeadCode was added to ShaderMinifier to run a shader rewriting step that removes unused functions and types from the shader source before compilation. This improves compile times.

  • Added DistanceFieldApproxAO Material node to calculate approximate ambient occlusion.

  • Fixed duplicated SV_InstanceID semantic across the shader code.

  • Added the ability to split the Pipeline State Object (PSO) cache among chunks, so each chunk contains the cache only for the assets it contains.

  • The Command-Line Argument -noshaderddc now applies to the global shaders as well.

Improvement:

  • Improved the specular and diffuse matching between Rasterizer and Path Tracer for SSProfile. Switch DMFP to MFP automatically.

  • Removed compilation (of never used!) legacy simple forward shading permutations from Windows shader databases (~27% reduction of SM6, ~22% reduction of SM5 when simple forward was enabled in the compiler).

Crash Fix:

  • Fixed multiple crashes that could occur when undoing materials in the Material Editor. The transaction system was not aware of the EditorOnly data owned by the UMaterial, meaning that any undo/redo operation left the editor-only data on the UMaterial in an incorrect state. For instance, UMaterialExpressions with properties missing, override virtual function Modify on UMaterial, and call Modify on the EditorOnly data owned by the UMaterial.

  • Fixed occasional failures to decompress shaders in ShaderCodeArchive.cpp.

Bug Fix:

  • We now ensure shaders are cached before drawing a tile with a material. In the editor with ODSC, shader maps could be incomplete resulting in them drawing a tiling with the default material (which never gets updated) If the material is detected to be incomplete, it will synchronously compile shaders so they are ready before drawing. Display a slow task if possible (not PIE)

  • Fixed noise caused by world unit scale for large distance screen space subsurface scattering.

  • Added console variable 'r.SSS.Checkerboard.NeighborSSSValidation' to fix subsurface profile border artifact when checkerboard is turned on. It is off by default due to performance concerns since it introduces one extra profile ID access per pixel at low quality (TAA mode by default), and four extra profile ID accesses per pixel at high quality.

  • Fixed the ‘Total Shaders' compiled counter and stat to account for the job cache DDC. We were potentially over counting actual shaders compiled if we found a job already in the cache. Now we increase the counter when we finish a job that was not cached, and use ‘JobsCompleted' on the FShaderCompilerStats as a proxy for the number of total shaders compiled instead of counting the number compiled in the ShaderCompilerStats, because these are wrong and don't account for the job cache. Also, added a trace CPU profiler scope to FinishCompilation.

  • Fixed an issue with wrong refraction happening when SingleLayerWater triangles are not horizontal in the world.

  • Shader compilation will retry now when the following conditions are true: r.ShaderDevelopmentMode=1, and bSpecialEngineMaterial==True. This allows you to retry compilation of special engine materials, like WorldGridMaterial, even if you have bPromptToRetryFailedShaderCompiles=False.

  • Fix for various issues with the "CompileShadersTestBed" commandlet by making it behave more like the cooker.

    • The commandlet shouldn't be configured for rendering. This was originally done to force shader compilation to happen in PostLoad. This caused textures resources to be created, which is not needed and was causing crashes.

    • Properly wait on potential DDC requests.

    • Wait on shader compilation by calling ProcessAsyncResults, which is exactly what the cooker calls.

    • While we have jobs to compile we process the results.

    • Be sure to flush rendering commands so we cleanup deferred delete objects like Shader Maps.

    • Added logging to commandlet.

    • Enabled "LogMaterial" for this commandlet so we can see DDC puts w/ DDC key.

  • Fixed long wait times in FODSCManager::Tick caused by running when cook-on-the-fly is not enabled. Also only flush in ProcessCookOnTheFlyShaders if some work was actually done.

  • When modifying a parameter value on a UMaterial, all expressions that match the name are updated, rather than simply the first.

  • Compiler errors are now generated if a Material tries to append more than 4 components worth of data.

  • Made sure that Blueprint exposed functions resulting in a Material (UMaterialInterface) draw are synchronously waiting for their shaders to be ready before issuing the draw command. This also removes double-update of canvas in Blueprint functions.

  • Fixed a bug where custom scene textures could not be read in widget Materials.

  • Removed fogging from water brush translucent Materials.

  • Fixed a case where only the first virtual texture sampled on an Actor decal was updated correctly.

  • Fixed a bug where decals that sample world normals were not able to write to emissive.

  • Code was rewritten to use HLSL precise keywords in a number of places, including where World Position Offset is used. This fixes broken velocity vectors, and broken Editor outlines for a range of Materials.

  • Fixed a bug with broken shadow casting from Material Instances when the "Cast Shadow as Masked" setting is enabled in the parent Material.

  • Corrected an issue with Material Instances on decals looking incorrect when using cook on the fly.

  • Fixed a bug with CorrelatedColorTemperature in TonemapCommon.ush.

  • Fixed writing Virtual Texture feedback in ThinTranslucency Materials by using a hard-coded stochastic alpha threshold.

  • Fixed issues with texture streaming on very skewed textures (4x1024 and similar) and non-power of two textures with cinematic LOD levels.

  • Fixed a rare crash when building Hierarchical Levels of Detail (HLOD) in a commandlet by removing shadermap access that can pose threading hazards.

  • Fixed hitching while precompiling the Pipeline State Object (PSO) cache.

Nanite

New:

  • Enable compilation and usage of tier1 Windows DX12 mesh shaders in Nanite if running under SM 6.6 w/ atomics.

  • Implemented initial Nanite raster pipeline register/unregister/de-duplication, including launching each raster pipeline during Nanite rasterization if programmable raster is enabled. Also hooked up graph GetMaterialMask function to Nanite HW raster pixel shader stage.

  • Implemented Nanite support for rendering complex collisions for the fallback meshes.

  • Added Nanite CPU Material culling to avoid unnecessary CPU and GPU overhead from numerous empty raster and shading dispatches/draws (content and view dependent).

  • Implemented basic HW triangle barycentric path for Nanite HW raster passes (NANITE_USE_HW_BARYCENTRICS). Some APIs and platforms can further improve this with special intrinsics.

  • Packed PixelValue into PageInfo for a single uint2 no interpolation VS -> PS param (so parameter cache performance is unchanged, since the cache perf is based on attribute count not element count), and also export PixelValue so depth only Nanite rasterization can use it if needed. The pixel shader behavior is unchanged though (PixelValue is only exported for 64b vbuffer).

  • Added ability to cull Nanite Instanced Static Meshes at a distance from the camera.

  • Refactored Nanite Material GBuffer passes to run off the render thread.

  • A Nanite Material override setting was added to Materials and Material Instances. The main advantage for this as opposed to using the NaniteSwitch Material Expression is that references from override Materials are not cooked on non-Nanite platforms.

  • Streaming data for Nanite can now be fetched asynchronously from the Derived Data Cache in the Editor.

  • The Nanite streamer now runs the GPU transcode in asynchronous compute on platforms that support it.

  • Added a Nanite MaterialCount debug visualization mode which can be enabled with the console variable 'r.Nanite.Visualize MaterialCount'.

  • Made imposter building optional with the console variable 'r.Nanite.Builder.Imposters'. This setting is turned off by default.

  • Implemented changes to improve disk size for smaller Nanite meshes.

  • Improved Nanite partitioning heuristics to produce fewer expensive multi-Material clusters.

  • The PreSkinnedPosition shader graph node now works with Nanite.

Improvement:

  • Removed a massive number of Nanite rasterizer shader permutations across all platforms/shaderdbs, significantly improving iteration times for the editor and cooker, especially when these numbers get multiplied by the number of materials that utilize programmable features in addition to the default material "fixed function" path.

    • CLUSTER_PER_PAGE has been fully removed (since we no longer ever run CLUSTER_PER_PAGE=0), which now makes it mutually inclusive with VIRTUAL_TEXTURE_TARGET.

    • HAS_RASTER_BIN has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load.

    • ADD_CLUSTER_OFFSET has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load.

    • HAS_PREV_DRAW_DATA has been replaced with a dynamic branch, since this is just a per cluster index offset based on a simple uniform buffer load.

    • NEAR_CLIP (only change to significantly affect codegen) has been turned into a dynamic branch based on FNaniteView. This lets us merge depth clip/clamp rasterizer calls in VSM together instead of relying on HAS_PREV_DRAW_DATA, and a future optimization can now be done to merge local and directional light full Nanite pipeline calls together.

    • VISUALIZE permutation removed from VS/MS since it only loaded uniform values that passed down per-vertex into fragment stage as nointerpolation parameters. Pixel shader now constructs this uint2 directly under the VISUALIZE permutation.

    • NANITE_MESH_SHADER_INTERP removed by default but still left in the code, since it is a work in progress potential optimization for DX12 mesh shaders.

    • Removed explicit Lumen and VSM usage of NANITE_RENDER_FLAG_HAVE_PREV_DRAW_DATA (now the dynamic branch path is only taken if CullRasterizeMultiPass implicitly breaks the rasterization into multiple calls due to NANITE_MAX_VIEWS_PER_CULL_RASTERIZE_PASS overflow).

    • Performance was tested on a 2080Ti in AncientGame, and the delta is effectively noise (tested cached and uncached VSM). Further testing on other platforms will occur, but it is important to get this change in for all the benefits and easy to tweak things later if needed.

  • Added an optimization to Nanite rasterizer binning. Multiple triangle Material span indirections of a single cluster are now emitted, rather than a single cluster indirection where each rasterizer VS needs to re-calculate whether or not a triangle is contained in the active rasterizer bin.

  • Implemented a significant optimization in certain heavy programmable raster scenes to use a fixed function path in Nanite if the only programmable feature is World Position Offset (WPO), but Evaluate WPO is false.

  • Implemented a minor CPU optimization to deferred pipeline registration on the Nanite draw lists. This is experimental and work is ongoing.

  • Converted Nanite Streaming buffers to support the Render Dependency Graph (RDG).

Optimization:

  • Explicitly disable WPO evaluation on Landscape Nanite meshes.

  • Merged Nanite HW rasterizer passes into a single RDG pass, and also SW rasterizer passes into a single RDG pass. All passes update various buffers with atomics, so they are now always marked with SkipBarrier to disable synchronization between passes and allow for overlap. VSM in AncientGame campfire went from 4.64ms -> 3.41ms, Primary raster went from 1.34ms -> 1.07ms. Lumen raster 0.20ms -> 0.18ms. Much higher gains expected in content with high numbers of rasterizer bins (more overhead to remove using this optimization) MedievalGame is even better: Primary raster 1.82ms -> 0.92ms, VSM 2.99ms -> 2.07ms, Lumen 0.43ms -> 0.19ms

  • Optimized raster binning by merging separate HW and SW dispatches together, and also fixed the cluster thread group count so we don't spawn 64x useless thread groups. Tested on a 2080Ti with AncientGame campfire.

    • Separate HW/SW dispatch vs. Merged HW/SW dispatch Primary 1.28ms -> 1.02ms Directional VSM 1.66ms -> 1.52ms Local VSM 2.21ms -> 1.96ms

    • Merged HW/SW dispatch -> Fixed Cluster Counts Primary 1.02ms -> 1.01ms Directional VSM 1.52ms -> 1.43ms Local VSM 1.96ms -> 1.92ms

  • Big rewrite/optimization of Nanite programmable raster pipeline registration with GPUScene on the CPU, added raster bin visualization plus duplicate define code cleanup, added initial WIP two sided material support (will optimize the math shortly), and fixed a number of programmable raster VSM related bugs.

Crash Fix:

  • Fix a Nanite crash which occurred when enabling Shader Complexity Mode in a cooked build.

  • Fixed a Nanite crash that would occur when setting the Preview Render Level to SM5 after successfully rendering SM6.

  • Fixed a potential crash when Nanite Derived Data Cache requests fail during cooking.

  • Added vertex sanitation code to the Nanite builder to fix a potential crash when the input mesh has bad floating point data.

  • Fixed a Nanite streaming crash when all pages early out.

Bug Fix:

  • Fixed a race condition which occurred when accessing the RasterMaterial or ShadingMaterial WeakObjectPtr on the render thread.

  • Fixed incorrect calculations that occurred in Nanite micropoly rasterizer when two sided materials are used.

  • Fixed Nanite AuditMaterials logic to correctly handle Material instances changing Blend Mode.

  • Fixed issues with Nanite triangle culling on orthographic cameras.

  • Fixed an issue where Nanite Geometry Collections could go missing when raytracing.

  • Fixed a logic issue with Nanite instance culling where the "Visible In Scene Capture Only" flag would not work properly.

  • Fixed an issue where Nanite Static Mesh settings would reset every time you re-import.

  • Fixed an issue where cluster DAG cuts from the Nanite Trim feature were sometimes inconsistent between clusters and groups, which could potentially lead to encoder crashes.

  • Added logic to the Nanite streamer to retry Derived Data Cache (DDC) streaming requests if they fail. Derived Data Cache warnings were improved to include resource names.

  • Fixed an incorrect warning message for Nanite cluster buffer overflows.

Removed:

  • Fully removed Nanite and Virtual Shadow Map SM5 vendor extension, lockbuffer hack, and DX11 support from UE5

Niagara

API Change:

  • Previously, new renderers were added by UClass; now it's a manual process to register new renderers, which allows for more flexibility. See FNiagaraRendererCreationInfo for more details.

New:

  • Niagara node pins can be moved multiple steps at once.

  • Added a "loose type" mode to Niagara. Users can now treat position types as vector types.

  • Added unit metadata to system and emitter properties. You can enter values in seconds by default, but if you enter units in a different value it will auto-convert them. For example, entering ‘500 ms' will convert to 0.5 seconds.

  • Overview modes now have a simplified display when the view is zoomed out.

  • Improved Niagara pin type colors.

  • Changed the parameter types of transform nodes to more clearly differentiate vector and position types.

  • Made the Niagara component a Blueprint type.

  • Double-clicking on a script node now opens the selected version in the graph.

  • Added custom validation rule support to Niagara. Users can refer to UNiagaraValidationRule and its subclasses for examples to write their own.

  • The UI now shows convertible linked inputs for stack input bindings.

  • Changed the default value of the property Only Create on Spawn in the Component Renderer. The default value was previously true, it is now false. Previously, particles only got a component from the Component Renderer when they spawned, but now they will get that component as soon as it becomes available. This resolves issues that users had with burst systems, particularly when used in conjunction with Sequencer. Old assets are not affected.

  • Added file include support for CustomHlsl nodes.

  • Added a message to the emitter and script graphs when downstream assets are affected.

  • You can now specify version dependencies in modules.

  • Improved the audio player:

    • One-shot audio no longer loops.

    • Persistent Audio Components are destroyed when particles die.

    • Audio modules work in emitter and system scripts.

  • Added a setting to zoom-fit system assets when opened.

  • Added an option to collapse disabled Niagara modules.

  • Niagara components that are not auto-activated now stay off when you change users parameters.

  • Improved numerics resolution, and made type checking stricter for operation nodes.

  • Made the compilation status more obvious in Niagara's viewport.

  • Removed loose parameter bindings from main Niagara parameters.

    • Data Interfaces should now opt in to the new binding path by setting UseLegacyShaderBindings to false.

    • BindParameters, SetParameters, and UnsetParameters are now BuildShaderParameters and SetShaderParameters.

    • CreateComputeParameters and GetComputeParametersTypeDesc are now CreateShaderStorage and GetShaderStorageType.

    • Shader storage should no longer be required for the majority of cases. Only those which require data based on bound functions will need additional data, everything else should be statically set.

  • Modified Niagara Compute Dispatch to use FRDGBuilder through the pipeline.

    • Legacy data interfaces run on the Graph execution timeline. Some caveats now exist, for example peeking the current buffer on the MainDataSet will be wrong.

    • Converted data interfaces run on the Graph build timeline, executing passes as required.

    • Converted data interfaces have been updated to use new PreStage, PostStage, and PostSimulate functions.

    • Various other parts of Niagara have been updated to allow operations on the Graph builder timeline, for example, readbacks, debug drawing, profiling, and more.

    • Various global compute shaders have been updated to use shader parameter structs.

  • Added support for spawning over 16k max secondary particles per frame in Niagara Fluids.

  • SimCache functions now access data from Blueprints.

  • Added methods to get the socket index from filtered and unfiltered sockets.

    • Added Velocity to all functions to make it consistent.

    • Added Interpolated methods for World Space functions.

  • Added RGB and RGBA pins to dynamic parameter material nodes.

  • We now show pin names and added RGBA to the Particle Color node.

  • Removed a case that blocked SRV for uniform sampling.

  • Reduced the size of the GPU triangle uniform sampling buffer from 16 bytes per triangle to 8 bytes.

  • Added a custom element count binding for simulation stages.

  • Added reset to default option to the camera in the Baker.

  • Added camera bookmarks to the Baker.

  • Added Attribute Capture Mode options to Niagara SimCache. This allows you to capture all, renderer only, or user-supplied attributes only into the cache.

  • Created a Blueprint library for capturing Niagara SimCache data.

  • We now support position types for material parameter bindings.

  • We now detect if a data interface is being used with a CPU script or not.

  • We now allow the static mesh data interface to access GPU resources if it's not used by a CPU script.

  • SRVs will be available on the target platform.

  • Support added for Cube, 2DArray, and Volume Sample data interfaces to select both the texture and render target types. SetTextureObject function can take either parameter now.

  • Data interfaces can add renderer-only attributes for capturing. For example, if a data interface ran a process post cache read to update the state required to render the system, we may not cache it, since the sim cache will only store renderer-bound attributes.

  • Emitter Properties data interfaces can access data that is not part of the data buffers.

  • Added a method to the particle reader to understand local or world space.

  • Static mesh data interface CPU access warnings no longer include socket sampling.

  • Added validation rules to simulation stage budgeting.

  • There is now an option to reset Niagara and Cascade when crossing too many large world coordinate tiles, since this will result in rendering artifacts.

  • Added constant material parameter bindings for renderers.

  • We now track registered components on the Debug HUD, and optionally show their information.

  • Converted the Collision data interface to Render Graph.

  • Converted the Physics data interface to Render Graph and shader parameters.

  • Added SubUV to the renderer information. This removes the GPU data deduplication, but this should be done via data interface deduplication and is not robust when using pointers.

  • Added Sprite Renderer Info data interface for reading information from a sprite renderer inside a script.

  • Converted Audio data interfaces to use shader parameter structs.

  • Landscape data interface uses the shader template and shader parameters.

  • Cross level references now use TSoftObjectPtr instead of TObjectPtr.

  • Physics Field Update now uses Template, Shader Parameter, and Render Graph.

  • Added a project setting for sort precision. Renderers can now override this project setting.

  • Converted Niagara Debug Drawing to Render Graph.

  • Converted the EmitterProperties, ActorComponent, and SimpleCounter data interfaces to shader parameters.

  • Converted RasterizationGrid to shader parameters and Render Graph.

  • Converted GeometryCollection and ChaosDestruction data interfaces to Render Graph.

  • Updated the NiagaraVariant when calling array set functions.

  • Converted StaticMesh data interface to shader parameters and Render Graph.

  • Exposed occluded line drawing color scale and set defaults to 5%.

  • Added Matrix User Parameters Setters. This truncates to FMatrix44f so will loosen precision for large world coordinates.

  • Separated expanding bounds between dynamic and static. Added an option to snap bounds to units, to reduce update transform frequency as they grow. When no static bounds or dynamic bounds are present, we do not return the static bounds.

  • Converted the Grid2D data interface to use template and parameter structure binding. All read-write data interfaces now use correct formatting for shader parameters.

  • Converted example mouse data interface to parameter bindings.

  • Converted RenderTarget data interface to use template and parameter structure binding.

  • Curve data interface now uses template and parameter structure binding.

  • Converted GBuffer data interface to use template and parameter structure binding

  • Converted Spline data interface to shader parameters. Object Reader conversion and Neighbor Grid 3D conversion now use shader structures.

    • Converted MeshRendererInfo, VectorField, CurlNoise, Camera, and Occlusion data interfaces to shader parameters.

  • Rigid Mesh Collision data interface converted to Render Graph.

  • Converted Export data interface to use template and parameter structure binding.

  • Moved constant buffers into loose parameters, with the exception of the external cbuffer. Parameter binding is now enabled when possible, for example when there are no legacy data interfaces, external cbuffers, or view uniform buffers.

  • Initial pass for Niagara Simulation Cache. Currently a full restart cache per frame is generated. It only contains system simulation and particle data set information. This is still highly experimental, while it works in cooked and uncooked we fully expect the data formats will change.

  • Added support for shared static float buffers that data interfaces can push data into.

  • Added NiagaraDebugHud console command to quickly enable or disable the HUD.

  • Added a Blueprint method to modify filtered sockets and bones for skeletal mesh sampling.

  • We now flush Niagara pending ticks in batches if we inject a large amount in a single frame. Render Graph has a limit on the number of passes that can execute. We avoid surpassing this limit, for example, by skipping forward in the Sequencer timeline.

  • Added support for returning the bone scale on a skeletal mesh data interface.

  • Converted Hair to Render Graph.

  • Converted Texture data interfaces to use template and parameter structure bindings.

  • Added a method for data interfaces to draw to the Debug HUD. Debug HUD is now wrapped with WITH_NIAGARA_DEBUGGER to make sure it's compiled out.

  • Fixed an RHI resource leak by calling release on uniform buffer before memstack wipes memory.

  • Updated the Array data interface to shader parameters.

  • Converted the Async GPU Trace data interface to shader parameters and Render Graph.

  • Added an experimental VirtualTexture data interface.

  • Converted the Skeletal Mesh data interface to Render Graph and shader parameters.

  • Added support for pulling a bind pose vertex or triangle.

  • Added overrides for translucent sort priority and offset.

  • Updated the Graph node Add menu logic. Loaded enums no longer show up in the make/break list unless the library only flag is off.

  • Improved the UX for the Device Tree and CVar Conditions:

    • Cleaned up Niagara Device Tree. Device profiles have a new value called bIsVisibleForAsssets that lets you indicate which device profiles should be visible in other assets.

    • Improved tooltips and coloring on the Device Tree to better show what is enabled or disabled and why.

    • Added tooltips for CVar conditions to text entry and suggestion boxes showing the CVar help text.

  • Platforms now specify a min and max Niagara Quality Level they support, which reduces need for trawling .ini files and allows fragments to set the quality level.

  • CVar Conditions now have more control over what occurs when the condition is passed or failed. Previously they could only disable the set when the condition failed, which is now the default.

  • New renderers added to emitters have a default asset assigned (for example a material or a mesh).

  • Multiple tweaks and additions for making scalability smarter with regards to culling important player FX.

    • New master mode for scalability culling allowing us to pause all culling. Useful for special cases such as a front end.

    • Added ability to reset FXBudget on mode transitions.

    • Tidied up library spawn functions with an initialization struct version.

    • NiagaraComponents can now be told that they are a player effect explicitly.

  • Physics Asset is replaced by Rigid Mesh Collision data interface for skeletal and static mesh collisions. All Niagara Fluids templates have been updated.

  • Niagara scalability can now globally be paused or disabled via the console command fx.Niagara.ScalabililityCullingMode.

  • Added a function to get spline length.

  • Implemented cubic interpolation for 3D gas simulations (velocity and scalar advection). This gives a large increase in quality.

  • Removed "Common" section from the Parameters panel in the Niagara Editor.

  • Event spawn scripts can now modify the initial values for particle attributes, so modules dependent on this can function correctly when spawning from events. An example of how this could be used is the ScaleColor module. This is optional per event handler, but defaults to enabled. Existing content has this disabled to maintain existing behavior.

  • Streak source particles for fluid simulations to avoid artifacts.

  • Added Get Velocity to the Actor data interface.

  • GPU scripts now log their errors in the Niagara log in a more reliable way.

  • You can now bind the attached component or a local player using Add Source Mode.

  • Small scale force to break up mushroom shapes on 3D gas simulations.

  • Added an option on 3D Flip simulations to add more particles near the surface of the sim for more detail and smoother surfaces.

  • Renderers now have default assets assigned to them, and new renderers can be registered via the Niagara Editor Module.

  • Selecting from the Parameters panel will highlight active usages in the stack overview.

  • Added an Effects section to the Niagara Component. Also added a category with Debug and Reset buttons. You can now summon the Niagara Debugger to view given variables, emitter, system, component, and more in context in the Niagara Editor.

  • Improvements to Niagara's scalability visibility culling options. This inlcudes custom view frustum checks that allow some visibility culling that is not based on the results of rendering code. As such, this can be used for pre-culling.

  • The Niagara Outliner can now pull data from a running instance of the game for a specific Niagara System into a Niagara SimCache for analysis and debugging.

  • Fluid bounds are programmable and set via the setup of the simulation.

  • Generalized the UvMapping feature so that it can be shared by both static and skeletal meshes. It now takes a different approach when specifying the uv index for the static mesh via a system script level VM function.

  • Stripped data from NiagaraSystems when AV data is not required (server builds).

  • Added a new function called vector field (LoadSample) to grab raw values by index rather than interpolated values.

  • Added mesh streaming reporting to Niagara and Cascade primitive component to ensure renderable meshes are being adequately streamed in. It now reports a scaled instance at the origin of the component. It does not take into account dynamic mesh scale.

  • When saving from the NiagaraSystemToolkit we now save the version not in edit mode. This prevents recompilation when someone references the system (for example in a level or a cook).

  • Added turbulence and small scale field to Niagara Fluids. The new small scale turbulence can be used to add edge breakup on simulations. It works by incorporating a random vector at each cell, ranged by the density value inside the simulation.

  • Added a bounds calculator for Niagara Light Renderers.

  • Disabled dependency on the HairStrands plugin for Niagara Fluids. Old assets may now fail to run properly without manually enabling the HairStrands plugin for access to the NiagaraDataInterfacePhysicsAsset class. Newer assets are no longer dependent on this plugin, and in the future the class itself will be migrated to the Niagara plugin.

  • Improvements to the Rigid Body data interface:

    • Debug rendering now shows the actors providing rigid bodies.

    • Added an emitter-based script for selecting actors using physics queries.

    • Made improvements to memory and runtime performance.

Improvement:

  • Optimizations for cooking in Niagara.

  • Updated the UI to handle cache changing while the UI is open, and to use the new API to read the data.

  • Made changes to the Static Mesh data Interface API for consistency.

  • We no longer add to GPUDataInterfaces if the data interface is not used by a GPU emitter. This improves the performance and reduces the memory of generating GPU ticks in some situations.

  • Cleaned up the copy and paste behaviors for Niagara Overview Graphs.

    • Copying from emitters is now no longer supported. The intended behavior here isn't well defined, so users are directed to the more supported path of using the add emitter option from the context menu.

    • Creating comments is no longer supported in emitter graphs. The overview is transient so any comments would not persist.

  • Migrated NiagaraDataInterfacePhysicsAssets to NiagaraPlugin. Implementing an interface on GroomComponent produces consistent behavior.

  • Added a stack warning for emitters which exclusively use emitter-sourced objects and are using dynamic bounds.

Crash Fix:

  • Fixed a crash when using undo after adding a renderer.

  • Prevented a crash in the editor when a struct with an unsupported type member was used in a module script.

  • Fixed a crash when playing audio from a particle system on a platform that had audio disabled.

  • Fix a crash when an event spawn info had no space left.

  • Fixed a crash when using fx.SuppressNiagaraSystems 1 with NiagaraDataInterfaceArrayFunctionLibrary.

Bug Fix:

  • Fixed a bug where user parameters that are linked to position types were only partially converted to positions.

  • Fixed a few bugs with the search bar in the generated code view.

  • Fixed an issue when duplicating a module would also duplicate all the script variable guids.

  • Fixed a bug when position bindings couldn't see position variables.

  • Prevented Niagara compilations from stacking, now you can have at most one pending compile request.

  • Fixed a bug that prevented playing audio from Niagara in cooked builds.

  • Fixed a bug when the array index changed, but was not picked up correctly in the Geometry Cache Renderer.

  • Fixed an issue when user parameters that were bound to renderer position bindings were not updated to position types.

  • Fixed a bug where pooled effects attached to Actors in hidden sublevels were not hidden properly.

  • Fixed a memory leak when several script source copies were left in the root set after compiling a Niagara system.

  • Fixed properties not showing for CustomHlsl nodes when the first input was a data interface.

  • Fixed a bug when types for user parameters were not considered across emitters.

  • Fixed an issue when Niagara systems without auto-activation would reinitialize after a compile request.

  • Fixed a bug when setting bOwnerNoSee on Niagara components wasn't hiding the Component if one of the emitters used a Light Renderer.

  • Fixed issues with memory image names. We now:

    • Write to the MemoryImageNames array.

    • Copy the contents of TArrayView rather than the layout of the view object itself.

    • Handle the name layout during patch application on foreign platforms.

  • On the Actor's EndPlay, we now release references to the source Actor and Component from NiagaraDataInterfaceSkeletalMesh.

  • Fixed GPU executing particle update script on spawn when interpolated spawning is disabled.

  • Fixed an issue when holding onto task references longer than necessary.

  • Fixed Mesh Renderer dynamic parameter constant bindings not working.

  • Fixed a potential issue that could cause a crash in an edge case for Cascade's activation code.

  • Fixed an issue with bool select nodes on the GPU where data is passed from the experimental virtual machine (VM).

  • When fixed delta tick is enabled, we now force solo mode.

  • Changed GPU initialize LODResource to TRefCountPtr to avoid stream out.

  • Fixed an issue that could cause some errors from correctly showing up in the editor for GPU simulations.

  • Fixed an issue when ray tracing was using PreViewTranslation for GPU instances. This also resolved missing large world coordinate support for Niagara and ray tracing.

  • Fixed a bug with the Niagara Platform Set CVar text entry box.

  • Resolved a memory stomp on loading UNiagaraGraph.

  • Fixed emitter mode visibility tag and mesh index not working on Mesh Renderers.

  • Fixed when a previous external cbuffer was using the current data. When not calling PostTick on GPU Context, we didn't push the data from current to previous.

  • Fixed an issue when GPU scene mesh path was dangling into a potentially reallocated buffer.

  • Fixed an incorrect LOD calculation in GetFirstValidLODIdx.

  • Fixed issues with default quality levels for uninitialized device profiles that could cause incorrect scalability behavior.

  • Fixed the Niagara Editor preview not resetting correctly when changing the Scalability Mode preview settings.

  • Fixed an issue that would prevent local player FX reactivating after being scalability culled in some cases.

  • Fixed an issue causing some Niagara user parameters set from Blueprints to be reset when a system was reactivated.

  • All the renderer material bindings now show up in GetBoundAttributes. Prior to this change, there could be subtle differences in the data being preserved in cooked and uncooked.

  • Modified the warmup delta time, it now affects the tick count and time properties. Added stack warnings on systems and emitters if the emitter maximum delta time is smaller than the system's warmup delta time.

  • Fixed issue in the Scalability Manager that could cause no updates to occur in some cases.

  • Fixed an issue with a duplicate user parameter of type position or vector being created when a variable with the same name but opposite type already existed.

  • Static variables were depending on pin persistent GUIDs for caching. This is insufficient as some pins are zeroed out for persistent GUIDs. Picking the pin offset and parent guid in that case.

  • Fixed an issue when some InstanceOverrideParameter data interfaces were being used before being post-loaded, and so missing some required post-load fixup.

  • Fixed a bug that would cause the tick function for Niagara solo components to be left running even when the systems were inactive.

  • Now detecting if a function signature actually changes when upgrading a data interface function call. This was causing an unnecessary reallocation of pins when doing a static duplicate.

  • StackFunctionInput cache now correctly populates the data source.

  • Fixed type checking of visited parameters when evaluating Fail If Not Set errors, as we may have intentional type mismatches for large world coordinate types.

  • We now prevent caching shaders for scripts that are not associated with a system. This prevents the compilation of standalone scripts and scripts from standalone emitters.

  • Made CullProxy on NiagaraComponent transient, so that we don't try to save any references to the dynamically created proxy component.

  • Initialized UNiagaraScriptVariables added to graphs with default mode Value when the variable is in the module namespace.

  • Apply SystemLWCTile to track the large world coordinate tile when evaluating Mesh signed distance fields (SDFs) in Niagara.

  • Fixed an issue where BoundAttributes in NiagaraComponentRendererProperties were getting trimmed.

  • We now handle TypeDefinitions with transient structs during serialization. If a small world coordinate struct is available, we use the mapping of this struct during the session to serialize out the large world coordinate version.

  • Fixed an issue when systems that shared the same name (but different paths) would overwrite results when dumping byte code.

  • Cleanup natvis for niagara types:

    • Types have been moved into their own niagara.natvis file.

    • We can then resolve FNiagaraTypeDefinitionHandle through global pointers so that FNiagaraVariable can now be properly visualized.

  • Incorporated the type into the ordering of the attributes. This resolves an issue that resulted in multiple attributes with the same name, but compatible types (float and position).

  • Fixed two issues with attribute trimming Niagara particle scripts:

    • Parameters to an impure function that were using the StackContext namespace weren't being properly included in the dependency chain.

    • Custom HLSL nodes which internally used impure data interface functions wouldn't necessarily have their inputs marked as dependents (in the case where a dummy output variable was being used, which itself got trimmed).

  • Stale and garbage-collected actor components can no longer be accessed when using the ActorComponent data interface.

  • Fixed the FindQuatBetween script to handle the case where one (or both) of the input vectors are 0 length (an identity quat will be returned).

  • Made sure we only enable bAreaWeighting if the option is selected and the underlying data is present. If you have modified the mesh, but it hasn't actually applied the change, it now behaves as expected.

  • Fixed Niagara VM bytecode generation for if blocks when a variable was assigned and then used within the same block.

  • Fixed VM bytecode generation which was failing in a very small number of cases of the form:

    • A = GetFirstValue;

    • B = A;

    • A = GetSecondValue;

    • C = A; This would get GetSecondValue assigned to C instead of GetFirstValue.

  • Added an SSA pass to help reduce overwriting registers. This added logic removes self assignments, and adds logic to stop propagating when values are dirtied. From a sampling of scripts, about 2% are changed (where 1-3 unnecessary ops have been deleted).

  • Niagara shaders now respect r.DumpShaderDebugWorkerCommandLine as expected.

  • Implemented fixes for experimental compressed particle systems.

    • Only particle systems will have their attributes compressed.

    • Previous versions of our deny list will also be denied compression (we don't want to be comparing half Particles.Previous.Position with float Particles.Position).

    • Fixed stride being supplied to VF shaders.

  • Added a work around for an issue when Niagara GPU scripts for the editor platform would have compile requests that were never properly handled, including being put into DDC. This happened when compile requests were dirty on load.

  • Made sure that DataInterface curves are consistent with respect to UpdateTimeRanges and BuildLUT for WITH_EDITORONLY_DATA.

  • Fixed a bug where the Niagara stack did not reflect the compile status correctly, and only updated error symbols after clicking on it.

  • Transient systems created during script merging are now reset.

Path Tracer

New:

  • Added initial support for rendering water in the Path Tracer.

  • Exposed a missing path tracing show flag in scene captures.

Postprocessing

New:

  • Added support for a Screen Space Reflection input pass to scene view extensions, which mirrors the post-process Material blend location.

  • Extended Luminance Range is enabled for new projects by default.

Improvement:

  • Improved pixel shader animation and translucencies no longer ghost as much as in UE5.

  • Local exposure is now applied when calculating bloom.

Crash Fix:

  • Prevent crashes with post process materials when one of them is not a Material Instance and it tries to blend the parameters. The easiest fix is just to skip blending the materials together. The blending functions below only work on instances, so skip blending if we are just a material interface. This can happen in two scenarios: 1) A wrong material type is assigned into the post process material array, and 2) the same material is placed in twice. The MID lookup code above won't create two separate MIDs for the same material, resulting in this code trying to blend a MID with a Material Interface.

Bug Fix:

  • Fixed an issue with PlanckianIsothermal in TonemapCommon.ush

RHI

New:

  • Added parallel setup for Render Dependency Graph (RDG) passes, and offloaded RDG buffer uploads and uniform buffer creations off the render thread.

  • Changed the minimum driver version for Nanite on Vulkan, and also added a check for Linux.

  • On the Vulkan RHI, added an option to change pipeline queries to BOTTOM_OF_PIPE. This gives more precise measures for a single span, but might alter overall frame time on some platforms. TOP_OF_PIPE remains the default.

  • A draw texture utility was added to RenderGraphUtils, which is used for copying with format conversions.

  • Implemented support for parallel buffer creation and lock/unlock.

  • All platforms now use the same Vulkan SKD flow for compilation to ensure that the engine is always built with the provided version at a minimum. A local SDK is only preferred if it is newer.

  • Local uniform buffers were deprecated, as RHICreateUniformBuffer now works on any thread.

  • On Vulkan, DriverDenyList entries were split per operating system, as driver numbering is different on each OS.

  • DriverDenyList support was added to Linux.

  • Added DriverDenyList entries for Vulkan on Windows and Linux.

  • Added Render Graph (RDG) versions of UnifiedBuffer utilities.

  • For Vulkan, fixed all cases of single scalar in shader parameter arrays to respect 16 byte alignment.

  • Added static_assert to prevent the creation of new asserts moving forward. Used SHADER_PARAMETER_SCALAR_ARRAY/GET_SCALAR_ARRAY_ELEMENT for single parameters, or packed them with surrounding parameters when possible.

  • Added "ultimate" version of AddClearRenderTargetPass that lets the user clear multiple mips, multiple array slices, with / without a custom clear color or viewport and does so by using a clear action if possible. Note that the existing versions have not been deprecated since they are more straightforward (they clear only a single mip/slice).

  • In Vulkan, use vk_enum_string_helper to print enum names in debug messages.

  • Implemented support for fused CopySrc | CopyDest transitions for Vulkan in RDG.

  • In Vulkan, we set the initial state of GParticleCurveTexture to SRVMask since it might get bound before it is filled for the first time. This fixes a validation error.

  • Added support for RHI validation breadcrumb logging with transition validation errors.

  • Added parallel UpdateUniformBuffer support by taking a command list.

  • Made RHICreateUniformBuffer thread safe.

  • Added bindless resource support as a requirement for ray tracing on PC (SM 6.6 + Resource Binding Tier 3). Compile DXR shaders using the same profile when targeting PCD3D_SM5 and PCD3D_SM6 (for example,. lib_6_6 or lib_6_5 based on USE_SHADER_MODEL_6_6 define).

  • Ensure that BC6+7 textures have good mappings on all platforms and RHIs, including ES3.1 RHI for performance mode. BC6+7 should now be useful in multi-platform games.

  • Only set the D3D12 residency priority for acceleration structure resources on pool creation, rather than on individual BLAS creation. Saves significant CPU time when creating transient (short-lived) acceleration structures.

  • Use D3D12_WRITEBUFFERIMMEDIATE_MODE_MARKER_IN / OUT instead of just IN for GPU bread crumbs. This is more accurate when there are multiple GPU commands back-to-back without barriers. However it may be slightly more expensive when many breadcrumbs are inserted. This also fixes MaxParameterCount in FD3D12CommandContext::WriteGPUEventStackToBreadCrumbData and slightly refactors FD3D12CommandListManager::FDiagnosticBuffer.

  • Reduced redundant D3D12 PSOs by ignoring vertex stream strides when computing the PSO cache key. D3D12_INPUT_LAYOUT_DESC part of D3D12 graphics PSO descriptor only includes the format, slot/semantic index, and so on. The stride is set at draw time using ID3D12GraphicsCommandList::IASetVertexBuffers. This saves a small percentage of total created low-level PSOs.

  • Added the r.RayTracing.EnableInEditor and r.RayTracing.EnableInGame console variables to control whether ray tracing effects should be enabled by default in the editor and in game (if corresponding game user setting does not exist).

  • Added support for creating raw buffer SRVs for any buffer in D3D12. In some RHIs, a raw buffer view can only be created if the buffer itself was originally created with a corresponding flag. However, modern RHIs such as D3D12 allow creating raw views for any buffer. This change adds FRawBufferShaderResourceViewInitializer to create raw views of buffers when GRHISupportsRawViewsForAnyBuffer is true.

  • Added Raster Ordered View (ROV) type support for shader binding.

  • Skip redundant calls to ID3D12Device5::SetResidencyPriority, which are extremely expensive The current priority can be stored in the D3D12 resource private data and redundant priority setting can be skipped. This is important for buffer allocations coming from CreateRayTracingBuffer.

  • Added the r.RayTracing.RequireSM6 console variable which can be used to only compile ray tracing shaders when targeting the SM6 D3D12 shader format.

  • Added Shader Model 6 warning dialogs, so that if a static mesh is detected to use Nanite, or a project is configured to use Virtual Shadow Maps and SM6 is not enabled in the project settings, a warning shows that SM6 needs to be enabled. Both cases only warn if the project was already configured to use a D3D platform.

  • Added an option for enabling Nanite in Project Settings.

  • Adding initial experimental D3D12 bindless support.

  • Added public interfaces and data for initial experimental bindless support.

  • Reworking shader platform settings on Windows to be per-RHI. This removes the ill-fated "min/max feature level" configs that can cause confusion. On Windows, "TargetedRHIs" is now split into "D3D11TargetedShaderFormats", "D3D12TargetedShaderFormats" and "VulkanTargetedShaderFormats". "TargetedRHIs" is still parsed for backwards compatibility. Using this, projects can now be more easily configured for D3D12-only or even Vulkan-only.

  • Updated FShaderFormatsPropertyDetails to use FName instead of FString for shader platforms. Also added a filtering method for mixed RHI platforms like Windows.

  • Reflection data is now included with SM6 embedded PDBs.

  • Added initial GetResourceFromHeap and GetSamplerFromHeap support.

  • Added TexCreate_Shared to FD3D11Texture3D.

  • Added a minimal interface to OpenGLDrv.

  • Added ERHIInterfaceType so the public RHIs can identify themselves.

  • Added templated GetDynamicRHI to avoid accidental Validation DynamicRHI casts.

  • Added depth clip control to the rasterizer state.

  • Added VRS D3D12RHI updates for defer ShadingRateImage binding to State Cache. Previously, we would bind the shading rate image plus related combiners as part of SetRenderTargetsAndClear. Instead, VRS images can now use the state cache infrastructure to reduce binding overhead.

  • Added "Supports Ray Tracing" to platform properties. This is checked in addition to the project/platform settings for RayTracing but is opt-in per platform instead of always enabled if the setting is enabled. This has the effect of reducing the number of platforms that say they support RayTracing which directly reduces the number of shader platforms that "support" RayTracing.

  • Added D3D12 Mesh shader support for ID3D12Device8, ID3D12Device9, and ID3D12Device10.

  • Created FShaderParameterMap::FindParameterAllocation method that returns the parameter struct instead of using reference parameters.

  • Implemented a change to migrate back to using UniformBuffer structs since the cbuffer uses the same name as the struct, we have to rename the cbuffer using a consistent prefix. The reflection handling also needs to reinterpret the renamed cbuffer as the correct UniformBuffer.

  • Added the ability to create a per-platform public interface for D3D12RHI.

  • Added Create functions to FRDGTextureDesc, which now derives from FRHITextureDesc instead of being an alias.

Improvement:

  • Added log messages for when D3D12CreateDevice fails.

  • FCubemapTexturePropertiesPS permutations have been modernized.

  • Changed WindowsTargetSettingsDetails to use shared functions to describe shader platforms.

  • Renderer dependency cleaned up by removing RenderGraph.h from SceneRenderTargetParameters.h.

  • Updated Agility SDK to 1.602.0

  • Refactored D3D12 descriptor management to go through a central manager.

  • Restored functionality to r.ShaderCompiler.EmitWarningsOnLoad.

  • Added more DXGISwapChain and DXGIFactory coverage in D3D12 and cleaned up adapter/swapchain code with available types.

  • D3D12RHI QuantizeBoundShaderState implementations now return the struct instead of taking it as an argument.

  • Moved ShaderParameterParser into its own source files.

  • Moved the bulk of SetShaderParameters to ShaderParameterStruct.cpp.

  • Shader reflection handling has been reorganized to funnel through common functions.

  • Moved D3D12RHI::ExecuteCodeWithCopyCommandQueueUsage into ID3D12DynamicRHI::RHIExecuteOnCopyCommandQueue.

  • Cleaned up the DXGI includes in D3D121RHI.

  • D3D12 descriptor heap size checks have been extended to allow for proper binding tier 3 support.

  • Moved Vulkan and OpenGL implementations of ApplyStaticUniformBuffers out of headers to remove header dependency on RHICore.

  • Reworked the parameter rewrite code to support automatic bindless conversion.

  • The Max RHIFeatureLevel is now output to the log on D3D12RHI creation.

  • Cleaned up D3D12 SRV and UAV implementations. Primarily renaming the "Initialize" methods to be more verbose about when they're called in relation to when the view is created. This allows us to identify when a CreateView call is for a newly-allocated descriptor or one that's been around for a while. Stubs added for deferred updates to bindless descriptors, not implemented yet. Unified a few RHI commands in RHICreateShaderResourceView to use a single command. Removed FD3D12ShaderResourceViewWithLocation and FD3D12UnorderedAccessViewWithLocation since they're no longer used.

  • Renamed the ShaderPrint uniform buffer to ShaderPrintData so it no longer collides with ShaderPrint() functions.

  • Switched ERHIFeatureLevel:SM6 from SM6.5 to SM6.6 in order to use the built-in 64-bit atomics.

  • Added TypedUAVLoad support checking for D3D12.

  • Added bNeedsExtraShaderFormats to TargetRules to protect hidden platforms from exposing their DataDrivenPlatformInfo defines to other hidden platforms.

  • D3D12 Mesh shader support will now be checked with all other CheckFeatureSupport calls.

  • Mesh shader support is now validated before creating D3D12 Mesh and Amplification shaders.

  • SetShaderParameters implementations have been cleaned up using a new helper class that loads parameters from passed in binary blobs.

  • DXGI includes have been cleaned up in D3D11RHI.

  • D3D12 Root Signature creation is now unified under a common path.

  • Updated Intel ExtensionsFramework version and added Intel Runtime support for atomic 64.

  • Added proper lifetime management to resources used by FRHICommandD3D12UpdateUniformBuffer

  • Updated the check for aliased textures in FD3D12TextureStats.

  • Launching a game that isn't cooked with any shader formats for the selected RHI now shows an error dialog before fatally quitting.

  • Added GRHISupportsLargerVariableRateShadingSizes to control support of 2x4/4x2/4x4 tile sizes. On D3D12, this maps to D3D12_FEATURE_DATA_D3D12_OPTIONS6::AdditionalShadingRatesSupported.

  • FRHITextureCreateDesc can now be constructed functionally via reference-returning Set functions.

Crash Fix:

  • Fixed a crash with Landscapes when using -rhivalidation. This fix ensures that the RHIBuffer is held for the life of the frame, as not all RHI backends have the Shader Resource View (SRV) to maintain a hard reference to the source buffer.

  • Implemented changes to avoid using the "groupshared bool" on Vulkan, as it has issues on some NVIDIA drivers. This fixes a crash in Vulkan engine tests (and playback of D3D12 captures in RenderDoc).

  • Fixed crashes that occurred when rendering offscreen in D3D12.

Bug Fix:

  • Fixed an assert when booting the QAGame Editor. Needed to use EnumHasAllFlags instead of EnumHasAnyFlags when testing BUF_RayTracingScratch, because it's a compound flag.

  • Fixed a bug with DriverDenyList support for Vulkan where no driver date was invalidating entries.

  • Fixed an issue with ProfileGPU scoping error in D3D12 where it erroneously included async compute scopes in the device GPU profiler stack.

  • In Vulkan, fixed a validation error where a view was created beyond its number of slices when the first slice index was offset.

  • Applied a fix for double signal of GPU fence in DX12 when performing All -> Graphics transition.

  • In Vulkan, allow MOBILE_EMULATION to be defined in VULKAN_PROFILE shaders. This fixes the gizmo not appearing when using Vulkan for Android emulation (alpha channel was not being set correctly for composite pass).

  • In Vulkan, when a slice is specified, create the view for only that slice or layouts will be altered by the render pass for other slices. Fixes bad layouts in Vulkan Mobile Preview.

  • Fixed a validation issue (in CitySample) with 2D copies using 0 as a Z component. This was resolved by adding DebugName to validation layer messages.

  • Fixed Anisotropy EngineTests on Vulkan.

  • Fixed a bug in CheckAllWritten() on Vulkan, and enabled it for graphic pipelines.

  • Fixed Render Dependency Graph culling behavior differences between Clang and Microsoft Visual C++ (MSVC) due to static initialization of shader parameter metadata.

  • Resolved a bug with texture 2D array resource creation.

  • Unified the DataDrivePlatformInfo for VULKAN_SM5 in a common VulkanPC fake platform to prevent settings on different platforms from overwriting one another. Previously they would all fill the same VULKAN_SMS in the FGenericDataDrivenShaderPlatformInfo::Infos array.

  • Fixed validation errors for unfreed resources which caused a loop on shutdown for as long as there were new entries to delete.

  • Added RHICopyTexture unit tests and fixed inconsistencies and bugs in that code.

  • Fixed validation errors on Vulkan where 2D default textures were used for Texture3D parameters.

  • Added BlackArrayDummy to system textures (single black pixel slice-texture array) because Metal requires texture arrays to be bound to texture array parameters.

  • Implemented changes to prevent collisions in the CurrentlyDeleting assert between an RHIThread running FRHIResource::FlushPendingDeletes and workers creating PSOs.

  • Fixed an issue with D3D12 validation errors encountered on the ray tracing indirect buffer. This was solved by duplicating relevant logic from GetResourceDescAndAlignment() into the ray tracing indirect buffer creation path so that D3D12RHI_RESOURCE_FLAG_ALLOW_INDIRECT_BUFFER is included for indirect buffers.

  • Fixed an issue with the SRV array slice not referencing the correct subresource in the Render Dependency Graph.

  • Fixed an issue where dxgi.dll was being freed before it was used.

  • Fixed an issue where view states were being set to the wrong FeatureLevel due to ULocalPlayer::PostInitProperties() creating view states before the UWorld was initialized.

  • RHI-specific arguments are now passed to launched processes as expected.

  • Implemented a workaround fix for the O0 crash in DXC when compiling FPathTracingRG.

  • Fixed issues involving RemoveUniformBuffersFromSource implicitly calling TransformStringIntoCharacterArray.

  • Fixed the missing VRS image state for XSX.

  • The Windows Feature Level checkboxes should now prompt the user to restart.

  • Addressed issues caused by improper handling of multi-plane texture formats.

  • Launching the Editor without selecting feature levels will now fall back to default feature levels as expected.

  • Fixed an issue where shader cooker stats would show incorrect shader format names.

  • Fixed instances where FRHITexture*Desc types were being used incorrectly instead of FRDGTextureDesc types.

Deprecated:

  • Deprecated CopyToResolveTarget method.

  • Deprecate D3D12RHI::ExecuteCodeWithCopyCommandQueueUsage.

  • Deprecated RHICreateTexture2DArray, RHICreateTexture3D, RHICreateTextureCube, and RHICreateTextureCubeArray.

  • Deprecated RHI*CommandList::SetComputeShader and switching to the PSO cache's SetComputePipelineState to move towards ComputerPipelineState as the default binding method.

  • Deprecated all of the Create functions in FRHITextureDesc.

Removed:

  • Removing the majority of D3D12RHI_API uses.

  • Removed the "equality comparison with extraneous parentheses" warning from DXC compiles.

  • Removed the Experimental label from PCD3D_SM6.

  • Removed more uses of GMaxRHIFeatureLevel. Focus started on GenerateMips and AddClearUAVPass.

  • Removed deprecated RHI functions.

  • Removed private RHI header includes.

  • Removed unnecessary dependencies on RHICore and RHI ThirdParty libraries.

  • Removed deprecated EShaderPlatform entries.

  • Removed the long-form create functions and constructors from FRHITextureCreateDesc in favor of the shorter versions.

UnrealLightmass

New:

  • Implemented ‘Lightmass Replace' material expression to work with GPU Lightmass This allows static lighting to be baked with a simpler material, or to tweak the color of indirect lighting through the material graph.

Simulation

Physics

API Change:

  • Exposed proximity tolerance as a parameter.

  • Chaos Immediate Physics which is used by Rigid Body Animation Nodes (RBAN) now creates a straight capsule body when a tapered capsule is requested in ChaosInterface::CreateGeometry. Previously tapered capsules defined in physics assets were just ignored. The new capsule will have a radius equal to the mean of the requested tapered capsule's radii.

  • Removed the console variable p.ChaosCloth.Solver.UseImprovedTimeStepSmoothing since there is no more solver dedicated code for the time step smoothing. A new console variable p.ChaosCloth.UseTimeStepSmoothing, which defaults to 1, has also been added to completely disable time step smoothing if ever desired.

New:

  • Added timestep post-processing in PBD evolution.

  • Added PoissonSolve function.

  • Add a 'skip fraction' to the custom Voronoi fracture tool, to remove a percentage of the 'live' sites.

  • Reduced the size of UPhysicsConstraintTemplate to 1008, so it fits in a smaller FMallocBinned2 pool.

  • Added a normals baking option to Fracture's AutoUV tool.

  • Added a grid distribution option for fracture mesh cut.

  • Added a 'custom' fracture pattern tool to support more user control of Voronoi fractures.

  • For optimization, RBAN memory usage has been reduced.

  • For Cloth, the Delete Cloth Asset button's tooltip has been updated.

  • Reduced memory footprint for triangle mesh implicit object when using LWC.

  • Added the missing Local Damping Coefficient in the SetDamping Blueprint function for Choas Cloth.

  • Added a menu option for the grab/poke interaction distance in the Physics Asset Tool.

  • Unregistered the cloth tick function whenever the owner Skeletal Mesh Component tick is disabled.

  • Changed the Physics Asset Tool simulate key to Alt + I.

  • Added an asset exporter abstract interface, and made it appear from the right click menu of the Clothing window whenever a corresponding modular feature is added.

  • Exposed per-axis constraint drive strengths etc on ConstraintInstance.

  • Updated Rigid Body Animation Nodes (RBAN) tonow optionally add kinematic objects at runtime to represent any Cloth Colliders defined in a parent skeleton. This can be used to improve the behavior of RBAN alternatives to cloth simulation (often used at lower LODs).

  • Added a Checkbox called Use External Cloth Collision on the RBAN node preferences panel to enable the kinematic objects feature.

  • Optimized the generation of geometry collections connection graphs has been.

  • Made the fracture mode interactive selection tool's "keep fraction" option attempt to space out the bones it keeps, rather than choosing completely at random. Gave user control of the random seed.

  • Added leaf and cluster selection tools to Fracture Mode

  • Improved the Children selection tool in Fracture Mode to not deselect nodes with no children.

  • Added project-default convex generation settings to Fracture Mode's project settings.

  • *Updated the Convex tool to include buttons to save and load convex generation settings.

  • We now apply project-default convex generation settings to all new or reset geometry collections.

  • Added an option to skip automatic removal of overlaps between neighboring hulls In the geometry collection convex hull generation settings.

  • New instance of geometry collections will now properly be initialized using the corresponding asset damage threshold array

  • Added AddImpulse and AddRadialImpulse functions to Geometry Collection component.

  • Added support for convex shapes in FBodyInstance GetShortestDistanceToPoint and GetClosestPointAndNormal methods.

  • Query based events now set ItemIndex when the hit component is a geometry collection corresponding to one of its specific parts.

  • Added multiple blueprint function taking this ItemIndex as an input allowing users to apply strain and/or break to specific part of the geometry collection.

  • Updated the CollisionObjectReductionPercentage geometry collection setting to also apply to convex collision, where it previously was restricted to other types of simple collision.

  • Added a flag on RigidBody AnimNode to allow it to use synchronous physics simulation.

  • Renamed CVar to p.RigidBodyNode.DeferredSimulationDefault to reflect that it's the project default, not an override.

  • Added an option to the AutoCluster tool in Fracture Mode to choose number of Voronoi sites as a fraction of total children to cluster, instead of directly specifying the number

  • Added options to the AutoCluster tool to (try to) prevent creating isolated children, by merging such clusters with neighbors, and clusters of all children (by skipping cluster creation in that case).

  • Added the ability for a geometry collection component to opt-out from sleep and/or break removal logic set on the asset.

  • Added a merge-selected-only option to the Fracture Mode TinyGeo tool, and stop selecting all after every merge.

  • Updated Geometry collections to now properly account for static meshes BuildScale parameter when importing geometry.

  • Added support for CCD, linear and angular damping for geometry collections.

  • Added asset-level option to use size specific damage thresholds for geometry collections.

  • Updated a number of the Fracture Mode tools run expensive computations in a background thread, with a regularly-sampled progress/cancel UI. This includes the Fracture tools such as Voronoi, Plane, and Mesh, as well as the AutoUV tool.

  • Added support for Enable Gravity parameter for geometry collections – only accounted for at initialization.

  • Updated the Convex builder to now use a new convex hull generation algorithm.

  • Updated the Geometry Collection Break events to now return the index of the specific piece. This "ItemIndex" can now be used to call blueprint functions targeting specific parts of the geometry collection.

  • Improved remove on max sleep feature for geometry collections to be able to also remove slow moving pieces, allowing for more efficient removal behavior.

  • Partial clusters will now crumble into smaller pieces after a certain time if remove on max sleep is enabled

  • Optimized collision impulse processing for Geometry Collections.

  • Added AddForce, AddRadialForce, and AddTorqueInRadians functions to Geometry Collection component.

  • Added interpolated asynchronous physics support for geometry collections.

  • Updated the p.ChaosCloth.Ispc command to register during static initialization (and in test builds), so it can be changed at startup for automated/unattended testing.

  • Added support for the Start Awake parameter for geometry collections.

  • Added a "Keep Frac" setting to the fracture interactive selection tool, to allow dropping a random fraction of the selection filter.

  • Provided an optimized code path for mostly vertical sweeps )

  • Added particle velocity visualization.

  • Changed the aerodynamic forces visualization colors depending on whether the particles are kinematic or dynamic.

  • Added support for Geometry Collections in Mesh Painting mode.

  • Geometry collection fragments hidden using the Fracture Editor Hide tool will now be excluded from the simulation.

  • Improved Chaos Cloth bending elements to be much more stable and correct, especially when the initial rest shape is not flat.

  • Added the "Buckling" feature in Chaos Cloth (i.e., biphasic materials), which adds "Buckling Stiffness" and "Buckling Ratio".

  • Updated Chaos Cloth bending element will now use its Buckling Stiffness rather than its Bending Stiffness once the cloth has bent beyond the limit set by Buckling Ratio.

  • Added options on geometry collection creation:

    • Ask if the user wants to duplicate input materials to create internal material slots.

    • Ask if the user wants to split the mesh by connected components, creating separate bones for each component.

  • Improved the names and organization of the geometry collection convex hull generation settings.

  • Overlap removal settings are now a separate group

  • Renamed "Can Exceed Fraction" to "Allow Larger Hull Fraction"

  • Renamed "Can Remove Fraction" to "Max Removal Fraction" and moved it to the overlap removal settings group.

  • Renamed the GeoMr' tool to TinyGeo in Fracture Mode.

  • Added a new GeoMrg tool in the 'edit' category which just merges the geometry from selected bones.

  • Added new blueprint functions to apply external and internal strain to specific geometry collection fragments.

  • Updated the Fracture Mode's validation tool into a modal tool with options, so the user can see what it will and won't do. Also added an option for it to remove 'clusters of one.'

  • Added the Chaos Cloth Air Pressure Field (Normal displacement). This adds a new "Pressure" field and map to cloth which is used to model a difference in air pressure on two sides of cloth (e.g., inflatable objects, puffy jackets, pillows).

  • Updated the fracture tools to propagate vertex colors internally on fracture via a smooth solve, so vertex colors are consistent within a fractured mesh.

  • Added standard fracture settings (including random seed to control the cut distribution) back to the Mesh fracture tool, except not Grout and Noise (as these aren't supported).

  • Updated Geometry collection to now caching their local bounds to reduce runtime overhead.

  • Updated Edge and Bending constraint debug drawing colors to be based on their parallel graph coloring. Constraints solved in parallel are the same color. This is largely for developer debugging, so you probably don't need to worry about it, but this is what the color change means!

  • Added the ability to define a timer for fragments ( including clusters) to be removed after a certain amount of time. This adds a new Remove On Break tool in the Fracture Editor that allows to set those parameters per fragment

  • Added several geometry collection blueprint functions to control individual fragments by applying linear and angular velocity as well as getting their initial level in the hierarchy.

  • Updated Existing Self Collisions in Chaos cloth (enabled via "Use Self Collisions") to now take normals into account and have a "Self Collision Friction" coefficient.

  • Updated Self collisions Chaos cloth to be (slightly) faster, especially on hardware with a lot of CPU parallelism. It is still not recommended to use self collisions where speed is critical.

  • Added a new "Use Self Intersections" flag has been added which will fix self intersections that were missed by the existing Self Collisions algorithm. This feature is highly experimental with significant changes and improvements expected in future releases.

  • Added anchored property to anchor a geometry collection fragment which allows it to hold the structure while still being able to be removed unlike setting its initial state to kinematic. This can be set by using the right-click menu in the hierarchy in the Fracture editor outliner.

  • Updated transient / un-Saved properties to work more logically for Geometry Collection data:

    • The ManagedArrayCollection 'Saved' flag controls whether the whole property is saved, rather than just its data.

    • Always save everything when transacting (ignore the Saved flag) Also when loading, remove properties that were not in the map that was loaded from.

    • Stop manually removing some unsaved attributes, as the Saved flag should take care of that instead.

    • Stop loading from the DDC (after already loading from the transaction history) for every undo/redo transaction.

  • Changed the geometry collection 'remove overlaps' fracture convex generation option to support more options -- specifically adding options to only remove overlaps on clusters, or overlaps of clusters with other clusters.

  • Added a Convex OverlapRemovalShrinkPercent variable to the geometry collection convex generation settings, to compute overlap removal on scaled-down convex hulls (without baking that scale into the hull). This gives additional flexibility when overlap removal is removing too much of the collision volumes.

Bug Fix:

  • Fixed hit event not reporting other component or actor when it is a geometry collection component.

  • Fixed crash in fracture mode AutoCluster tool when there are no bones

  • Disable radial fracture position (center, normal) settings when position is controlled by gizmo. Update tooltips to explain why they're disabled.

  • Updated Chaos Cloth to reset the field's outputs to avoid it affecting the cloth once it is no longer active.

  • Restricted the solver field update in Chaos Cloth to the currently active LOD set of particles, thus avoiding unnecessary updates for the inactive LODs.

  • Fixed the Chaos Shared Config ownership that was preventing some Skeletal Mesh assets from being saved once the first/original cloth asset owner had been deleted.

  • Fixed an issue in Chaos Cloth where the collision particles index wasn't reset during an LOD change, and was causing the external collision sources to be re-added multiple times.

  • Geometry Collection: Fixed shape generation not properly using relative size when clustering is on.

  • Fixed the stiffness exponentiation calculations in Chaos Cloth. Prevented a 0 Low or High painted stiffness to be turned into a small stiffness whose effect is still perceivable on all related constraints when values are close to 0 and 1.

  • Fixed issue where adding an element to the size specific array in a geometry collection asset details would sometimes add two.

  • Fixed a crash when FParallelClothTask::GetDesiredThread() was called outside of the game thread.

  • Fixed issue with heightfield depth computation when sample point is outside of the XY bounds of the heightfield.

  • Fixed convex generation to properly remove internal and invalid faces.

  • Updated Fracture Mode to only auto-scroll to bones in the outliner/histogram if they are selected via a single bone selection in the 3D view. This prevents the outliner view from auto-scrolling to the first bone in the list after every click while the user is multi-selecting within the outliner itself.

  • Fixed rotated box-shaped fields that resulted in a smaller area of effect than expected.

  • Fixed non-nanite cached geometry collections not properly updating their bounds in editor when using sequencer.

  • Fixed Geometry Collection's size specific damage threshold calculation to now properly accounting for max cluster level value.

  • Fixed inertia tensor calculation for geometry collection clusters when the original mesh has a world transform with a non zero rotation.

  • Improved performance of proximity detection when fracturing very large meshes, especially for meshes with regular face orientations.

  • Fixed inertia calculation for scaled geometry collection.

  • Deleted geometry collection components are now properly handled by the Chaos-Niagara interface.

  • Fixed complex collision display for spline mesh components.

  • Factorized FMeshBatch spline setup code.

  • Fixed a performance problem that caused the editor to take a very long time to convert a set of large static meshes to geometry collections.

  • Fixed issue where sleeping geometry collections could be unexpectedly woken up by distant fields.

  • Fixed performance bug in fracture mode that could cause a very long processing time on reset of a large geometry collection with many input parts.

  • Fixed an edge case where running sweep queries against dirty elements in the AABBTree could lead to an infinite loop.

  • Fixed issue where kinematically moving geometry collection would have their velocity set to 0 when activated by a field.

  • Chaos Cloth: Fixed the velocity calculations when MaxPhysicsDelta kicks in, preventing the cloth from receiving excessive impulses as the time step gets clamped.

  • Fixed capsule ray-cast sometimes returning false negatives.

  • Fixed off-centered rotations issues for geometry collections when using asynchronous physics or caching.

  • Fixed a crash due to fracture mode outliner being out of sync with geometry after an undo or redo.

  • Fixed Geometry Collection hit proxies rendering incorrectly for triangles referencing a few vertices in each buffer, due to an incorrect offset parameter.

  • Fixed geometry collection hit proxies rendering incorrectly in fracture mode when not actively selecting bones.

  • Fixed smoothed velocities computation that could cause rigid bodies to flip between a sleeping and dynamic state while falling if they add a small force applied to them.

  • Moved smoothed time step operations out of the solver of Chaos Cloth, leveraging the velocity scale to avoid cloth tugging issues. This also allows for more drastic change in time steps without causing the simulation to explode, as when using the slomo command for example.

  • Fixed the fracture mode AutoUV tool to use more appropriate texture types when baking. For example, using linear rather than sRGB mapping when encoding values like distances, curvatures, and normals.

  • Updated the fracture mode brick tool to work correctly with zero grout, rather than forcing the grout to always be non-zero.

  • Fixed Chaos cache manager not working after resetting a cached geometry collection.

  • Fixed the fracture mesh tool creating a very deep hierarchy when applying multiple cuts; it now only adds one level of children for a given fractured bone.

  • Fixed character movement interaction with scaled geometry collections.

  • Fixed bug where a blueprint Chaos collision event would not properly set the OtherComponent property.

  • Fixed the fracture mode AutoUV tool's box projection feature sometimes messing up unrelated UV layers, and generating bad results for isolated triangles.

  • Resolved rare crash when dynamically creating and deleting Chaos vehicles.

  • Fixed Fractures to now be computed in a consistent local space, rather than globally. This makes the noise applied to fracture surfaces not depend on the world-space position of the geometry collection.

  • Fixed fracture mode capturing 'escape' when in PIE and simulate modes, making it difficult to leave the mode.

  • Fixed cook warning related to selection material in geometry collection.

  • Fixed cached geometry collection bounds not being updated properly when scrubbing start time from caches in editor mode, causing them to sometimes be wrongly culled by the rendering system in editor.

  • Fixed crash attempting to retrieve shapes from a body instance that has no actor instance (e.g. welded bodies).

  • Fixed incorrect identification of owned instance shapes in GetSquaredDistanceToBody for welded instances.

  • Enabled mask filters for Chaos collision.

  • Adjusted zero-component scale behavior to always pass a valid scale to avoid creating invalid body instances due to invalid scales

  • Fixed physical material resolve for landscapes with a simple collision mip enabled. Both material assignments and holes should be represented correctly now.

  • Fixed rigid bodies no longer colliding after being constrained with a constraint using "Disable Collision". After the constraint breaks we now update the ignore manager for the bodies in question to re-enable their interaction.

  • Fixed incorrect class filter for default destructible material to allow proper selection and avoid warnings for missing classes.

  • Fixed exports of UShapeComponent templated methods so that the explicit instantiations can be called from external modules.

  • Minor Chaos non-unity build fixes.

  • Added warning for default physics collision handler to catch invalid actor references in pending collision lists.

  • Fixed player collision mode rendering of convex elements which was previously not taking element transforms into account.

  • Fixed use-after-move when building unions of implicit objects.

  • Fixed OnHit event propagation to correctly identify the shape that the collision came from and the component that owns it.

  • Added a memory barrier to TObjectPool to ensure no writes to the head block will reorder beyond grabbing a free item pointer

  • Fixed erroneous deleter being used for derived types of FProxyTimestampBase

  • Fixed physical material mask set operation causing the map array to endlessly expand on repeated calls.

  • Fixed a few control paths that could lead to the dirty grid acceleration in scene queries to get caught inside an infinite loop which was showing up as a write-deadlock on the main thread

  • Fixed disabled constraints never being removed from the constraint graph leading to severe performance degradation after long runtimes. Fixed disabled constraints never being removed from their owning particle joint lists - leading to dangling joint pointers in the particles.

  • Fixed geometry collection/provider asserting that its geometry is of inner types without unwrapping its implicit.

  • Fixed the cast helpers for Chaos geometries only accepting callable objects that return value types.

  • Changed null actor release message from Warning to Verbose as it is a valid code path currently when welding shapes into a body instance of a parent that is set to NoCollision.

  • Fixed a bug that was preventing physics constraint forces from being reported.

  • Hoisted branch evaluation allocations out of AABB inner loops, reduces repeated allocations within a frame when objects move in Chaos scenes.

  • Removed ensure in GetWorldVelocityAtPoint that required the object to be kinematic or dynamic. It is valid to request a velocity from a static object without firing an ensure - the velocity will always be zero in that case.

  • Fixed incorrect access to inner physics materials during update when a material had not yet been created.

  • Re-enabled scene-wide physics collision handler customization.

  • Grouped sibling choice and cost for AABBTree leaf insertion to avoid double cache misses.

  • Refactored nodes to be smaller so more nodes fit in a cache line.

  • Altered node access pattern during FindSibling to avoid repeated indirection through the Node array.

  • Fixed incorrect joint constraint termination leading to memory leaks and dangling joints that slow down the solver.

  • Changed coincident vertex Warning during tri-mesh cleaning to Display. This is a recoverable issue as we just delete those triangles and move on. Display will still message to the user that there are invalid triangles to address.

Deprecated:

  • Deprecated remove on fracture option for Geometry collections - this is now replaced by recently introduced and more flexible remove on break

Volumetric

New:

  • Upgraded Blosc to version 1.21.0

  • Added support for OpenVDB and Blosc on Mac and Linux in addition to Windows.

UI

New:

  • Added new LLM subtags for UI and increased UI LLM coverage.

  • Added a Blueprint-callable setter for bHideInputAction on CommonButtonBase.

Slate

API Change:

  • As the FTextBlockStyle is now embedded in the FEditableTextBoxStyle, it cannot be initialized the exact same way. If you need, you can now configure the FTextBlockStyle of an FEditableTextBoxStyle by calling SetTextStyle on it.

New:

  • Added InitialSortMode attribute to FColumn and STableColumnHeader. InitialSortMode will default to EColumnSortMode::Ascending as before.

  • Added icons for C++ widget classes.

  • Previously, UMG MultilineEditableTextBox contained both a Font with an EditableTextBoxStyle, and another Font with a TextBlockStyle. This was error-prone as it was not clear which one was supposed to be modified. To solve this duplication issue, the Font from the EditableTextBoxStyle has been removed, and the TextBlockStyle has been moved from the MultilineEditableTextBox to the EditableTextBoxStyle.

  • Added general support for external per-mode widgets to be displayed by UMG editor. This improves UMG editor extensibility.

Crash Fix:

  • Fixed a crash that would occur when capturing callstacks using Slate Insights in editor.

Bug Fix:

  • Fixed an issue where FDirectoryPath properties failed to disable the path selection button when the property is disabled.

  • Fixed the checkbox style on editor utility widgets.

  • Addressed an issue where zero-sized scissor rects were not culled.

  • Fixed an issue where the mouse was not properly locked to the game window.

  • Fixed several issues with Slate line and spline rendering.

  • Addressed an issue where SDockTab::OnTabClosed would not fire when the tabs were removed.

  • Fixed an issue causing slider and text selections to be offset when displaying in non-standard viewport resolutions.

  • Fixed the order of parameters in KeyEvent.

UMG

New:

  • Keyboard input type overrides are now available for Spinbox

  • Added an option to make moved widgets only invalidate the SWorldWidgetScreenLayer if they are visible.

  • Added list reordering to widget animations.

  • Added DrawSpline to Widget Blueprint library.

  • Added a size overlay for the currently selected widget to the UMG editor.

  • Exported FCommonAnalogCursor from the CommonUI module.

Crash Fix:

  • Fixed a potential crash that would occur in UCommonButtonBase::RefreshDimensions when the preview widget is rebuilt.

  • Added guards against CommonUI action router not existing on game shutdown.

Bug Fix:

  • Safeguards have been added to prevent null entries from being added to a ListView with SetListItems

  • Setting a Margin variable in a parent blueprint now correctly updates child blueprint variables as well.

  • Fixed a bug that caused the cursor to disappear while using PIE with CommonUI.

  • Fixed widget references not updating in UMG Designer on compile.

  • Fixed issues preventing zoom from functioning well at small sizes in UMG Editor.

  • Fixed rounded box outlines when using default CommonUI style with full transparency.

  • Added missing broadcasts in CommonLazyImage and CommonLazyWidget.

  • Fixed editable text box default focused color black.

  • Editable texts will now react instantaneously to any change to the font settings done in the UMG designer. Previously it was necessary to force a refresh.

Virtual Production

New:

  • You can now predetermine the number of frames to capture when using MediaCapture.

  • Multi-User: Added an option/cvar for closing Sequencer when a sequence is closed by a remote user.

  • DMXFixtures: Fixed visibility logic on all light fixtures to make sure it's responsive.

  • Extended INetworkMessagingExtension to support network monitoring. Subscribers can provide bytes lost, bytes received, and bytes sent that can be displayed in a Multi-User Server session.

  • Changed the default console variable values for Concert.EnableOpenRemoteSequencer and for Concert.EnableSequencerPlaybackSync to be true.

  • Improved handling of World Partition levels in a Multi-User session.

  • Added a delegate to the IConcertClientWorkspace class to indicate that a workspace has been synced and finalized.

  • Added the LiveLinkFaceImporter plugin to the Unreal Editor source. Previously this plugin was only available on the marketplace.

  • Added a setting to control the size of the work send queue for Multi-User. Sessions with a large number of transactions and clients that join late may cause this queue to fill up and never recover.

  • Fixed incorrect values sent over Multi-User when using the Console Variable Editor.

  • VP Roles improvements:

    • Moved roles to a menu in the level editor toolbar.

    • Mde it easier to select/remove roles.

    • Added roles subsystem to provide a basic Blueprint API.

  • Added modifier key to increment/decrement timed data monitor offset by 10 and 0.1. By default, the Shift key will increment/decrement by 0.1, and the Control key will increment/decrement by 10.

  • Changed VirtualCamera plugin to Runtime.

  • Added a function to VCam Modifiers that allows them to access their associated name in the modifier stack.

  • Added an intermediate dialogue when creating VCam related Blueprints to prompt for an optional InputActionContext. This dialogue is used when creating VCam Modifiers or VCam Widgets.

  • Changed Right Click Asset Creation Menu to "VCam" from "Virtual Camera".

  • Exposed ILiveLinkClient::GetSourceType to Blueprints. Name changed to GetSourceTypeFromGuid to avoid conflict with existing GetSourceType function using a Source Handle.

Bug Fix:

  • Added additional precautions to deal with "slightly off" blocked ranges being set to control "blocked synced" playback.

  • Improved the TCPMessaging retry on connection failure mechanic.

  • Fixed blocked/synced playback timeouts with enabled audio playback on player setup. Syncing was disabled.

  • DMXFixtures now checks if a DMX component is valid before reading it to avoid warnings in Blueprints.

    • Added support for camera Field of View in beam shader.

    • Fixed division by zero in zoom component.

  • Trashed VCam components are now properly disabled when they are replaced in the Editor (usually via rerun construction scripts).

  • Made LiveLink an explicit requirement of the VirtualCamera plugin.

  • VCamComponent no longer tries to access the Live Link Client during cook.

  • Fixed an issue where VCam Modifier Names were resetting when changing modifier properties in the Details panel.

Deprecated:

  • DMXFixtures - Deprecated MinQuality and MaxQuality UProperties. Now using BeamQuality and ZoomQuality.

IO

API Change:

  • CaptureSceneViewportImpl and CaptureRenderTargetImpl have been deprecated and replaced with InitializeCapture called for any type of capture and specific post initialize methods for each type of capture like PostInitializeCaptureViewport.

New:

  • Added an importer for ulens files. This makes it possible to associate a LensFile asset with a file on disk, so it can be reimported as well.

  • OpenEXR: Upgraded OpenEXR to version 3.1.5.

  • Updated MediaCapture to use RDG, and added structured buffer output support to media capture.

  • Added immediate rhi resource capture mode to MediaCapture.

  • Added support for UAV output configuration from media converter in media texture.

  • The Live Link API now allows deriving from LiveLinkProvider and MessageBusSource classes.

  • Added autodetection for Blackmagic genlock format.

  • Aja input format input is now autodetected by default.

  • Added automatic exporting of data collected during camera calibration to disk.

    • Added support for importing camera calibration datasets.

  • Added "Depth of Field Supported" flag to the LiveLink Camera Role to allow a LiveLink Source to enable/disable depth of field (Focus Override) on a Camera Component.

  • Media capture now automatically reopens media capture when media output is modified.

  • Added option to enable linear conversion when doing a media capture.

  • Added control key modifier to timed data buffer visualizer to zoom faster.

  • Added format autodetection for Aja timecode.

  • Added format autodetection for Aja Timecode Provider.

  • Added Aja GPU direct support for input. Enabled by the console variable MediaIO.EnableGPUDirectInput.

  • Renamed "Lens Distortion Component" to "Lens Component".

    • Fixed a bug to guarantee that a camera recorded with Take Recorder would have nodal offset baked into its recorded transform.

    • Added "Evaluation Mode" option to Lens Component to choose where the Focus and Zoom values used to evaluate a Lens File come from.

  • Added media playback buttons to the simulcam viewport to support pausing and seeking a file media source used for camera calibration.

  • Added ability for each controller in the LiveLink component to potentially control a different component.

  • Added "Distortion Source" setting to Lens Component, with options to use a Lens File, a LiveLink Lens subject, or to manually drive the distortion state.

    • Added "Filmback Override" setting to Lens Component, with options to use the filmback specified in a Lens File or a user-specified "Cropped Filmback".

    • Changed the Composure CG Layer setting to choose a Lens Component instead of a Distortion Source.

    • Deprecated Lens Distortion Handler Picker structure.

    • Deprecated methods for querying for a Lens Distortion Handler from the Camera Calibration Subsystem.

  • Added a new track recorder to Take Recorder to support recording distortion state from a Lens Component and applying distortion to a camera on playback of a level sequence.

  • Timed Data Monitor Improvements:

    • Put channels in alphabetical order in buffer visualizer.

    • Added buttons to increment/decrement frame offset and time evaluation offset.

    • Added dropdown to select evaluation offset type (frame vs seconds).

    • Fixed style not being registered resulting in white texture.

    • Added indicator in frame time to display when you are over your frame budget.

  • Added console command to reinitialize timecode and genlock. Commands are TimecodeProvider.Reset and CustomTimeStep.Reset.

    • Added support for Rivermax 2110 video streaming for input as a MediaSource.

    • Added support for Rivermax 2110 video streaming for output as a MediaOutput.

Bug Fix:

  • LensFile image dimensions are now saved on the asset itself.

  • Fixed IsChildOf called on nullptr in RemoteControl.

  • Fixed crash when adding LiveLink component.

  • Fixed a crash that happened when using file media capture with resolution that needs padding.

    • Fixed float FileMedia output expected stride.

  • Fixed crash caused by Media IO player not clearing itself from the timed data monitor system.

  • Fixed LiveLinkLightController not setting the LightComponent's "Use Temperature".

  • Fixed lens file import doing wrong coordinate conversion (unreal to opencv instead of the opposite).

  • Fixed Remote Control preset transactions being ignored by Multi-User.

  • Fixed NDisplay config "rebind all" not working if generated for a different config (Viewport properties excluded). Added context menu for rebinding viewport properties.

  • Fixed audio crashing when outputting audio with Blackmagic on Linux.

  • Fixed nDisplay exposed properties on viewports not being able to be rebound. Fixed some nDsplay properties changing to <multiple values> after being changed in the preset.

  • Fixed Blueprint event not being callable with raw Remote Control API.

  • In the Remote Control panel, exposing/unexposing now properly generates transactions in the undo history.

  • Fixed Aja media capture outputting a still image after unexpected engine closes.

  • Fixed Remote Control unexpose not working on nDisplay viewport properties.

  • Fixed desync between the Remote Control web interface and Unreal Engine when entering or exiting a Multi-User session.

nDisplay

New:

  • nDisplay: Added support for the resize tool in the OutputMapping UI to lock the aspect ratio when being dragged by holding shift.

Rendering

New:

  • Added OpenColorIO support for selecting displays and views when available in the configuration file.

Improvement:

  • Added OpenColorIO plugin Blueprint function to activate color transforms in game mode, called "Create In-Game OpenColorIO Display Extension".

  • Added 32-bit float lookup table texture support in OpenColorIO for improved precision, exposed as a plugin setting.

  • OpenColorIO plugin now uses v2.1's new GPU processor, while maintaining legacy support via a plugin setting.

Bug Fix:

  • OpenColorIO source and destination color space conversion settings are now correctly reset if no longer available in the configuration.

  • Fixed OpenColorIO crashing on Mac when using Lumen overview viewports.

  • Improvement: Migrated OpenColorIO viewport settings from EditorPerProjectUserSettings.ini config to plugin-specific OpenColorIO.ini file.

  • Fixed mismatch in Composure between preview window and viewport: the tone curve is now consistently disabled by default, with option to re-enable.

  • Fixed media texture trilinear sampling with new style output.

Tools

New:

  • Added the first version of the Render Grid plugin (still in heavy development), which allows you to render several variations (different materials, colors, etc) of the same level sequence with ease.

  • Switchboard: Added a "Vulkan" option to the nDisplay "Render Mode" setting.

  • SwitchboardEditor: The Switchboard toolbar button is no longer automatically hidden after desktop shortcuts have been created.

  • Sequencer Playlists: Added support for opening multiple Playlist assets simultaneously. Double-clicking Playlist assets in the Content Browser will now spawn new Playlists editor tabs.

  • Virtual Scouting: Added a new "Virtual Scouting" plugin, which contains code required for OpenXR compatibility. For now, the "Virtual Production Utilities" plugin is also still required to use Virtual Scouting.

  • Virtual Scouting: GetHMDDeviceType is now shimmed for backward compatibility when using the OpenXR plugin, instead returning the name of the deprecated VR plugin which corresponds to the active OpenXR interaction profile.

  • Virtual Scouting: Added a "Game View" toggle to the Virtual Scouting settings panel, and added an "Enter VR Mode" Blueprint function to the VPScoutingSubsystem.

  • Switchboard: Added a setting to allow finding levels that are inside plugins.

  • Virtual Scouting: You can now use the OpenXR aim pose for the laser origin when applicable, rather than the grip pose. We have added a socket named "OpenXrGrip" to the Virtual Scouting Oculus controller mesh (SM_Controller_RiftS), adjusted to coincide roughly with the OpenXR grip pose. For any mesh where this socket is present, the interactor mesh relative transform is adjusted to treat the socket as the mesh origin. This allows us to preserve the original mesh origin for compatibility with the deprecated Oculus VR plugin and its differing motion controller pose.

  • VR Editor: Changed UIBrightness upper bound property annotation from ClampMax to UIMax, in order to permit values >10.0 to be typed in.

  • Switchboard: Added support for hostnames in addition to IP addresses. Address-type settings fields will now attempt name resolution on the entered value, with highlighting to indicate the lookup status (yellow = pending, red = failed).

  • Added support to join all interfaces on multicast address when 0.0.0.0 is used for UDP unicast.

  • Enhanced Switchboard tool to allow users to save configurations outside of the main config folder.

  • RemoteControlWebInterface: Added dedicated view for Virtual Production FX, Color Correction & Light Card control.

  • Added SwitchboardListener and Multi-User Server as build steps in UnrealGameSync.

  • Added an option to the Multi-User persist dialog to allow users to make a file writable if source control is not enabled.

  • RemoteControlWebInterface: Added support for Controllers.

  • Enabled ShotGrid plugin for Linux.

  • Added Shader and Asset Loading status column to the Stage Monitor tool.

  • The VPBookmark Actor used by both Virtual Camera and Virtual Scouting has been nativized.

  • Added CineCameraComponent in VPBookmarkActor in order to save camera parameters on the bookmark

  • Added the function InjectInputForAction to the VCamComponent that will inject the input to whichever input system the component is currently using.

  • Added SetActorLabel function in the VCamBP function library that will be accessible from VCam modifiers and widgets.

  • Implemented GetWorld function in VCamModifier class that will expose Actor related functions for VCam modifiers.

  • Enhanced Input has been enabled in the VRTool and VirtualScoutingInteractor classes to support future development of VR in Editor toolsets.

  • All materials associated with the Virtual Scouting tools have been modified to ignore pre-exposure. They can now be used in scenes with physically accurate lighting values and remain visible regardless of lighting ratios or exposure level.

  • The Viewfinder tool now uses the CineCameraComponent filmback size and crop settings to define screen size and render target dimensions.

    • Viewfinder and Viewfinder_v02 now display focal length from the focal length variable on the CinecameraComponent rather than the lens preset name to support arbitrarily named lenses.

  • Take Recorder's "Review Last Take" now considers Multi-User setups where multiple takes may have been recorded.

  • VPCineCamera SceneCapture2Dcomponent no longer captures every frame, saving performance in VR Scouting sessions with multiple VPCineCameras spawned in.

  • UDP Messaging will now detect when a message cannot be properly routed and mark the endpoint as unreachable. This prevents the UDP Messaging module from initiating auto-repair, which would force the entire connection to be rebuilt.

Bug Fix:

  • Virtual Scouting no longer logs an error and refuses to launch if r.PostProcessing.PropagateAlpha is not set to 0, which otherwise led to the rendered image displaying all black in the HMD.

  • SwitchboardListener: Fix for building with bForceEnableExceptions ("error C2712: cannot use __try in functions that require object unwinding").

  • Sequencer Playlists: Fixed a potential crash when specifying out-of-bounds start/end frame offset values.

  • SwitchboardListener: Fixed expansion of %TEMP% in file destination paths on non-Windows platforms. This was causing a crash attempting to launch nDisplay devices running on Linux.

  • Switchboard: Fixed unhandled exceptions during creation of a new Switchboard configuration when attempting to invoke wmic to populate guesses for project/engine paths.

  • Switchboard now uses Build.bat/Build.sh instead of invoking UnrealBuildTool.exe directly, which ensures that the environment is set correctly.

  • Sequencer Playlists: Fixed an issue where hold sections could display the wrong frame for certain sequences.

  • For RemoteCotnrolWebInterface, there's no need to install NodeJS anymore. Plugins download required nodejs binary.

  • Virtual Scouting - the Sequencer tool now opens the first available level sequence Actor.

Upgrade Notes

Animation

Rigging

Upgrade Notes:

  • Hide Transform and TransformNoScale as available control types in Control Rig. Controls of Type Transform and TransformNoScale will continue to work — but users cannot create new controls of those types through the UI.

  • The Update event is now called Forwards Solve and the Inverseevent is now referred to as Backwards Solve in Control Rig.

  • Spherical Pose Reader can now be mirrored. Inner/outer falloff regions are independent. Added debug drawing of coordinate axes.

    • Node should behave as before, though you may find the inner/outer regions are tuned slightly differently after upgrading.

Sequencer

Upgrade Notes:

  • Root instance handles are now type-enforced in Sequencer.

    • This prevents passing an FInstanceHandle to something that specifically wants a root instance handle.

    • FRootInstanceHandle is implicitly castable to an FInstanceHandle, but not visa-versa.

    • Some forward-facing APIs that deal with root instance handles have been changed to use FRootInstanceHandle over FInstanceHandle.

Editor

Upgrade Notes:

  • Upgraded the remote_execution.py script in the PythonScriptPlugin. Changes are backwards compatible. No changes to previous code that utilizes remote_execution.py is necessary. Changes include:

    • Added macOS support and fixed problems with command socket not being able to start in Unreal.

    • Added Python 3.9 support.

  • Updated hair strands to support Alembic groom_group_cards_id for hair card generation.

    • In order to use the new Alembic schema field 'groom_group_cards_id', any relevant groom assets with this field must be re-imported.

Foundation

Core

API Change:

  • FAssetBundleData now only stores the paths of top level assets to save space, though it can still be populated by TSoftObjectPtr properties tagged with the appropriate metadata.

  • FSoftObjectPath and FTopLevelAssetPath should be able to replace FNames that referenced object paths in most cases without problems, however they are restricted to storing strings which have the correct form (for example, they start with a '/', they do not contain adjacent subobject delimiters, and so on).

Upgrade Notes:

  • FSoftObjectPath should be used to contain the paths of objects that may exist at any depth in an object hierarchy, such as /Path/To/Map.Map:PersistenLevel.Actor.Component.

    • It stores the first two components (the package name and top level asset name) as FNames and the rest of the path as an FString.

    • FTopLevelAssetPath should be used to contain the paths of objects which always have a package as their direct outer, such as /Path/To/Package.AssetName.

    • FAssetData::ObjectPath is deprecated, FAssetData::GetSoftObjectPath or GetObjectPathString should be used instead.

Dev Tools

Upgrade Notes:

  • Updated common memory reporting commands to properly use -csv output and added parsable delimiting to MemReport output.

  • Fixed audiomemreport command to properly redirect to a different OutputDevice (removed -skipcsvforaudio, added -log).

  • Any tools that parse the output of affected memory profiling commands like "obj list" or "listtesxtures" may need adjusted to respect the new formatting. These outputs should now use more standard csv formatting that doesn't include leading or trailing white spaces in cells. MemReport files now include "Begin/End command" notations for each section.

Framework

Upgrade Notes:

  • Large world support (~88 million km wide) is enabled for all worlds.

    • If your project relies on the 22km UE4 WORLD_MAX you may revert to that version by building with UE_USE_UE4_WORLD_MAX=1.

    • Alternatively project code can be updated to use UE_OLD_WORLD_MAX and equivalents as appropriate. Refer to EngineDefines.h for the complete list of OLD (UE4), LARGE (UE5), and HUGE_DISTANCE (precision limits) defines.

    • AWorldSettings::bEnableLargeWorlds was deprecated as part of this change. Test projects that previously relied on this toggle will continue to function and will now apply world bounds restrictions to actors further than ~44 million km from the origin. You may use AWorldSettings::bEnableWorldBoundsChecks to alter this behavior.

Gameplay

Upgrade Notes:

  • Enabled the Enhanced Input plugin by default.

    • Upon project startup, if you have not customized your UPlayerInput or UInputComponent classes in your project, they will automatically be set to the new Enhanced Input versions.

    • You can disable the automatic upgrade path by setting the console variable "EnhancedInput.bEnableAutoUpgrade" to false if desired.

    • Enhanced Input is fully backwards compatible with the old input system, so you can make your UPlayerInput and UInputComponent's based on the Enhanced Input equivalents and all old Action and Axis mappings will still work. This provides a solid upgrade path where you can upgrade your input code at your own pace, or just keep it and start using Enhanced Input for new features.

Level Design and Art Tools

Geometry Core

API Change:

  • Use volatile for INEXACT to force rounding.

Geometry Script

API Change:

  • Added an AggGeom to the dynamic mesh component to support the addition of the Async Physics build for Dynamic Mesh component. Collision update functions should update instead of the one on the current BodySetup. This ensures new collision changes are not overwritten by an async build replacing the BodySetup.

Upgrade Notes:

  • Update the CopyMeshToStaticMesh and CreateStaticMeshAsset Geometry scripting functions to use the standard engine FMeshNaniteSettings data structure to define Nanite settings instead of the previous custom structures/fields.

    • This is a breaking change, Blueprints that use the now-deprecated properties will need to be manually updated.

    • The previous NaniteProxyTrianglePercent values can be converted to the FMeshNaniteSettings Fallback Percent field by dividing the value by 100.

Modeling Tools

API Change:

  • This adjustment is designed to support tools where the selection type before the tool is activated is not compatible with the tool's function and requires conversion (for example vertices to triangles). The old behavior was also partially broken, where attempts to call a mode change on an inactive selection mechanic would result in the mode being changed transparently, but with no other processing taken, such as converting the active selection or sending undo changes.

Platform

Upgrade Notes:

  • Added a native async save API.

    • Any save game operations that are currently nested in AsyncTask calls or similar can be moved to use the new async save game API.

Mobile

Upgrade Notes:

  • Fixed issue where shader pipeline cache files could be incorrectly trimmed from the pak directory list.

Online

API Change:

  • AVEncoder no longer stores a width and height. These properties have been moved to the FVideoEncoderInput. This input is now the source of truth and both AMF and NVENC will adapt their resolution to the input resolution

  • Moved ECodec to public so the module can expose a method to select what codec the user would like to use.

  • Modified packaging of a PixelStreaming project so that ps-infra files are placed in a nicer location.

  • Renamed the encoders and their corresponding factories to better describe their purpose.

Upgrade Notes:

  • Fixed PixelStreamingAudioComponent that had delayed audio.

  • Fixed audio bitrate from Unreal Engine to browser that was set to a low default causing compressed audio quality in stream. The new default is now Opus maximum value of 510kb/s.

  • Fixed the Selective Forwarding Unit (SFU) not being added to the Pixel Streaming samples folder for a packaged project.

  • Fixed default max bitrate not being high enough to support 4k.

  • Fixed reconnections not autoplaying in the browser.

  • Refactored Pixel Streaming start-up logic to be a more uniform code path.

  • Refactored Pixel Streaming URL to use settings function like PixelStreamingIP and Port.

  • Fixed backwards compatibility break where offers from players would not result in a connection.

  • Fixed a deadlock scenario that could be triggered with rapid peer connects/disconnects.

  • Fixed a crash in WebRTC caused by not removing the audio sink when a peer disconnects.

  • Fixed streams being capped at 30fps by default.

  • Fixed incorrect WebRTC headers being included in the public header.

  • Frames now flow through a much more rigid set of operations to get streamed.

  • Video Sources have a Video Adapter and are fed by a Video Input.

  • Video Adapters are fed by the input and contain a number of Processes.

  • Processes take the input frame and adapt it to a format that the encoder can use.

  • Frame Buffers now contain a reference to the adapter, frame data is grabbed from here as needed by the encoder.

  • Adapters and their processes are public with the intention that users can implement their own adapt step for other encoders.

  • Streamer is now modular so we can have multiple streamers with their own inputs that stream to their own location.

  • Extracted out the copy texture into a rendering util and tweaked how it handles transitions.

  • Modify PixelStreamingModule to use new functions for creating a streamer.

  • Added optional codepaths to use WebRTC M96 or M84.

  • Refactored plugin to enable using our API for the new Pixel Streaming Player plugin.

  • Created a new PixelStreamingPeerConnection class to wrap the webrtc peer connection with specific pixel streaming behavior.

  • Made the signaling server connection public and renamed its observer methods so it is obvious when they are implemented.

  • Some small changes to frame buffers to make handling of cached data slightly safer.

  • Made use of lambdas more explicit where possible.

  • Remove unnecessary warning message from PixelStreamingAudioComponent.

Rendering

Architecture

Upgrade Notes:

  • Default to writing velocity in base pass instead of in depth pass. This is because we do not currently support nanite WPO with depth pass velocity (work to fix this is ongoing). To avoid any confusion or problems for licensees who are trying out the new nanite WPO, we default to this setting that works everywhere.

    • Licensees can locally set depth pass velocity if they are not using nanite WPO and want the potential performance improvement.

Postprocessing

Upgrade Notes:

  • Pixel shader animations no longer ghost.

  • Translucencies no longer ghost.

  • VFX no longer ghost.

Simulation

Physics

Upgrade Notes:

  • Geometry collection now allows import of collision from the static meshes they are generated from.

    • Existing geometry collection assets will need to be reset in the Fracture Editor to allow this feature to work.

    • Then the "Import Collision From Source" checkbox then needs to be checked to allow using them.

    • A "Collision" column mode in the Fracture Editor outliner has been added that will display if collisions are used, or are available or not.

  • Fracture Editor outliner can now display run-time damage information, including maximum damage, current threshold and if the piece broke or not.

    • In order to enable this feature, the component needs to have "Enable Run Time Data Collection" enabled.

    • Then, in the Fracture Editor, simply run the simulation then pause or stop and then refresh the Fracture Editor outliner in "Damage" column mode.

  • Size specific damage thresholds generation has been improved for geometry collections where bones can get assigned more predictable thresholds from the settings.

    • Existing assets will use the cluster only computability mode and will need to uncheck the "Per Cluster Only Damage Threshold" check box.

  • Added new interface to ChaosWheeledVehicleMovementComponent which enabled direct control over the drive and braking torque per wheel.

    • The new blueprint compatible functions are SetDriveTorque and SetBrakeTorque. They take two parameters, Torque specified in Newton Meters and a wheel index. The wheel index matches the wheel array in the wheeled vehicle movement component.

    • This has a few modes of operation allowing you to add to or completely override the torque at each wheel.

    • The new property ExternalTorqueCombineMethod on the wheel class ChaosVehicleWheel, has three states:

      • None [the default] - No external torque will be applied to the simulation when you call the above set torque functions.

      • Override - The external torque provided by the set torque functions will be used and any internal calculations for engine/ brakes will be ignored.

      • Additive - The external torque provided by the set torque functions will be added to any internal calculations from engine/ brakes.

    • This mode can also be changed at runtime via the blueprint compatible function SetTorqueCombineMethod.This is also defined per wheel.

    • There is no change to current behavior, the new feature is enabled by setting a new property (ExternalTorqueCombineMethod) which is defaulted to off.

  • Added brake and shock damage propagation options to geometry collection component (enabled by default). This allows finer tuning and more realistic breaks.

    • No upgrade needed, older assets will keep it disabled, only new assets will have it enabled by default.

  • In the Chaos Vehicle Plugin it was noted that the wheel forces were being applied to high up and not at the road surface.

    • Rectifying this means vehicle handling will change dramatically, likely requiring a lowering of the center of mass by approximately the wheel radius to get the same result.

    • To alleviate this issue a new property (bLegacyWheelFrictionPosition) has been added to retain the old behavior. This will automatically be enabled on any existing vehicles but will default to false on any new vehicles that are created.

    • To ensure all your vehicles are consistent on existing projects, ensure bLegacyWheelFrictionPosition property is enabled on the ChaosWheeledVehicleMovementComponent.

New:

  • Added a new connection graph method for geometry collection that filters overreaching connections by testing for bounds overlaps.

    • Because this method produces better quality connection graphs, it is recommended to use it when possible.

  • Added crumbling event for geometry collections that triggers whenever a cluster crumbling related function is called.

    • Crumbling event will only fire if Notify Crumbling is enabled on the corresponding geometry collection component.

UI

Upgrade Notes:

  • Added BP_OnPressed and BP_OnReleased blueprint-implementable events to CommonButtonBase of CommonUI for better control over visual states and animations.

UMG

New:

  • Calling Stop Animation is now an asynchronous operation.

    • This is currently enabled by default, but controllable through the UMG.AsyncAnimationControlFlow cvar (false disables this new flow).

    • When an animation would usually be ticked by the animation tick manager, it now schedules an update on Stop, and queues a latent action to finish stopping before it completes the operation.

    • Content that specifically relies upon Stop Animation being a synchronous call (that is, it relies upon animated values being immediately realized after Stop Animation has been called) should either disable UMG.AsyncAnimationControlFlow, or rework the content to respond to an OnAnimationStopped event (the latter being more preferable).