언리얼 엔진 5.1 출시 노트

언리얼 엔진 5.1의 새로운 기능과 업데이트된 기능을 살펴봅니다.

새로운 기능

언리얼 엔진 5.0에는 획기적인 수많은 새로운 툴이 도입되었습니다. 5.1은 이러한 5.0의 프레임워크를 기반으로 차세대 리얼타임 3D 콘텐츠 및 경험 제작 수준을 한층 높입니다. 에픽게임즈는 항상 다양한 산업의 요구 사항에 맞게 기능 세트를 더욱 강력하고, 워크플로에 친화적이며, 유연하게 만들기 위해 노력하고 있습니다.

시각적 무결성 및 퍼포먼스

차세대 콘솔 및 고성능 PC를 타깃으로 한 60fps 게임을 원활하게 제작하는 데 도움이 되는 다양한 기능이 향상되었습니다.

  • 나나이트, 루멘 및 버추얼 섀도 맵이 향상되었습니다.

더 큰 규모의 월드 빌드 및 협업

  • 월드 파티션을 사용하여 더 큰 규모의 월드를 생성할 수 있습니다.

  • 보다 효율적인 팀 작업을 위해 게임 개발 프로세스가 개선되었습니다.

버추얼 프로덕션 및 인카메라 VFX

에픽게임즈는 버추얼 프로덕션 및 인카메라 VFX(In-Camera VFX, ICVFX)에 활용할 수 있는 새로운 툴을 계속해서 빠르게 개발하고 있습니다. 이를 통해 영상으로 작업하는 것이 한층 쉬워졌습니다.

  • 인카메라 VFX 에디터를 사용하여 색을 보정하고, 라이트 카드를 적용하고, 전반적인 스테이지 작업을 수행할 수 있습니다.

  • DMX 환경설정이 MVR 지원으로 향상되었습니다.

  • nDisplay에 대한 루멘의 초기 구현이 제공됩니다.

  • GPULM 워크플로가 향상되었습니다.

이러한 툴에 대한 자세한 내용과 언리얼 엔진 5.1에서 향상된 기능의 전체 목록은 아래에 정리된 내용을 참고하세요.

이번 버전에는 GitHub의 언리얼 엔진 개발자 커뮤니티에서 제공한 개선 사항도 포함되어 있습니다. 언리얼 엔진 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)

렌더링

향상된 루멘

루멘은 이제 머티리얼의 서브서피스 컬러로 감쇠된 후면 라이팅을 수집하여 리프(leaf) 전체에 스캐터링함으로써 양면 폴리지 셰이딩 모델을 지원합니다.

Lumen Two-Sided Foliage Example 1

Lumen Two-Sided Foliage Example 2

또한 루멘의 소프트웨어 레이 트레이싱 은 폴리지의 과도한 오클루전을 수정하는 확률적 반투명 디스턴스 필드 레이 트레이싱을 통해 훨씬 정확한 폴리지 표현을 지원합니다.

루멘은 특히 카메라가 움직이지 않을 때 스페이셜 템포럴 블루 노이즈를 사용하여 보다 깔끔한 이미지 퀄리티를 구현합니다. 가장 뛰어난 퀄리티 향상은 높음 글로벌 일루미네이션 엔진 퀄리티 레벨을 사용 중인 경우에 확인할 수 있습니다. 루멘은 해당 엔진 퀄리티의 경우 차세대 콘솔에서 60fps로 동작하는 것을 목표로 하고 있습니다.

Cleaner global illumination with Spatiotemporal Blue Noise.

루멘의 소프트웨어 레이 트레이싱 은 이제 뭉개져 보이는 저해상도 복셀 표현 대신 표면 캐시를 직접 샘플링합니다. 이를 통해 작은 이미시브 표면 엘리먼트의 2차 바운스, 리플렉션 및 글로벌 일루미네이션이 향상됩니다.

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

프로젝트에서 고퀄리티 반투명 리플렉션(High Quality Translucency Reflections) 이 활성화된 경우 루멘 리플렉션은 반투명 표면 머티리얼의 가장 앞쪽 레이어에서 미러 리플렉션을 제공합니다.

Lumen high quality translucency reflections from translucent surface materials

루멘 리플렉션은 이제 단일 레이어 워터 를 지원합니다. 반사는 거울 반사로 강제됩니다.

Lumen Reflections on SingleLayerWater shading model.

이 출시 버전에서 루멘은 다음과 같은 기타 기능 및 향상된 사항을 제공합니다.

  • 하드웨어 레이 트레이싱 모드의 경우 리플렉션은 이제 표면 캐시에서 알파를 평가하여 더 빠른 알파 마스킹을 지원합니다.

  • 표면 캐시 생성 알고리즘은 이제 한층 강력해졌으며 작은 씬 엘리먼트를 위한 표면 캐시 등 보다 다양한 메시를 지원합니다.

  • 높음(High), 에픽(Epic), 시네마틱(Cinematic) 엔진 퀄리티 레벨에 추가 내부 세팅이 추가되어 퍼포먼스와 퀄리티 간의 균형을 더 잘 제어할 수 있게 되었습니다.

  • 포스트 프로세스 볼륨(Post Process Volume) 세팅의 스카이라이트 누수(Skylight Leaking) 기능은 실내 영역이 완전히 어두워지지 않도록 하는 비물리 기반 아트 디렉션 수단으로 사용할 수 있습니다.

  • 포스트 프로세스 볼륨 세팅에서 사용 가능한 디퓨즈 컬러 부스트(Diffuse Color Boost) 기능은 씬에서 반사광의 양을 늘립니다.

  • 루멘은 캡처 컴포넌트의 포스트 프로세스 볼륨 세팅에서 GI 및 리플렉션을 강제 활성화함으로써 씬 캡처를 선택적으로 지원합니다. 씬 캡처에서 실행될 때 표면 캐시 해상도는 기본적으로 디폴트 크기의 50%로 줄어들지만 이는 컴포넌트 세팅에서 오버라이드할 수 있습니다.

  • 루멘은 이제 nDisplay에서 다수의 뷰포트를 지원합니다. 각 뷰포트는 독립적인 루멘 씬을 사용합니다.

  • Vulkan하드웨어 레이 트레이싱 지원이 실험단계 기능으로 추가되었습니다.

    • 표면 캐시 리플렉션 라이팅만 포함하며 히트 라이팅은 아직 지원되지 않습니다.

  • 다수의 안정성 강화 및 버그 수정이 이뤄졌습니다.

자세한 내용은 루멘의 기술적 디테일을 참고하세요.

향상된 나나이트

나나이트는 5.1 버전에서 다음과 같은 기능이 추가되고 향상되었습니다.

  • 이제 다음 옵션을 사용하는 머티리얼을 지원합니다.

    • 양면

    • 마스크드 블렌드 모드

    • 월드 포지션 오프셋(베타)

      • 컬링 바운드는 아직 업데이트되지 않아 트라이앵글이 사용 중에 사라질 수 있습니다.

    • 픽셀 뎁스 오프셋

    • 이러한 기능의 예상되는 퍼포먼스 특징에 대한 자세한 내용은 나나이트 문서에서 찾을 수 있습니다.

  • 나나이트 폴리지 지오메트리 지원이 향상되었습니다.

    • 나나이트 스태틱 메시에 대한 새로운 영역 보존(Preserve Area) 옵션은 폴리지가 활성화된 경우 지오메트리가 먼 거리에서 사라지는 것을 방지합니다.

    • 이제 랜드스케이프 그래스 메시에서 나나이트를 활성화할 수 있습니다.

    • 나나이트 폴리지 퍼포먼스는 영향을 미치는 요인이 다양하며 콘텐츠 의존도가 매우 높은 복잡한 주제입니다. 자세한 내용은 나나이트 문서를 참고하세요.

  • 나나이트가 지원되는 플랫폼과 그렇지 않은 플랫폼에서의 제작에 대한 하이브리드 나나이트/비나나이트 워크플로 지원이 향상되었습니다.

    • 우클릭 메뉴 항목 레벨 오브 디테일(Level of Detail) > 고해상도(High Res) > 고해상도 임포트...(Import High Res...) 를 사용하여 콘텐츠 브라우저(Content Browser)에서 비나나이트 메시에 나나이트 표현을 추가할 수 있습니다. 이 워크플로를 사용하면 임포트 프로세스가 자동으로 나나이트 지오메트리에서 예비 메시를 생성하는 대신, 기존 메시 및 LOD 체인이 예비 메시가 됩니다.

    • 추가된 머티리얼의 Nanite Switch 표현식은 나나이트를 사용하여 렌더링할 때 특정 동작을 정의할 수 있게 지원합니다.

    • 나나이트 오버라이드 머티리얼(Nanite Override Material) 슬롯을 머티리얼 및 머티리얼 인스턴스에 추가했습니다. 이 슬롯이 설정된 경우 나나이트로 할당된 메시 렌더링은 레퍼런스된 머티리얼을 대신 사용합니다. 이 슬롯은 머티리얼 인스턴스에서 없음(None)으로 강제 디폴트 설정되어 부모 머티리얼에서 오버라이드된 세팅이 자손에서 자동으로 상속되지 않게 합니다.

    • 스태틱 메시 컴포넌트에는 이제 나나이트 허용 안 함(Disallow Nanite) 파라미터가 제공되어 나나이트와 비나나이트 액터의 조합을 동일한 메시 에셋에서 사용할 수 있게 되었습니다.

  • 나나이트가 활성화된 메시는 이제 숨겨진 섀도(Hidden Shadow) 플래그를 지원합니다. 이를 통해 커스텀 섀도 프록시 메시를 나나이트로 만들어 버추얼 섀도 맵의 퍼포먼스를 향상할 수 있습니다.

  • 나나이트로 드로되는 인스턴스드 스태틱 메시 컴포넌트는 이제 거리 기반 컬링 세팅을 따릅니다.

  • (실험단계) 랜드스케이프는 이제 나나이트를 사용하여 렌더링되도록 변환할 수 있습니다.

  • (실험단계) r.RayTracing.Nanite.Mode=1 세팅으로 레이 트레이싱 및 패스 트레이싱에 네이티브 나나이트 메시 초기 지원을 활성화할 수 있습니다. 이 접근법은 상대 오차가 0인 예비 메시보다 훨씬 적은 GPU 메모리를 사용하면서도 모든 디테일을 보존할 수 있게 지원합니다. 초기 테스트 결과, 저퀄리티 예비 메시 대비 5~20%의 퍼포먼스 비용이 드는 것으로 나타났지만 결과는 콘텐츠에 따라 다를 수 있습니다.

  • 다수의 기타 퀄리티 및 퍼포먼스 향상

언리얼 5.1부터 나나이트는 셰이더 모델 6에서 DirectX 12를 활성화해야 합니다. Vulkan은 세팅을 변경하지 않아도 됩니다.

자세한 내용은 나나이트 가상화 지오메트리를 참고하세요.

템포럴 슈퍼 해상도 향상

템포럴 슈퍼 해상도는 이번 버전에서 다양한 부분이 향상되었습니다.

  • 애니메이팅된 머티리얼의 안티 에일리어싱 향상

  • 반투명 지오메트리 또는 부정확한 모션 벡터가 있는 지오메트리에서 퀄리티 향상 및 고스팅 현상 감소

  • 안티 에일리어싱 퀄리티 향상 및 고스팅 현상 감소로 픽셀 깜빡임 및 모아레현상 탐지 향상

  • 60fps 타깃의 퍼포먼스 최적화

자세한 내용은 아래 안티 에일리어싱 및 업스케일링 섹션을 참고하세요.

패스 트레이서 향상

패스 트레이서는 이 출시 버전에서 다음과 같은 기능 및 향상된 사항을 포함합니다.

  • 다양한 엔진 기능 지원 추가:

    • 익스포넨셜 하이트 포그 및 스카이 애트머스피어

      • 익스포넨셜 하이트 포그 컴포넌트는 볼류메트릭 포그(Volumetric Fog) 활성화를 필요로 합니다. 로컬 라이트는 볼류메트릭 섀도를 캐스팅하지 않도록 디폴트 설정되었고 해당 세팅에서 활성화해야 하므로 디폴트 워크플로가 리얼타임 라이팅과 일치하게 됩니다.

      • 스카이 애트머스피어에서 레퍼런스 애트머스피어(Reference Atmosphere) 포스트 프로세싱 볼륨 세팅이 지원됩니다. 이 세팅이 활성화된 경우 볼류메트릭 클라우드는 아직 지원되지 않습니다.

    • 평면 데칼

    • 워터 지오메트리 및 단일 레이어 워터 셰이딩 모델

    • 인스턴스별 커스텀 데이터 및 인스턴스별 랜덤 머티리얼 표현식

    • 라이트 함수 지원이 추가되었습니다. r.PathTracing.LightFunctionsColor 를 활성화하면 패스 트레이서에 한해 컬러가 적용된 라이트 함수를 사용할 수 있습니다.

  • 보다 정확한 모션 블러를 얻기 위해 레퍼런스 모션 블러(Reference Motion Blur) 옵션을 무비 렌더 큐에 추가하여 더 높은 퍼포먼스 비용으로 더 부드러운 결과를 얻을 수 있습니다. 이 모드에서는 포스트 프로세스 벡터 블러가 적용되지 않으며, 모든 스페이셜 및 템포럴 샘플 누적 후에 디노이징이 적용됩니다. 퀄리티를 높이기 위해서는 더 높은 템포럴 샘플을 적용해야 합니다.

  • 멀티 GPU 렌더링(mGPU) 지원이 추가되었으며 SLI가 필요합니다. 활성화하려면 언리얼 에디터 명령줄에서 -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 라이트매스 향상

GPU 라이트매스는 이번 버전에서 다음과 같은 기능 및 향상된 사항을 포함합니다.

  • 다음과 같은 엔진 기능 지원 추가:

    • 스카이 애트머스피어

    • 스테이셔너리 스카이 라이트(벤트 노멀 포함)

    • 스테이셔너리 라이트를 위한 볼류메트릭 섀도

    • 스태틱 라이트의 컬러 적용 반투명 섀도

    • 스태틱 라이트를 위한 IES 프로파일

    • 라이트별 섀도 캐스팅 플래그

  • 복사도 캐시(Irradiance Cache) 및 1차 바운스 레이 가이딩(First Bounce Ray Guiding) 동작을 향상시켜 동일한 세팅으로 더 높은 퀄리티를 구현하게 했습니다.

  • Intel 디노이저 전후로 톤매핑 및 인버스 톤매핑 적용을 통해 낮은 라이트 레벨에서 디노이저 결과를 향상했습니다. 이에 따라 극단적인 다이내믹 레인지에서의 변색 문제가 완화되었습니다.

  • 볼류메트릭 라이트맵 렌더러에서 퀄리티, 퍼포먼스, GPU 메모리 사용량을 향상했습니다.

    • 전체 씬의 볼류메트릭 라이트맵 프로브를 모두 동시에 렌더링하는 대신 렌더러가 프로브를 일괄 처리합니다. 하지만 이로 인해 볼류메트릭 라이트맵의 인터랙티브 프리뷰가 중단됩니다.

    • 이 변경사항을 통해 원래 GPU 메모리의 1/4만으로도 볼류메트릭 라이트맵을 구울 수 있으며 프로브 배치가 향상되어 필요한 프로브가 약 25% 줄어들었습니다.

자세한 내용은 GPU 라이트매스를 참고하세요.

반투명 오버레이 머티리얼

이제 스태틱 및 스켈레탈 메시에 보조 오버레이 머티리얼을 할당할 수 있습니다. 따라서 이를 통해 메시를 복제하지 않고도 특정 비주얼 이펙트를 구현할 수 있습니다. 메시는 두 번 렌더링 되며 한 번은 베이스 머티리얼을 사용하여 렌더링되고 또 한 번은 반투명 오버레이 머티리얼을 사용하여 렌더링됩니다. 머티리얼 슬롯 수와 무관하게 메시당 오버레이 머티리얼은 하나뿐이므로 한 패스에서 셰이딩 이펙트는 전체 메시에 적용됩니다.

Translucent Overlay Material Slot in Material Details panel.

온디맨드 셰이더 컴파일

온디맨드 셰이더 컴파일(On-Demand Shader Compilation, ODSC)은 쿡 온 더 플라이를 사용하여 반복적인 플랫폼 개발 도중에 에디터에서 화면에 보이는 것을 렌더링하는 데 필요한 셰이더만 컴파일합니다. ODSC는 정기적으로 빌드를 동기화하고 컴파일할 셰이더가 많은 경우, 머티리얼 및 셰이더를 자주 반복작업하는 경우, 캐시된 셰이더를 위한 원격 DCC에 액세스할 수 없는 경우에 컴파일해야 하는 셰이더의 수를 대폭 줄여줍니다.

ODSC는 기본적으로 활성화되며 CVar r.ShaderCompiler.JobCacheDDC 로 제어할 수 있습니다.

ODSC는 다수의 셰이더를 정기적으로 컴파일하는 대규모 프로젝트의 작업 대부분에서 셰이더 컴파일을 줄일 수 있지만, 현재 초기 에디터 스타트업 도중 컴파일되는 글로벌 셰이더의 수를 줄여주지는 않습니다.

DX12 PSO 컴파일 향상

UE 5.1은 오브젝트가 렌더링되는 시점이 아니라 컴포넌트가 로드될 때 PSO 컴파일을 먼저 시작하여 셰이더 컴파일에 의해 유발되는 스톨을 줄입니다. 이는 시간이 많이 걸리고 완벽한 결과를 보장할 수 없는 PSO 캐시를 수동으로 수집해야 하는 필요성을 줄이거나 해소합니다.

오브젝트를 로드한 직후 렌더링해야 하는 경우 여전히 스톨이 발생할 수 있습니다. 멀리 있는 오브젝트를 백그라운드 스트리밍하는 경우, 오브젝트 드로를 딜레이하는 대신 스톨을 줄일 수 있도록 PSO가 준비될 때까지 메시 렌더링을 건너뛰는 옵션을 추가했습니다. 이와 유사하게 타이틀이 카메라를 완전히 새로운 위치로 텔레포트시켜야 하거나 다른 방식으로 새 머티리얼 다수를 한꺼번에 표시해야 하는 경우 모든 PSO를 컴파일할 시간이 부족하게 됩니다. 이 경우 머티리얼 및 메시를 더 일찍 로드하고 렌더러에 미리 드로하도록 게임 코드를 작성해야 합니다.

기존 PSO 캐시 시스템은 여전히 새 시스템과 함께 작동할 수 있습니다. 항상 필요하거나 텔레포트 이벤트 이후에 사용할 머티리얼을 포함하는 수동으로 생성된 작은 PSO 캐시를 준비해 두고 자동 시스템이 나머지 머티리얼 대부분을 처리하게 하는 하이브리드 접근법을 고려하는 것도 가능합니다.

이 시스템은 현재 개발 중이며 향후 엔진 출시 버전에서 퍼포먼스가 향상될 예정입니다. 또한 Vulkan 같은 다른 RHI도 지원하도록 확장될 것입니다.

스트라타 머티리얼(실험단계)

스트라타 는 디폴트 릿, 클리어 코트 등 고정된 셰이딩 모델 세트를 보다 표현력이 뛰어난 모듈형 프레임워크로 대체하는 새로운 머티리얼 제작 방식입니다. 이 프레임워크는 작업 시 더 폭 넓은 표면의 표현 및 파라미터 조절 범위를 제공합니다. 스트라타 머티리얼의 퍼포먼스는 프로젝트의 복잡성과 원하는 예산에 따라 조절할 수 있으며 레거시 머티리얼의 비용은 이전과 비슷합니다.

Strata material sphere example.

프로젝트 세팅(Project Settings)엔진(Engine) > 렌더링(Rendering) > 스트라타(Strata) 에서 스트라타를 활성화할 수 있습니다.

실험단계 상태인 스트라타에 대한 자세한 내용은 에픽 디벨로퍼 커뮤니티 포럼 페이지를 참고하세요.

텍스처 및 텍스처 에셋 에디터 향상

텍스처 및 텍스처 에셋 에디터는 이 출시 버전에서 다음과 같은 향상된 사항을 포함합니다.

  • 이제 텍스처를 32비트 플로트 단일 채널과 4채널 포맷인 R32FRGBA32F 로 임포트할 수 있습니다. 하위 호환성을 위해 이러한 옵션은 옵트-인 방식으로 제공되며 디스크의 소스 파일이 32비트 플로트 포맷을 사용하더라도 수동으로 활성화해야 합니다. (스카이라이트는 현재 지정된 큐브맵(Specified Cubemap) 을 16비트 플로트로 범위 제한하므로 최대 픽셀 값은 65,504로 제한됩니다. 이는 엔진의 향후 버전에서 해결될 예정입니다.)

Texture Compression Settings options.

  • 이제 2제곱 크기가 아닌 텍스처가 밉맵을 가질 수 있습니다. 텍스처가 압축 가능하려면 각 크기는 여전히 4의 배수여야 합니다. 이는 콘텐츠를 원본 종횡비로 저장하고 애니소트로픽 필터링 등의 기능을 향상하는 데 유용하지만 플랫폼에 따라 항상 다음 2제곱 크기에 상대적으로 메모리를 절감해 주지는 않습니다.

  • 슬라이스와 체크박스로 표시되는 텍스처 2D 배열을 위한 툴바 옵션이 추가되었습니다.

  • 3D 뷰 로 표시되는 큐브맵 HDR 텍스처를 위한 툴바 옵션이 추가되었습니다.

  • 씬 캡처 컴포넌트에서 사용된 렌더 타깃을 볼 때 디테일(Detail) 패널은 이제 씬 캡처의 총 GPU 메모리 사용량 및 이와 관련된 모든 텍스처를 표시합니다. 캡처에서 루멘이 활성화된 경우 루멘 씬도 포함됩니다.

루멘 꺼짐:

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

루멘 켜짐:

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

PC의 새 프로젝트 디폴트: 셰이더 모델 6을 사용하는 DirectX 12

PC에서 언리얼 엔진 5용으로 새롭게 생성된 모든 프로젝트는 이제 기본적으로 셰이더 모델 6(SM6)이 활성화된 DirectX 12를 사용합니다. DX12는 CPU 타임, GPU 타임, 메모리 사용량과 관련된 모든 부분에서 보다 효율성을 높이며 레이 트레이싱 같은 새로운 기능을 지원합니다.

향후에도 나나이트 및 버추얼 섀도 맵에서는 SM6을 사용하는 DX12가 필요합니다.

이미 DirectX 12를 사용 중인 프로젝트의 경우 프로젝트 세팅 에서 플랫폼(Platforms) > Windows > D3D12 타기팅된 셰이더 포맷(D3D12 Targeted Shader Formats)SM6 체크박스를 통해 SM6를 활성화할 수 있습니다.

PC에서 DX12를 사용하는 경우 언리얼 엔진은 활성화된 각 셰이더 모델을 내림차순으로 사용하려고 시도합니다. 따라서 SM5와 SM6이 모두 활성화된 경우 먼저 SM6을 시도하고, 머신에서 지원되지 않는 경우 SM5로 예비 전환됩니다. 활성화된 셰이더 모델 중 사용 가능한 것이 없는 경우에는 프로젝트 세팅에서 비활성화되어 있지 않은 한 DX11 SM5로 예비 전환됩니다. 이 로직은 RHI 또는 셰이더 모델이 명령줄을 통해 -dx12, -dx11, -sm5, -sm6 등의 플래그를 사용하여 강제되는 경우 적용되지 않습니다. 이 경우 엔진은 강제된 구성이 지원되지 않으면 종료됩니다.

SM6 중간 언어의 차이로 인해 머티리얼 에디터(Material Editor)에 있는 플랫폼 통계(Platform Stats) 섹션의 셰이더 인스트럭션 수는 SM6와 SM5 간에 비교할 수 있습니다. SM6 인스트럭션 수는 같은 수준의 복잡도에서 더 높게 나타납니다. SM6 인스트럭션 수는 다른 SM6 컴파일 머티리얼과만 비교할 수 있습니다.

아나모픽 뎁스 오브 필드 및 카메라 크롭(실험단계)

뎁스 오브 필드가 이제 수직으로 스트레치된 보케 모양의 아나모픽 렌즈를 지원합니다. 아나모픽 보케는 프로젝트를 지원하는 완전한 커스텀 텍스처가 없는 경우에도 퍼포먼스 옵션을 제공합니다. 또한 카메라 뷰를 일반적으로 사용되는 종횡비 또는 커스텀 종횡비로 크롭할 수 있습니다.

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

아나모픽 보케 세팅은 시네 카메라(Cine Camera)포스트 프로세스 볼륨(Post Process Volume) 세팅내에 스퀴즈 인수(Squeeze Factor) 세팅을 사용하는 렌즈 세팅(Lens Settings) 아래에서 찾을 수 있습니다.

카메라 종횡비를 크롭하는 세팅은 크롭 세팅(Crop Settings) 아래의 시네 카메라(Cine Camera) 에서 찾을 수 있습니다. 일반적인 종횡비를 선택하거나 크롭된 종횡비(Cropped Aspect Ratio) 를 사용하여 지정하세요.

자세한 내용은 시네마틱 뎁스 오브 필드를 참고하세요.

머티리얼 에디터 인라인 편집

머티리얼 그래프(Material Graph)의 노드에서 상수 값 및 프로퍼티를 직접 인라인으로 편집할 수 있도록 80개 이상의 머티리얼 표현식 을 개편했습니다. 이제 많은 경우에 디테일 패널에서 노드를 선택하여 값을 편집하지 않아도 되므로 머티리얼 편집 워크플로의 편의성이 대폭 향상되었습니다.

라이트 믹서(베타)

라이트 믹서(Light Mixer) 는 빠른 확인 및 편집을 위해 씬의 모든 라이트를 간결한 표 형태로 표시하는 새 에디터 창입니다. 인바이런먼트 라이트 믹서가 씬 인바이런먼트 라이팅 컴포넌트를 포함하는 방식과 유사합니다.

Light Mixer

라이트 믹서의 기능:

  • 라이트 믹서에서 라이트를 직접 생성하고 계층관계를 재설정합니다.

  • 폴더 내 계층형 컨텍스트 또는 폴더 없는 단일 계층 목록으로 라이트를 표시합니다.

  • 선택된 모든 라이트에서 동일한 필드를 동시에 편집합니다.

  • 선택한 라이트 서브셋을 사용하여 컬렉션 탭을 여러 개 엽니다.

  • 단일 라이트를 솔로(Solo) 버튼으로 단독 표시하고 나머지 모든 라이트의 에디터 비저빌리티를 끕니다.

  • 선택 동기화(Sync Selection) 를 활성화/비활성화하여 뷰포트와 월드 아웃라이너(World Outliner)에서 동일한 라이트를 자동으로 선택합니다.

  • 편집을 위해 어떤 라이팅 프로퍼티를 표시할지 커스터마이징합니다.

  • 블루프린트에 포함된 다수의 라이트 컴포넌트를 표시합니다.

버추얼 섀도 맵: 디스턴트 라이트 모드

버추얼 섀도 맵(Virtual Shadow Maps) 은 먼 거리에서 렌더링되는 여러 로컬 라이트를 가진 씬의 효율성을 향상합니다. 콘솔 명령어 r.Shadow.Virtual.DistantLightMode 로 활성화할 수 있습니다.

버추얼 섀도 맵을 사용하려면 이제 프로젝트 세팅 에서 셰이더 모델 6(SM6)을 사용하는 DirectX 12(DirectX 12 with Shader Model 6(SM6))를 활성화해야 합니다. SM6는 플랫폼 > Windows > D3D12 타기팅된 셰이더 포맷 에서 활성화할 수 있습니다.

하드웨어 레이 트레이싱 Windows 10 버전 요구 사항

하드웨어 레이 트레이싱 은 이제 나나이트 및 버추얼 섀도 맵과 동일하게 최소 Windows 10 버전이 필요합니다. 자세한 내용은 하드웨어 및 소프트웨어 사양 페이지를 참고하세요. 레이 트레이싱 셰이더는 이전과 같이 SM5 또는 SM6 D3D12 셰이더 포맷을 타기팅할 때 컴파일됩니다.

월드 빌딩

월드 파티션 데이터 레이어 향상

데이터 레이어(Data Layer) 는 에디터 및 런타임에 데이터 레이어를 토글하여 조건에 따라 월드 데이터를 로드 및 언로드하도록 디자인된 시스템입니다. 데이터 레이어는 에디터에서 월드를 조직화하여 게임 내 다양한 시나리오를 관리하고 동일한 월드의 베리에이션을 생성하는 데 매우 유용합니다.

The new Data Layers panel

이번 버전에 도입된 데이터 레이어 시스템의 향상된 사항은 다음과 같습니다.

  • 데이터 레이어 기능이 이제 다음과 같은 두 구성 요소로 나뉩니다.

    • 여러 월드에 유용한 데이터를 저장하는 데이터 레이어 에셋(Data Layer Assets)

    • 데이터 레이어 에셋을 레퍼런스하며 특정 월드 전용인 데이터 레이어 인스턴스(Data Layer Instances)

  • 데이터 레이어 아웃라이너(Data Layer Outliner) 편의성 향상

  • 레벨 인스턴스(Level Instance) 지원 : 레벨 인스턴스 내 액터는 이제 월드 내 데이터 레이어를 레퍼런스할 수 있습니다.

자세한 내용은 월드 파티션 - 데이터 레이어 문서를 참고하세요.

워터 바디 액터에 HLOD 지원

언리얼 엔진의 워터 시스템(Water System) 렌더링 및 메시 툴세트는 레벨에 다양한 워터 바디 액터(Water Body Actor) 타입을 추가하여 물을 표현할 수 있게 해줍니다.

Water HLOD Settings

이번 버전에서 언리얼 엔진의 계층형 레벨 오브 디테일(Hierarchical Level of Detail, HLOD) 시스템 은 이제 워터 바디 액터를 완벽하게 지원합니다. 각 액터는 HLOD 레이어 에 할당할 수 있으며 프로젝트의 필요에 맞게 커스터마이징 가능한 다양한 HLOD 세팅을 갖추고 있습니다.

워터 시스템에 대한 자세한 내용은 워터 시스템 문서를 참고하세요.

계층형 레벨 오브 디테일 시스템에 대한 자세한 내용은 계층형 레벨 오브 디테일월드 파티션 - 계층형 레벨 오브 디테일 문서를 참고하세요.

액터 에디터 컨텍스트

언리얼 엔진 5.1 출시와 함께 에디터는 이제 3D 뷰포트 오른쪽 하단에 액터 에디터 컨텍스트를 표시합니다.

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

이 작은 박스는 현재 선택된 서브레벨, 월드 파티션 데이터 레이어, 레벨 인스턴스 또는 현재 활성 아웃라이너 액터 폴더를 표시합니다. 월드에 배치된 액터는 자동으로 현재 액터 에디터 컨텍스트 에 추가됩니다.

소스 컨트롤의 컨트롤되지 않은 체인지리스트 지원

언리얼 엔진의 소스 컨트롤(Source Control) 시스템은 버전 관리를 통해 에셋 및 코드 파일 공유를 촉진하여 개발 팀 간의 긴밀한 협업을 지원합니다. 또한 이를 위해 프로젝트의 파일 백업 및 변경사항에 대한 히스토리를 제공합니다.

Uncontrolled changelist support in source control

소스 컨트롤은 액터당 한 개의 파일과 긴밀하게 작동하며 이를 월드 파티션 워크플로에서 중요하게 활용합니다.

언리얼 엔진 5.1 버전의 소스 컨트롤은 여러 부문에서 편의성이 향상되었으며, 이제 컨트롤되지 않은 체인지리스트(Uncontrolled Changelists) 를 사용할 수 있습니다. 이 기능은 프로젝트에서 쓰기 가능한 모든 파일을 트래킹하고 모든 로컬 변경사항을 목록으로 제공합니다.

  • 변경사항은 다수의 컨트롤되지 않은 체인지리스트에서 트래킹될 수 있습니다.

  • 언제든지 파일을 개별적으로 컨트롤되는 체인지리스트로 옮기거나 되돌릴 수 있습니다.

  • 테스트 및 디버깅을 위해 배타적 체크아웃 잠금을 방지하여 파일 경합을 줄여줍니다.

컨트롤되지 않은 체인지리스트는 언리얼 엔진 5.1에서 기본적으로 활성화됩니다.

언리얼 엔진 내 소스 컨트롤에 대한 자세한 내용은 언리얼 에디터 안에서의 소스 컨트롤 문서를 참고하세요.

월드 파티션을 위한 대규모 월드 좌표 지원(베타)

언리얼 엔진 5는 배정밀도 데이터 베리언트 타입을 지원하는 대규모 월드 좌표(Large World Coordinates, LWC) 를 도입했습니다. 5.1 출시 버전에서 이 시스템은 월드 파티션을 지원하도록 확장되었습니다.

대규모 월드 좌표 월드 최대치 증가

이 출시 버전에서는 디폴트 월드 규모를 22km에서 88,000,000km로 늘려서 훨씬 큰 규모의 월드를 생성하도록 지원합니다.

대규모 월드 좌표에 대한 자세한 내용은 대규모 월드 좌표 문서를 참고하세요.

버추얼 프로덕션

인카메라 VFX 에디터

가장 흔히 사용되는 ICVFX 스테이지 작업 컨트롤을 하나의 정리된 UI로 모으기 위해 전용 스테이지 오퍼레이터 패널을 추가했습니다. 효율적인 스테이지 작업을 위해 이제 nDisplay 조정, 색 보정 및 라이트 카드가 한 곳에 표시됩니다.

VP In-Vamera VFX Editor

향상된 라이트 카드 시스템

LED 월에 표현될 때 디자인된 셰이프를 유지시켜 주는 UV 프로젝션 로직을 사용하도록 라이트 카드 가 향상되었습니다. 또한 라이트 카드 제작, 편집, 배치를 위한 UI를 이 크리에이티브 라이팅 작업과 관련된 컨트롤만 나타내도록 간소화되었습니다.

향상된 ICVFX 색 보정 컨트롤

ICVFX 프로덕션의 색 보정 워크플로가 확장되었습니다. 색 보정 영역은 3D로 작동하며 파워 윈도우로서 2D 셰이프와 결합하거나 함께 사용할 수 있습니다. 이는 뷰포트별 컬러 보정에 추가되는 기능입니다. 이제 색 보정 영역/창에서 원하는 컬러 그레이딩 이펙트를 특정 액터들의 픽셀들로 제한할 수 있습니다.

미디어 플레이트

VP Media Plate Actor

지금까지 씬에서 미디어를 스트리밍하려면 블루프린트를 통해 엘리먼트를 수동으로 함께 매핑해야 했습니다. 이제 모든 기반 연결을 처리하는 미디어 플레이트 액터 엘리먼트를 씬에 직접 추가할 수 있습니다. 미디어 플레이트는 가장 높은 퀄리티의 최대 해상도 및 컬러 뎁스 이미지 시퀀스를 위해 EXR 타일링과 밉을 사용합니다. 사전 제작된 구체 및 사각형 셰이프를 미디어 플레이트에서 사용하면 언리얼 엔진은 현재 카메라에서 보이는 픽셀만 스트리밍하여 스트리밍 예산을 줄입니다. 이는 렌더 노트에서의 로드를 분산하고 PC별 대역폭 제약을 향상합니다.

새 비디오 아키텍처는 다음과 같은 이점을 제공합니다.

  • 대폭 간소화된 비디오 임포트 프로세스

  • 미디어 플레이리스트 지원

  • 권장 에셋 및 액터 모두를 위한 드래그 앤 드롭 지원

  • 업데이트된 정보 및 프리뷰 창

  • 시퀀서 통합

  • 퍼포먼스 향상을 위한 뷰 프러스텀 컬링

  • 미디어 플레이어 및 텍스처 매니저

EXR 플레이트 퍼포먼스

VP EXR plate performance

압축되지 않은 EXR은 최상 퀄리티의 비디오 영상을 제공하며 스토리지 디바이스의 속도가 적절한 경우 가장 빠른 처리 성능을 보여줍니다. 압축되지 않은 EXR을 사전 처리하고 타일 및 밉맵 레벨 세트로 분리하기 위해 새 시스템을 추가했습니다. 미디어 플레이트 액터 워크플로를 사용하면 nDisplay 시스템을 사용하여 렌더링되든 단독으로 렌더링되든 올바른 밉 레벨과 함께 뷰포트에 표시되는 타일만 스트리밍 및 렌더링함으로써 적절하게 최적화된 EXR이 시스템을 통해 가장 효율적으로 재생되도록 할 수 있습니다.

ICVFX용 루멘(실험단계)

루멘은 이제 nDisplay에서 다수의 뷰포트를 지원하며 ICVFX에서 사용할 수 있습니다. 각 뷰포트는 독립적인 루멘 씬을 사용하여 LED 볼륨에서 아티팩트를 제거합니다. 루멘뿐 아니라 버추얼 섀도 맵 또한 nDisplay에서 다수의 뷰포트를 지원하며 동일한 메커니즘을 통해 ICVFX를 지원합니다.

시네 카메라 근거리 클리핑

시네 카메라는 이제 카메라별 커스텀 근거리 클리핑 평면 을 갖습니다.

버추얼 카메라

버추얼 카메라의 출력은 이제 WebRTC 픽셀 스트리밍을 지원하여 보다 안정적이고 퍼포먼스가 뛰어난 스트리밍 옵션을 제공합니다. 이는 라이브 링크 VCam 앱과 기타 모든 웹 브라우저에서 볼 수 있습니다. 또한 버추얼 카메라는 이제 에디터에서 향상된 입력을 지원하므로 지원되는 모든 하드웨어 디바이스에서 리매핑 가능한 VCam 컨트롤을 허용합니다. 이 변경사항은 VirtualCamera2Actor를 대체하는 새 VCamActor에서 기본적으로 활성화되며, 디폴트 오퍼레이터 HUD는 라이브 액션 카메라 같은 느낌과 깔끔한 프레임 이미지에 중점을 두고 새롭게 디자인되었습니다.

또한 버추얼 카메라 UI 및 UX가 향상되었습니다.

Virtual Camera UI improvements

버추얼 스카우팅 향상

버추얼 스카우팅 은 이제 OpenXR 및 향상된 입력 시스템과 함께 작동합니다.

라이브 링크 페이스 CSV 임포터 플러그인

라이브 링크 페이스 iOS 앱을 사용하여 언리얼 엔진에 연결하거나 테이크 레코더에서 녹화하지 않고 디바이스에서만 페이스 캡처를 녹화하는 경우 이제 (백업) 녹화를 추출하여 임포트할 수 있습니다. 디바이스는 원시 타임코드 및 블렌드 셰이프 데이터가 포함된 .csv 파일을 저장합니다. 이 파일을 임포트하면 라이브 링크 트랙을 갖춘 레벨 시퀀스를 얻을 수 있습니다. 이는 테이크 레코더에서 라이브 스트림을 녹화하여 구현할 수 있는 결과와 같습니다.

멀티 유저 서버 UI

5.1에서는 서버의 실행 상태를 라이브로 검사하는 UI를 멀티 유저 서버에 추가했습니다. 이를 통해 오퍼레이터와 ICVFX 스테이지 매니저는 멀티 유저 서버 운영 도중 문제를 검사, 모니터링, 진단할 수 있습니다. 이는 콘솔 명령어로 연결 정보 스트림만 제공하고 실행 중인 서버 운영에 대한 컨텍스트 정보는 제공하지 않았던 콘솔 서버와 비교할 때 이점을 갖습니다.

헤드리스 컴퓨터 또는 UI 실행이 불가능한 컴퓨터에서는 계속 콘솔 서버를 사용할 수 있습니다. 예를 들어 Linux 서버 또는 컨테이너화된 운영이 이에 해당됩니다.

무비 렌더 큐

향상된 텍스처 처리

무비 렌더 큐(Movie Render Queue, MRQ)가 텍스처 스트리밍을 처리하는 방식이 몇 가지 향상되었습니다. 텍스처 스트리밍(Texture Streaming) 이 활성화된 경우 로드되는 부정확한 밉맵에 대한 처리가 향상되었습니다. 텍스처 스트리밍은 MRQ에서 여전히 기본적으로 비활성화되지만 대규모 프로젝트에서 메모리 절감을 위해 활성화할 수 있습니다.

시네마틱 프리스트리밍

이제 프리스트리밍 레코더를 사용하여 버추얼 텍스처 및 나나이트 시네마틱 캐시를 생성할 수 있습니다. 이 플러그인은 시네마틱 프리스트리밍 시스템이 해석할 캐시를 빌드하는 렌더 패스로 사용됩니다. 캐시가 빌드되면 해당 캐시를 시퀀스에서 레퍼런스하여 나나이트 및 버추얼 텍스처 데이터 스트림을 시네마틱에서 보다 안정적으로 만들 수 있습니다.

cinematic prestreaming track

카메라 향상

새 카메라 관련 기능이 무비 렌더 큐에 추가되었습니다. 이제 MRQ 작업을 실행하기에 앞서 모든 카메라 렌더링(Render all Cameras) 을 활성화하여 동일한 샷에서 여러 카메라 앵글로 렌더링할 수 있습니다.

또한 직교 카메라가 지원되어 비원근 카메라를 사용한 시퀀스 렌더링이 가능해졌습니다. 현재 패스 트레이서가 이 옵션에서 유일하게 지원되는 렌더 패스입니다.

런타임 API 향상

프로젝트 배포에서 MRQ를 사용하는 복잡성을 크게 줄이도록 무비 렌더 큐 API를 간소화했습니다. 이제 서브시스템에서 새 작업을 요청하고, 환경설정을 설정하고, 서브시스템에 작업을 렌더링하도록 지시할 수 있습니다. 이제 큐를 사용하거나, 수동으로 실행 툴을 환경설정하거나, 렌더링할 월드 및 레벨 시퀀스 작업에서 기본 세팅을 소프트 패스로 구성하지 않아도 됩니다.

nDisplay

nDisplay SMPTE 2110 support

nDisplay 미디어 I/O 매핑 시스템(실험단계)

ICVFX 카메라, nDisplay 뷰포트, 애플리케이션 창 백버퍼에 임의의 시간 동기 픽셀 소스 및 대상을 지정할 수 있도록 워크플로를 향상했습니다. 즉, 네이티브 UE 3D 씬 렌더에 더하여 이제 SMPTE 2110 같은 IP 비디오 소스, 미디어 텍스처, 라이브로 생성된 데이터를 하드웨어 캡처 디바이스에서 nDisplay 뷰포트로 등록할 수 있습니다.

SMPTE 2110 지원(실험단계)

SMPTE-2110 I/O(Rivermax 사용) 지원을 언리얼 엔진에 추가했습니다. nDisplay 렌더 노드는 새 미디어 I/O 매핑 시스템을 사용하여 SMPTE-2110을 지원하는 LED 월 프로세서로 직접 스트리밍할 수 있습니다. 또한 이는 각 내부 프러스텀이 전용 머신에 의해 렌더링될 수 있는 다른 nDisplay 시스템 하드웨어 환경설정을 허용합니다. 그런 다음 각 내부 프러스텀이 외부 프러스텀에서의 컴포짓을 위해 전체 이미지의 일부를 렌더링하는 각 머신에 공유할 수 있습니다. 이는 퍼포먼스와 카메라의 선형 확장성 및 보다 예측 가능한 콘텐츠 퍼포먼스를 향상합니다.

nDisplay에 대한 무비 렌더 큐 지원

이제 MRQ를 사용하여 nDisplay 뷰포트를 디스크에 렌더링할 수 있습니다. 새로운 세팅을 사용하면 환경설정 파일 및 원하는 뷰포트를 선택하여 네이티브 및 지정된 해상도로 렌더링할 수 있습니다.

nDisplay 빠른 로컬 런처

nDisplay가 활성화된 프로젝트를 이제 로컬로 빠르게 실행하여 디버깅하고 프로젝트를 클러스터 없이 PC에서 로컬로 테스트할 수 있습니다.

개발자 툴

디폴트 Visual Studio 버전

언리얼 빌드 툴(Unreal Build Tool, UBT) 은 이제 설치된 최신 Visual Studio 버전에 대한 Visual Studio 솔루션 파일을 생성합니다. 최신 버전을 지원하지 않는 플랫폼 SDK가 설치된 경우는 예외입니다. 이 경우에 UBT는 해당 플랫폼 SDK를 지원하는 Visual Studio 최신 버전의 Visual Studio 솔루션 파일을 생성합니다. 선호 컴파일러는 Visual Studio 2019입니다.

Clang 13 지원

이제 Linux 등 Clang 기반 플랫폼 컴파일 시 Clang 13이 요구됩니다.

스태틱 코드 분석

언리얼 빌드 툴 은 이제 여러 다양한 스태틱 코드 분석 툴(Static Code Analyzers) 실행을 지원합니다. 스태틱 코드 분석 툴은 다양한 알고리즘 및 기법을 사용하여 소스 코드를 분석하고 코드를 실행하지 않고도 버그를 찾을 수 있게 합니다.

지원되는 분석 툴은 다음과 같습니다.

  • 디폴트: 선택된 컴파일러에 대한 디폴트 스태틱 분석 툴을 사용합니다.

  • VisualCpp: 내장된 Visual C++ 스태틱 분석 툴을 사용합니다. Microsoft Visual C++(MSVC) 기반 플랫폼에서만 지원됩니다.

  • PVSStudio: PVS-Studio 스태틱 분석 툴을 사용합니다. MSVC 기반 플랫폼에서만 지원됩니다. 이 분석 툴의 경우 라이선스가 필요합니다. 자세한 내용은 PVS-Studio 사이트를 참고하세요.

  • Clang: Clang 스태틱 분석 툴을 사용합니다. MSVC 기반 플랫폼에서 컴파일러가 Clang을 사용하도록 강제합니다. 이 분석 툴은 베타입니다.

언리얼 빌드 툴을 사용하여 스태틱 코드 분석 툴을 실행하는 구문은 다음과 같습니다.

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

예를 들어 다음을 명령줄에 입력하여 Windows 64비트 시스템에서 언리얼 에디터를 타깃으로, 선택된 컴파일러에 디폴트 스태틱 코드 분석 툴을 실행할 수 있습니다.

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

자세한 내용은 지원되는 분석 툴 및 추가 명령줄 옵션에 대한 세부 사항이 포함된 스태틱 코드 분석 문서를 참고하세요.

C# 언리얼 헤더 툴

언리얼 헤더 툴(Unreal Header Tool, UHT) 은 C#을 사용하여 다시 작성되었으며 언리얼 빌드 툴과 직접 통합됩니다. 다시 작성한 목적은 다음과 같습니다.

  • 관리 가능성 향상

  • 빌드 시간 단축

  • 빌드 팜 시간 단축

  • 엔진 후크 제거

C++ 언리얼 헤더 툴은 이제 지원이 중단되었으며, 가능한 한 빠른 시일 내에 제거될 예정이지만 UE 5.2 이후가 될 것입니다..

C++ 언리얼 헤더 툴

C++ UHT를 언리얼 엔진에서 제거하기 전에 이를 아직 사용해야하는 이유 두 가지와 C++ UHT를 계속 사용하는 방법에 대한 정보는 다음과 같습니다.

  • 현재 C# 버전이 없는 UHT 스크립트 제너레이터 플러그인을 사용하는 경우

    • UBT가 프로젝트에서 스크립트 제너레이터 플러그인이 사용되는 것을 탐지하고 C# 버전이 플러그인에 존재하지 않는 경우 UBT는 자동으로 C++ UHT를 사용하도록 되돌립니다.

  • UHT에 로컬 변경사항이 있는 경우

    • 이 경우 UEBuildConfiguration 카테고리에서 bUseBuiltInUnrealHeaderTool = false 로 설정하여 C# UHT를 비활성화합니다.

어느 경우든 C++ UHT가 UE에서 제거되기 전에 C++ UHT 변경사항 및 스크립트 제너레이터 플러그인을 C#으로 이식하는 것이 중요합니다. C# UHT에 변경사항을 적용하려면 Engine/Source/Programs/Shared/EpicGames.UHT 에서 소스 코드를 찾을 수 있습니다.

C# 스크립트 제너레이터 플러그인

Engine/Plugins/ScriptPlugin/Source/ScriptGeneratorUbtPlugin 에서 샘플 C# 스크립트 제너레이터 플러그인을 제공합니다. 또한 모든 기존 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# 제너레이터 플러그인은 UE_5_1_OR_LATER 처럼 C# 소스 빌드에 사용 가능한 동일한 상수를 정의해 지원해야 합니다.

제공된 팩토리 오브젝트에는 UE 데이터 타입 익스포트에 필요한 컨텍스트가 포함되어 있습니다. 팩토리 오브젝트에는 UhtSession 이 포함되어 있습니다. 이 UhtSession 에는 UhtPackages 목록이 포함되어 있습니다. 헤더에 정의된 데이터 타입은 UhtHeaderFiles 에서 찾을 수 있으며, 이는 UhtPackages 에 있습니다.

C# UHT 모범 사례

  • 파일을 비동기 작업에서 익스포트하여 퍼포먼스를 향상합니다.

  • IUhtExportFactory.MakePathIUhtExportFactory.CommitOutput 메서드로 파일을 익스포트하여 내장된 변경사항 탐지, 레퍼런스, 유효성 검사 출력을 활용합니다.

  • BorrowStringBuilder 를 사용하여 캐시된 스트링 빌더를 사용합니다.

  • 임시 오브젝트 및 스트링은 가능한 한 피합니다.

  • IUhtSession.GoWide 프로퍼티를 디버깅에 사용하여 -nogowide 가 명령줄에서 지정되었는지 확인합니다. 있는 경우, 비동기 작업을 사용하여 출력을 생성하지 말고 익스포트 코드를 직접 호출합니다. 그러면 디버깅이 간소화됩니다.

오디오

메타사운드(베타)

MetaSounds Demo

성능이 뛰어난 그래프 기반 오디오 시스템인 메타사운드 의 몇 가지 요소가 5.1에서 향상되었습니다.

노드 라이브러리를 확장하여 피치 시프트, 그레인 딜레이, 리라우팅 등 새로운 함수 기능을 제공합니다. 또한 멀티채널 오디오 출력 지원을 추가하여 몰입형 서라운드 사운드 경험을 더 쉽게 생성하도록 지원합니다.

메타사운드에 관련된 자세한 내용은 메타사운드 문서를 참고하세요.

오디오 모듈레이션

오디오 모듈레이션(Audio Modulation) 플러그인이 베타 단계를 벗어나 메타사운드에 완전히 통합되었습니다. 이 기능은 오디오 파라미터 모듈레이션을 위한 일반적인 방법을 제공합니다. 이제 무엇이든 모듈레이션 소스 또는 대상으로 삼을 수 있습니다. 또한 자체 파라미터 그룹을 정의하고 원하는 대로 제어할 수도 있습니다.

오디오 게임플레이 볼륨(베타)

오디오 게임플레이 볼륨(Audio Gameplay Volumes)은 지오메트리에 기반하여 오디오를 관리 및 제어하게 해주는 새로운 반복작업 방식입니다. 레거시 오디오 볼륨 시스템을 대체하기 위해 디자인된 오디오 게임플레이 볼륨은 언리얼 오디오 엔진 기능 통합, 확장성, 더 긴밀한 게임플레이 통합, 무버블 및 다이내믹 트랜스포메이션을 위한 컴포넌트 기반 옵션을 제공합니다.

오디오 게임플레이 볼륨에 대한 자세한 내용은 오디오 게임플레이 볼륨 문서를 참고하세요.

사운드스케이프(베타)

사운드스케이프(Soundscape)는 바스락거리는 폴리지, 지저귀는 새, 북적이는 차량 등 월드에서 플레이어의 움직임에 따라 스트리밍되는 앰비언트 사운드를 프로시저럴하게 생성합니다. 활성화된 경우 플러그인이 이러한 사운드 시스템을 자율적으로 관리 및 구성하므로 수동으로 생성하지 않아도 됩니다.

웨이브폼 에디터(베타)

Waveform Editor Demo

웨이브폼 에디터(Waveform Editor)는 언리얼 에디터 내에서 사운드 웨이브를 보고 편집하게 해주는 새로운 툴입니다. 웨이브폼을 트림, 페이드 및 정규화하고 다른 웨이브폼을 더할 수 있습니다. 사운드 웨이브 메타데이터는 루프 영역, 큐 포인트 등을 지원하도록 변경될 수 있습니다. 이러한 수정 사항은 원본을 보존하기 위해 새 에셋으로 저장 가능합니다.

UMG/슬레이트 향상

UMG 뷰모델(베타)

뷰모델(Viewmodel) 플러그인은 디자이너가 위젯의 구조를 변경할 때 보다 간편하게 프로그래머와 독립적으로 작업할 수 있도록 해주는 프레임워크를 제공합니다.

이전에는 주로 다음과 같은 두 가지 방법을 사용하여 UMG에서 데이터를 위젯으로 전송 하였습니다.

  • 어트리뷰트 바인딩: 위젯이 값을 반환하는 프로퍼티 또는 블루프린트 함수에 해당 필드 값 중 하나(텍스트 필드 등)를 적용합니다. 이 구현 방법은 유연하고 사용하기에 간편하지만 프로퍼티가 실제로 변경되었는지와 무관하게 계속 위젯을 업데이트하기 때문에 퍼포먼스 문제가 있습니다.

  • 이벤트 기반 업데이트: 게임플레이가 UI를 수동으로 업데이트하는 함수를 호출하거나 UI가 이벤트 디스패처 또는 델리게이트를 기반으로 업데이트됩니다. 이 방법은 퍼포먼스는 뛰어나지만 UI의 변경사항을 반영하기 위해 수동으로 코드를 변경해야 합니다.

뷰모델 플러그인은 두 방법의 장점만 제공합니다. 이 플러그인을 활성화하면 뷰모델 을 생성하여 UI에서 사용되는 변수를 저장하고 위젯을 뷰모델의 프로퍼티에 바인딩할 수 있습니다.

The View Binding and Viewmodels windows

뷰모델은 UI에서 필요한 변수 세트의 사본을 저장하는 별도의 오브젝트입니다. 변수 중 하나를 변경해야 하는 경우 UI에서 직접 업데이트하지 않고 뷰모델 내에서 업데이트합니다. 그런 다음 뷰모델이 UI 내의 바인딩된 위젯에 값이 변경되었음을 알리고 업데이트를 푸시합니다. 따라서 콜백 및 업데이트 함수를 생성하는 번거로운 작업을 하지 않아도 되므로 데이터 기반 UI를 생성하는 프로세스를 간소화하고 UI 자체와 별개로 프로그래머에게 노출할 수 있습니다.

프로젝트에서 뷰모델을 사용하는 방법에 대한 자세한 내용은 뷰모델 문서를 참고하세요.

네임드 슬롯 위젯

Example of a Named Slot Widget

UE 5.1의 UMG에 네임드 슬롯 위젯(Named Slot Widgets) 이 도입되었습니다. 이 위젯은 템플릿 생성 시 다른 위젯을 위한 자리표시자 역할을 합니다. 일반적으로 UMG 위젯의 자손 클래스를 생성할 때 계층구조의 위젯은 숨겨져 있습니다.

네임드 슬롯은 계층구조에 표시되며 PreConstruct 이벤트에서 안전하게 채워질 수 있으므로 테스트 사용 사례에서 템플릿 위젯을 보다 쉽게 프리뷰할 수 있습니다. 또한 자손을 네임드 슬롯에 삽입할 때 부모 클래스를 기반으로 계층구조 및 렌더 순서 내의 위치가 보존됩니다.

UMG 툴 팔레트 플러그인(실험단계)

UMG Tool Palette

새로운 툴 팔레트(Tool Palette) 플러그인이 UE 5.1의 UMG에 추가되었습니다. 이 툴 팔레트는 일반적으로 사용되는 툴, 위젯, 인터랙션을 빠르게 액세스할 수 있게 해줍니다. 이 플러그인은 플러그인 메뉴에서 활성화하여 사용할 수 있습니다.

에디터

향상된 에셋 검색 및 필터링

아웃라이너(Outliner)레퍼런스 뷰어(Reference Viewer) 가 이제 에셋 필터링 을 지원합니다. 이 필터는 콘텐츠 브라우저의 필터와 동일하게 작동하며 고급 검색 구문 연산자를 지원합니다.

이제 에셋 검색을 아웃라이너, 콘텐츠 브라우저 및 레퍼런스 뷰어에서 커스텀 필터로 저장할 수 있습니다. 커스텀 필터를 저장한 후에는 이를 생성한 사용자가 모든 스트림 및 프로젝트에서 해당 필터와 개별 필터 세팅을 사용할 수 있습니다.

콘텐츠 브라우저에서의 에셋 검색 및 필터링이 다음과 같이 향상되었습니다.

  • 검색 바는 가장 최근 검색의 히스토리를 보여줍니다.

  • 기본적으로 필터는 세로 열로 표시됩니다. 콘텐츠 브라우저의 세팅(Settings) 메뉴에서 신규(세로) 및 레거시(가로) 필터 레이아웃을 토글할 수 있습니다.

  • 필터(Filter) 드롭다운 메뉴는 최소 하나의 필터가 활성 상태일 때 배지를 표시합니다.

아웃라이너 향상

아웃라이너에서의 탐색을 향상하기 위해 이제 위아래로 스크롤할 때 헤더가 스택됩니다.

아웃라이너에서 헤더 스태킹

아웃라이너에서 액터를 보다 쉽게 찾을 수 있도록 다음 기능을 추가했습니다.

  • 레벨 뷰포트(Level Viewport)에서 액터를 선택할 때 아웃라이너가 항상 해당 액터로 스크롤되도록 환경설정할 수 있습니다. 이 옵션은 아웃라이너의 세팅 메뉴에서 항상 프레임 선택(Always Frame Selection) 을 토글하여 활성화할 수 있습니다.

  • 레벨 뷰포트에서 액터가 선택되어 있을 때 F 를 눌러 아웃라이너에서 해당 액터를 하이라이트합니다.

  • 현재 선택된 액터의 부모 항목은 현재 선택이 접혀져 있더라도 하이라이트됩니다.

이제 최대 4개의 아웃라이너 인스턴스를 유지하고 각 인스턴스를 개별적으로 커스터마이징할 수 있습니다.

아웃라이너에서 어떤 열을 표시할지 선택할 수 있습니다. 열 헤더를 우클릭하고 열 이름을 클릭하여 표시 여부를 토글합니다.

레퍼런스 뷰어 툴 재디자인

더 많은 수의 에셋 레퍼런스와 더 상세한 레퍼런스 그래프를 지원할 수 있도록 레퍼런스 뷰어(Reference Viewer) 툴이 재디자인되었습니다. 레퍼런스 검색은 이제 검색 깊이 50, 검색 너비 1000 에셋 레벨을 지원합니다.

에셋 레퍼런스를 찾을 때 이제 언리얼 엔진의 향상된 검색 및 필터링 기능을 활용하여 레퍼런스 그래프에 표시될 에셋 타입을 더 잘 제어할 수 있습니다.

레퍼런스 그래프의 에셋 노드는 에셋 타입별로 컬러가 지정되며, 에셋의 섬네일이나 파일 경로 등 추가 정보를 표시하도록 커스터마이징할 수 있습니다.

언리얼 엔진 5.1의 향상된 레퍼런스 뷰어에 대한 자세한 내용은 레퍼런스 뷰어문서를 참고하세요.

Python 타입 힌팅

Python 플러그인은 이제 타입 힌팅으로 스텁 파일을 생성합니다. 타입 힌트는 Python IDE 자동 완성 메뉴에 표시됩니다. 타입 힌팅을 활성화하려면 언리얼 에디터 메뉴 바에서 편집(Edit) > 에디터 개인설정(Editor Preferences)에서 플러그인(Plugins) > Python 으로 이동합니다. 개발자 모드(Developer Mode) 를 활성화하고 원하는 타입 힌팅 모드(Type Hinting Mode) 를 선택합니다. 이렇게 하면 선택한 IDE에 추가할 수 있는 Python 스텁 파일이 생성됩니다. 타입 힌팅 활성화 및 사용 가능한 다양한 타입 힌팅 모드에 대한 자세한 내용은 언리얼 에디터 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 로 이동한 뒤 ConflictReportNameWordCountReportName 필드를 설정하여 .csv 대신 .txt 확장자를 사용하도록 변경할 수 있습니다.

향상된 파싱 코드

UE 5.1에서는 코드에서의 현지화된 텍스트 처리 편의성을 위해 몇 가지 변경사항이 추가되었습니다. #define LOCTEXT_NAMESPACE#undef LOCTEXT_NAMESPACE 를 사용하여 코드 섹션을 특정 현지화 네임스페이스에 속하도록 표시합니다. 그런 다음 이러한 매크로 사이에 LOCTEXT 매크로를 사용하여 현지화된 텍스트 엔트리를 디폴트 텍스트의 키 및 스트링으로 정의할 수 있습니다.

    #define LOCTEXT_NAMESPACE "Paper2D"
    //…

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

    //…

    #undef LOCTEXT_NAMESPACE

위 예시에서는 키 TerrainDefaultRuleDesc 와 디폴트 텍스트 TopPaper2D 네임스페이스에 추가됩니다. 또한 현지화된 텍스트는 이제 이스케이프 문자 사용을 지원합니다.

커브 테이블 에디터

이제 커브 데이터 테이블 에디터 에서 단순 커브리치 커브 를 편집할 수 있습니다. 커브 테이블을 생성할 때 이를 생성한 외부 프로그램으로 돌아갈 필요 없이 에디터를 열고 테이블이나 커브 뷰에서 커브를 편집할 수 있습니다.

  • 커브 테이블은 콘텐츠 브라우저에서 기타(Miscellaneous) 섹션으로 이동하여 생성할 수 있습니다. 보간 타입을 선택하여 리치 커브 또는 단순 커브를 선택할 수 있습니다.

Curve Table Creations

  • 새 큐빅 커브 테이블을 생성하면 리치 커브 테이블이 생성됩니다.

RichCurve Table

  • 상수 또는 선형 커브 테이블을 생성하거나 스프레드시트를 임포트하면 언리얼 엔진 내에서 편집할 수 있는 단순 커브 세트가 생성됩니다.

Simple Curves Table

  • 단순 커브를 편집할 때 모든 커브의 키 시간이 동일하도록 컨스트레인트를 유지하여 키가 가로로 움직이지 않게 할 수 있습니다. 키를 추가하면 모든 커브에 키가 추가됩니다.

Editing Simple Curves

  • 에디터는 이제 향상된 상수 커브 테이블 렌더링과 함께 커브의 이름변경 및 제거를 지원합니다.

Renaming Curves

  • 커브 키 값 편집과 함께 새 툴바 향상 사항으로 시간 재지정 기능, 키 열 추가 또는 제거, 리임포트가 포함되었습니다.

버추얼 에셋(베타)

버추얼 에셋 은 프로젝트 규모가 커지기 시작할 때 팀원 간 더 빠르고 효율적으로 데이터를 동기화할 수 있도록 지원합니다.

에셋으로 작업할 때는 에셋에 표시하기 위한 최소한의 에셋 관련 데이터만 필요합니다. 예를 들어 텍스처는 섬네일 이미지 및 에디터 프로퍼티(좌표, 스케일 등)를 필요로 할 수 있지만, 텍스처에 대한 .UAsset 벌크 파일의 픽셀 데이터는 필요하지 않을 수 있으며 팀에서 프로젝트에 동기화하는 것이 낭비가 될 수 있습니다.

이 에셋은 에셋이 소스 컨트롤에 있는 코어 에셋 메타데이터 부분으로 분할되며 벌크 데이터를 다른 위치로 분할합니다. 사용자가 벌크 데이터를 필요로 하는 경우 소스 컨트롤에서 온디맨드 방식으로 동기화할 수 있습니다.

이 기능에는 다음이 포함됩니다.

  • 전체 프로젝트를 동시에, 패키지 경로별로, 특정 에셋 타입별로 또는 특정 에셋별로 가상화하는 함수 기능

  • 텍스처 및 오디오 에셋 지원

새 임포트 프레임워크

언리얼 엔진 5.1은 퍼포먼스가 뛰어나고 커스터마이징 가능한 에셋 파이프라인을 제공하도록 디자인된 새 임포트 프레임워크 를 지원합니다. 이 프레임워크는 에디터와 런타임에서 작동하며, 블루프린트 및 Python을 사용한 스크립팅도 제공합니다.

Interchange framework options

이 새 프레임워크는 포맷의 제약을 받지 않으며 다음 단계에 따라 작동합니다.

  • 트랜슬레이터(Translator) : 파일 포맷을 언리얼 엔진의 중개 그래프 구조로 변환합니다.

  • 팩토리(Factory) : 파이프라인 출력에서 액터 및 에셋을 생성합니다.

  • 파이프라인(Pipeline) : 그래프 구조를 언리얼 액터 및 에셋 설명으로 처리합니다.

이 프레임워크는 현재 다음 포맷을 지원합니다.

  • 이미지 포맷 : BMP, DDS, EXR, HDR, JPG, PCX, PNG, PSD, TGA, TIFF

  • 라이트 포맷 : IES

  • 3D 모델 : GLTF, OBJ

  • 머티리얼 : MTLX

    • 이번 초기 출시 버전에서 MaterialX는 임포트 전용이며, standard_surface 셰이딩 모델을 사용한 머티리얼의 트랜슬레이션만 지원합니다.

이전에 언리얼 엔진에서 지원되었던 파일 포맷은 레거시 프레임워크를 사용하여 계속 지원됩니다.

자세한 내용은 임포트/익스포트 인터체인지 문서를 참고하세요. (링크 제공 예정)

모델링 및 스컬프팅 툴

UV 에디터(베타)

5.0에서 실험단계 기능으로 도입된 UV 에디터(UV Editor) 가 5.1에서 베타로 전환되었습니다. 기존에는 플러그인을 통해 UV 에디터에 액세스할 수 있었지만 이제는 다음과 같은 세 가지 방법을 통해 에디터에 빠르게 액세스할 수 있습니다.

  • 모델링 모드(Modeling Mode) 에서 UV 패널 사용

  • 레벨 내에서 메시 우클릭

  • 콘텐츠 브라우저 에서 메시 우클릭

UV 생성 및 편집 기능은 지속적으로 향상될 예정이며, 여기에는 UV 에디터 자체의 향상뿐 아니라 다음과 같은 사항도 포함됩니다.

  • 기즈모가 제공하는 것보다 복잡한 트랜스폼 행동을 지원하기 위해 트랜스폼(Transform) 툴을 추가했습니다. 이 컨트롤에는 체인 스케일, 회전, 이동 및 UV 트랜스폼의 상대적 모션을 조정하기 위한 다양한 피벗 옵션이 포함됩니다.

  • UDIM 은 이제 레이아웃(Layout)언랩(Unwrap) 툴에서 사용할 수 있습니다.

    • 레이아웃 또는 언랩 작업을 수행하는 동안 기존 UV 아일랜드가 차지하고 있는 UDIM에 해당 아일랜드를 핀으로 고정할 수 있습니다.

  • 분포(Distribute) 툴은 바운딩 박스 에지 규칙을 기반으로 UV 아일랜드 사이에 간격을 자동으로 생성합니다.

    • 이제 수동 거리 조정이 지원되므로 다양한 분포 작업을 수행할 때 선택된 UV 사이의 간격을 정밀하게 제어할 수 있습니다.

    • 오버랩을 최소한으로 제거하는 새 모드를 사용할 수 있습니다. 이는 필요한 경우 선택된 영역을 분리하여 바운딩 박스가 교차하는 것을 방지합니다. 또한 이 모드는 새 수동 거리 제어 기능과도 함께 작동하여 분리되는 거리를 커스터마징하게 해줍니다.

  • 분할(Split) 툴이 이제 전체 트라이앵글 영역, 버텍스 및 에지를 지원합니다. 이를 통해 기존 UV 아일랜드를 빠르게 선택하고 세분화할 수 있습니다.

  • 정렬(Align) 툴이 추가 그룹화 로직을 제공합니다. 선택된 개별 아일랜드를 독립적으로 정렬하고 선택 항목을 그룹으로 정렬하여 상대적 위치를 보존할 수 있습니다.

    • 정렬 및 분포 툴이 이제 버텍스 및 에지 선택을 지원하여 바운더리와 내부 라인을 따라 보다 정밀하게 배치할 수 있게 되었습니다. 이에 따라 정렬 및 분포 툴은 개별 버텍스를 독립된 항목으로 취급하며 버텍스별 정렬 및 분포 스케일을 매우 세밀하게 조정할 수 있습니다.

  • UV 에디터의 3D 뷰포트 는 선택 항목에 대한 카메라 스내핑을 지원합니다.

    • 이렇게 하려면 뷰포트 툴바의 새 카메라 포커스 버튼 또는 디폴트 카메라 스냅 단축키 Alt+F를 사용하면 됩니다.

  • 자동 UV(AutoUV) 툴을 사용하여 기존 메시 폴리그룹에 기반하여 UV를 생성할 수 있습니다.

    • 결과 아일랜드를 원래의 폴리그룹에 따라 UDIM 타일로 자동 배열하는 옵션이 제공됩니다.

이러한 향상된 기능 대부분은 기존 아티스트 및 드로잉 애플리케이션의 기능과 매우 유사합니다. 자세한 내용은 UV 에디터 문서(한글 제공 예정)를 참고하세요.

패턴 툴

아티스트의 모델링 툴키트를 확장하여 패턴(Pattern) 툴이 추가되었습니다. 하나 이상의 선택된 메시를 이동 가능 3D 평면에서 라인, 그리드 또는 원을 따라 타일링합니다. 각 타일링 패턴에 이동, 회전, 스케일 보간을 비롯한 다양한 파라미터를 사용할 수 있습니다. 결과 패턴을 병합된 다이내믹 메시, 엘리먼트별 액터(스태틱 또는 다이내믹) 또는 인스턴스드 스태틱 메시 컴포넌트로 출력합니다.

애니메이션

애니메이션 합성

머신 러닝 디포머(베타)

이제 머신 러닝 디포머(Machine Learning Deformer)를 사용하여 언리얼 엔진에서 고퀄리티 메시 디포메이션에 가까운 자체적인 ML 디포머 모델을 생성할 수 있습니다.

플러그인으로 패키징된 ML 디포머 프레임워크(ML Deformer Framework) 는 런타임에서 신경망을 평가하여 메시를 디폼하는 ML 디포머 모델을 트레이닝, 검사, 디버깅하는 데 사용할 수 있는 재사용 가능한 에셋 타입 및 에디터와 기존 신경망 추론(Neural Network Inference, NNI) 프레임워크를 사용합니다.

또한 ML 디포머 시스템은 생성된 메시 디포메이션을 편집 및 미세조정하는 데 사용할 수 있는 디포머 그래프(Deformer Graph) 시스템과의 통합도 제공합니다.

뿐만 아니라 새로운 뉴럴 모프 모델(Neural Morph Model) 플러그인을 활성화하여 사전 제작된 하이 퍼포먼스 디포머 모델을 활용함으로써 캐릭터에서 낮은 메모리 점유율로 고퀄리티 디포메이션을 트레이닝할 수 있습니다.

  • 뉴럴 모프 모델버텍스 델타 모델(Vertex Delta Model) 을 대체합니다. 캐릭터당 소량의 추가 데이터(MB)만 요구하며, 빠른 하드웨어 퍼포먼스를 제공하는 뉴럴 모프 모델은 최신 플랫폼에서 고퀄리티 ML 기반 메시 디포메이션 모델을 사용 가능하게 합니다.

ML 디포머 프레임워크뉴럴 모프 모델 도입과 함께 ML 디포머 에셋 에디터(ML Deformer asset editor) 에 몇 가지 퍼포먼스 및 편의성 향상이 이뤄졌습니다.

자세한 내용은 머신 러닝 디포머 문서를 참고하세요.

디포머 그래프(베타)

디포머 그래프 플러그인은 사용자가 디포머 그래프 에셋을 생성편집 하여 모든 스킨 적용 메시에 대한 복잡한 메시 버텍스 디포메이션 동작을 커스터마이징하도록 지원하는 일종의 에디터 역할을 합니다.

디포머 그래프 에디터(Deformer Graph Editor) 를 사용하면 커스텀 블루프린트 로직과 HLSL(High Level Shader Language) 스크립팅을 조합하여 런타임에서 동적 입력으로 메시 버텍스 데이터를 수정하는 메시 디포머 시스템을 생성 및 커스터마이징할 수 있습니다. 디포머 그래프는 런타임에서 복잡한 메시 디포메이션을 생성하기 위해 모프 타깃 또는 클로스 시뮬레이션을 사용하는 기존의 선형 스킨 적용 메시의 강력한 대안입니다.

자세한 내용은 디포머 그래프 문서를 참고하세요.

피직스 컨트롤 컴포넌트(실험단계)

피직스 컨트롤 컴포넌트(Physics Control Component) 플러그인은 단순하고, 직관적이고, 강력한 물리 기반 컨트롤을 블루프린트에 추가할 수 있게 해줍니다. 이러한 피직스 컨트롤을 사용하면 스태틱 메시 및 스켈레탈 메시의 신규 물리 모션을 활용하는 동시에 예술적인 컨트롤과 게임플레이 컨트롤을 유지할 수 있습니다.

피직스 컨트롤 컴포넌트를 활용하면 스켈레탈 메시 전체 또는 일부분에만 영향을 미치는 컨트롤을 손쉽게 생성할 수 있습니다. 예를 들어 신규 모션을 확인하는 동시에 컨트롤 상당수를 유지하고 싶은 경우 월드 스페이스 에서 사용할 피직스 컨트롤을 생성할 수 있습니다. 부모 스페이스 에서 사용할 피직스 컨트롤을 설정하여 근육 반응 같은 팔다리 행동을 생성할 수 있습니다. 피직스 컨트롤은 로컬 또는 외부의 물리적 바디 간에도 사용할 수 있습니다.

또한 피직스 컨트롤이 애니메이션, 프로시저럴 타깃 또는 두 가지의 조합을 사용하도록 지시할 수 있습니다.

풀 바디 이펙트, 보조 모션, 히트 반응 등 피직스 컨트롤 컴포넌트의 활용 예시를 보려면 콘텐츠 예제 프로젝트의 피직스 컨트롤(Physics Control) 레벨을 참고하세요.

애니메이션 게임플레이

모션 매칭(실험단계)

포즈 검색(Pose Search) 플러그인은 이제 새로운 Motion Matching 이라는 애니메이션 블루프린트 노드를 제공합니다. 이는 스테이트 머신의 동적 대안으로, 캐릭터 로코모션 애니메이션 시스템을 빌드하는 데 사용할 수 있습니다.

Motion Matching 노드는 캐릭터의 로코모션 애니메이션을 포함하는 데이터베이스(Database) 에셋을 사용하여 저장된 애니메이션 세트의 정보를 바탕으로 애니메이션 포즈를 선택하여 캐릭터의 런타임 무브먼트 모델(Movement Model) 과 매칭합니다. Motion Matching 노드를 사용하면 복잡한 스테이트 머신 로직 없이도 반응성이 뛰어난 고퀄리티 캐릭터 로코모션 애니메이션 시스템을 빠르고 효율적으로 구성할 수 있습니다.

캐릭터의 모션 매칭 애니메이션의 충실도 및 퀄리티를 높이려면 캐릭터 모션 데이터베이스 또는 데이터베이스 세트 에셋에 애니메이션을 더 추가하기만 하면 됩니다. Motion Matching 노드는 추가된 각 애니메이션에서 더 많은 데이터를 추출하여 보다 정확하고 효과적으로 플레이어 무브먼트 모델과 매칭할 고퀄리티 출력 포즈를 선택할 수 있습니다.

또한 포즈 검색 플러그인은 커스텀 통합된 되감기 디버거(Rewind Debugger)와 패키지로 제공되기 때문에 어떤 포즈가 선택되었고 어떤 포즈가 선택되지 않았는지 확인하기 위해 모션 매칭 포즈 선택 프로세스를 기록 및 분석할 수 있습니다. 그런 다음 이 정보를 사용하여 프로젝트의 필요에 맞게 선택 프로세스를 조절 및 미세조정할 수 있습니다.

custom rewind debugger implementation for motion matching

애니메이션 런타임

되감기 디버거

되감기 디버거 는 새롭게 바뀐 유저 인터페이스를 통해 정보를 시각적 그래프로 표시해주는 애니메이션 데이터 트랙의 타임라인 을 제공합니다. 이를 사용하여 캐릭터의 애니메이션 시스템을 디버깅할 때 애니메이션 데이터의 중요한 업데이트 및 변경사항을 확인할 수 있습니다.

되감기 디버거 타임라인은 각 디버그 서브젝트의 컴포넌트 또는 자손 오브젝트에 대한 애니메이션 데이터 트랙을 제공합니다. 되감기 디버거를 사용하여 애니메이션 시퀀스 재생, 노티파이, 커브, 블렌드 가중치(Blend Weights) 등을 분석 및 디버깅할 수 있습니다. 타임라인에서 각 애니메이션 데이터 트랙을 선택하면 디버깅을 위해 선택한 애니메이션 데이터의 보다 정확한 정보가 새 **되감기 디버거**의 디테일 패널에 표시됩니다.

또한 되감기 디버거는 이제 포즈 감시 통합을 지원하므로 캐릭터 애니메이션 블루프린트에서 이를 활성화하여 녹화된 게임플레이 세그먼트 내 블루프린트 노드의 출력 포즈를 관찰할 수 있습니다.

자세한 내용은 되감기 디버거 문서를 참고하세요.

시퀀서

레이어 바

다수의 키프레임 이동 및 스케일 조절을 동시에 지원하기 위해 이제 레이어 바(Layer Bar) 를 사용하여 시퀀서에서 키프레임 및 섹션을 움직일 수 있습니다. 레이어 바는 계층적이며 액터, 컴포넌트, 폴더 트랙에 표시됩니다. 어느 한 레이어 바를 조작하면 안에 있는 다른 레이어 바가 적절하게 조작되어 각 트랙을 펼치지 않고도 액터에서 키프레임의 시간을 보다 쉽게 재지정할 수 있습니다.

sequencer layer bars

키 바

키 바(Key Bar) 는 인접한 키프레임 쌍의 타이밍을 손쉽게 재설정하기 위해 시퀀서에 추가되었습니다. 두 키프레임 사이에 그어진 선을 선택하여 드래그하면 두 키가 모두 서로 상대적으로 움직입니다. 이렇게 하면 여러 키를 개별적으로 선택하고 키 사이의 커스텀 커브를 보존하는 데 걸리는 시간을 줄일 수 있습니다.

sequencer key bars

애니메이션 컨스트레인트

이제 언리얼 엔진의 새 컨스트레인트(Constraint) 기능을 사용하면 다양한 방식으로 시퀀서 오브젝트를 동적으로 제한할 수 있습니다. 다른 애니메이션 툴의 제한 방법과 마찬가지로 부모 컨스트레인트(Parent Constraint) 를 사용하여 전체 트랜스폼을 제한하거나 이동, 회전, 룩앳, 스케일 컨스트레인트 를 통해 개별 채널을 따라 제한할 수 있습니다.

컨스트레인트는 오브젝트, 액터, 컨트롤 릭 컨트롤 을 시퀀서 애니메이션에서 동적으로, 그리고 원 상태가 손상되지 않는 방식으로 손쉽게 어태치할 수 있게 지원합니다.

컨트롤 릭

생성 이벤트

다른 유사한 블루프린트 툴과의 일관성을 향상하기 위해 Setup Event 의 이름을 Construction Event 로 변경했습니다. 또한 또한 새 스폰 노드를 추가하여 Construction Event의 프로시저럴 릭 생성 작업을 더 빠르고 쉽게 만들었습니다.

construction event and spawn control

UX 및 기능 향상

컨트롤 릭에 몇 가지 편의성을 향상하고 UX를 변경하여 워크플로를 향상되었습니다.

  • 컨트롤 릭 에디터(Control Rig Editor)는 이제 다수의 그래프를 지원합니다. 이제 릭 로직을 독립적인 그래프로 정리 및 분할할 수 있습니다.

  • 컨트롤 릭 그래프(Control Rig Graph)에 커스텀 이벤트 , 즉 사용자 정의 이벤트를 추가하고 이를 통해 자체적인 릭 이벤트를 생성 및 실행할 수 있습니다.

  • 이제 다른 소프트웨어의 X-Ray 세팅과 유사하게 컨트롤을 지오메트리 위에 오버레이하여 표시할 수 있습니다. 이렇게 하려면 애니메이션 모드(Animation Mode) 패널에서 컨트롤을 오버레이로 표시(Show Controls as Overlay) 를 활성화하면 됩니다.

  • 드라이버(Driver)/드리븐(Driven) 관계에서 다른 컨트롤에 링크할 수 있는 새로운 컨트롤 타입프록시 컨트롤(Proxy Control) 이 추가되었습니다.

  • 이제 Python 명령을 컨트롤 릭 에디터에서 핀에 어태치하여 노드를 자동화된 방식으로 구성할 수 있습니다.

control rig user interface

IK 릭 및 리타기터

조정 가능한 보폭

IK 리타기터에서 사용 가능한 새 프로퍼티가 추가되었습니다. 이를 통해 IK 목표의 길이, 너비 및 스플레이를 제어할 수 있습니다. 대부분의 경우 이를 사용하여 리타기팅된 캐릭터의 보폭 및 전반적 발 위치를 조정할 수 있습니다.

속도 플랜팅

매우 다양한 캐릭터의 리타기팅 결과를 향상하기 위해 새 툴 및 워크플로를 제공합니다. 이제 속도 플랜팅(Speed Planting) 워크플로를 사용하여 발 미끄러짐 및 기타 유사한 문제를 줄일 수 있습니다. 이 워크플로에 대한 자세한 내용은 속도 플랜팅 문서 페이지를 참고하세요.

UX 및 기능 향상

워크플로, 레이아웃, 툴 행동을 향상하기 위해 IK 릭 및 IK 릭 리타기팅 에디터의 유저 인터페이스 및 사용자 경험을 몇 가지 변경했습니다. 주목할 만한 변경사항은 다음과 같습니다.

  • 이제 소스 및 타깃 스켈레톤을 리타깃 에디터의 스켈레톤 계층구조와 함께 모두 뷰포트에서 볼 수 있습니다. 추가 필터, 검색 바, 계층형 정렬을 사용하여 체인 프로퍼티를 분리 및 편집하는 기능을 향상할 수 있습니다.

  • IK 프로퍼티 같은 특정 프로퍼티는 리타깃 체인에서 필요하지 않은 경우 이제 비활성화됩니다. 디폴트 값이 아닌 프로퍼티를 위한 프로퍼티 리셋 표시기 등 간단한 프로퍼티 UI도 추가되었습니다.

  • 이제 리타기팅 포즈를 저장 및 임포트하여 프로젝트에서 커스텀 포즈를 공유할 수 있습니다.

  • 리타깃 포즈 편집 시 본 회전의 숫자 값을 입력할 수 있도록 향상되어 보다 쉽고 정밀하게 제어할 수 있습니다.

ik retargeting interface

DMX

Vectorworks for DMX

Vectorworks 및 MVR 임포터(실험단계)

MVR은 라이브 이벤트와 영화/TV 업계에서 DMX 픽스처 및 패칭 정보를 전송하는 데 사용되는 주요 포맷으로, Vectorworks 같은 CAD 애플리케이션이나 Grand MA3 같은 라이팅 콘솔을 사용하는 팀과 원활하게 협업할 수 있게 지원합니다.

Vectorworks 파일을 라이브 이벤트 또는 VP 스테이지 프리비즈를 위해 UE로 임포트할 수 있도록 GDTF 및 MVR 지원이 데이터스미스 워크플로에 추가되었습니다.

MVR은 DMX 픽스처 트랜스폼, 패칭 정보, GDTF 시그니처 파일을 제공하며 데이터스미스는 일반 메시 및 텍스처 데이터를 임포트합니다.

버추얼 프로덕션용 DMX(실험단계)

언리얼 엔진에서 DMX 이벤트를 트리거하고 DMX 콘솔로 언리얼 엔진 액터를 제어할 수 있도록 언리얼 엔진과 DMX 간의 양방향 워크플로를 향상하고 있습니다. 이는 언리얼 엔진 사용자와 DMX 기반 라이팅 콘솔을 사용하는 프로덕션 팀원 간의 긴밀한 협업을 지원합니다.

에디터 내 실시간 지원(실험단계)

지금까지 DMX 지원은 DMX 플러그인을 통해 활성화되었으며 전송/수신 함수 기능은 플레이/프리뷰/게임 내 또는 패키지드 모드에서만 활성화되었습니다. 에픽게임즈는 DMX를 사용하여 에디터 내 엘리먼트를 구동할 수 있도록 에디터 내 라이브 지원을 추가하고 있습니다.

픽셀 매퍼 향상(실험단계)

DMX 픽셀 매퍼에 다양한 UI 미세조정 및 워크플로 향상 사항이 추가되었습니다. 특히 이전에 임포트한 MVR 데이터셋 레이아웃을 통해 2D 픽스처 매핑 그리드를 설정하는 기능이 추가되었습니다.

언리얼 클라우드 서비스

픽셀 스트리밍

픽셀 스트리밍에 버추얼 프로덕션 지원

원격 픽셀 스트리밍 세션을 사용하여 버추얼 카메라(VCam)를 제어하는 지원 기능이 도입되었습니다. 이 기능은 새로운 픽셀 스트리밍 출력 제공자(Pixel Streaming Output Provider) 를 VCam 액터의 출력 제공자로 선택하면 동작합니다.

버추얼 프로덕션 라이브 링크 향상(실험단계)

iOS 디바이스에서 픽셀 스트리밍을 사용하여 버추얼 카메라를 스트리밍 및 제어할 수 있도록 버추얼 프로덕션 라이브 링크(Virtual Production LiveLink) iOS 앱에도 실험단계 지원이 추가되었습니다. 지금까지 라이브 링크 앱으로 버추얼 카메라를 제어하는 경우에는 눈에 띄는 수준의 지연시간이 발생했지만, 픽셀 스트리밍 접근법을 사용하여 가상 카메라를 구동하는 경우 지연시간이 크게 줄어듭니다. 이 워크플로에 대한 지원은 실험단계이며 아직 정식 버전은 아닙니다.

픽셀 스트리밍 프론트엔드 향상

픽셀 스트리밍 프론트엔드, 시그널링 서버, SFU 및 관련 스크립트는 모두 언리얼 엔진의 출시 주기와 분리된 각각의 상위 레벨 GitHub Repository로 옮겨졌습니다. 이를 통해 언리얼 엔진 출시 주기에 얽매이지 않고 중요한 변경사항이 있을 때마다 보다 자주 컴포넌트를 업데이트할 수 있습니다. 이 GitHub Repository는 아래 위치에서 찾을 수 있습니다.

https://github.com/EpicGames/PixelStreamingInfrastructure

픽셀 스트리밍 사용자라면 향후에도 워크플로에 거의 변화가 없을 것입니다. 애플리케이션을 패키징할 때 애플리케이션에 작은 스크립트가 번들로 포함되며, 스크립트를 실행하면 언리얼 엔진 버전을 기반으로 적합한 버전의 GitHub release 버전이 다운로드됩니다. 출시 버전 사이에 주요 변경사항 또는 문제가 있는 경우 이 GitHub Repository는 출시와 무관하기에 이를 해결하기 위한 메커니즘을 제공할 것입니다. 또한 에픽게임즈가 사용자와 보다 쉽게 협업할 수 있도록 픽셀 스트리밍 사용자를 대상으로 이 GitHub Repository에 프론트엔드/서버 문제를 보고하도록 권장합니다.

UE 에디터/게임에서의 픽셀 스트림 디코딩

5.1에서는 픽셀 스트리밍 비디오 스트림의 엔진 내 디코딩이 지원됩니다. 이를 통해 애플리케이션 간 스트리밍 그리고 추후에는 에디터 간에 스트리밍이 가능해집니다. 이 기능은 C++ 를 작성하지 않고도 엔진 내에서 스트림 재생을 구성할 수 있게 해주는 몇 가지 새로운 블루프린트 노드와 함께 제공됩니다. 현재 스트림은 특수 머티리얼을 사용하여 재생할 수 있습니다.

Example of Pixel Streaming ingame

New Blueprint nodes for in-engine Pixel Streaming

에디터 뷰포트 창 스트리밍(실험단계)

지금까지 언리얼 엔진 사용자는 패키징된 언리얼 엔진 애플리케이션 및 게임을 스트리밍할 수 있었습니다. 원격 작업과 협업이 증가함에 따라 에픽은 픽셀 스트리밍에 전체 언리얼 에디터 자체를 스트리밍하는 실험단계 지원을 도입했습니다. 에디터 스트리밍은 새 픽셀 스트리밍(Pixel Streaming) 툴바를 사용하여 테스트할 수 있으며, 이는 픽셀 스트리밍이 활성화되면 표시됩니다. 무인 구성으로 실행하는 경우 -EditorPixelStreamingStartOnLaunch 를 사용하여 실행하면 됩니다. 에디터 스트리밍 실행은 일반 픽셀 스트리밍과 동일하게 작동하며 여전히 시그널링 서버가 필요합니다.

에디터 경험과 관련된 제한도 몇 가지 있습니다. 예를 들어 현재 멀티 모니터 스트리밍은 아직 지원되지 않습니다. 일반적으로 이 기능은 실험단계 프리뷰이며, 후속 출시 버전에서 기능 세트 및 사용자 경험을 확장할 계획입니다. 기능이 변경될 수 있으므로 이를 사용하여 빌드할 경우 주의를 기울여야 합니다.

플랫폼

Apple Silicon에서의 언리얼 에디터(실험단계)

이전 버전의 언리얼 엔진은 Apple의 ARM 64 아키텍처에서 프로젝트 빌드를 지원했지만, 언리얼 에디터 자체는 이를 위해 네이티브로 빌드되지 않았으며 Apple Silicon 기기에서 실행할 때는 Rosetta 인스트럭션 트랜슬레이터에 의존했습니다. UE 5.1의 언리얼 에디터에는 Apple Silicon의 네이티브 지원 실험단계 버전이 포함되며, M1 이상 디바이스에서 에디터 실행 시 퍼포먼스가 향상됩니다.

이 지원은 에픽게임즈 런처를 통해 배포되는 빌드에서는 이용할 수 없습니다. 대신 Apple Silicon 기반 Mac에서 Xcode를 사용하여 소스에서 언리얼 엔진을 빌드해야 합니다. Apple Silicon 플랫폼에서 Xcode로 UE를 빌드할 경우 실험단계 네이티브 버전을 빌드하는 것으로 디폴트 설정되며, 타깃 디바이스는 My Mac 으로 표시됩니다. Rosetta 버전을 빌드하려면 타깃 디바이스를 My Mac(Rosetta) 으로 변경해야 합니다.

Xcode Rosetta Option

마켓플레이스 플러그인은 아직 ARM 64와 호환되지 않으므로 이 환경설정에서는 작동하지 않을 수 있습니다.

Linux IDE 워크플로 향상

UE 5.1에서는 Linux의 IDE에 대한 디폴트 옵션으로서 VS Code에 대한 지원이 향상되었습니다. 다수의 IDE를 사용하고 있고 코드 접근자가 적합한 것을 찾지 못하는 경우 오류 처리 및 메시징도 지원됩니다.

Google Stadia 지원

UE 5.1에서는 Google Stadia 플랫폼 지원이 중단됩니다. UE 5.2에서는 Stadia 지원이 제거됩니다.

XR

향상된 OpenXR 지원

ResetOrientationAndPosition 인터페이스 기능 및 픽셀 밀도에 대한 지원, 스크린 퍼센티지와 템포럴 업샘플에 대한 실험단계 지원이 안정성 향상 및 버그 수정 사항과 함께 추가되었습니다.

향상된 입력(베타)

5.1에서는 향상된 입력(Enhanced Input)을 사용하여 OpenXR 프로젝트를 처리하는 복잡한 입력을 생성합니다. 향상된 입력은 이제 OpenXR 호환 컨트롤러 및 헤드 마운트 디스플레이(HMD)를 지원합니다.

VR 템플릿은 XR 프로젝트에서의 향상된 입력 사용법 예시를 포함하도록 업데이트되었습니다.

The OpenXR Input Mapping Context Details tab

렌더링 기능 패리티(실험단계)

나나이트, 루멘 및 템포럴 슈퍼 해상도에 대한 초기 스테레오 지원이 추가되었습니다. 현재 이는 디퍼드 렌더러를 사용하는 동안 PC에서만 지원됩니다.

HoloLens용 OpenXR 지원

언리얼 엔진용 Windows Mixed Reality 플러그인을 제거하고 HoloLens용 OpenXR로 옮겼습니다. HoloLens 5.1용 프로젝트를 개발하려면 Windows Mixed Reality OpenXR 런타임 및 Microsoft OpenXR 플러그인을 설치해야 합니다.

OpenXR을 사용하여 HoloLens 프로젝트를 구성하는 방법에 대한 자세한 내용은 OpenXR 사전 요구 사항 문서를 참고하세요.

Oculus VR 및 SteamVR 플러그인 지원 중단

5.1에서는 Oculus VR 및 SteamVR 플러그인이 지원 중단되었습니다. Oculus 또는 SteamVR 프로젝트의 경우 OpenXR 플러그인 및 적절한 관련 OpenXR 런타임을 사용해야 합니다.

OpenXR 플러그인 및 런타임 설치 방법에 대한 자세한 내용은 OpenXR 사전 요구 사항 문서를 참고하세요.

모바일

모바일 개발 요구 사항 및 호환 하드웨어

다음은 언리얼 엔진 5.1에서 지원되는 모바일 디바이스 OS 버전 및 최소 하드웨어입니다. 필수 SDK 및 IDE에 대한 자세한 내용은 플랫폼 SDK 업그레이드 섹션을 참고하세요.

iOS, iPad OS 및 tvOS

UE 5.1은 OS 버전 15 이상에서 실행되는 iOS, iPadOS 및 tvOS 디바이스를 지원합니다. 다음은 호환 가능한 최소 디바이스 모델입니다.

  • iOS 15

    • iPhone 6S 이상

    • iPod Touch 7세대

  • iPadOS 15

    • iPad 5세대 이상

    • iPad Air 2* 이상

    • iPad Mini 4* 이상

    • iPad Pro(모든 모델)

  • tvOS 15

    • 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 디바이스를 지원합니다.

  • 64비트 Android를 실행하는 Android 8 이상

  • 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

    • Vulkan은 호환 드라이버를 갖춘 Android 10 이상 디바이스에서 지원됨

필수 SDK 버전에 대한 자세한 내용은 아래의 SDK 업그레이드 노트를 참고하세요.

모바일 렌더러용 디퍼드 셰이딩 모드 정식 버전 전환

UE 4.26에서 실험단계 기능으로 도입된 모바일 디퍼드 셰이딩 모드가 UE 5.1에서 정식 버전으로 전환되었습니다. 이 모드는 모바일 디바이스에서 일반적인 타일링된 GPU에 최적화되어 있으며 라이트 함수, IES 프로파일, 릿 데칼 등 모바일 포워드 렌더링 패스에서는 지원되지 않는 몇 가지 고퀄리티 라이팅 기능을 활성화합니다. Android의 Vulkan 및 OpenGL ES 모드를 포함하여 UE에서 모바일용으로 지원되는 모든 디바이스는 디퍼드 모드를 실행할 수 있습니다.

또한 모바일 디퍼드 패스는 이전까지 모바일 포워드 렌더링 패스에서만 작동했던 다음과 같은 렌더링 기능을 지원합니다.

  • 디스턴스 필드 섀도잉

  • 스포트라이트 섀도

  • 스크린 스페이스 앰비언트 오클루전

사전 계산된 라이팅을 사용하지 않는 경우 다음과 같은 기능이 지원됩니다.

  • 스킨 셰이딩 모델

  • 헤어 셰이딩 모델

  • 얇은 반투명 모델

모든 모바일 패스에서 DirectX 셰이더 컴파일러 사용

UE 5.0은 DXC(DirectX Shader Compiler)를 Vulkan 및 OpenGL ES의 디폴트 셰이더 컴파일러로 설정합니다. UE 5.1에서는 Metal을 포함한 모든 모바일 피처 레벨이 이제 DXC를 사용합니다. 이는 각 렌더링 패스 간의 일관성과 기능 패리티를 향상하며 DXC 커뮤니티의 리소스가 언리얼 엔진의 모든 모바일 프로젝트에 기여할 수 있도록 합니다.

모바일 렌더링 향상

UE 5.1에서는 다음과 같은 기능 및 향상된 사항을 모바일 렌더링 파이프라인에 추가했습니다. 이러한 기능은 렌더링 최적화 향상에 초점을 맞춰져 있습니다.

ARM ASTC 인코더

UE는 이제 ARM의 ASTC(Adaptive Scalable Texture Compression) 압축 표준을 옵션으로 지원합니다.

리팩터링된 머티리얼별 및 프로젝트별 반/최대 정밀도 세팅

UE 5.1에서는 모바일 디바이스용으로 머티리얼 및 머티리얼 표현식의 정밀도 모드를 지정하는 옵션이 추가되었습니다. 다음과 같은 세 가지 모드가 제공됩니다.

  • 모든 플로트에 대해 최대 정밀도

  • 머티리얼 표현식에 대해서만 최대 정밀도

  • 모든 플로트에 대해 반정밀도

새로운 주요 추가 사항은 엔진 셰이더가 반정밀도를 사용할 때 머티리얼 표현식에만 최대 정밀도를 사용하는 기능입니다. 내부적으로 어떤 엔진 셰이더 변수가 반정밀도를 사용해도 안전한지 판단하기 때문에, 이는 일반적으로 반정밀도를 전역으로 설정하는 것보다 안정적입니다.

모바일 플로트 정밀도 모드(Mobile Float Precision Mode) 세팅은 프로젝트 세팅 > 엔진 - 렌더링(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~5배에 달하는 사전 컴파일 시간을 절감할 수 있어 퍼포먼스 측면에서 이점을 얻을 수 있습니다.

에디터 모바일 프리뷰 향상

서로 다른 렌더링 세팅을 갖춘 플랫폼의 경우에도 이제 에디터 내 플랫폼 프리뷰에서 세팅이 더 정확하게 표시됩니다. 이전에는 단일 셰이더 플랫폼이 모든 모바일 프리뷰에 사용되어 디스턴스 필드 섀도 같은 기능은 한 플랫폼에서만 활성화된 경우 정확하게 프리뷰할 수 없었습니다. 이제 이러한 제한을 해소하기 위해 각 프리뷰 플랫폼이 독립적인 셰이더 플랫폼을 사용합니다.

엔진 퀄리티 및 디바이스 프로파일 콘솔 변수가 이제 모바일 플랫폼 프리뷰 시 에디터에 적용됩니다.

Android NDK 25 지원

UE 5.1에서는 최신 LTS 버전인 Android NDK 25 지원이 추가됩니다. 여기에는 새로운 LLVM 14 툴체인이 포함되며 최적화를 통해 더 빠른 코드를 구현할 수 있어 컴파일 시간을 약 15% 절감하고 바이너리 크기를 줄일 수 있습니다.

게임플레이 프레임워크

블루프린트

블루프린트 헤더 뷰

블루프린트 네이티브화 툴과 유사하게 블루프린트 헤더 뷰(Blueprint Header View) 는 언리얼 엔진 블루프린트 클래스블루프린트 구조체를 C++ 코드로 빠르게 변환하도록 지원합니다.

C++ Header Preview

변환 프로세스 동안 블루프린트 헤더 뷰는 모든 블루프린트 변수, 함수, 액터 컴포넌트이벤트 디스패처에 대해 C++ 스타일 선언을 생성합니다.

프로젝트에서 블루프린트 헤더 뷰를 사용하려면 블루프린트 클래스 또는 구조체콘텐츠 브라우저 에서 우클릭 하고 C++ 헤더 프리뷰로 미리 보기(Preview Equivalent C++ Header) 를 컨텍스트 메뉴에서 선택할 수 있습니다.

Blueprint Class Action Preview Header

블루프린트 네임스페이스

새로운 블루프린트 네임스페이스(Blueprint Namespace) 기능을 사용하면 프로젝트의 블루프린트를 선택적으로 정리하여 에디터를 열었을 때 관련된 에셋 및 콘텐츠만 로드하도록 만들 수 있습니다. 네임스페이스 를 사용하여 콘텐츠를 델리게이팅하면 새 언리얼 엔진 에디터 인스턴스를 열 때 복잡한 블루프린트를 더 빠르게 로드 및 표시할 수 있고, 대량의 콘텐츠를 정리하여 사용자 워크플로 효율성을 높일 수 있습니다.

Blueprint Namespace Example

또한 네임스페이스를 사용하면 블루프린트 콘텐츠를 타입 선택 툴(type picker)우클릭 컨텍스트 메뉴 로 필터링하여 항목 목록을 로드하는 시간을 줄이고 작업 공간을 깔끔하고 실용적으로 정리할 수 있습니다.

블루프린트의 클래스 세팅(Class Settings) 에서 블루프린트의 할당된 네임스페이스를 설정 및 레퍼런스할 수 있으며, 이 경우 디테일 패널의 블루프린트 네임스페이스 프로퍼티를 사용하면 됩니다.

Characters Blueprint Namespace

자세한 내용은 블루프린트 네임스페이스 문서를 참고하세요.

향상된 입력

향상된 입력 플러그인은 플레이어 입력 및 컨트롤을 생성하고 관리하는 기능이 다양하게 포함된 메서드를 제공합니다.

입력 액션(Input Action) 에셋을 사용하면 개별 입력 또는 축 컨트롤에 대한 플레이어 입력 메서드를 설정 및 정의할 수 있습니다. 입력 액션 에셋은 입력 매핑 컨텍스트(Input Mapping Context) 에셋 내에서 수집 및 관리되어 프로젝트의 플레이어 입력 및 행동에 대해 보다 포괄적인 컨트롤을 제공합니다. 이는 런타임에서 컨텍스트별로 조정 가능한 동적 시스템을 구축할 수 있게 해줍니다.

또한 향상된 입력 시스템은 프로젝트가 확장되고 그 규모가 커짐에 따라 온라인 , 로컬분할 화면 멀티플레이어 입력 시스템의 생성 및 관리를 보조하는 강력한 기능을 제공하여 플레이어 입력을 구성하고 관리할 수 있도록 지원합니다.

향상된 입력 시스템의 작동 예시는 라이라 샘플 프로젝트를 참고하세요.

자세한 내용은 향상된 입력 문서를 참고하세요.

매스

매스 엔티티(베타)

UE 5.1에서 매스 엔티티(Mass Entity) 시스템이 대폭 향상되었으며 이제 베타로 기능을 제공합니다. 저희는 향후 매스 API에 중요한 변경사항을 적용할 예정이며 매스 프레임워크 개발을 위해 계속 노력할 것입니다.

시스템 재구조화

매스 엔티티의 공유 프래그먼트는 이제 아키타입 레벨에서 청크 레벨로 내려가 아키타입 파편화를 제한합니다.

또한 매스 엔티티 서브시스템의 엔티티 관리 부분은 매스 엔티티 매니저(Mass Entity Manager) 라는 새로운 타입으로 분리되었습니다. 이는 테스트 목적, 커스텀 사용 사례 등에 독립적으로 엔티티 풀을 생성하게 합니다.

안전한 멀티 스레딩

매스 프로세싱 페이즈 매니저(Mass Processing Phase Manager)가 호스팅하는 프로세서는 멀티 스레드 실행됩니다. 이는 데디케이티드 서버를 제외한 모든 타깃에서 기본적으로 활성화됩니다.

이제 MassEntityQuery는 서브시스템 요구 사항을 표현할 수 있습니다. 이는 매스 프로세싱의 멀티스레딩 안전성에 핵심적인 요소입니다. 또한 프로세서가 소유한 쿼리는 이제 스레딩 안전성 확보에 중요한 프로세스 간 추가 종속성을 결정하는 데 사용됩니다.

향상된 디버깅

UE 5.1에서 매스 엔티티는 매스 디버거 UI 툴(Mass Debugger UI Tool) 을 선보입니다. 이 툴은 선택된 매스 엔티티 매니저 아키타입의 컴포지션 및 엔티티 수를 표시함으로써 아키타입에 대한 시각화를 제공합니다.

또한 이 툴은 어떤 아키타입이 특정 프로세서에 의해 처리되는지 보여주며, 매스 프로세싱 페이즈 매니저가 소유한 매스 프로세싱 그래프를 시각화합니다.

AI

스마트 오브젝트

전반적인 향상

UE 5.1에서는 스마트 오브젝트에 전반적인 안정성 및 워크플로 향상이 이뤄지면서 스마트 오브젝트 정의 구성이 보다 편리해졌습니다.

API는 UE 5.0과 일관되므로 프로젝트 마이그레이션 시 하위 호환성을 지원합니다.

게임플레이 인터랙션 플러그인(실험단계)

스마트 오브젝트는 게임플레이 도중 유의미한 게임플레이 인터랙션을 생성하는 기능으로 주로 사용됩니다. 이러한 이유로 스마트 오브젝트는 게임플레이 인터랙션(Gameplay Interactions) 플러그인에 대한 초기 실험단계 지원을 받았습니다. 저희는 스마트 오브젝트에 게임플레이 인터랙션을 임베딩하는 것을 목표로 향후 버전에서 계속 지원을 향상할 계획이며, 이 과정에서 스테이트 트리 및 컨텍스트에 따른 애니메이션을 리플리케이션 지원과 결합할 예정입니다.

인바이런먼트 쿼리 시스템 지원

UE 5.1 출시 버전에서는 인바이런먼트 쿼리 시스템(Environment Query System, EQS)을 사용하여 레벨 내 AI 에이전트 또는 플레이어에 가장 적합한 스마트 오브젝트를 선택할 수 있습니다.

스테이트 트리

State Tree

스테이트 트리 는 UE 5.0에서 도입된 언리얼 엔진의 범용 계층형 스테이트 머신입니다. UE 5.1에서는 스테이트 트리가 상당히 향상됐으며 이제 정식 버전으로 지원됩니다. 이 프로세스의 일부로 스테이트 트리의 API가 5.0과 비교하여 대폭 변경되었습니다.

전반적인 향상

이번 업데이트는 향상된 액터 및 블루프린트 중심 워크플로를 포함합니다. 이제 스테이트 트리를 블루프린트 전용 워크플로와 함께 완전히 활용할 수 있습니다.

유연성 향상

스테이트 트리는 이제 파라미터화할 수 있으며, 이를 통해 동일한 스테이트 트리를 다른 데이터와 함께 사용할 수 있습니다. 이 업데이트에는 보다 복잡한 조건 기반 표현식에 대한 지원도 포함됩니다.

스테이트 트리 이벤트가 향상됨에 따라 외부 로직을 기반으로 스테이트 변경사항을 간편하게 트리거할 수 있게 되었습니다.

또한 이 업데이트는 스테이트 트리 내의 태스크 및 조건 사용을 간소화합니다. 이제 이밸류에이터를 사용하지 않고도 조건을 태스크에 연결하기가 더 쉬워졌습니다. 이에 따라 스테이트 트리가 보다 단순해지고 간소화되었습니다. 예를 들어 이제 이밸류에이터를 사용하지 않고 액터 데이터에 직접 액세스할 수 있습니다.

모듈 방식 추가

UE 5.1에서 스테이트 트리에 서브트리 개념이 추가되었습니다. 서브트리를 사용하면 스테이트 트리의 공통 부분을 재사용할 수 있습니다. 이를 통해 재사용성을 높이고 복잡한 스테이트 트리를 직관적으로 빌드할 수 있습니다.

서브트리는 블루프린트 매크로와 유사하며, 지정된 이름으로 서브트리를 생성하고 해당 입력을 정의할 수 있습니다. 서브트리는 스테이트 트리 내에서 이름으로 직접 호출할 수 있습니다.

메모리 최적화

스테이트 트리의 내부 스토리지에서 여러 가지 최적화가 이뤄졌으며, 이에 따라 활성 스테이트 트리별 메모리 사용량이 크게 감소되었습니다. 런타임에서는 활성 태스크업만 스테이트 트리 메모리에 저장됩니다. 또한 UE 5.0과는 달리 스테이트 트리의 대규모 프로퍼티를 전체 복제가 아닌 레퍼런스로 바인딩할 수 있습니다.

이러한 향상된 사항으로 인해 도시 샘플에서 약 35,000개의 스테이트 트리가 게임플레이 동안 실행될 때 메모리 사용량이 약 75% 줄어들었습니다.

월드 파티션의 내비게이션 메시

다이내믹 내비게이션 메시(실험단계)

언리얼 엔진 5.1에는 월드 파티션 사용 시 다이내믹 내비게이션 메시(내비메시)에 대한 초기 실험단계 지원이 포함됩니다.

이제 다이내믹(Dynamic) 모드를 내비게이션 메시의 런타임 생성 에 사용하여 월드 파티션된 맵에서 월드 파티티션된 다이내믹 내비메시를 만들 수 있습니다.

이 경우 베이스 내비게이션 메시의 일부가 아니면서 로드 및 언로드되는 오브젝트의 내비게이션 메시 변경사항은 무시됩니다. 또한 월드 파티션 다이내믹 내비메시를 사용할 때 다이내믹 타일 생성은 로드된 스페이스로 제한됩니다.

전반적인 향상

이번 업데이트에서는 고정 타일 풀 크기(Fixed Tile Pool Size)월드 파티션 과 함께 사용하는 경우의 지원이 향상되었습니다. 이제 타일 제한에 도달하여 내비메시 타일을 추가할 수 없을 때 타일을 추가하면 경고가 표시됩니다. 또한 고정 타일 풀 크기 제한은 UWorldPartitionNavigationDataBuilder 커맨드릿을 사용하여 내비게이션을 만들 때 무시되어 제작 속도가 더 빨라집니다.

내비게이션 데이터는 이제 맵과 별개로 패키징됩니다. 즉, 이제 월드 파티션된 내비메시를 만들어도 메인 맵이 더티 상태가 되지 않습니다.

또한 월드 파티션 맵에서 일반 내비메시를 빌드할 때 내비게이션 메시 생성 전에 전체 맵을 자동으로 로드합니다.

피직스

씬 쿼리 및 리지드 바디 시뮬레이션 퍼포먼스

언리얼 엔진 5.1에서는 리지드 바디 및 씬 쿼리 함수 기능에서 다수의 퍼포먼스 향상이 이뤄졌습니다. 다음은 UE 5.0의 테스트 빌드와 UE 5.1 출시 버전을 비교한 것입니다.

다양한 예제를 UE 5.1 업데이트로 테스트하면서 UE 5.0에서 가장 퍼포먼스가 좋지 않은 예제에 초점을 맞췄습니다. 첫 번째 예제는 512개의 동적으로 시뮬레이트된 컨벡스 오브젝트를 회전 컨벡스 오브젝트에 배치하는 텀블러 테스트입니다. 아래 예제에서는 UE 5.1 테스트 결과가 50% 더 빠르다는 것을 알 수 있습니다.

Tumbler test results

두 번째 예제는 복잡한 지형, 월드에 배치된 10만 개의 스태틱 오브젝트, 하이트필드 지형에 드롭된 512개의 다이내믹 컨벡스 오브젝트를 사용한 테스트입니다. 아래 예제에서는 이 맵에 대한 레이캐스트에서 언리얼 엔진 5.1의 퍼포먼스가 언리얼 엔진 5.0의 두배라는 것을 알 수 있습니다.

Raycast test results

플루이드 시뮬레이션

터뷸런스 모델 및 소규모 스케일 포스

언리얼 엔진 5.1에서는 터뷸런스 모델 및 소규모 스케일 포스가 향상되었습니다. 이 향상으로 인해 시뮬레이션의 앞쪽 에지에 추가적인 디테일을 보다 쉽게 더할 수 있습니다. 이는 시뮬레이션을 좀더 자연스럽게 보이게 만드는 동시에 셰이프를 한층 더 눈에 띄게 표시해줍니다.

No Small Scale forces compared to with Small Scale forces.

트라이큐빅 보간

시뮬레이션의 전체 해상도를 높이지 않으면서 추가적인 디테일을 더하는 데 사용할 수 있는 새 트라이큐빅 보간 모드가 추가되었습니다. 이를 통해 언리얼 엔진 이전 버전의 시뮬레이션과 비슷한 비용으로 한층 디테일한 시뮬레이션을 수행할 수 있습니다.

메모리 소비 개선

언리얼 엔진 5.1에서는 플루이드 시뮬레이션의 메모리 소비와 관련하여 몇 가지 개선이 이뤄졌습니다. 이를 통해 UE 5.0과 동일한 메모리 예산으로 더 높은 해상도 시뮬레이션을 수행할 수 있습니다.

디스트럭션

카오스 디스트럭션(Chaos Destruction)이 언리얼 엔진 5.1에서 대폭 향상되었습니다.

향상된 프랙처 계층구조

프랙처 계층구조의 업데이트 사항은 다음과 같습니다.

  • 이제 본(bone) 목록을 스크롤할 때 부모 클러스터가 자동으로 스택됩니다.

  • 계층구조를 레벨별로 컬러를 지정하여 가독성을 높일 수 있습니다.

  • 다음 옵션을 기반으로 컨텍스트 정보를 표시하는 열 모드(Column Mode) 가 새롭게 추가되었습니다.

    • 스테이트 및 크기(State and size) : 본별 상대적 크기, 초기 스테이트 및 앵커링 정보를 표시합니다.

    • 대미지(Damage) : 본별 런타임 대미지 정보를 표시합니다. 이는 아티스트가 에셋에 대한 대미지 한계치를 미세조정할 수 있게 지원합니다.

    • 제거(Removal) : 본별 파괴 시 제거 세팅을 표시합니다.

    • 콜리전(Collision) : 원본 스태틱 메시에서 임포트된 콜리전의 정보를 표시합니다.

대미지 감시 툴

5.1에서 새 런타임 대미지 감시 툴(Damage Watcher)프랙처 모드(Fracture Mode) 에 추가되었습니다. 일반(General) 세팅에서 시뮬레이트(Simulate) 를 클릭하고 런타임 데이터 수집 활성화(Enable Runtime Data Collection) 옵션을 활성화하여 대미지 결과를 기록할 수 있습니다.

본별로 받은 대미지는 대미지 열 모드(Damage Column Mode) 아래에 표시됩니다. 대미지 한계치 및 파괴된 본(있는 경우)도 표시됩니다.

툴 향상

언리얼 엔진 5.1 업데이트에서는 다양한 프랙처 모드 툴이 향상되었습니다. 이 툴에 대한 자세한 내용을 확인하려면 디스트럭션 문서를 읽고 필요한 디스트럭션 학습과정을 따르세요.

GeoMerge 툴

지오메트리 컬렉션에서 선택된 지오메트리 조각을 병합하는 새 GeoMerge 툴이 추가되었습니다. 지금까지 GeoMerge 툴로 알려졌던 툴의 이름은 여분 지오메트리의 작은 조각을 정리하는 용도임을 나타내기 위해 TinyGeo 로 변경되었습니다.

컨벡스 툴

새 컨백스 헐 생성 세팅은 생성된 헐의 정확도와 인접한 헐과의 오버랩 간에 균형을 잡을 수 있게 지원합니다.

디폴트 컨벡스 생성 세팅(모든 신규 또는 리셋 지오메트리 컬렉션에 적용)은 이제 프랙처 모드 프로젝트 세팅에서 설정할 수 있습니다.

유효성 검사 툴

유효성 검사(Validate) 유틸리티는 유효성 검사 및 수정 대상을 정확하게 제어할 수 있도록 체크박스가 있는 모달 툴로 바뀌었습니다. 이제 선택적으로 단일 자손 클러스터를 수정할 수 있지만 시뮬레이션에서는 바람직하지 않습니다.

선택 툴

선택(Selection) 툴은 이제 현재 뷰 레벨에서 모든 리프 또는 모든 클러스터를 선택하는 버튼을 제공합니다.

자동 클러스터 툴

자동 클러스터(Auto Cluster) 툴은 이제 입력 비율 에 의한 클러스터링을 포함하며, 계층구조 감소 시 반복작업의 속도를 대폭 높여줍니다.

새로운 단독 표시 방지(Avoid Isolated) 옵션은 클러스터가 항상 두 개 이상의 트랜스폼을 포함하게 합니다.

메시 페인트

메시 페인트(Mesh Paint) 모드는 이제 지오메트리 컬렉션을 지원합니다. 프랙처된 지오메트리에서 버텍스 컬러 및 텍스처를 페인팅할 수 있습니다.

또한 버텍스 컬러는 이제 프랙처에 의해 생성된 새 버텍스를 전파하여 보다 일관된 머티리얼 행동을 제공합니다.

임포트된 콜리전

이제 원본 스태틱 메시의 콜리전을 사용하여 지오메트리 컬렉션을 만들 수 있습니다. 이는 특히 비컨벡스 셰이프에 대해 콜리전을 정교하게 커스터마이징할 수 있게 합니다.

제거

기존 슬립 시 제거(removal on sleep) 기능이 향상되고 파괴 시 제거(remove on break) 기능이 새로 도입되었습니다. 두 기능의 차이는 다음과 같습니다.

  • 슬립 시 제거:

    • 느리게 움직이는 부분도 제거할 수 있도록 새 파라미터가 추가되었습니다.

    • 부분적으로 파괴된 클러스터는 이제 작은 조각으로 붕괴되고 이러한 조각들은 결국 제거됩니다.

  • 파괴 시 제거:

    • 이제 파괴된 뒤에 조각을 제거할 수 있습니다. 이러한 파라미터는 본별로 설정 가능하며 클러스터는 제거되는 대신 붕괴되도록 설정할 수 있습니다.

연결 그래프

이제 새 연결 그래프(Connection Graph) 메서드를 사용하여 보다 정밀하게 연결하고 조각이 공중에 떠 있는 문제를 줄일 수 있습니다.

Previous method (minimal spanning)

New method (Bounds checking)

전파 시스템

새 대미지 전파 시스템을 사용하면 보다 예측 가능하고 의도에 맞게 컨트롤되는 파괴 행동을 제공할 수 있습니다. 이는 인스턴스 레벨에서 파라미터화할 수 있으며 파괴 및 충격으로 인한 대미지 전파 컨트롤을 제공합니다.

블루프린트 노드

지오메트리 컬렉션의 특정 부분에서 작동할 수 있는 새 블루프린트 함수 세트가 추가되었습니다. 이벤트 및 트레이스 쿼리는 이제 프랙처된 부분의 레벨을 쿼리하는 함수에서 사용 가능한 항목 인덱스를 반환하거나, 내부 및 외부 스트레인을 적용하거나, 포스를 적용하거나, 붕괴시킬 클러스터를 요청할 수도 있습니다.

이는 필드 없이 지오메트리 컬렉션 부분을 매우 정밀하게 타기팅할 수 있게 지원합니다.

Geometry Collection Blueprint nodes

퍼포먼스

UE 5.1에서는 런타임 및 제작 프로세스 측면에서 다양한 퍼포먼스 향상이 이뤄졌습니다.

런타임 : 다수의 지오메트리 컬렉션을 레벨에 배치하는 방법을 제공하기 위해 여러 최적화가 이뤄졌습니다.

제작 : 프랙처 모드의 여러 툴이 다수의 지오메트리 컬렉션에 최적화되었습니다. 또한 프랙처 툴은 이제 연산에 시간이 오래 걸리는 작업을 도중에 취소하는 옵션과 함께 진행률 표시줄을 제공합니다.

클로스 시뮬레이션

UE 5.1에서 클로스 시뮬레이션의 일부가 향상되었습니다.

클로스 캐싱

이제 시퀀서 내에서 클로스 시뮬레이션을 녹화 및 재생할 수 있습니다.

Cloth caching in Sequencer

클로스 압력

클로스 환경설정에 압력(Pressure) 이라는 새 컨트롤을 추가하고 블루프린트 카오스 클로딩 인터랙터(Chaos Clothing Interactor)에 압력 설정(Set Pressure) 이라는 새 함수를 추가했습니다. 이러한 컨트롤은 시뮬레이트된 클로스의 각 트라이앵글에 지속적인 압력을 가할 수 있습니다.

이 이펙트는 압력 페인터블 마스크를 통해 메시에서 모듈레이트할 수 있습니다. 압력은 항상 트라이앵글의 노멀 방향으로 적용되며, 트라이앵글을 반대 방향으로 밀어내려면 음수 값을 사용하면 됩니다.

Cloth pressure example

버클링

벤딩 엘리먼트(Bending Element) 컨스트레인트에 버클링(buckling) 기능이 새롭게 추가되었습니다. 이 기능을 사용하면 Buckling RatioBuckling Stiffness 에 따라 벤딩 엘리먼트 컨스트레인트를 늘리거나 줄일 수 있습니다. 이러한 파라미터는 시뮬레이션 도중 클로스 머티리얼의 주름을 더 잘 제어할 수 있게 해줍니다.

Buckling Ratio

엘리먼트가 벤딩되어 휴식각도에서 이 비율보다 더 많이 접히면, 즉 버클링되면 Bending Stiffness 대신 Buckling Stiffness 를 사용하도록 전환됩니다. Buckling Ratio = 0이면 Buckling Stiffness는 사용되지 않습니다. Buckling Ratio = 1이면 벤딩되면서 휴식 상태를 벗어나는 즉시 Buckling Stiffness가 사용됩니다.

Buckling Stiffness

벤딩은 클로스가 버클링되는 경우, 즉 특정 각도를 넘어서 벤딩되는 경우 Bending Stiffness 대신 Buckling Stiffness를 사용합니다. 일반적으로 Buckling Stiffness는 Bending Stiffness보다 작게 설정됩니다. Buckling Ratio는 Bending Stiffness와 Buckling Stiffness간에 전환되는 지점을 결정합니다.

Buckling stiffness example

환경설정에서 UseBendingElements 체크박스를 선택하여 이 기능을 활성화할 수 있습니다.

셀프 콜리전 향상

UE 5.1에서 클로스 시뮬레이션의 셀프 콜리전이 전반적으로 향상되었습니다.

추가 해결 단계

이제 Use Self Intersections 파라미터를 통해 추가 셀프 콜리전 해결 단계를 사용할 수 있습니다. 이제 셀프 콜리전 마찰은 자체 Self Collision Friction 파라미터를 사용합니다.

셀프 교차점

셀프 교차점 해결을 조정하여 콜리전 반발로 처리되지 않는 모든 클로스 교차점을 수정할 수 있습니다.

Self Collision Friction

Self Collision Friction 파라미터가 새롭게 클로스 시뮬레이션에 추가되었습니다. 이 파라미터는 클로스 간 인터랙션의 마찰 계수를 나타냅니다.

값이 작으면 클로스가 서로 닿았을 때 부드럽게 미끄러집니다. 값이 크면 인터랙션에 마찰이 더 많이 적용되며 클로스 간 접촉 지점에서의 움직임이 적어집니다.

Self collision settings

머신 러닝 클로스(실험단계)

UE 5.1에서는 새 가장 근접한 이웃 모델(Nearest Neighbor Model) 플러그인을 사용할 수 있습니다. 이 플러그인은 비교적 적은 런타임 오버헤드 및 메모리 점유율로 인게임 클로스에 풍부한 접힘 및 주름 이펙트를 생성할 수 있게 해줍니다.

플러그인 에디터에서 신경망을 학습시켜 지정된 포즈에 대한 사전 시뮬레이트된 소규모 데이터 세트(보통 50~100프레임)에서 가장 근접한 이웃을 찾을 수 있습니다. 그런 다음 지오메트리 디테일을 지정된 포즈의 클로스에 전달하는 데 가장 근접한 이웃을 사용하여 고퀄리티 런타임 시뮬레이션을 생성할 수 있게 됩니다.

나이아가라

GPU 리본

이제 GPU에서 리본 이 지원됩니다. 이전 버전에서 리본 렌더러(Ribbon Renderer) 는 CPU 이미터에만 추가될 수 있었습니다. 게임의 필요 사항과 사용하려는 기능에 따라 GPU나 CPU 중 어디에서 렌더링할지 선택할 수 있습니다.

엔진 퀄리티 모드

나이아가라 에디터(Niagara Editor)에서 엔진 퀄리티 모드(Scalability Mode) 를 켜서 다양한 엔진 퀄리티 세팅을 프리뷰할 수 있습니다. 이렇게 하면 이펙트가 서로 다른 플랫폼에서 재생되도록 미세조정할 수 있습니다. 더 알아보기 쉽도록 엔진 퀄리티(Scalability) 세팅이 디폴트 뷰에서 제거되고 엔진 퀄리티 모드에 추가되었습니다.

Niagara Scalability Mode

이미터 버전 관리

4.27부터 커스텀 모듈을 생성하는 경우 버전 관리를 사용하여 기존 이펙트를 손상하지 않고 새 모듈을 팀에 푸시할 수 있습니다.

5.1에서는 이미터에 동일한 함수 기능이 추가되어 전체 이미터에 버전을 지정하고 팀에 디플로이할 수 있습니다. 버전 관리를 통해 새 에셋을 생성하거나 기존 행동이 손실되는 위험 없이 템플릿을 업데이트 또는 수정할 수 있습니다.

Emitter Versioning in Niagara

플립북 베이커(베타)

플립북 베이커(Flipbook Baker) 의 첫 버전은 UE 5.0에서 도입되었습니다. 이 툴은 이펙트의 래스터화된 플립북을 굽는 데 사용됩니다. UE 5.1에서는 사용자 경험을 보다 향상하고 추가 옵션을 더했습니다. 이제 다음과 같은 타입을 구울 수 있습니다.

  • 2D 텍스처

  • 볼륨 텍스처

  • 시뮬레이션 캐시(실험단계)

렌더 종속성 그래프

이제 나이아가라가 렌더 종속성 그래프(Render Dependency Graph) 에서 지원됩니다. 자세한 내용은 렌더 종속성 그래프를 참고하세요.

이종 볼류메트릭 렌더링(실험단계)

나이아가라 플루이드 렌더링은 UE 5.0에서 도입되었습니다. 초기 구현은 제한적이었으며, 2개의 디렉셔널 라이트만 플루이드 시뮬레이션에 추가할 수 있었습니다. 또한 플루이드에 섀도를 캐스팅할 수도 없었습니다.

이종 볼류메트릭 렌더링(Heterogeneous Volumetric Rendering) 은 이미 씬에 구성한 라이팅을 플루이드 시뮬레이션 렌더링에 적용하도록 디자인되었습니다. 이 렌더링 타입은 디렉셔널 라이트뿐 아니라 모든 라이트 타입에서 작동합니다. 사용할 수 있는 라이트 수에 제한은 없지만, 현재 구현은 각 라이트가 추가됨에 따라 비용이 높아집니다.

레벨에 다른 오브젝트가 있는 경우 이 오브젝트도 플루이트 볼륨에 섀도를 캐스팅할 수 있습니다. 이는 보다 사실적인 모습을 연출하여 플루이트 이펙트가 씬에 한층 매끄럽게 통합되도록 해줍니다.

이 실험단계 기능을 활성화하려면 프로젝트 세팅 에서 이종 볼륨 활성화(Enable Heterogeneous Volumes) 를 선택하여 활성화하고 머티리얼 MI_HeterogeneousVolumes_GasExplosionCine 를 메시 렌더러 또는 플루이드 시뮬레이션에 적용하면 됩니다.

플루이드 퀄리티 향상(베타)

이 버전에서는 나이아가라 플루이드에 몇 가지 퀄리티 및 퍼포먼스 향상이 이뤄졌습니다.

  • 터뷸런스 모델이 향상되었습니다.

  • 소규모 스케일 포스가 향상되어 시뮬레이션 앞부분의 디테일을 높여줍니다.

  • 시뮬레이션의 해상도를 높이지 않고도 추가적으로 디테일을 향상시켜 주는 트라이큐브 보간이 추가되었습니다. 단, 이 모드는 퍼포먼스에 영향을 미칩니다.

  • 플루이드의 퍼포먼스가 전반적으로 향상되었습니다.

UX/UI 향상

나이아가라 에디터의 새로운 레이아웃

나이아가라 에디터 의 레이아웃이 간소화되었습니다. 파라미터(Parameters) 패널이 왼쪽 하단으로 이동하여 중앙의 시스템 개요(System Overview)를 더 넓게 볼 수 있습니다. 커브 에디터(Curve Editor)로그(Log) 는 하단의 타임라인(Timeline) 옆에 도킹됩니다.

Niagara Editor New Layout

파라미터 패널이나 선택(Selection) 패널 같은 패널은 이제 컨텍스트를 인식하여 선택한 항목에 따라 업데이트됩니다.

레벨 에디터의 사용자 파라미터

이전에는 레벨 에디터(Level Editor)에서 나이아가라 액터를 선택하면 파라미터 오버라이드(Override Parameters) 라는 섹션이 표시되었습니다. 이 섹션의 이름이 이제 사용자 파라미터(User Parameters) 로 변경되었습니다.

스크래치 스크립트 매니저

이전의 스크래치 패드(Scratch Pad) 인터페이스는 나이아가라 에디터에서 직접 스크래치 모듈을 생성하는 새 워크플로로 대체되었습니다. 필요한 수만큼 스크래치 모듈을 추가하고 각각을 나이아가라 에디터의 자체 탭에 표시할 수 있습니다.

Scratch Pad Tab in Niagara Editor

파라미터에 대한 계층구조 에디터

많은 수의 커스텀 사용자 파라미터를 생성하는 경우에는 파라미터 패널에서 이를 정리하는 것이 어려울 수 있습니다. 계층구조 에디터(Hierarchy Editor) 에서는 변수를 범주화하고 정리할 뿐 아니라 변수의 디폴트 값을 구성할 수도 있습니다.

Niagara Hierarchy Editor

레벨 에디터의 이펙트 섹션

레벨 에디터에서 나이아가라 시스템을 선택하면 이제 디테일 패널에 이펙트(Effects) 라는 섹션이 표시됩니다. 이는 나이아가라에서 편집해야 하는 파라미터를 빠르게 가려내는 데 도움이 됩니다.

Effects Section in Details Panel

시스템 또는 파라미터 디버깅

나이아가라 디버거(Niagara Debugger) 를 열고 분석할 엘리먼트를 트래킹하는 새로운 방법이 추가되었습니다.

특정 시스템에서 디버거를 빠르게 켜려면 레벨 에디터에서 나이아가라 컴포넌트를 클릭하고 디테일 패널에서 디버그 를 선택합니다. 그러면 시스템 정보가 이미 설정된 나이아가라 디버거가 열립니다.

Niagara Debug HUD

파티클 수명 등 특정 파라미터를 디버그할 수도 있습니다. 나이아가라 에디터의 파라미터 패널에서 트래킹할 파라미터를 우클릭하고 나이아가라 디버거에서 파라미터 감시(Watch Parameter in Niagara Debugger) 를 선택합니다.

Watch Parameter in Niagara Debugger

그러면 자동으로 디버거에서 해당 파라미터 정보를 보는 데 필요한 모든 관련 옵션이 켜집니다.

자세한 내용은 나이아가라 디버거 문서를 참고하세요.

접근성 향상

UE 5.1의 접근성 툴이 다음과 같이 향상되었습니다.

멀티 유저 스크린 리더 지원

스크린 리더(Screen Reader) 플러그인은 이제 한 번에 다수의 사용자를 지원하여 시각 장애를 겪고 있는 여러 사용자가 동시에 플레이할 수 있게 해줍니다. 사용자의 입력 디바이스에서 특수 오디오 포트(예: 게임 콘솔 컨트롤러에 있는 포트)를 사용할 수 있는 경우 각 사용자는 헤드폰 세트를 연결하여 각 사용자 스크린 리더의 음성을 별도로 출력할 수 있습니다. PC 사용자 및 헤드폰이 없는 사용자의 경우에는 스크린 리더가 사용자별 다른 피치로 음성을 출력합니다. 스크린 리더 사용자는 FScreenReaderUser 클래스로 표현되며 이는 음성 안내를 요청하고, 현재 포커싱된 액세스 가능 위젯에 대한 정보를 유지하고, 사용자의 탐색 방식을 정의하기 위해 새 내비게이션 정책을 사용할 수 있습니다.

내비게이션 정책

이제 시각 장애를 겪고 있는 사용자가 화면을 탐색하는 방식을 미세조정하는 내비게이션 정책 을 정의할 수 있습니다. 이는 상업용 스크린 리더의 작동 방식과 유사합니다. 내비게이션 정책을 생성하려면 IScreenReaderNavigationPolicy 를 구현하는 클래스를 생성합니다. 그런 다음 FScreenReaderUser::SetNavigationPolicy 를 사용하고 사용할 항목에 대한 공유 레퍼런스를 제공하여 스크린 리더 사용자에 대한 내비게이션 정책을 설정할 수 있습니다.

언리얼 인사이트

언리얼 인사이트(Unreal Insights)는 게임의 CPU 및 메모리 퍼포먼스를 분석하고 프로파일링할 수 있도록 지원하는 언리얼 엔진의 보조 애플리케이션입니다. 자세한 내용은 언리얼 인사이트 문서를 참고하세요.

상단 메뉴

다음과 같은 새로운 상단 메뉴 명령을 사용할 수 있습니다.

  • 테이블 임포트(Import Table): 타이밍 인사이트(Timing Insights) 에서 분석할 .csv 또는 .tsv 테이블을 임포트할 수 있습니다. 모든 테이블에 그룹화 및 계층형 경로 분석 기능을 적용할 수 있습니다.

  • 세션 브라우저(Session Browser): 세션 브라우저 를 닫은 경우 열린 트레이스 파일에서 다시 열 수 있습니다.

  • 트레이스 파일 열기(Open Trace File): 타이밍 인사이트에서 이미 열려 있는 트레이스가 있는 경우 다른 트레이스 파일을 열어 현재 세션을 대체하거나 두 번째 세션을 열 수 있습니다.

  • 라이브 트레이스 자동 열기(Auto Open Live Trace): 활성화된 경우 현재 세션이 라이브 트레이스로 자동으로 변경됩니다.

세션 브라우저

이제 언리얼 인사이트에서 트레이스 세션 목록을 필터링 및 정렬하여 찾으려는 특정 데이터를 더 잘 분석할 수 있습니다.

이름 또는 명령줄로 트레이스를 검색할 수 있습니다.

Searching Trace Filter

이제 트레이스에서 우클릭하여 세션 브라우저에서 직접 트레이스 세션을 이름변경하고 삭제할 수 있습니다. 컨텍스트 메뉴에서 삭제하거나 이름을 변경하면 트레이스 파일 및 관련된 캐시 파일이 삭제되거나 이름이 변경됩니다.

메모리 인사이트

메모리 트레이스를 캡처하려면 세션을 명령줄에서 시작해야 합니다. 녹화를 시작하려면 trace=default,memory 추가 실행인자와 함께 명령줄에서 에디터 또는 게임을 실행합니다. 명령줄에서 이 실행인자로 시작하는 이유는 트레이스 정보가 엔진 초기화 즉시 트래킹되어야 하기 때문입니다.

에셋 이름 및 클래스 이름

이제 명령줄에서 추가 트레이스 채널 metadataassetmetadata 를 사용하여 메모리 인사이트를 시작할 수 있습니다. 이렇게 하면 추가 필터링 옵션을 위해 에셋 이름 및 클래스 이름이 메모리 인사이트 세션에 제공됩니다. 예를 들어 에셋 이름별 또는 클래스 이름별로 메모리 할당 비용을 계산할 수 있습니다.

트리 뷰 향상

이제 스트링 열 그룹화를 위한 경로 분석(Path Breakdown) 옵션이 제공됩니다. 이 옵션을 선택하면 접을 수 있는 계층구조 뷰가 생성됩니다. 이를 통해 로우 레벨 메모리(Low-Level Memory, LLM) 태그, 에셋 및 상위 소스 파일을 그룹화할 수 있습니다.

이렇게 그룹화하면 시각적으로 정리하는 데 유용할 뿐 아니라 부모 그룹의 비용을 확인할 수도 있습니다.

Visual Studio에서 열기

언리얼 인사이트의 이전 버전에서는 콜스택으로 그룹화된 항목을 우클릭하고 컨텍스트 메뉴에서 Visual Studio에서 열기(Open in Visual Studio) 를 선택하여 열 수 있었습니다. 최신 버전에서는 콜스택으로 그룹화되어 있지 않은 경우에도 이 옵션을 사용할 수 있습니다. 예를 들어 태그로 그룹화한 경우 할당을 우클릭하고 Visual Studio에서 열기를 선택합니다.

모듈 뷰

메모리 인사이트의 모듈 뷰(Modules View)는 모든 .dll 파일을 표시합니다. 이 버전에서는 통계 정보를 별도의 열로 분할하여 쉽게 정렬할 수 있게 했습니다. 이제 각 열은 발견됨, 캐시됨, 해결됨, 실패를 나타내는 기호로 구분됩니다.

Modules View

실패한 목록 항목은 빨간색으로 하이라이트되며, 올바르게 해결된 목록 항목은 녹색으로 하이라이트됩니다. 노란색은 일부는 해결되고 일부는 실패했음을 나타냅니다.

네트워킹 인사이트

패킷 뷰

패킷 뷰(Packet View) 에서 이벤트를 하이라이트하여 특정 이벤트에서 몇 개의 비트가 패킷을 사용하고 있는지 확인할 수 있습니다. 이를 통해 이벤트가 다른 데이터에 비해 얼마나 많은 대역폭을 사용 중인지 빠르게 확인할 수 있습니다.

다음 중 하나를 하이라이트할 수 있습니다.

  • 이벤트의 모든 인스턴스에 대해 집계된 비트 수

  • 단일 이벤트에서 사용되는 최대 비트 수

넷 통계 카운터

넷 통계 카운터(NetStatsCounters)라는 새 탭에서는 선택된 패킷 또는 패킷 범위의 리플리케이션 시스템과 관련된 통계 카운터를 볼 수 있습니다. 통계에는 다음의 두 가지 카테고리가 있습니다.

  • 프레임 통계(FrameStats): 전체 프레임에 대한 통계 카운터입니다. 일반적으로 모든 연결에서 공유되는 작업에 대한 네트워킹 관련 통계 카운터 리포팅에 사용됩니다. 예를 들어 이 프레임에서 현재 업데이트되고 있는 오브젝트 수가 여기에 해당합니다.

  • 패킷 통계(PacketStats): 특정 패킷과 관련된 통계 카운터입니다. 예를 들어 시리얼라이즈가 예약된 오브젝트의 수, 패킷에 실제로 피팅되는 수 등이 여기에 해당합니다.

넷트레이스

매크로 UE_NET_TRACE_PACKET_STATSCOUNTERUE_NET_TRACE_FRAME_STATSCOUNTER 를 사용하여 네트워크 트레이스 데이터와 관련된 단순 통계를 트레이싱할 수 있습니다. 이러한 매크로로 트레이싱된 데이터는 네트워크 인사이트(Network Insights)의 넷 통계 카운터 탭에 표시됩니다.

타이밍 인사이트

태스크 인사이트

ParallelFor 작업에 대한 지원이 추가되었습니다.

쿠킹 인사이트

쿠킹 인사이트(Cooking Insights) 는 패키지가 쿠킹되는 방식에 대한 정보를 수집 및 표시하는 프로파일링 방법을 제공합니다. 쿠킹 세션 기록을 시작하려면 명령줄에서 -trace=default,cook 실행인자를 사용하여 시작합니다.

쿠킹 채널을 활성화하면 타이밍 인사이트에 패키지(Packages) 패널이 추가됩니다. 이는 쿠킹 이벤트와 연결된 모든 패키지 목록을 표시합니다. 각 패키지마다 LoadTime, SaveTime, BeginCache, IsCacheCooked, Asset Class 같은 통계를 사용할 수 있습니다. 각각은 그룹화 및 정렬 가능한 열에 표시됩니다.

Packages View

그룹화(Grouping) > 경로 분석 - 패키지 이름(Path Breakdown - Package Name) 옵션을 사용하여 접을 수 있는 데이터 계층구조 뷰를 생성합니다. 에셋 클래스별로 그룹화할 수도 있습니다.

동시 실행 루틴

게임에서 동시 실행 루틴(coroutines)을 사용하는 경우, 이제 이를 타이밍 인사이트에서 확인할 수 있습니다. 동시 실행 루틴은 한 스레드에서 무언가가 실행을 시작하고 다른 스레드에서 끝내는 것을 가리킵니다. 이제 동시 실행 루틴 맞춤형 타이밍 이벤트가 표시됩니다.

스크린샷 트레이싱

이제 타이밍 인사이트에서 스크린샷을 활성화할 수 있습니다. 스크린샷 트레이싱(Screenshot Tracing) 을 활성화하면 스크린샷을 찍을 수 있으며 빨간색 수직선이 타이밍 인사이트 타임라인에 표시됩니다. 또한 스크린샷 섬네일도 표시되므로 타이밍 인사이트에서 시각적으로 디버깅하는 데 유용합니다.

스크린샷 트레이싱을 활성화하려면 명령줄에서 -trace=default,screenshot 실행인자를 사용하여 시작합니다.

스크린샷 트레이싱이 활성화되면 콘솔 명령에 trace.screenshot 을 입력하여 해당 프레임에서 스크린샷을 찍을 수 있습니다.

에셋 로드 시간

타이밍 인사이트를 시작할 때 명령줄에서 에셋 로드 시간(Asset Load Time) 이라는 새 채널을 추가할 수 있습니다. 이 채널의 역할은 두 가지입니다.

  1. UObject::Serialize 에 명명된 CPU 타이머를 활성화합니다.

  2. 블루프린트 이름 트레이싱을 토글합니다.

이전에는 블루프린트 이름 트래킹이 기본적으로 활성화되었지만, 이 경우 런타임 트레이스 이벤트에 많은 비용이 추가됩니다. 이제 블루프린트 이름 트레이싱을 활성화하려면 이 실행인자를 명령줄에서 켜야 합니다.

에셋 로드 시간 트래킹을 명령줄에서 활성화하려면 -trace=default,AssetLoadTime 실행인자를 사용하면 됩니다.

하지만 블루프린트 이름이 토글될 때 많은 타이머가 추가되므로 트레이스 인사이트에서는 기본적으로 숨겨져 있습니다. 에셋 로드 시간 트래킹을 활성화한 후 -statnamedevents 실행인자를 사용하여 블루프린트 이름을 표시할 수 있습니다.

복사 및 붙여넣기

UE 5.0에서는 타이밍 이벤트를 복사하면 이름만 복사되었습니다. 이제는 Ctrl + C로 타이밍 이벤트를 복사하면 이름, 경과시간 및 관련 메타데이터를 타이밍 인사이트 패널에서 표시되는 대로 복사합니다.

UI를 열지 않고 명령 실행하기

타이밍 인사이트는 UI를 열지 않고 명령줄에서 바로 실행할 수 있습니다. 명령줄에서 단일 명령을 지정하거나 응답 파일을 사용하여 일련의 명령을 실행할 수 있습니다. 두 경우 모두 데이터 세트가 .csv 또는 .tsv 파일로 익스포트됩니다.

  • TimingInsights.ExportThreads: 이 명령은 GPU 및 CPU 스레드 목록을 익스포트합니다.

  • TimingInsights.ExporTimers: 이 명령은 GPU 및 CPU 타이머 목록을 익스포트합니다.

  • TimingInsights.ExportTimingEvents: 이 명령은 GPU 및 CPU 타이밍 이벤트 목록을 익스포트합니다. 익스포트되는 이벤트 목록은 스레드, 타이머 또는 시간 범위로 필터링할 수 있습니다.

  • TimingInsights.ExportTimerStatistics: 이 명령은 GPU 및 GPU 타이머 목록과 집계된 통계를 익스포트합니다.

이러한 명령은 자동화된 테스트를 실행하는 데 유용합니다.

명령줄에서 명령을 직접 실행하는 방법에 대한 자세한 내용은 타이밍 인사이트 문서를 참고하세요.

트레이스

콘솔 명령

언리얼 인사이트가 trace.starttrace.stop 등을 사용하여 파일 트레이스를 시작하거나 멈출 때 UE에서 사용할 수 있는 기존 콘솔 명령이 몇 가지 있습니다. UE 5.1에서는 두 가지 콘솔 명령이 새로 추가되었습니다.

  • Trace.SnapshotFile <filename>: 이 명령은 현재 메모리 내 트레이스 버퍼의 스냅샷을 파일에 씁니다. 이미 트레이싱이 활성화된 경우 활성 트레이스에 영향을 미치지 않지만 이 스냅샷을 위해 두 번째 트레이스 파일을 병렬로 기록합니다.

  • Trace.Bookmark <name>: 지정된 스트링 이름으로 북마크 이벤트를 내보냅니다. 북마크는 기록된 시간에 타이밍 인사이트에서 수직선으로 나타납니다. 이전에는 TRACE_BOOKMARK() 로 API를 통해서만 사용할 수 있었습니다.

  • Trace.Screenshot <Name> <bIncludeUI>: 위에서 언급했듯이 이 콘솔 명령을 실행하여 수직선을 생성하고, 선택적으로 타이밍 인사이트의 스크린샷에 대해 true 또는 false를 지정하여 UI를 포함할 수 있습니다.

명령줄 파라미터

트레이스 자동 시작

트레이싱을 프로젝트 시작 시 자동으로 시작할지, 콘솔 명령에서 트레이스 명령이 개시되기를 기다릴지 선택할 수 있습니다. UnrealInsights.exe 의 디폴트 행동은 자동 시작 활성화입니다.

자동 시작이 활성화된 경우 언리얼 인사이트 세션 브라우저가 실행 중인 것으로 감지되면 해당 런타임이 자동으로 로컬 트레이스 서버와 연결을 시도합니다.

트레이스 스레딩 없음

모든 트레이싱 정보를 캡처하는 전용 스레드인 워커 스레드(worker thread)를 사용하여 런타임에서 트레이싱을 수행할 수 있습니다. 또는 정규 프레임 끝의 게임 스레드에서 직접 트레이싱할 수도 있습니다. 게임 스레드를 사용하면 게임 퍼포먼스에 영향을 미칩니다.

기본적으로 권장 구성인 워커 스레드를 사용합니다. 하지만 서버의 경우 워커 스레드를 사용할 수 없는 경우도 있습니다. 이 경우 명령줄 파라미터 -notracethreading 을 사용하여 워커 스레드를 비활성화하고 게임 스레드를 사용할 수 있습니다.

데이터스미스

새 3ds Max 플러그인

데이터스미스 3ds Max 플러그을 완전히 새로 작성하고 모든 데이터스미스 기능을 3ds Max의 새 리본 툴바에 통합했습니다. 새 플러그인은 퍼포먼스를 향상하며 여러 새롭고 향상된 기능을 제공합니다.

The Datasmith 3ds Max Ribbon

다이렉트 링크 지원

새로운 3ds Max용 데이터스미스 플러그인은 다이렉트 링크 를 지원합니다. 이제 3ds Max 프로젝트를 언리얼 엔진 프로젝트에 연결하고 수동으로 동기화하거나 다이렉트 링크 자동 동기화 기능을 통해 자동으로 동기화할 수 있습니다.

신규 및 향상된 플러그인 호환성

새로운 3ds Max용 데이터스미스 플러그인에서는 다음 지원이 향상되었습니다.

  • VRay: 머티리얼 파라미터 및 프록시 메시 지원 강화

  • Corona: PBR 머티리얼 및 프록시 메시 지원

  • RailClone: 익스포트 향상, RailClone5 지원

  • Forest Pack: 익스포트 향상, Forest Pack 7 지원

구워진 텍스처 해상도 제어

구워진 3ds Max 텍스처가 이제 4096 해상도로 자동으로 익스포트되지 않으며, 최대 해상도를 64~4096으로 제한할 수 있습니다. 이는 복잡한 머티리얼을 갖춘 대규모 씬에서 임포트/익스포트 퍼포먼스를 향상합니다.

XRef 씬 익스포트 토글

XRef 씬은 외부 3ds Max 파일에서 현재 파일로 로드되는 씬입니다. 3ds Max 프로젝트를 데이터스미스로 익스포트하는 경우 XRef 씬도 같이 익스포트할지 선택할 수 있습니다. XRef 씬 익스포트는 새 리본 툴바에서 토글할 수 있습니다.

향상된 라이트 익스포트

이제 데이터스미스는 지원되는 라이트 타입에서 다음과 같은 더 많은 파라미터를 지원합니다.

  • ArnoldLight

  • CoronaSun

  • PhotometricLight 및 TPhotometricLight

  • VRaySun

텍스맵 변환

3ds Max용 새 데이터스미스 플러그인은 자동으로 비트맵, 노멀, 범프, 프로시저럴, 구워진 텍스맵(Texmap)을 변환합니다.

Revit 플러그인 향상

이 출시 버전에서 Revit 데이터스미스 익스포터 에 다이렉트 링크 자동 동기화가 추가되었습니다. 자동 동기화가 활성화된 경우 언리얼 프로젝트는 링크된 Revit 프로젝트가 변경된 경우 자동으로 동기화됩니다.

데이터스미스 세팅은 이제 Revit 프로젝트 파일에 커스텀 데이터로 저장됩니다.

또한 이 출시 버전에서는 Revit의 다음과 같은 정보를 익스포트하는 지원이 추가됩니다.

  • 뷰: 현재 어떤 뷰에서 작업 중이든 Revit 프로젝트에서 익스포트할 뷰를 지정할 수 있습니다.

  • 커스텀 원점: Revit의 베이스 포인트 또는 서베이 포인트를 언리얼 엔진의 삽입 포인트로 사용할 커스텀 원점 포인트로 정의할 수 있습니다.

  • 데칼: 데이터스미스는 이제 Revit 데칼을 언리얼 엔진 데칼로 익스포트합니다.

SketchUp 플러그인 향상

이 출시 버전에서는 SketchUp 용 데이터스미스 플러그인을 최적화하는 데 주력했습니다.

데이터스미스가 복잡한 계층구조를 익스포트하는 방식을 향상했습니다. 그룹 헤드 또는 컴포넌트 헤드별로 액터 하나, 그룹 또는 컴포넌트 내의 모든 메시마다 액터 하나를 익스포트하는 대신 데이터스미스는 그룹 및 컴포넌트의 메시를 자동으로 병합합니다. 이를 통해 언리얼 엔진의 계층구조가 한층 간소화되어 SketchUp 아웃라이너와 비슷하게 되었습니다.

SketchUp에서 Color by Tag 기능을 사용하여 오브젝트의 컬러를 설정한 경우, 데이터스미스에서 이제 해당 컬러를 익스포트합니다.

이미지에 대한 지원도 추가했습니다. SketchUp용 데이터스미스 플러그인은 이제 이미지를 텍스처가 있는 메시 액터로 익스포트합니다.

SolidWorks 플러그인 향상

SketchUp용 데이터스미스 플러그인은 이제 더 많은 SolidWorks 기능을 지원합니다. 이제 SolidWorks 환경설정 디스플레이 상태를 레벨 베리언트 세트의 베리언트로 익스포트할 수 있습니다. 또한 사용자가 생성한 디렉셔널 라이트, 스포트 라이트, 포인트 라이트를 위치, 원뿔 각도, 밝기, 컬러 데이터와 함께 익스포트할 수 있습니다.

향상된 비주얼 데이터프렙 메타데이터 처리

비주얼 데이터프렙(Visual Dataprep)은 언리얼 엔진 프로젝트에서 최종 에셋과 액터를 생성하기 전에 씬 엘리먼트를 재구성, 정리, 병합, 수정하는 재사용 가능 임포트 레시피를 생성하는 시스템입니다.

UE 5.1의 경우 비주얼 데이터프렙에서 메타데이터로 작업하기 위한 몇 가지 사용성을 향상했습니다.

메타데이터 키와 값을 이제 보다 쉽게 읽고 선택할 수 있으므로 이를 수동으로 복사하는 대신 복사하여 필터 필드에 붙여넣을 수 있습니다.

또한 키에 대한 새 스트링 매칭 옵션도 추가했습니다. 메타데이터로 필터링할 때 contains 표현식을 사용하여 유사한 접두사, 접미사 등이 있는 모든 키를 처리할 수 있습니다. 따라서 동일한 키에 대해 약간 다른 이름을 사용하는 애플리케이션에서 중요한 모델 임포트 프로세스를 작성할 때 시간을 절감할 수 있게 되었습니다.

유니버설 씬 디스크립션(USD) 파일 워크플로

언리얼 엔진 5.1에서는 유니버설 씬 디스크립션(Universal Scene Description, USD) 파일 작업을 위한 몇 가지 기능 및 워크플로가 향상되었습니다.

라이브 링크 통합

이제 라이브 링크를 사용하여 언리얼 엔진 내 USD 파일의 콘텐츠와 외부 소스를 동기화할 수 있습니다. USD 스테이지(USD Stage) 창의 새 라이브 링크 구성 옵션(Set up Live Link) 옵션을 사용하여 Autodesk Maya 등 DCC 애플리케이션을 캐릭터가 있는 언리얼 엔진의 USD 씬과 연결하면 해당 DCC를 사용하여 캐릭터를 구동할 수 있습니다. 링크/USD 통합은 모션 캡처 작업에도 유용합니다. USD를 사용하여 캐릭터가 있는 씬을 언리얼 엔진으로 로드한 후 모션 캡처가 USD 씬에서 캐릭터를 구동하게 할 수 있습니다.

컨트롤 릭 통합

USD 스테이지(USD Stage) 창의 새 컨트롤 릭 구성(Set up Control Rig) 옵션을 사용하면 컨트롤 릭을 언리얼 엔진의 USD 파일에 있는 캐릭터에 연결할 수 있습니다. 컨트롤 릭을 사용하여 스켈레탈 애니메이션을 생성 및 편집하고 애니메이션 데이터를 다시 USD 파일에 저장할 수 있습니다. 컨트롤 릭 에셋을 구성하거나 FK 컨트롤 릭을 생성할 수 있습니다.

프리미티브 편집 옵션

USD 스테이지 창에 프리미티브 편집을 위한 몇 가지 옵션을 추가했습니다. 여기에는 다음이 포함됩니다.

  • 프리미티브 자르기, 복사, 붙여넣기 명령

  • 프리미티브를 다양한 방식으로 복제하는 옵션. 예를 들어 구성된 프리미티브의 병합된 복제를 생성하거나 단일 레이어를 복제할 수 있습니다.

*단독 모드. 특정 레이어를 분리시켜서 작업할 수 있어 편집 히스토리를 검토하거나 수정할 때 유용합니다. 단독 모드에서 적용한 변경사항은 분리된 레이어에 적용됩니다.

  • USD 스테이지에서 레퍼런스를 추가하면 이제 레퍼런스된 파일에서 타깃 프리미티브를 지정할 수 있습니다.

  • 이제 레퍼런스를 추가하듯이 USD 스테이지에 페이로드를 추가할 수 있습니다.

그룸 지원

USD 파일에 그룸 지원을 추가했습니다. 이제 그룸 캐시 및 스태틱 그룸 파일을 에셋으로 임포트하고 Alembic으로 임포트된 그룸 에셋과 같은 방식으로 사용할 수 있습니다. USD 스테이지에서 로드할 수도 있습니다.

USD 임포터는 커스텀 그룸 API 스키마를 사용하여 USD BasisCurves에서 그룸을 임포트합니다. 또한 임포터는 Alembic 그룸 사양을 따르는 Alembic 그룸도 지원하므로 USD 파일에 레퍼런스된 Alembic 그룸을 임포트할 수 있습니다.

뿐만 아니라 스켈레탈 메시 또는 지오메트리 캐시에 그룸을 바인딩하는 데 사용할 수 있는 새로운 그룸 바인딩 API 스키마를 추가했습니다. 이제 캐릭터에서 그룸을 구성하고, USD 스테이지로 결과를 로드하고, 시뮬레이션과 캐릭터 애니메이션을 언리얼 에디터에서 함께 재생할 수 있습니다.

기타 데이터 포맷

glTF

Khronos Group의 GL 트랜스미션 포맷(GL Transmission Format, glTF™)은 확장 가능한 공개 표준 파일 포맷으로, 작은 파일 크기와 빠른 로딩, 완전한 씬 표현을 위해 디자인되었습니다. 트윈모션에서 모델을 임포트 및 익스포트하는 데 사용되며 스케치팹 툴 및 라이브러리에 선호되는 교환 포맷입니다.

이 출시 버전에서는 glTF 지원이 향상되었고 언리얼 엔진과 더 긴밀하게 통합했습니다.

기존 glTF 임포터 및 데이터스미스 glTF 임포터 플러그인은 향후 출시 버전에서 제거될 예정입니다.

  • glTF 임포터는 이제 다음을 지원합니다.

  • 이전에는 외부 플러그인으로 사용 가능했던 glTF 익스포터가 이제 언리얼 엔진의 일부로 통합되었습니다. 현재는 별도로 활성화해야 합니다.

  • 캐릭터 인코딩이 향상되어 액터와 에셋의 비영어 이름 및 라벨이 이제 정확하게 익스포트됩니다.

CADKernel

CadKernel 은 언리얼 엔진에 임포트하는 CAD 모델을 테셀레이팅하기 위한 대안 알고리즘입니다. 디폴트 알고리즘과 동일한 테셀레이션 파라미터를 사용하지만 경우에 따라 더 좋은 결과를 보여줍니다. 특히 방사상 기능을 갖춘 모델의 경우 그렇습니다. 또한 CADKernel은 테셀레이션 이후 남아 있는 오픈 에지의 수를 제한하는 데 뛰어납니다.

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

왼쪽: 디폴트 언리얼 엔진 알고리즘으로 테셀레이팅된 CAD 모델, 오른쪽: CADKernel로 테셀레이팅된 동일한 모델

CADKernel을 활성화하려면 ds.CADTranslator.DisableCADKernelTessellation 콘솔 변수를 False 또는 0 으로 설정합니다. 변수는 콘솔 변수 매니저에서 변경할 수 있습니다.

CADKernel을 활성화하면 언리얼 엔진은 CAD 모델 임포트 시 이를 자동으로 사용합니다. 이미 CAD 모델을 임포트한 경우 언리얼 엔진이 CADKernel로 이를 다시 테셀레이팅하게 하려면 전체 리임포트를 수행하면 됩니다.

MaterialX

MaterialX 는 풍부한 머티리얼 및 외형을 표현하고 이를 플랫폼 및 애플리케이션 간에 쉽게 이전하는 데 사용되는 공개 표준입니다. 언리얼 엔진 5.1의 새 MaterialX 임포터는 다음 Material X 노드를 지원합니다.

  • Autodesk 표준 표면 머티리얼의 모든 입력

  • 포인트 라이트, 스포트 라이트, 디렉셔널 라이트

  • MaterialX 표준 데이터 타입 및 노드의 서브셋

지원되는 데이터 타입 및 노드의 전체 목록은 MAterialX 지원[XREF] 문서를 참고하세요.

LiDAR 포인트 클라우드 향상

LiDAR 포인트 클라우드 에셋 편집 툴 이 언리얼 엔진 5 프레임워크로 마이그레이션되었습니다. 이제 새로운 LiDAR 모드에서 모든 포인트 클라우드 편집 툴에 액세스할 수 있으며, 이 모드는 메인 툴바의 모드 선택(Select Mode) 드롭다운에서 제공됩니다.

이번 업데이트를 통해 포인트 클라우드 편집 워크플로가 메시 편집과 같은 다른 언리얼 에디터 워크플로와 비슷해졌습니다. 포인트 클라우드 에셋에서 콜리전을 선택, 병합, 편집 및 생성하고 결과를 레벨에서 프리뷰할 수 있습니다.

워크플로 향상

이제 포인트 클라우드 선택 툴(예: 올가미 툴 또는 폴리곤 선택 툴)을 사용하여 선택에서 포인트를 더하거나 뺄 수 있습니다. 클라우드에서 포인트를 추출하는 것 외에도 선택된 포인트에서 스태틱 메시를 생성할 수 있습니다.

포인트 노멀을 위한 새 옵션

포인트 클라우드 액터는 이제 포인트 오리엔테이션 세팅을 제공합니다. 이 세팅을 통해 포인트 카드가 항상 카메라를 향하지 않고 계산된 노멀을 따라 정렬되도록 할 수 있습니다. 노멀 페이싱 카드는 비주얼과 라이팅 인터랙션 측면에서도 더 뛰어난 결과를 보여줍니다.

이제 LiDAR 포인트 클라우드 플러그인은 노멀 데이터를 포함하는 ASCII 파일 및 E57 파일에서 노멀을 임포트할 수 있습니다.

새 포인트 컬러 옵션

포인트 클라우드 액터의 새 컬러 소스(Source) > 분류 알파가 있는 데이터(Data with Classification Alpha) 프로퍼티를 사용하면 포인트 분류를 기반으로 포인트의 RGB 컬러를 커스텀 알파 값과 혼합할 수 있습니다. 이는 분류를 기반으로 전체 포인트 그룹을 표시하고 숨기거나 페이드할 때 유용합니다.

베리언트 매니저

이 출시 버전에서 베리언트 매니저(Variant Manager) 툴을 언리얼 엔진 5 프레임워크로 이주했습니다. 이제 UE 5.1의 다른 툴과 일관된 룩 앤 필을 갖추게 되었습니다. 디자인 피드백을 바탕으로 유저 인터페이스도 향상되어 보다 시각적으로 보기 좋고 사용하기 쉽게 만들었습니다.

The previous variant manager in Unreal Engine 5.0

The new variant manager in Unreal Engine 5.1

위: 언리얼 엔진 5.0의 이전 베리언트 매니저, 아래: 언리얼 엔진 5.1의 새 베리언트 매니저

RAD 툴

우들 텍스처 2.9.7

  • 모든 플랫폼에서 동일한 비트 출력

  • 더 빠른 ARM 64 인코더

텍스처 인코딩 공유

  • 모든 플랫폼 대상

Bink

  • 표준 SRT 자막 파일 지원

온라인

온라인 서비스 플러그인

언리얼 엔진의 새 온라인 서비스(Online Services) 플러그인은 이제 완전히 정의된 인터페이스를 갖췄으며 실험단계에서 베타로 전환되었습니다. 이 플러그인은 기존 온라인 서브시스템 플러그인과 함께 작동하며 둘 모두 사용할 수 있습니다.

새 온라인 서비스 플러그인의 장점은 다음과 같습니다.

  • 보다 일관되고 강력한 API

  • 강화된 안전 호출 패턴

  • 향상된 타입 안전성

  • 간소화된 델리게이트 바인딩

  • 기존 구현을 쉽게 확장하는 기능

이제 공유 일반 프레임워크가 제공되어 자체 온라인 백엔드와 함께 사용할 자체 플러그인을 개발하는 것이 더 쉬워졌습니다. 온라인 서비스 플러그인의 프레임워크는 다음을 제공합니다.

  • 비동기 연산 결과 캐싱

  • 비동기 연산 순차 진행

  • 백엔드별 환경설정

  • 실행 명령 핸들러

  • 보일러플레이트 최소화

  • 로깅

이 버전에는 다음 구현이 포함되었습니다.

  • EOS SDK를 사용한 EOS 온라인 서비스 플러그인 구현

  • 개발 용도의 NULL 온라인 서비스 플러그인 구현

  • 새 API를 통해 기존 온라인 서브시스템을 사용하기 위한 OSSAdapter 온라인 서비스 플러그인 구현.

새 온라인 서비스 플러그인에서 사용 가능한 인터페이스는 다음과 같습니다.

  • 업적

  • 인증

  • 커머스

  • 연결 상태

  • 리더보드

  • 로비

  • 현재상태

  • 세션

  • 소셜

  • 통계

  • 타이틀 파일

  • 사용자 파일

  • 사용자 정보

자세한 내용 및 문서는 온라인 서비스 문서를 참고하세요.

라이라

  • 플레이어는 이제 에픽 온라인 서비스(Epic Online Services, EOS) 오버레이를 사용하여 매치메이킹 세션에 친구를 초대하고 참여할 수 있습니다.

네트워킹 및 멀티플레이어

아이리스(실험단계)

아이리스(Iris) 는 새로운 언리얼 엔진 리플리케이션 시스템의 실험단계 구현입니다. 아이리스의 목적은 더 크고 많은 인터랙티브 월드와 플레이어 수, 서버 비용 절감 효과를 제공하는 더 풍부한 멀티플레이어 경험을 활성화하는 것입니다. 아이리스는 다음을 통해 현재 리플리케이션 시스템과 비교하여 리플리케이션의 퍼포먼스를 향상합니다.

  • 리플리케이션을 제약하는 안티패턴을 제거하여 확장성 증대

  • 리플리케이션과 게임 스레드 데이터를 분리하여 동시 실행 지원

  • 다수의 오브젝트 및 연결에서 가능한 한 많은 작업을 공유하여 효율성 향상

아이리스는 옵트-인 시스템이며 당분간은 현재 리플리케이션 시스템과 함께 유지됩니다. 기존 게임 코드는 계속해서 이전과 같이 작동합니다. 아이리스를 선택하려면 게임 코드가 새 엔진 API를 사용해야 합니다. 단, C++ 및 블루프린트의 기존 리플리케이티드 프로퍼티 및 원격 프로시저 호출(Remote Procedure Call, RPC) 정의는 호환성이 유지됩니다.

서브오브젝트 리플리케이션 향상

언리얼 엔진의 리플리케이티드 서브오브젝트(Replicated Subobjects) 는 UObject 파생 클래스 및 포함된 리플리케이티드 프로퍼티를 리플리케이트할 수 있는 방법을 제공합니다. 컴포넌트 및 서브오브젝트 리플리케이션에 사용되는 이전 시스템은 가상 함수 AActor::ReplicateSubobjects 를 이용합니다.

새 시스템을 사용하면 이제 액터가 서브오브젝트를 소유 액터 또는 액터 컴포넌트의 목록에 등록할 수 있게 되며, 이렇게 등록된 서브오브젝트의 리플리케이션은 액터 채널에 의해 자동으로 처리됩니다. 이 프로세스를 통해 서브오브젝트가 리플리케이트되는 시간과 위치를 더 많이 제어할 수 있습니다.

등록된 서브오브젝트 목록(Registered Subobjects List)은 옵트-인 기능입니다. 등록된 서브오브젝트 목록을 활성화하려면 액터 또는 액터 컴포넌트 클래스에서 bReplicateUsingRegisteredSubObjectList = true 로 설정합니다. 그런 다음 ReadyForReplicationBeginPlay 에서 또는 새 서브오브젝트 생성 시 AddReplicatedSubObject 를 호출합니다. 마지막으로, 서브오브젝트를 수정 또는 삭제할 때마다 RemoveReplicatedSubObject 를 호출합니다.

이전 시스템은 당분간 새 시스템과 함께 계속 작동합니다. 등록된 서브오브젝트 목록 활성화 및 새 시스템 활용에 대한 자세한 내용은 리플리케이티드 서브오브젝트 문서를 참고하세요.

템플릿 및 샘플 콘텐츠

시뮬레이션 템플릿

Screenshot of an Unreal Engine project made with a Simulation template

언리얼 엔진 5.1에는 새 시뮬레이션(Simulation) 템플릿 카테고리가 추가됩니다. 시뮬레이션 템플릿은 다양한 엔터프라이즈 시뮬레이션 애플리케이션에 대한 폭넓은 출발점을 제공하며 다음과 같이 사전 구성되어 있습니다.

  • 야외 환경을 위한 특정 세팅

  • 사실적인 스카이 및 라이팅

  • 지오레퍼런싱 툴

자세한 내용은 언리얼 엔진 템플릿 레퍼런스 페이지를 참고하세요.

플랫폼 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 최소 사양: 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 인터페이스 2.5.5

    • 지원되는 IDE: Visual Studio 2019, 2022

  • PS4

    • Orbis SDK 10.008.001

    • 시스템 소프트웨어:

      • 10.008.001

    • 지원되는 IDE: Visual Studio 2019, 2022

  • PS5

    *Prospero SDK 6.00.00.38

    • 시스템 소프트웨어:

      • 6.00.00.42

    • 지원되는 IDE: Visual Studio 2019, 2022

  • macOS

    • 권장 사양

      • 최신 macOS 13 Ventura, 최신 Xcode 14

    • 최소 사양

      • macOS 12 Monterey, Xcode 13.4.1

    • 머신 아키텍처 노트

      • 네이티브 Apple Silicon 지원은 에디터 및 프로젝트 빌드에 대한 macOS 타깃에서 사용 가능합니다. 에디터의 Apple Silicon 지원은 실험단계입니다.

      • 일부 타사 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).