새로운 기능
언리얼 엔진 5.3에서는 핵심 UE5 툴세트가 추가적으로 향상되었습니다. 5.3은 렌더링, 월드 빌딩, 프로시저럴 콘텐츠 생성(Procedural Content Generation, PCG), 애니메이션과 모델링 툴, 버추얼 프로덕션, 시뮬레이션 등의 다양한 분야에서 향상되었습니다.
이 출시 버전에는 GitHub의 언리얼 엔진 개발자 커뮤니티에서 제공한 개선 사항도 포함됩니다. 언리얼 엔진 5.3에 기여해 주신 모든 분들께 감사드립니다.
909185693, 34Pibo, aaronmjacobs, Acren, aijkoopmans, AishaBrown-SMG, aknarts, alexey-pelykh, alwintom, AndreaCatania, AndTikhomirov, ArcEcho, astutejoe, avudnez, baronpumpky, BenVlodgi, BinaerBoy, Bioliquid, BlenderSleuth, bretternst, brycehutchings, c4augustus, CaptainHoke, chalonverse, chrismcr, Cleroth, cneumann, crobertson-d3t, crssnky, David-Vodhanel, dbsigurd, Deathrey, DecoyRS, djethernet1, DomCurry, dorgonman, Drakynfly, DreikaEru, drichardson, dulanw, Dumbeldor, dyanikoglu, Edstub207, erebel55, error454, fieldsJacksonG, FineRedMist, flibitijibibo, foobit, freezernick, gbxAlx, gonfva, hellokenlee, hkzhugc, HSeo, Ilddor, ilkeraktug, ImaginaryBlend, iniside, jackatamazon, JakobLarsson-Embark, jammm, janurbanech13, jcb936, JDCruise, jfgoulet-gearbox, jimsimonz, Johnsel, JonasKjellstrom, jorgenpt, KacperKenjiLesniak, KaosSpectrum, KasumiL5x, KeithRare, kimixuchen, kissSimple, kniteli, KristofMorva, ldisthebest, LennardF1989, Levil0229, lflecunneen, lightbringer, lijenicol, lijie, liuhao0620, loening, LtRandolph, lucyainsworth, MalikuMane, mamoniem, manugulus, marcussvensson92, mariuz, mattiascibien, MaximeDup, microsoftman, MikBou123, mkotlikov, muit, OskarHolmkratz, pepsiandmilk, PhilBax, Phyronnaz, pirskij, praisesolek, projectgheist, QRare, qwe321, RandomInEqualities, Rareden, robert-wallis, RobertVater, roidanton, ryanjon2040, samhocevar, satoshi-iwaki, scorpio20t, Skylonxe, slackba, slonopotamus, Sn-a-ke, SRombauts, steelixb, stlnkm, teessider, tehpola, TheJamsh, TheoHay, Thomasleeee, tianyu2202, tommybear, tonetechnician, ToniSeifert, tuxerr, ukustra, Ultrahead, ungalyant, user37337, Vaei, velvet22, vorixo, Voulz, vsrc, WarmWar, WillmsBenjamin, WinsonSS, xiexbmu, yaakuro, yatagarasu25, yehaike, ZioYuri78, zompi2
렌더링
나나이트

명시적 탄젠트
나나이트는 이제 데이터 형식과 런타임에서 명시적 탄젠트를 지원합니다. 지금까지 나나이트는 스크린 스페이스 위치와 UV 그레이디언트를 기반으로 머티리얼에 암시적으로 파생되는 탄젠트 스페이스에 의존했습니다. 이러한 방식은 계산상으로도 편리하고 메모리 및 디스크 점유율 측면에서 탄젠트의 제한을 풀어주며, 특히 테셀레이트된 메시와 같은 여러 메시 타입에서 실제로 잘 작동합니다. 하지만 특히 로우 폴리 모델의 경우 암시적 탄젠트가 너무 부정확하고 타깃 퀄리티를 달성하기 위해서는 커스텀 버텍스별 탄젠트가 필요했었습니다. 이런 경우를 지원하기 위해 이제는 사용자가 에셋별 기반으로 원본 모델 탄젠트를 저장하고 사용하도록 선택할 수 있습니다. 이를 활성화하면 에셋의 메모리 및 디스크 점유율이 추가적으로 10% 정도까지 증가하여 약간의 비용이 추가될 수 있습니다.
나나이트 스플라인 메시(실험단계)
나나이트 메시에 대해 스플라인 메시 컴포넌트의 초기 구현이 도입되었습니다. 이 기능은 세팅 .ini
파일에서 r.Nanite.AllowSplineMeshes=1을 설정하여 활성화할 수 있습니다. 경고: 현재 이 기능을 활성화하면 모든 나나이트의 컬링 퍼포먼스에 영향을 미치는 퍼포먼스 비용이 발생하며, 극한의 디포메이션에서는 컬링이 잘못되는 알려진 문제가 있습니다.
마스크드 머티리얼 및 픽셀 뎁스 오프셋의 퍼포먼스 향상
프로그래밍 가능한 래스터에 새로운 슬라이딩 창 버텍스 캐시를 사용하면 마스크드 머티리얼 및 픽셀 뎁스 오프셋(Pixel Depth Offset, PDO)이 빨라집니다. 초기 테스트에서는 마스크드 폴리지의 래스터화 속도가 20% 향상되었습니다.
나나이트 선택 외곽선
TSR/TAA가 활성화된 상태에서 나나이트 오브젝트 선택 시 더는 깜박이거나 다른 오브젝트로 가려지지 않고 최종 해상도로 렌더링됩니다.
나나이트 인스턴스드 스태틱 메시/폴리지 인스턴스 선택
에디터에서 나나이트가 활성화된 인스턴스드 스태틱 메시(Instanced Static Mesh, ISM)또는 폴리지 액터의 인스턴스 선택, 수정 또는 삭제와 관련된 다양한 문제가 수정되었습니다.
예비 타깃 세팅
나나이트 스태틱 메시에 '예비 타깃(Fallback Target)' 세팅이 추가되었습니다. 이 메뉴 옵션은 예비 메시에 대해 상대 오차 또는 퍼센트 트라이앵글 중 어떤 타깃으로 축소할지를 보다 명확하게 제어합니다.
루멘

-
루멘 리플렉션은 하드웨어 레이 트레이싱(Hardware Ray Tracing, HWRT)이 히트 라이팅(Hit Lighting)으로 활성화되어 있고 포스트 프로세스 볼륨의 최대 리플렉션 바운스 세팅이 2 이상으로 설정되어 있는 경우 두 번 이상의 바운스를 지원합니다. 이를 통해 바운스를 허용할 퍼포먼스 예산이 충분할 때 리플렉션에서 검은색 영역을 방지할 수 있습니다.
-
스태틱 라이팅을 사용하지만 리플렉션 캡처를 넘어서 리플렉션 퀄리티를 스케일 업하려는 게임 및 애플리케이션의 경우 이제 루멘 GI 없이 루멘 리플렉션을 단독으로 사용할 수 있습니다. 독립형 루멘 리플렉션은 HWRT가 활성화된 경우에만 작동하며, 루멘 GI가 비활성화되어 있는 경우에는 루멘의 표면 캐시 최적화가 제공되지 않기 때문에 히트 라이팅을 자동으로 활성화합니다.
-
콘솔에서 HWRT에 대한 비동기 컴퓨팅 활성화를 포함하여 상당히 많은 루멘 HWRT 최적화가 이뤄졌습니다.
-
루멘 개요 시각화 모드에는 이제 루멘 씬의 지오메트리 노멀 뷰가 포함되어 글로벌 디스턴스 필드(소프트웨어 레이 트레이싱의 경우) 또는 나나이트 예비 메시(HWRT의 경우) 관련 문제를 손쉽게 포착할 수 있습니다.
-
리플렉션 레이 시각화 및 디버깅을 위해 r.Lumen.Reflections.VisualizeTraces가 추가되었습니다.
-
이전에 이미시브 라이팅 및 직접광 위에 적용되던 머티리얼 AO가 수정되었습니다.
직교 렌더링(실험단계)

직교 렌더링은 건축 및 제조 업계에서 프로젝트를 시각화하기 위한 매우 일반적인 방법으로, 게임에서도 독특한 스타일의 카메라 옵션으로 사용됩니다. UE에서도 오랫동안 카메라 옵션으로 제공되었지만 지원되는 렌더링 기능이 많지 않아 실용성이 떨어졌었습니다.
5.3부터는 직교 렌더링이 이제 실험단계로 지원됩니다. 원근 투영과 직교 투영 사이의 동일성을 달성하기 위해 언리얼 엔진의 여러 부분이 수정되었습니다. 루멘, 나나이트, 및 섀도를 포함하여 UE5의 대부분의 최신 기능이 이제 정상적으로 작동합니다. 이러한 노력은 상시적으로 진행되며, 이를 프로젝트에 사용하는 경우 피드백을 보내 주시면 감사하겠습니다.
스파스 볼륨 텍스처(실험단계)

UE 5.3에서는 스파스 볼륨 텍스처(Sparse Volume Texture, SVT)라는 새로운 에셋 타입이 도입되었습니다. SVT는 연기, 불, 물과 같은 볼류메트릭 미디어를 나타내는 구워진 시뮬레이션 데이터를 저장합니다. SVT는 다른 3D 애플리케이션에서 생성된 OpenVDB(.vdb
) 파일을 임포트하여 생성되며, 단일 파일과 애니메이팅된 시퀀스가 지원됩니다. 또한 나이아가라 유체가 이제 SVT에 내부적으로 캐시되어 퍼포먼스 및 메모리가 대폭 향상됩니다.
SVT는 텍셀(복셀)을 3D 데이터 구조에 저장하고 3차원 UV 좌표로 인덱싱할 수 있다는 점에서 3D 텍스처/볼륨 텍스처와 유사합니다. 일반적인 고밀도 볼륨 텍스처와 달리 SVT는 '관심' 데이터가 있는 볼륨 영역에서만 메모리를 사용하기 때문에 고밀도 볼륨 텍스처와 비교할 때 훨씬 더 많은 볼륨이 허용됩니다. 반면, 볼륨 규모가 동일한 경우에는 메모리를 적게 사용합니다.
불균질 볼륨, 볼류메트릭 클라우드, 볼류메트릭 포그와 같은 디퍼드 렌더링 기법은 볼륨 도메인 머티리얼에 일련의 스파스 볼륨 텍스처 머티리얼 노드를 통합하여 SVT를 활용할 수 있습니다. 불균질 볼륨으로 렌더링된 에셋은 새로운 불균질 볼륨 컴포넌트를 사용해야 합니다. 디퍼드 렌더링 기능은 리얼타임 볼륨의 기존 기능 세트로 제한됩니다. 볼륨 렌더링을 위해 보다 완벽한 지원이 이제 패스 트레이서에서 실험단계로 제공되며 스캐터링, 섀도 및 GI를 정확하게 시뮬레이션할 수 있습니다. 또한 대부분의 경우 디버깅에 사용되고 디퍼드 렌더러를 지원하는 매우 간단한 스파스 볼륨 텍스처 뷰어 컴포넌트도 있습니다.
패스 트레이서

-
(실험단계) 패스 트레이서에 이제 연기, 불, 클라우드와 같은 불균질 볼륨을 트레이싱하는 초기 지원이 포함됩니다. 불균질 볼륨은 나이아가라 유체를 사용하거나 스파스 볼륨 텍스처로 구동되는 데이터와 함께 불균질 볼륨 액터를 인스턴스화하는 방식으로 생성될 수 있습니다. VDB 파일은 스파스 볼륨 텍스처로 임포트될 수 있고, 따라서 패스 트레이서에서 렌더링될 수 있습니다. 참고: 이 시스템은 아직 스카이 애트머스피어 클라우드와 호환되지 않습니다.
-
(실험단계) 서브스트레이트 머티리얼이 이제 패스 트레이서에서 지원됩니다.
-
서브서피스 스캐터링 샘플링 효율성이 향상되어 동일한 수의 레이 샘플에서 서브서피스 머티리얼의 노이즈가 감소되었습니다.
-
패스 트레이서가 이제 래스터라이저로 생성된 것을 사용하는 대신 자체 뎁스 패스를 렌더링합니다. 이를 통해 뎁스와 RGB 결과 사이에 일치 정확도가 높아져 뎁스 오브 필드와 같이 뎁스에 의존하는 포스트 프로세싱 패스가 향상되었습니다. 이러한 변경사항은 '레퍼런스 뎁스 오브 필드'에 영향을 미치지 않습니다.
-
이제 머티리얼 그래프에서 DBuffer 데칼 셰이딩 노드가 지원됩니다. 이러한 노드는 5.0부터 사용할 수 있으며, 머티리얼에서 데칼 기능을 대폭 확장합니다. DBuffer 데칼 셰이딩 노드에 대한 문서는 UE 5.3 출시 시 제공될 예정입니다.
-
포스트 프로세스 머티리얼 버퍼에 이제 특히 패스 트레이서에 사용할 수 있도록 추가 출력이 포함됩니다. 이러한 버퍼는 '패스 트레이싱 버퍼 텍스처(Path Tracing Buffer Texture)'라는 머티리얼 그래프에서 새 노드를 통해 액세스할 수 있으며 래디언스, 노이즈가 제거된 래디언스, 알베도, 노멀 및 베리언스 데이터를 제공합니다.
서브스트레이트(실험단계)

5.2에서 실험단계로 출시된 서브스트레이트는 디폴트 라이팅포함이나 클리어 코트와 같은 고정된 셰이딩 모델을 보다 표현력이 풍부하고 표면에 대한 한층 더 넓은 표현 범위와 더 넓은 파라미터 스페이스를 제공하는 모듈형 프레임워크로 대체합니다. 복잡성과 예산에 따라 퍼포먼스를 조절할 수 있으며, 레거시 머티리얼의 비용은 이전과 비슷합니다.
서브스트레이트는 5.3에서도 계속 실험단계 기능으로 제공됩니다. 프로덕션 씬에 사용해서는 안 되지만, 이 개발 단계에서 테스트를 권장하며 피드백을 제공해 주시기 바랍니다.
UE 5.3에는 서브스트레이트 기능, 안정성, 퍼포먼스 측면에서 많은 향상점이 포함되어 있습니다. 일부 변경사항은 다음과 같습니다.
-
기본적으로 자동차 애플리케이션에 유용한 새로운 글린트 및 스페큘러 프로파일 기능
-
향상된 DBuffer 셰이딩 노드 지원
-
고사양 플랫폼을 위한 새로운 퍼즈(Fuzz) 모델
-
머티리얼 퍼포먼스 및 토폴로지 정보가 보다 효과적으로 표시되도록 '머티리얼 에디터(Material Editor)'에서 '서브스트레이트 머티리얼 정보(Substrate Material Information)' 탭이 업데이트되었습니다.
-
다수의 버그 수정 및 퍼포먼스 향상점이 추가되었습니다.
버추얼 섀도 맵

-
UE 5.3에서 버추얼 섀도 맵(Virtual Shadow Map, VSM)에 대한 베타 지정을 제거하여 현재 이 기능은 정식 버전으로 간주됩니다. VSM은 아직 개발 과정이 많이 남아 있지만 이번의 정식 버전 지정에는 현재 작동하는 기능 세트의 안정성과 실행 가능성이 반영되었습니다.
-
VSM은 이제 섀도 캐싱이 활성화되어 있는 경우에도 나나이트 컬 디스턴스를 따릅니다. 이전에는 캐싱이 활성화되어 있는 경우 프라이머리 렌더 맵과 섀도 맵 사이에 불일치가 발생할 수 있어서 섀도에서 컬 디스턴스가 무시되었습니다. 하지만 이러한 방식은 상당한 양의 컬링을 수행하도록 콘텐츠가 최적화된 경우에 퍼포먼스에 큰 영향을 미칠 수 있습니다. 컬링에 의존하는 씬은 이제 섀도가 더 빨라지지만 프라이머리 렌더에서 팝핑이 표시될 정도로 컬 디스턴스가 짧은 경우 섀도 아티팩트가 표시될 수 있습니다.
-
사용자가 섀도 무효화 동작을 제어할 수 있는 프리미티브별 플래그가 추가되었습니다. 이를 통해 예를 들어 프리미티브가 월드 포지션 오프셋 세팅을 정적으로 사용하는 것으로 알려진 경우에 사용자가 무효화를 방지할 수 있습니다. 현재 시스템은 이를 자동으로 처리할 수 없습니다. 디폴트 세팅은 '자동(Auto)'이며, 명시적으로 변경하지 않는 한 현재 동작을 유지합니다.
-
추가적인 버그 수정과 퍼포먼스 향상이 이뤄졌습니다.
헤어

그룸 및 그룸 바인딩 에셋에 대한 그룸 스트리밍 지원이 추가되었습니다. 이로 인해 필요한 항목만 로딩할 수 있게 되어 에디터 및 게임에서 로딩 시간이 빨라지고 그룸 에셋의 CPU 및 GPU 메모리 부담이 줄어들었습니다.
화면의 작은 부분을 덮는 그룸이 많은 경우 퍼포먼스를 스케일링/향상시키기 위해 연속 LOD(Continuous LOD)가 추가되었습니다. 이 세팅은 기본적으로 꺼져 있으며, r.HairStrands.ContinuousLOD
를 사용하여 활성화할 수 있습니다.
디포머 그래프에서 헤어 스트랜드에 대해 커스텀 어트리뷰트 작성 지원을 포함한 실험단계 지원이 추가되었습니다. 이 기능은 아직 초기 개발 중이지만 디포머 그래프에서 런타임에 그룸을 변경할 수 있는 가능성을 열어줍니다.
더 유연하고 새로운 어트리뷰트를 손쉽게 추가할 수 있도록 그룸 어트리뷰트를 재작업했습니다. clumpID와 AO라는 새로운 어트리뷰트가 추가되었습니다. 이제 '그룸 에디터(Groom Editor)'에서 그룸 어트리뷰트의 수치 값을 시각화하여 쉽게 확인할 수 있습니다.
이제는 에셋 임포트 도중에 포인트/커브 제한이 사용자에게 보고되고 이에 따라 데이터가 트리밍됩니다. 또한 임포트된 어트리뷰트가 '그룸 에디터'는 물론이고 임포트 시에도 명확하게 표시되어 특정 그룸 에셋에 사용 가능한 항목을 시각화할 수 있습니다.
추가적으로 많은 버그 수정과 퍼포먼스 향상이 이뤄졌습니다.
템포럴 슈퍼 해상도

동적 해상도가 비활성화되었을 때(기본적으로 PC 플랫폼) 게임에서 스크린 퍼센티지를 좀 더 자동으로 제어하는 새로운 기능이 도입되었습니다. 기본적으로는 표시된 픽셀 수에 대한 최적의 템포럴 슈퍼 해상도(Temporal Super Resolution, TSR) 수렴 속도를 기준으로 스크린 퍼센티지를 설정합니다. 이를 통해 최종 사용자는 자신의 디바이스에서 최적의 세팅을 찾기 위해 여러 번 실험해야 하는 번거로움을 줄일 수 있게 되었습니다.
에디터에 포함된 몇 가지 새로운 UX 기능을 통해 에디터 및 PIE 뷰포트에서 스크린 퍼센티지의 동작을 보다 쉽게 이해하고 제어할 수 있습니다.
하드웨어가 지원하는 경우 데스크톱 GPU에서 16비트 연산에 대한 초기 지원을 추가했습니다. 여기에는 Radeon RX5000 시리즈(RDNA) 및 더 최신의 카드가 포함됩니다.
이미시브 표면의 루멘 스크린 스페이스 트레이스와 관련하여 TAA와 TSR 사이의 불일치가 수정되었습니다.
다양한 최적화 및 버그 수정이 이뤄졌습니다.
렌더 리소스 뷰어

UE 5.2에서 도입된 렌더 리소스 뷰어를 사용하면 GPU 메모리 할당과 버텍스 버퍼 및 인덱스 버퍼와 같은 렌더 리소스, 스태틱 및 스켈레탈 메시 같은 소스 에셋을 완벽하게 파악할 수 있습니다. 이를 통해 아티스트와 개발자는 GPU 메모리를 최적화하고 렌더링 예산 내에서 프로젝트를 유지하는 데 필요한 정보를 얻을 수 있습니다.
UE 5.3의 새로운 기능:
-
이제 렌더 버퍼/텍스처를 선택하고 '콘텐츠 브라우저(Content Browser)'에서 소스 에셋으로 이동할 수 있습니다.
-
인사이트 메모리 트레이스는 이제 DX12 리소스를 트래킹하고 인사이트 메타데이터 트레이스는 렌더 리소스 뷰어처럼 리소스 오너 경로를 트래킹합니다. 이러한 기능은 에디터에서만 작동하는 렌더 리소스 뷰어를 보완하여 패키징된 필드에서 소유 에셋 경로, 렌더 리소스의 디버그 이름, 오너 렌더 클래스 이름을 트래킹할 수 있게 해줍니다.
라이팅

-
레이 트레이스드 섀도가 적용 중인 라이트는 이제 볼류메트릭 포그를 선택적으로 섀도잉할 수 있습니다. 이를 활성화하려면 콘솔 변수 r.VolumetricFog.InjectRaytracedLights를 사용하면 됩니다. 이 변수는 퍼포먼스 비용으로 인해 기본적으로 꺼져 있습니다.
-
스포트, 포인트, 렉트 라이트가 이제 강도 유닛을 'EV'(Exposure Value, 노출 값)로 설정할 수 있습니다. 즉, 상대적인 '스톱' 값 또는 2의 거듭 제곱 단위로 강도를 설정할 수 있습니다.
월드 빌딩
레벨 인스턴스 액터 필터

액터 필터를 사용하면 월드 파티션 레벨 내에서 레벨별 인스턴스 베리언트가 허용됩니다. 이는 사용자 정의 디폴트 필터 포함을 사용하여 액터 필터링을 지원하도록 설정된 데이터 레이어 인스턴스 또는 로컬 데이터 레이어로 구성됩니다. 이러한 사전 환경설정된 필터와 연결된 모든 액터는 필터 디폴트, 오버라이드 및 각 레벨 인스턴스 내에 설정된 활성화 상태에 따라 스트리밍 생성 시 포함되거나 제외됩니다. 필터로 걸러진 데이터는 게임 내에서 완전히 제거됩니다.
레벨 스트리밍 퍼시스턴스(실험단계)
'레벨 스트리밍 퍼시스턴스(Level Streaming Persistence)'는 스트리밍 인/아웃 레벨 내에 포함된 오브젝트에서 특별히 마킹된 프로퍼티의 저장 및 복원을 관리하는 플러그인입니다. 이러한 프로퍼티는 엔진 환경설정(.ini
) 파일 내에서 정의됩니다.
제공된 API를 통해 구현된 경우, 세션 간은 물론 메모리 내 스냅샷에서 게임플레이 동안 프로퍼티의 퍼시스턴스를 보장합니다.
나나이트 랜드스케이프

이제 일반적인 랜드스케이프 렌더링과 동일하게 랜드스케이프 액터에서 나나이트를 활성화할 수 있습니다. 나나이트 랜드스케이프 메시는 에디터에서 사용자 워크플로를 방해하지 않도록 백그라운드에서 리빌드됩니다. 나나이트 랜드스케이프는 랜드스케이프 해상도를 향상하지는 않지만 GPU 컬링, 자동 지오메트리 스트리밍 및 LOD 같은 나나이트 런타임 기능을 활용할 수 있게 해주며, 특히 VSM 같은 리소스 사용량이 많은 기능에서 일반적으로 런타임 퍼포먼스를 높여줍니다.
대규모 랜드스케이프 임포트/익스포트
월드 파티션을 활용하고 임포트 작업을 여러 개의 연속적인 배치로 분할하여 규모가 매우 큰 랜드스케이프/해상도를 지원하도록 랜드스케이프 임포트/익스포트가 업데이트되었습니다.
랜드스케이프 피지컬 머티리얼 표시
새로 도입된 CVar landscape.CollisionMesh.ShowPhysicalMaterial
을 사용하면 콜리전을 표시할 때 랜드스케이프 피지컬 머티리얼을 표시할 수 있습니다. 이를 활성화하면 특히 랜드스케이프 피지컬 머티리얼 출력 노드를 사용할 때 피지컬 머티리얼이 익스포트되는 방법을 디버깅하는 데 유용합니다.
랜드스케이프 LOD 그룹
동일한 그룹에서 여러 랜드스케이프 액터 간에 원활한 LOD 트랜지션을 지원하기 위해 LOD 그룹이 추가되었습니다.
프로시저럴 콘텐츠 생성
계층형 생성

계층형 생성을 통해 단일 PCG 그래프 내에서 다양한 그리드 크기를 활용할 수 있습니다.
PCG 그래프 세팅에서 디폴트 그리드 크기를 설정하면 사용자는 Grid Size 노드를 추가하여 하위 요소들이 실행되어야 할 세분화 수준을 정의할 수 있습니다. 더 큰 사이즈의 그리드로 처리되는 데이터는 이보다 작은 모든 사이즈의 그리드에서도 사용할 수 있습니다.
이러한 계층형 로직에 따라 특히 런타임에서 대규모 월드를 처리할 때 프로시저럴 콘텐츠 생성 시 효율성을 향상할 수 있습니다.
외부 데이터에서 규칙 처리

이제 외부 데이터에서 규칙 처리(Rule Processing) 기능 지원을 통해 도시 샘플 프로젝트 Rule Processor 플러그인과 동일한 수준의 기능을 제공하여 외부 데이터를 관리 및 처리하고 타깃 액터에서 아티팩트를 생성할 수 있습니다.
여기에는 다음이 포함됩니다.
-
Alembic 포인트 클라우드 및 데이터 테이블에 대한 외부 데이터 지원
-
Alembic 파일을 PCG 세팅 에셋으로 변환하기 위한 유틸리티
서브그래프 조사

부모 그래프 내에서 어트리뷰트 리스트 뷰를 통해 PCG 서브그래프를 디버깅하고 조사하기 위한 지원이 추가되었습니다.
그래프 인스턴스 파라미터

PCG 그래프 사용자 파라미터를 구하고 설정할 수 있도록 블루프린트 API가 도입되었습니다. 그 외에도 UX 향상과 지원되는 타입 필터링이 추가됩니다.
커스텀 PCG 엘리먼트

커스텀 PCG 엘리먼트의 생성 워크플로 및 가독성을 향상시키기 위해 PCG 전용 블루프린트 루프 함수 이름이 변경되었습니다. 또한 PCG 데이터 컬렉션을 순차적으로 구성하고 출력하기 위한 새로운 함수도 추가되었습니다.
개발자 반복작업
멀티 프로세스 쿡(베타)
멀티 프로세스 쿡(Multi-Process Cook) 은 사용 가능한 CPU 코어와 메모리 리소스를 활용하여 빌드 팜 서버 또는 로컬 워크스테이션에서 쿠킹 결과물을 구하는 데 걸리는 전체 시간을 줄여줍니다.
멀티 프로세스 쿡은 UE 5.3의 베타 기능입니다. 퍼포먼스는 프로젝트의 크기와 데이터 구분 방식에 따라 달라질 수 있습니다. 최상의 결과를 얻으시려면 프로젝트 및 사용 가능한 하드웨어 사양에 따라 여러 CookProcessCount 값을 테스트해 보는 것을 권장합니다.
버추얼 에셋
버추얼 에셋은 이제 UE 5.3에서 정식 버전으로 전환되었습니다. Perforce 버전 컨트롤 및 공유된 언리얼 파생 데이터 캐시(Derived Data Cache, DDC)를 사용하고 있는 팀의 경우 최상의 퍼포먼스를 위해 버추얼 에셋을 사용할 것을 권장합니다.
간단히 말해서 버추얼 에셋은 로컬 프로젝트의 데이터 크기를 크게 줄여주고 코어 에셋 메타데이터만 동기화하여 동기화를 빠르게 수행합니다. 그런 다음 필요한 경우 벌크 데이터를 온디맨드로 풀링합니다.
버추얼 에셋은 텍스처, 오디오 데이터 및 스태틱 메시(나나이트 포함)에서 지원됩니다. 벌크 데이터는 추가적으로 데이터 크기를 절약하기 위해 우들을 사용하여 압축됩니다.
오프라인으로 전환될 것이 예상될 경우에는 프로젝트를 시작할 때 미리 캐시(precache) 커맨드릿을 실행할 수 있습니다. 이 커맨드릿은 가상화된 데이터를 머신에 로컬로 캐시합니다. 또한 언리얼 자동화 툴(Unreal Automation Tool, UAT)에는 '에셋 자동 수정/재가상화' 체크인 스크립트도 있습니다. 이 스크립트로 프로젝트 전체에서 실수로 가상화되지 않은 에셋을 찾을 수 있습니다.
C++20 디폴트 버전
UE 5.3은 이제 최신 C++20 표준으로 컴파일되며, 이 버전은 개발 환경에서 지원됩니다.
언리얼 빌드 툴(Unreal Build Tool, UBT)에 C++20 지원이 추가되었고, 타깃 또는 모듈 세팅으로 이를 제어할 수 있습니다. C++14는 지원 중단(deprecated)으로 표시되고 더 이상 지원하지 않습니다.
타깃 C++ 표준에 관계없이 모든 엔진 모듈이 기본적으로 C++20으로 컴파일됩니다. 다른 모듈은 C++17을 계속 지원하지만, 원한다면 C++20으로 전환할 수 있습니다.
C++ 언리얼 헤더 툴
언리얼 엔진에서 C++ 언리얼 헤더 툴(Unreal Header Tool, UHT)이 제거되었습니다. 대신 C# 언리얼 헤더 툴을 사용하세요.
플랫폼
XR

시선 트래킹된 포비티드 가변 비율 셰이딩(실험단계)
XR 애플리케이션을 개발할 때는 퍼포먼스가 가장 중요합니다. 이 실험단계 기능은 OpenXR을 사용하여 시선 트래킹된 포비티드 이미지 생성 작업을 지원하며 렌더링되는 전체 픽셀 수를 줄여줍니다.
-
OpenXR 및 OpenXR EyeTracking 플러그인을 활성화하고 다음을 설정해야 합니다.
-
xr.VRS.FoveationLevel 1-3 - 포비에이션 활성화
-
xr.VRS.GazeTrackedFoveation 1 - 시선 트래킹된 포비에이션 활성화
-
xr.VRS.FoveationPreview 1 - 포비에이션 마스크 프리뷰 활성화
-
나나이트를 위한 단일 패스 스테레오 렌더링
이제 인스턴스드 스테레오 렌더링이 활성화되어 있는 경우 나나이트가 단일 패스로 두 스테레오 뷰를 모두 렌더링할 수 있습니다.
-
나나이트 렌더링은 여러 단계로 구성된 프로세스이므로 각 눈에 이러한 단계를 개별적으로 실행하는 것은 효율적이지 않습니다. ISR이 활성화된 프로젝트에서 이제 나나이트 파이프라인의 각 단계가 두 눈을 동시에 처리할 수 있으므로 전체 렌더링 시간이 줄어듭니다.
-
이 기술로 인해 문제가 발생한다고 의심되는 경우 r.Nanite.MultipleSceneViewsInOnePass=0을 사용하여 비활성화할 수 있습니다.
루멘 글로벌 일루미네이션을 위한 스테레오 향상
루멘 GI는 여러 개의 뷰별 캐시를 사용합니다. 위치와 방향 측면에서 스테레오 뷰가 서로 가깝기 때문에 뷰 사이에 일부 캐시를 재활용할 수 있습니다.
- 문제가 있는 경우 r.Lumen.StereoOptimizations=0을 사용하여 이를 비활성화할 수 있습니다.
휴대형 증강현실 향상
-
ARCore SDK가 1.37로 업데이트되었습니다.
-
ARCore 플러그인 향상점:
-
지원이 중단된 카메라 메타데이터 API 사용이 제거되었습니다.
-
새로운 클라우드 앵커 비동기 API가 업데이트되었습니다.
-
새로운 정면/후면 카메라 환경설정 API가 업데이트되었습니다.
-
크로스 플랫폼 상응 기능이 있는 지원이 중단된 ARCore 전용 블루프린트 함수가 제거되었습니다.
-
월드 트랜스폼 또는 월드 스케일의 트래킹에 변경사항이 발생할 경우의 ARCore 및 ARKit ARPins 문제가 수정되었습니다.
-
XRScribe 플러그인(실험단계)
이 실험단계의 새 플러그인에서는 OpenXR 디바이스가 없어도 OpenXR 플러그인 및 관련 코드를 사용할 수 있습니다. 이 플러그인은 언리얼 엔진과 런타임 간의 OpenXR API 인터랙션을 캡처하고 이를 사용하여 디바이스를 에뮬레이트할 수 있습니다.
-
일부 OpenXR 익스텐션 세트가 현재 XRScribe OpenXR 표면에서 지원됩니다. 핸드 트래킹, 시선 트래킹, 뎁스 레이어, Vive Tracker는 아직 지원되지 않습니다.
-
현재 Win64만 지원되며, 다른 플랫폼은 향후 지원될 예정입니다.
-
에뮬레이션은 현재 HMD 및 디바이스 포즈의 리플레이를 처리하지만 입력은 아직 처리하지 않습니다.
-
CLI(-xremu=mq1 또는 -xremu=vi)를 사용하여 빠르게 에뮬레이트할 수 있도록 플러그인 내장 캡처를 사용할 수 있습니다.
XRBase 리팩터링
다양한 XR 관련 인터페이스 구현이 코어 엔진에서 XRBase 플러그인으로 리팩터링되었습니다. 이러한 수정은 비XR 프로젝트에서 실행 파일의 크기와 메모리 오버헤드를 줄이기 위한 것입니다. 따라서 일부 XR 관련 플러그인은 XRBase를 종속성으로 추가해야 할 수 있습니다.
XR_FB_Foveation 지원(실험단계)
문제가 수정되어 이제 Meta Quest 디바이스의 다이내믹 포비에이션을 '프로젝트 세팅(Project Settings)'->'OpenXR 세팅(OpenXR Settings)'에서 활성화할 수 있습니다. 다음 CVar를 사용하여 환경설정할 수 있습니다.
-
xr.OpenXRFBFoveationLevel(디폴트=0)
- 0=없음, 1=낮음, 2=중간, 3=높음
-
xr.OpenXRFBFoveationDynamic(디폴트=False)
- True/False
-
xr.OpenXRFBFoveationVerticalOffset(디폴트=0)
기타 향상된 기능
-
Vulkan RHI의 모바일 프리뷰 에 이제 모바일 멀티 뷰 에뮬레이션 대신 기본적으로 멀티 뷰 익스텐션이 사용됩니다.
-
프로젝트 세팅에서 Meta Quest용 패키지(Package for Meta Quest) 체크박스를 활성화하여 모든 Meta 디바이스를 패키징할 수 있습니다.
-
OpenXR 플러그인용 익스텐션 플러그인 이 이제 레이어 목록 에 액세스할 수 있습니다.
모바일 개발 요구 사항 및 호환 하드웨어
다음은 언리얼 엔진 5.3에서 지원되는 모바일 디바이스 OS 버전 및 최소 하드웨어입니다. 필수 SDK 및 IDE에 대한 자세한 내용은 플랫폼 SDK 업그레이드 섹션을 참고하세요.
iOS/tvOS/iPadOS
UE 5.3은 버전 타깃 SDK 15 이상을 지원하는 OS가 설치된 iOS, iPadOS 및 tvOS 디바이스를 지원합니다. UE 5.3에서 다음을 지원합니다.
-
A8 AppleTV 디바이스
-
A8X iPad
-
A9 디바이스 이상
다음은 UE 5.3에서 호환 가능한 최소 디바이스 모델입니다.
-
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세대)
-
Android
UE 5.3은 다음 사양을 충족하는 Android 디바이스를 지원합니다.
-
Android 8 이상
-
64비트 ARM 기반 CPU
-
호환 GPU:
-
Mali T8xx, G71, G72, G76, G77, G78 및 G71x 시리즈
-
Adreno 5xx, 6xx 또는 7xx 시리즈
-
PowerVR GM9xxx 시리즈
-
Xclipse 920
-
-
호환 그래픽 API:
-
OpenGL ES 3.2
-
호환 드라이버를 갖춘 Android 10 이상 디바이스의 Vulkan 1.1
-
Android SDK 및 JDK 업데이트
Android Studio Flamingo 2022.2.1 로 전환하고 OpenJDK 17.0.6 을 JDK 버전으로 사용하여 Android SDK 요구사항을 간소화했습니다. UE 및 AGDE에 대한 기본 Android 지원이 이제 동일한 JDK 버전을 타기팅하므로 사용자가 별도의 JDK 설치를 가리키기 위해 서로 다른 JAVA_HOME
및 AGDE_JAVA_HOME
환경 변수가 필요하지 않습니다. 이 업데이트를 통해 UE는 이제 JDK에 대해 jre
대신 jbr
디렉터리로 타기팅합니다.
5.3 이전의 UE 버전 지원이 필요하지만 Android용 UE 5.3을 구성해야 할 경우 다음이 권장됩니다.
-
이전 버전의 Android Studio를 제거하기 전에 Android Studio 설치 외부에
jre
디렉터리 콘텐츠를 복사하여 덮어쓰지 않도록 합니다. -
Android 환경 변수가 이전 UE 버전에 사용된 SDK를 타기팅하도록 구성되지 않았는지 확인합니다.
-
이전 UE 버전의 경우
BaseEngine.ini
또는 '프로젝트 세팅'을 사용하여 사용자의 SDK를 타기팅하도록 수동으로 구성합니다. 특히, JDK 디렉터리를 복사된jre
디렉터리로 설정합니다.
자세한 내용과 지침은 UE 5.3용 Android Studio 구성하기 문서를 참고하세요.
최신 Xcode 프로젝트
최신 Xcode 워크플로 표준에 보다 일관될 수 있도록 UE의 Xcode 프로젝트 및 워크스페이스 처리 방식이 업데이트되었습니다. 여기에는 다음과 같은 변경사항이 포함됩니다.
향상된 Xcode 프로젝트 체계
-
UE에서 이제 플랫폼당 하나의 Xcode 워크스페이스 가 사용됩니다.
- 예: UnrealGame(Mac) 및 UnrealGame(IOS).
-
UE에서 이제 워크스페이스 내의 각 빌드 타깃 타입에 대해 개별 프로젝트 가 사용됩니다.
-
예: UnrealGame(Mac), UnrealGameEditor(Mac), UnrealGame Server(Mac) 모두 Mac 워크스페이스 내에서 개별 프로젝트로 구성됩니다.
-
각 프로젝트는 지원되는 빌드 환경설정만 허용합니다. 예를 들어 에디터 프로젝트에는 테스트 또는 출시 환경설정이 표시되지 않습니다.
-
-
프레임워크가 이제 표준 Xcode 메서드를 사용하여 처리됩니다.
- 이전 버전에서는 개발자가 프레임워크를 수동으로 복사하고 코드 서명을 적용해야 했지만 이제는 빌드 시스템이 이를 자동으로 식별하고 코드 서명을 적용합니다.
향상된 패키징 및 배포 프로세스
-
실행에 필요한 모든 데이터가 각 Apple 플랫폼의 독립형
.app
파일 내에 번들로 포함되어 있습니다.- 여기에는 이전 버전의 UE에서 이 패러다임을 사용하지 않던 macOS가 포함됩니다.
-
이제는 macOS 및 iOS/iPadOS/tvOS용 개발/디버깅 빌드에서 코드 서명을 처리하는 데 자동 코드 서명 이 선호됩니다.
-
Xcode를 사용하여 Xcode 아카이브로 앱을 관리 및 배포 할 수 있으며, 이 방식이 출시 빌드를 생성하는 데 선호됩니다.
- 출시 빌드는 이 용도로
.xarchive
파일과.dSYM
파일을 생성합니다.
- 출시 빌드는 이 용도로
-
권한 및
.plist
파일의 관리 기능이 향상되었습니다. 개발자는 이제 이러한 두 에셋에 대해 템플릿과 커스터마이징된 파일을 사용할 수 있습니다.
이러한 향상점에 대한 자세한 내용은 최신 Xcode 워크플로 문서를 참고하세요.
iOS 워크플로

UE 5.3은 iOS 플랫폼의 개발 워크플로에 몇 가지 향상점을 도입했습니다.
-
앱 ID에 확장된 가상 주소 지정 권한이 포함된 경우 MallocBinned2 메모리 할당자를 사용할 수 있습니다.
-
최신 XCode 프로젝트 통합 덕분에 패키징 및 앱 서명이 향상되었습니다(위의 최신 Xcode 프로젝트 참고).
-
디버깅 파이프라인을 간소화하는 디버깅 준비 명령이 이제 Windows 원격(실험단계) 및 보조 Mac 워크플로를 제공합니다. 자세한 내용은 Xcode에서 디버깅하기 및 원격 Mac 사용하기 문서를 참고하세요.
-
iOS 시뮬레이터 가 이제 Apple Silicon Mac에서 지원되어 디바이스 없이 개발 반복작업을 빠르게 수행할 수 있습니다(실험단계).
Android의 모바일 레이 트레이싱 지원(실험단계)
UE 5.3에서는 모바일 데스크톱 렌더러 를 실행하는 고급 Android 디바이스에 대해 레이 트레이싱 이 지원됩니다. 지원되는 모바일 GPU는 다음과 같습니다.
-
Adreno 740
-
Immortalis-G715
-
Xclipse 930
모바일 레이 트레이싱을 활성화하려면 다음 단계를 따릅니다.
-
프로젝트에서 데스크톱 렌더러를 활성화합니다.
-
레이 트레이싱을 활성화합니다.
-
디바이스 프로파일에 다음을 추가합니다.
[Android_Vulkan_SM5 DeviceProfile] +CVars=r.Android.DisableVulkanSM5Support=0
이 업데이트에는 디퍼드 셰이딩에서만 작동하는 레이 트레이스드 섀도에 대한 모바일 인라인 섀도 지원도 포함합니다.
이 지원은 실험단계 이며 아직 프로덕션 용도로 사용하지 않아야 합니다. 하지만 이를 시도해 본 사용자의 피드백은 언제든지 환영합니다.
모바일 렌더러

모바일 렌더러가 이제 퍼포먼스와 시각적 퀄리티 측면에서 다음과 같이 향상되었습니다.
-
컴퓨트 기반 랜드스케이프 버텍스 컬링
-
포그 볼륨 지원
-
모바일 포워드로 글로벌 디스턴스 필드 생성
-
인스턴스 렌더링 향상(GPU 씬)
-
버추얼 텍스처링 지원
Apple M2 디바이스에서 나나이트 지원(베타)

언리얼 엔진 5.3에서는 macOS를 실행하는 Apple Silicon M2 디바이스 에서 나나이트 렌더링 기술을 위한 베타 지원이 도입되었습니다. 이러한 지원은 셰이더 모델 SM6를 사용하고 에픽게임즈 런처를 통해 다운로드할 수 있는 UE macOS 바이너리에서 기본적으로 활성화됩니다. 이와는 대조적으로 실험단계의 5.2 지원은 GitHub 소스에서 빌드하는 경우에만 가능했습니다.
캐릭터 및 애니메이션
런타임 및 비선형 시네마틱을 위한 다이내믹 워크플로

5.3에서는 런타임 워크플로와 비선형 구성을 향상하는 데 주력했습니다.
사용자 정의 다이내믹 바인딩
레벨 시퀀스 디렉터 블루프린트를 사용하여 런타임 중에 플레이어 폰과 같은 여러 다른 오브젝트가 다이내믹하게 빙의되거나 시퀀서에 의해 스폰되도록 정의합니다.
머티리얼 섹션 블렌딩
다른 트랙 타입과 유사하게 머티리얼 타입의 섹션을 머티리얼 트랙에 추가할 수 있습니다. 여기에는 머티리얼 파라미터 컬렉션과 UMG의 UI 애니메이션이 포함됩니다.
서브시퀀스용 테이크
샷 트랙과 유사하게 시퀀서 내에서 서브시퀀스용 테이크를 생성 및 설정할 수 있습니다.
테이크용 코멘트
시퀀서 내에서 샷/서브시퀀스 테이크에 대한 코멘트 추가/편집/보기를 지원합니다.
텍스트 트랙
이제 시퀀서에서 텍스트 프로퍼티를 트랙으로 추가할 수 있습니다. 사용자가 시간 경과에 따라 텍스트 필드의 값을 변경하고 키를 추가할 수 있습니다.
애니메이션 리타기팅

이 출시 버전에서는 리타기팅의 편의성을 향상하는 데 주력했습니다.
-
리타깃 에디터(Retarget Editor) 툴바 - 리타깃 단계를 진행하는 동안 글로벌 및 루트 세팅에 손쉽게 액세스할 수 있습니다. 이를 통해 리타깃 실행, 리타깃 포즈 편집 및 리타깃 포즈 보기 옵션 간에 모드를 전환할 수 있습니다.
-
리타깃 포즈(Retarget Poses) - 본의 로컬 스페이스를 편집하여 본 회전을 0으로 설정합니다.
-
선택된 스켈레탈 메시/IK 릭에서 우클릭 컨텍스트 메뉴를 통해 IK 릭/IK 리타기터 에셋을 생성합니다.
-
IK 릭과 IK 리타기터 에셋의 섬네일을 지원합니다.
애니메이션 제작

5.3에서 애니메이션 제작을 위해 추가로 향상된 기능은 다음과 같습니다.
스마트 베이크
-
이제 키프레임을 베이크하는 데만 집중할 수 있습니다.
-
컨스트레인트 베이크
-
스페이스 전환 베이크
-
스냅퍼
-
섹션 병합
-
트랜스폼 베이크
스마트 자동 탄젠트
- 커브 형태를 더 잘 관리할 수 있는 새로운 자동 탄젠트
커브 에디터 향상
-
향상된 정규화 뷰
-
다수의 키에 대한 향상된 퍼포먼스
-
향상된 선택 처리
-
보다 정확한 범위 선택
-
자동 프레임이 꺼진 경우의 줌 레벨 수정
모션 블렌딩 향상
-
루트 모션 프리뷰를 적용 중인 애니메이션에서 AnimBP를 사용하여 루트 본 교체 적용
-
스켈레탈 애니메이션 섹션을 뒤로 확장 가능
익스포트 향상
- 컨트롤 릭 애니메이션을 FBX 파일로 익스포트
스켈레탈 에디터(실험단계)

스켈레탈 에디터(Skeletal Editor) 를 통해 언리얼 엔디터에서 직접 스켈레톤을 생성하고 메시 스킨 웨이트를 편집할 수 있습니다. 이 툴을 사용하면 에셋에 본을 추가하고, 스태틱 메시를 디폼하며 이 결과를 스켈레탈 메시로 변환하는 작업을 스켈레톤 데이터를 임포트할 필요 없이 모두 한 곳에서 할 수 있게 되어 더 빠르게 반복작업할 수 있습니다.
-
스태틱 메시를 스켈레탈 메시로 변환
-
스켈레톤 생성 및 편집
-
본 추가
-
본 제거
-
본 방향 지정 및 편집
-
본 미러링
-
-
스킨 웨이트 생성
-
페인트 가중치 브러시 툴
-
버텍스 선택에서 가중치 편집
-
플러드(Flood) / 릴렉스(Relax) / 정리(Prune) / 평균(Average) / 정규화(Normalize) 연산
-
가중치 미러링
-
-
맵 페인팅
-
본 및 가중치에 대한 Python API 지원
머신 러닝(ML) 디포머

머신 러닝(Machine Learning, ML) 디포머를 사용하면 UE에서 실시간으로 실행되는 머신 러닝 모델을 학습하여 복합 릭, 비선형 디포머, 임의 디포메이션의 근사치를 구할 수 있습니다.
UE 5.3에서 향상된 사항은 다음과 같습니다.
-
구조화된 데이터를 사용한 작업 기능을 향상시켜 주는 로컬 뉴럴 모프 모델을 위한 마스킹 시스템 추가
-
최근접 이웃(Nearest Neighbor) 모델 UI와 워크플로 향상
-
NNI 프레임워크에 대한 종속성 제거
-
학습 마스크를 생성하고 뷰포트 내에서 본/본 그룹/커브별로 마스크를 시각화하는 기능
-
Windows에서 가장 최근접 이웃 모델 및 뉴럴 모프 모델을 적절하게 학습시키는 데 Python 패키지 설치 같은 수동 단계가 더는 필요하지 않음
-
Linux 및 macOS에서 학습된 뉴럴 모프 모델 및 최근접 이웃 모델을 실행하는 기능 제공(학습 오류가 발생해도 실행 가능)
데이터에서 컨트롤 릭 빌드
컨트롤 릭 그래프 외부의 데이터를 사용하여 프로시저럴하게 릭을 생성하고 수정할 수 있도록 컨트롤 릭의 프로시저럴 툴세트를 확장했습니다. 여기에는 다음이 포함됩니다.
-
컨트롤 릭을 프로시저럴하게 빌드하기 위해 트랜스폼, 플로트, 스켈레톤 같은 외부 데이터를 쿼리하고 사용하는 기능
-
들어오는 데이터를 쿼리하는 새로운 GetUserData 노드
-
현재 레퍼런스되고 있는 셰이프 라이브러리를 교체하는 새로운 Set Shape Library from User Data 노드
버추얼 프로덕션
ICVFX의 SMPTE 2110

언리얼 엔진 5.3이 출시되면서 nDisplay 기술과 함께 처음부터 끝까지 SMPTE 2110 기반의 IP 비디오 장비를 사용하는 차세대 ICVFX 스테이지 준비가 완료되었습니다. 프로덕션 팀은 SMPTE 2110 지원을 통해 향상된 효율성을 기반으로 내부 프러스텀 해상도를 높이고 지연시간을 낮춰 스테이지에서 사용 가능한 하드웨어 리소스를 극대화할 수 있습니다.
SMPTE 2110 기반 환경설정에 따라 프로덕션 팀은 다음을 수행할 수 있습니다.
-
내부 프러스텀을 한 번만 렌더링하고 이를 클러스터의 다른 렌더 노드와 공유함으로써 결정론과 관련된 문제를 피하기 위해 각 노드에서 내부 프러스텀을 다시 렌더링하는 중복 작업을 방지할 수 있습니다.
-
렌더 노드의 전체 리소스를 내부 프러스텀에 할당하여 사용 가능한 모든 리소스를 활용할 수 있게 되므로 카메라에 표시되는 픽셀에 대해 최상의 퀄리티를 제공할 수 있습니다.
-
언리얼 엔진 출력을 카메라와 동기화된 상태로 유지하는 네이티브 SMPTE 2110 동기화 정책을 사용하여 각 렌더 노드에 프레임록을 적용합니다.
-
SMPTE 2110을 통해 LED 프로세서에 결과 렌더를 출력하므로 디스플레이 포트 또는 HDMI 컨버터가 필요하지 않습니다.
버추얼 카메라

테이크 브라우저
버추얼 카메라에서 레벨 시퀀스를 탐색할 수 있는 기능이 도입되었습니다. 이러한 시퀀스를 검토 목적으로 로드하거나 다음 번 레코딩을 위해 베이스로 로드할 수 있습니다. 또한 목록 필터링을 위해 시퀀스에 별, 플래그, NG 시퀀스를 표시할 수 있습니다.
단일 VCam에서 여러 HUD 지원
이제 자체 HUD와 스트림을 사용하여 단일 VCamComponent에 여러 출력 제공자를 추가할 수 있습니다. 하나의 VCam에서 작업자 뷰, 단순 번 인, 클린 플레이트를 동시에 스트리밍할 수 있습니다.
시간 스케일 재생 및 녹화
이제 1:1 이외의 속도로 재생과 녹화를 수행할 수 있습니다. 커스텀 속도로 녹화하면 전체 속도로 재생할 때 움직임이 가속되거나 감속됩니다.
초기 macOS 지원(실험단계)
VCamActor가 이제 레거시 원격 세션을 통해 macOS에서 스트리밍을 지원합니다. Virtual Camera Core, VCamComponent, VCamModifier, VCamOutputProvider를 사용하여 UE5의 macOS 버전에서 커스텀 VCam을 생성할 수 있습니다. macOS에서 픽셀 스트리밍과 전체 VCam 지원이 제공될 때까지 지속적으로 개발할 예정입니다.
CineCamera 릭 레일(베타)

고급 시네마틱 및 버추얼 카메라 워크플로에 최적화된 새로운 릭 레일 액터가 추가되었습니다.
컴포지션 계획
카메라 초점, 조리개 및 줌을 레일 포인트에 저장하여 레일이 보다 복잡한 컴포지션을 구동할 수 있도록 합니다.
레일 구동
다양한 구동 모드를 사용하여 움직임 자동화:
-
수동(Manual): 시퀀서 또는 외부 입력에서 레일 위치를 구동합니다.
-
기간(Duration): 설정된 시간에 이동을 완료하도록 레일 위치를 구동합니다.
-
속도(Speed): 설정된 속도로 레일 위치를 구동합니다.
시퀀서로 작업
절댓값을 사용하여 포인트가 저장되며, 시퀀서에서 안전하게 키를 설정할 수 있습니다. 따라서 포인트를 직접 수정하지 않는 한 지정된 포인트의 위치 값이 변경되지 않습니다. 지정된 프레임 내에서 특정 위치로 키프레임을 지정하면 이전 또는 이후에 추가된 새 포인트의 수에 관계없이 이 위치 값은 변경되지 않습니다.
속도 시각화
레일 메시에 적용된 히트 맵을 통해 레일의 어떤 지점에서든지 속도를 확인할 수 있으므로 레이어링된 이동을 녹화할 때 예상치 못한 결과를 방지할 수 있습니다.
축 상속성 선택
릭 레일에서 축의 서브세트만 상속하도록 선택할 수 있습니다. 회전을 조정하면서 레일에서의 위치를 구동하거나 Z축을 제외하여 안정적으로 이동할 수 있습니다.
CineCamera 씬 캡처 컴포넌트(베타)

CineCamera의 씬 캡처 컴포넌트가 추가되었습니다. 렌더 타깃에 CineCamera 컴포넌트를 정확하게 캡처하여 머티리얼, UMG 등에 사용할 수 있습니다. 이 기능은 CineCamera 관련 프로퍼티와 포스트 프로세싱과 함께 렌즈 디스토션을 지원합니다.
애너모픽 렌즈 캘리브레이션 솔버(실험단계)

렌즈 에셋과 함께 사용할 수 있는 애너모픽 렌즈 모델 및 솔버가 렌즈 툴에 추가되어 애너모픽 렌즈 디스토션을 분석할 수 있게 되었습니다. 또한 렌즈 컴포넌트를 사용하면 애너모픽 렌즈 모델 디스토션을 CineCamera 액터에 추가하여 언리얼 엔진 내에서 디스토션 이펙트를 렌더링할 수 있습니다. 따라서 프로파일링된 애너모픽 렌즈를 사용하여 샷을 시각화할 수 있습니다. 애너모픽 렌즈 모델의 수동 파라미터를 조정하여 애너모픽 디스토션 룩을 생성할 수도 있습니다.
OCIO를 통한 텍스처 변환

언리얼 엔진 내에서 완벽하게 컬러를 관리할 수 있는 기반을 제공하는 '작업 중인 컬러 스페이스(Working Color Space)'가 도입되었습니다. 이는 에셋이 어디에서 제작되었는지에 관계없이 정확한 룩을 확보할 수 있어 텍스처에 대한 입력 컬러 스페이스 환경설정과 같은 필수 작업에서 특히 중요합니다. 언리얼 엔진 5.3에서는 이러한 텍스처 변환에 OpenColorIO를 활용하여 이와 같은 지원을 확장합니다. 이를 통해 언리얼 엔진은 업계 표준 프레임워크를 채택하여 텍스처의 컬러 파이프라인 간의 일관성을 극대화합니다.
nDisplay 멀티플레이어 액터 리플리케이션

멀티플레이어 게임 컨텍스트에서 액터 리플리케이션을 지원할 수 있도록 nDisplay 로우 레벨 네트워킹 아키텍처가 수정되었습니다.
-
최종 사용자에 대한 투명성 확보:
-
이 기능은 클러스터 리플리케이션 활성화됨(Cluster Replication Enabled) 옵션을 사용하여 nDisplay 프로젝트 세팅에서 활성화할 수 있습니다.
-
스위치보드에 멀티플레이어 서버 옵션이 추가되었습니다.
-
-
멀티플레이어 세션 또는 게임에 참가할 때 각 nDisplay 노드가 네트워킹 클라이언트가 됩니다.
향후에는 개별 노드와 반대로 nDisplay 클러스터가 멀티플레이어 세션에 참가하도록 지원할 예정입니다.
nDisplay 파생 데이터 캐시 채우기

nDisplay 시스템에 '준비(prime)' 기능을 추가하여 처음 사용하기 전에 파생 데이터 캐시(DDC)를 미리 채울 수 있게 되었습니다. 이 기능은 빌드 메뉴를 통해 로컬에서 트리거하거나 스위치보드를 사용하여 모든 클러스터 노드에서 트리거할 수 있습니다.
그런 다음 추가 셰이더 컴파일 없이도 nDisplay 클러스터를 시작할 수 있게 준비됩니다. 명령줄 실행인자를 사용하여 언리얼 엔진에 노출되고 외부에서 트리거할 수 있기 때문에 편리한 시간에 오프라인으로 이 작업을 예약할 수 있습니다.
DMX 컨트롤 콘솔 UX

다음과 같은 추가 기능으로 새로운 컨트롤 콘솔 UI 및 UX가 향상되었습니다.
-
두 가지 주요 레이아웃 모드:
-
디폴트(Default) - 선택한 패치만 표시됩니다.
-
수동(Manual) - 페이더 그룹 위치를 정의할 수 있습니다.
-
-
더 빠른 DMX 페이더 액세스를 위한 검색 메커니즘 수정
-
상대 또는 절대 컨트롤을 사용하여 페이더 값을 변경하는 기능
-
DMX 데이터를 전송하는 패치 선택 기능
DMX 픽셀 매핑 UX

'DMX 픽셀 매핑(DMX Pixel Mapping)' 툴이 크게 변경되어 향상된 UI 및 UX를 제공하며, 다음과 같은 수정 사항도 포함되어 있습니다.
-
새로운 입력 필터 섹션을 통해 해상도를 줄이고, 블러를 적용하고, 들어오는 픽셀에 머티리얼 기반 로직을 수행할 수 있습니다.
-
DMX 라이브러리 조작이 컨트롤 콘솔에서 제공되는 새로운 UX와 일관됩니다. 이 기능은 계층구조 뷰와 함께 작동하므로 추가된 패치와 나머지 패치를 명확하게 확인할 수 있습니다.
미디어 IO 미디어 플레이트 머티리얼 시스템

기존 미디어 플레이트 액터 머티리얼 시스템이 향상되어 다음과 같은 기능을 제공합니다.
-
자동으로 채워지는 새로운 드롭다운을 사용하여 미디어 플레이트 플러그인 콘텐츠 디렉터리에서 직접 머티리얼을 선택할 수 있습니다.
-
빠른 액세스를 위해 미디어 플레이트 플러그인 콘텐츠 디렉터리를 탐색할 수 있습니다.
또한 미디어 플레이트 머티리얼에서 출력 뎁스 및 속도(Output Depth and Velocity) 플래그가 활성화되었습니다. 이는 특히 미디어 플레이트 액터와 관련해서 카메라 이동이 있는 경우 TSR/TAA 이미지의 안정성을 높여줍니다.
시뮬레이션
카오스 클로스 에디터 파운데이션(실험단계)

UE 5.3의 카오스 클로스에 실험단계 의 '클로스 에디터(Cloth Editor)'가 추가됩니다.
새로운 '클로스 에디터'를 사용하면 캐릭터별로 여러 개의 의류를 사용하고 이후 여러 캐릭터 간에 동일한 의류를 적용할 수 있습니다. 또한 클로딩 구성을 손쉽게 구성하고 수정할 수 있는 패널 기반의 워크플로를 제공합니다. 여기에는 다음과 같은 기능이 포함됩니다.
-
캐릭터 피직스를 위한 새로운 베이스 클래스 에디터(클로스/플레시)
-
데이터 플로 그래프가 포함된 패널 기반 에디터의 초기 단계
-
끊김이 없는 워크플로
-
클로스는 스켈레탈 메시에서 추출되어 별개의 컴포넌트로 취급됩니다.
-
추가 콜리전 지원
-
새로운 스킨 웨이트 전송 툴
-
마스크가 이제 재사용 가능한 웨이트 맵으로 대체됩니다.
-
한 개의 시뮬레이션 메시로 여러 머티리얼을 구동할 수 있습니다.
이 기능에 대한 자세한 내용은 패널 클로스 에디터 개요를 참고하세요.
카오스 ML 클로스(실험단계)

클로스 시뮬레이션은 대부분의 사용 사례에서 비용이 너무 높을 수 있습니다. 아티스트, 엔지니어 및 게임 디자이너 모두 특히 더 적합한 클로스를 얻기 위해 클로스 시뮬레이션을 모방할 수 있는 낮은 비용의 대체 런타임 솔루션을 필요로 합니다. 현재 이렇게 하기 위해서는 언리얼 엔진과 DCC 사이를 전환하면서 시뮬레이션하고 결과물을 언리얼 엔진으로 다시 가져오는 힘든 반복작업이 필요합니다.
UE 5.3에서는 이제 아티스트가 실험단계 의 '카오스 클로스 제너레이터(Chaos Cloth Generator)' 플러그인을 사용하여 언리얼 엔진에서 클로스를 시뮬레이션하고 학습시킬 수 있습니다.
이 기능에 대한 자세한 내용은 머신 러닝 클로스 시뮬레이션 개요를 참고하세요.
카오스 리지드 바디 및 씬 쿼리
아티스트, 개발자 및 프로그래머에게 더 나은 시뮬레이션 결과를 제공하기 위해 카오스 피직스의 기능 중에서 특히, 리지드 바디 시뮬레이션과 씬 쿼리에서 다양한 업데이트와 최적화가 적용되었습니다.
리지드 바디에 대해 지속적으로 초점을 맞춰 SIMD, 캐시 일관성, 기능 제거, 데이터 복사 감소 같은 로우 레벨에서의 최적화가 이뤄졌습니다.
씬 쿼리는 이제 향상된 다이내믹 가속도 구조체를 구현하여 업데이트 및 쿼리 속도를 높여줍니다.
카오스 디스트럭션
프랙처 에디터 업데이트
지오메트리 컬렉션의 머티리얼 관리 및 할당을 세부적으로 제어할 수 있도록 새로운 머티리얼이 추가되었습니다.

향상된 시각화 제어와 연결 그래프 생성을 위한 새로운 컨택트 메서드를 통해 근접성 툴이 향상되었습니다.

레벨 통계에는 이제 지오메트리 컬렉션 콜리전을 최적화하는 데 유용한 집계 컨벡스 정보가 표시됩니다.

런타임 최적화
-
지오메트리 컬렉션 컴포넌트는 이제 더는 기본적으로 틱하지 않고 지오메트리 컬렉션이 손상된 후에만 틱합니다. 틱 함수의 런타임 비용도 줄어들었습니다.
-
솔버 및 어트리뷰트 레벨에서 데이터 타입 최적화가 이루어져 디스크의 지오메트리 컬렉션 에셋 비용과 해당 인스턴스의 런타임 메모리 비용이 줄어들었습니다.
-
또한 대규모로 디스트럭션을 사용하기 위해 지오메트리 컬렉션 인스턴스의 전체 CPU 비용을 낮출 수 있도록 다양한 최적화가 이뤄졌습니다.
머티리얼의 피지컬 프로퍼티와 지오메트리 컬렉션의 내부 토폴로지 및 연결을 활용하여 새로운 실험단계의 대미지 모델이 도입되었습니다.
나이아가라 유체

-
나이아가라 유체 시뮬레이션을 캐시한 후 트랜스폼할 수 있는 기능이 추가되었습니다. 이로 인해 캐시를 여러 번 복제하고 시간/공간 측면에서 중복을 오프셋하여 캐시된 단일 시뮬레이션에서 더 복잡한 이펙트를 얻을 수 있습니다.
-
3D 가스 시뮬레이션에 데이터 채널 지원이 추가되었습니다. 이는 레벨 내의 모든 CPU 시스템에서 유체를 소싱할 수 있게 해주는 실험단계 기능입니다. 마스터 이미터의 경우, 파티클 소스는 이제 '이미터(Emitter)'와 '데이터 채널(Data Channel)'이라는 두 가지 모드를 갖습니다. 이미터 모드는 동일한 시스템의 이미터에서 데이터를 읽습니다. 데이터 채널 모드는 사전 정의된 나이아가라 데이터 채널에서 데이터를 읽습니다. 이 데이터 채널을 기존 '유체 소스 어트리뷰트 설정(Set Fluid Source Attributes)' 모듈에 쓸 수 있습니다.
-
패스 트레이서가 이제 이종 볼륨을 지원하므로 내부에서 직접 유체를 렌더링할 수 있게 되었습니다.
-
스파스 볼륨 텍스처(Sparse Volume Texture, SVT)에 대한 실험단계 지원이 추가되었습니다. 이제 유체 캐싱이 SVT에 직접 쓰여지므로 속도가 대폭 향상되었습니다.
나이아가라 요약 뷰 에디터

'요약 뷰 에디터(Summary View Editor)'를 통해 나이아가라 이미터의 커스텀 뷰를 생성할 수 있습니다. 이를 사용하면 이미터의 가장 중요한 세팅과 입력만 최종 사용자에게 보여줄 수 있습니다. 이에 대한 중요한 사용 사례 중 하나는 나이아가라 유체 이미터입니다. 이를 사용하면 잘 정리된 세팅의 서브셋만 살펴볼 수 있으므로 원하는 이펙트를 얻기 위해 들어가는 수고를 줄일 수 있습니다. 스프라이트 렌더러의 스프라이트 머티리얼과 같은 특정 프로퍼티 외에도 카테고리, 섹션, 개별 모듈 입력 또는 전체 모듈을 재배열하고 구성할 수 있습니다.
이 기능에 대한 자세한 내용은 요약 뷰 퀵스타트를 참고하세요.
오디오
메타사운드 빌더 API
메타사운드 빌더 API는 게임이 실시간으로 실행되는 동안 C++ 또는 블루프린트 API를 사용하여 메타사운드 그래프를 생성하고 변경할 수 있게 해줍니다. 따라서 게임플레이 동안에 메타사운드 노드를 추가/제거하고 연결을 수정할 수 있습니다.
오디오 버스 쓰기
이제 새로운 메타사운드 노드를 통해 하나의 메타사운드에서 데이터를 취해 이를 다른 메타사운드 또는 다른 소스 버스로 전송할 수 있습니다.
메타사운드 출력 감시(실험단계)

메타사운드 출력 감시를 사용하면 블루프린트 또는 C++를 통해 메타사운드 그래프에서 변경사항을 감시할 수 있습니다. 이를 통해 게임플레이와 비주얼을 메타사운드에서 발생하는 이벤트와 일치시킬 수 있습니다. 예를 들어 음악 비트 또는 오디오의 변화에 따라 게임플레이 엘리먼트와 비주얼에 영향을 미칠 수 있습니다.
이를 통해 다음과 같은 기능이 지원됩니다.
-
float, int32, Bool, fstring 타입의 제공된 메타사운드 출력에서 값이 변경될 때 이벤트를 발동합니다.
-
오디오 출력에서 엔벨로프 팔로워가 변경될 때 이벤트를 발동합니다.
UI 시스템
범용 UI(베타)

범용 UI는 크로스 플랫폼을 지원하는 다양한 멀티 레이어 유저 인터페이스를 생성하기 위한 툴박스를 제공합니다. 여기에는 다음이 포함됩니다.
-
UI 관련 입력 액션 시스템
-
입력을 캡처할 때 선택적으로 메뉴를 손쉽게 제외할 수 있게 해주는 입력 라우팅 시스템
-
일반적으로 사용되는 텍스트/폰트, 윤곽선, 버튼의 스타일 에셋을 제공하는 스타일링 시스템
-
일반적으로 사용되는 기타 위젯 라이브러리
5.3에 포함된 향상점은 다음과 같습니다.
-
향상된 입력과의 통합
-
입력 디버깅
-
문서 및 콘텐츠 예시
UMG의 폰트 DPI 일치

이제 디자이너가 UI 목업을 UMG 화면으로 변환할 때 폰트 크기를 손쉽게 확인할 수 있으므로 DPI와의 불일치 문제를 걱정할 필요가 없습니다.
-
새로 생성된 프로젝트는 DPI 세팅이 기본적으로 72DPI로 지정됩니다.
-
기존 프로젝트는 96DPI로 유지됩니다.
-
다른 DPI 세팅으로 전환하는 경우에도 폰트 렌더링에는 영향을 미치지 않습니다.
자세한 내용은 폰트 DPI 스케일링 문서를 참고하세요.
블루프린트의 뷰 모델

이전 버전의 언리얼 엔진에서는 디자이너가 C++에서 뷰모델을 생성해야 했지만 UE 5.3에서는 블루프린트에서 뷰모델을 생성할 수 있습니다. 이 업데이트는 다음과 같은 다양한 방법을 통해 뷰모델을 생성 및 바인딩하는 프로세스를 간소화하게 해줍니다.
-
MVVMViewmodelBase 클래스를 확장하여 새로운 뷰모델 블루프린트를 생성합니다.
-
블루프린트에서 일반적인 방식으로 변수를 생성하고 이름 옆의 종 모양 아이콘을 클릭하여 이를 FieldNotify 변수로 지정합니다.
-
FieldNotify 함수를 생성하여 전용 변수가 필요하지 않은 작업을 처리한 후 FieldNotify 변수를 사용하여 이를 트리거합니다.
-
뷰모델 패널을 사용하여 뷰 모델을 위젯 클래스에 추가합니다.
-
새로운 클릭-드래그 기능으로 뷰모델을 UI 필드에 더 쉽고 빠르게 바인딩할 수 있습니다.
프로젝트에서 블루프린트 기반 뷰모델을 사용하는 방법에 대한 자세한 내용은 뷰모델 문서를 참고하세요.
모델링
모델링 워크플로(베타)

에셋을 개발하는 아티스트의 경우 효율적인 모델링, 스컬프팅, UV 편집 및 텍스처링 워크플로가 필요합니다. 이러한 워크플로에는 단순히 몇 가지 툴을 특정 순서대로 클릭하는 것 이상이 필요합니다. 마우스 클릭 수를 줄이고, 커서 이동을 최소화하고, 아티스트에게 정확한 피드백을 제공할 수 있도록 모든 인터랙션 타입을 고려해야 합니다.
이러한 목표를 위해 UE 5.3에서는 다음과 같은 사항이 향상되었습니다.
새로운 UI
'모델링 모드(Modeling Mode)'의 메인 메뉴, 툴 팔레트 및 프로퍼티 패널이 새롭게 디자인되었습니다. 새로운 UI는 보다 컴팩트하고 효율적이며 일관된 워크플로를 지원합니다. 또한 새로운 메뉴에는 사용자가 정의할 수 있는 최상위 커스텀 메뉴를 제공하는 새로운 즐겨찾기 옵션이 포함됩니다.
툴 프리셋
크리에이터 및 개발자가 이제 모델링 툴의 커스텀 프리셋을 만들 수 있습니다. 아티스트는 커스텀 프리셋을 사용하여 여러 툴의 옵션을 저장하고 툴 아이콘에서 빠르게 액세스할 수 있습니다.
엘리먼트 선택
메시 엘리먼트를 직접 선택하여 워크플로의 일관성과 최적화 수준을 높일 수 있습니다. 기존의 선택 방법에서는 아티스트가 메시를 먼저 선택하고 특정 툴을 선택한 후 마지막으로 엘리먼트를 선택해야 작업을 호출할 수 있었습니다. 새로운 엘리먼트 선택 워크플로에서는 PolyEdit 또는 TriEdit와 같은 중간 툴을 사용하지 않고도 아티스트가 메시를 선택한 후 엘리먼트를 선택하여 작업을 호출할 수 있습니다.
모델링 툴(베타)

'모델링 모드'의 툴세트 개발이 계속되고 있습니다. UE 5.3에서는 스플라인을 사용하는 새로운 툴 외에도 몇 가지 요청해 주신 개선점이 툴세트에 추가되었습니다. 새로운 엘리먼트 선택 모드는 전용 툴세트에서도 지원됩니다.
스플라인 툴
크리에이터가 새 스플라인을 그리고 Revolve 및 Flat Mesh 작업에 사용할 수 있는 새로운 툴이 '생성(Create)' 메뉴에 추가되었습니다.
엘리먼트 선택 툴
엘리먼트 선택 워크플로에서는 선택된 대상에 직접 작용하는 새로운 툴 메뉴가 사용됩니다. 팔레트에는 Extrude, Bevel, Offset, Inset, Insert Loops 같은 일반적인 툴이 포함됩니다. 또한 PolyGroup 과 Triangle Edit 에 빠르게 액세스할 수 있습니다.
LOD 지원
이제 'Bake Transform' 툴과 'Edit Pivot' 툴을 사용하여 모든 LOD를 새로운 트랜스폼 또는 피벗으로 선택적으로 업데이트할 수 있습니다.
버텍스 컬러 페인트
버텍스 컬러 페인팅을 위해 새로운 툴이 추가되었습니다. 이 새로운 툴을 사용하면 여러 채널 또는 특정 채널에 컬러 페인팅, 채우기 및 블렌딩을 수행할 수 있습니다.
기타 향상된 기능
Edit Normals, Weld, Bake Texture, Generate PolyGroups 툴이 추가적으로 향상되었습니다.
사용 가능한 툴에 대한 자세한 내용은 모델링 툴을 참고하세요.
UV 툴(베타)

UV는 메시 작업에서 최종 렌더링뿐만 아니라 레벨 디자인에도 필수적인 중요한 구성 요소입니다. UE 5.3에서는 'UV 에디터(UV Editor)'에 다음과 같이 중요한 두 가지 새로운 기능이 추가되었습니다.
UV 에디터 디스토션 표시
'UV 에디터'에 이제 선택적인 디스토션 표시 모드가 포함됩니다. 이를 통해 텍셀 스트레치 또는 밀도 수준을 인터랙티브하게 표시할 수 있습니다.
UV 자동 레이아웃
이제 이 툴에서 텍셀 밀도 정규화가 지원됩니다. 이 옵션은 전체 레이아웃에서 일관되고 평균적인 밀도를 유지할 수 있도록 개별 아일랜드의 크기를 조정합니다.
UV 툴에 대한 자세한 내용은 UV 에디터를 참고하세요.
지오메트리 스크립팅(베타)
지오메트리 스크립팅은 테크니컬 아티스트가 커스텀 모델링 툴과 워크플로를 제작할 수 있는 툴키트를 제공합니다. 5.3에서 지오메트리 스크립팅은 현재 베타 상태이며 다음과 같은 추가 기능 및 향상점을 통해 계속해서 확장됩니다.
몇 가지 새로운 노드로 스켈레탈 메시 상호운용성 향상:
-
CopyBonesFromMesh
-
TransferBoneWeightsFromMesh
-
GetRootBoneName
-
GetBoneChildren
-
GetAllBonesInfo
-
GetBonesInfo
-
DiscardBonesFromMesh
오프셋 및 부울 계산을 포함하는 2D 폴리곤 및 패스 관리를 위한 새로운 함수:
-
Polygons Difference (폴리곤 차집합)
-
Polygons Union (폴리곤 합집합)
-
Polygons Intersection (폴리곤 교집합)
-
이외에도 대규모 함수 라이브러리가 제공됩니다.
포인트를 보간하는 메시를 생성하기 위한 들로네 삼각분할:
- Append Delaunay Triangulation
메시 표면의 측지선:
-
GetShortestSurfacePath
-
GetShortestVertexPath
지오메트리 스크립팅 및 사용 가능한 함수에 자세한 내용은 지오메트리 스크립트 사용자 가이드 및 지오메트리 스크립트 레퍼런스를 참고하세요.
콘텐츠 파이프라인
인터체인지 임포트/리임포트

이 출시 버전에서 인터체인지 프레임워크의 향상된 사항은 다음과 같습니다.
-
전체 씬을 리임포트할 수 있도록 새로운 커스텀 에셋 타입이 추가되었습니다.
-
인터체인지 UI에서 이제 변환별로 파이프라인 스택을 오버라이드하는 것을 지원합. 이는 추가적인 설정 레이어를 제공하며, 디폴트 세팅에서 사용됩니다. 예를 들어 glTF 에셋 파이프라인 스택은 FBX 및 OBJ에 사용되는 디폴트 에셋 파이프라인 스택을 오버라이드합니다.
-
glTF 임포트의 경우, 이제 에디터에서 머티리얼을 사용하거나 미리 정의된 머티리얼 인스턴스를 사용하도록 선택할 수 있습니다. 또한 보다 효율적으로 glTF 렌더링을 제어할 수 있도록 이러한 인스턴스를 오버라이드할 수 있습니다.
USD MaterialX(실험단계)

언리얼 엔진 5.3은 DCC와 언리얼 엔진 사이에 원활한 워크플로 및 콘텐츠 생성을 위해 MaterialX와 함께 USD를 사용할 수 있는 기능을 제공합니다. 이제 언리얼 엔진에서 직접 MaterialX 셰이딩 네트워크를 사용하여 USD 파일을 임포트할 수 있습니다.
또한 USD 파일 콘텐츠와의 직접 인터랙션을 지원하면서 USD 스테이지 에디터에서 MaterialX 셰이딩 네트워크가 포함된 USD 파일을 열 수 있습니다.
언리얼 엔진에서 MaterialX 지원은 5.1에서 도입되었으며 아직 실험단계입니다.
USD 머티리얼 및 텍스처

언리얼 엔진 5.3에서는 USD 에셋 디스플레이 향상을 위해 텍스처 및 머티리얼 처리 방법이 일부 변경되었습니다.
-
동일한 머티리얼에 있는 여러 UV 세트에 대한 지원이 추가되었습니다.
-
프리뷰 표면 머티리얼에서 단순 UV 트랜스폼에 대한 지원이 추가되었습니다. 텍스처 트랜스폼을 위해 수학 노드를 사용 중인 프리뷰 표면을 로드하는 경우 이제 올바르게 표시됩니다.
-
USD 스테이지 에디터의 '디테일(Details)' 패널에서 인터랙티브하게 USD 머티리얼을 변경하고 뷰포트에서 결과를 실시간으로 확인할 수 있는 기능이 추가되었습니다. 이전에는 변경사항을 보려면 USD 파일을 저장하고 다시 열어야 했습니다.
USD 애니메이션

직접 지오메트리 캐시 임포트
USD 파일에서 언리얼 엔진으로 캐시된 지오메트리를 직접 임포트하는 기능이 추가되었습니다. 이전에는 스테이지에서 USD 파일을 로드한 후에 거기에서 지오메트리 캐시 애니메이션을 재생할 수 밖에 없었습니다.
시퀀서에서 트랜션트 액터 지원
시퀀서에서 트랜션트 액터에 대한 지원이 추가되었습니다. 이를 통해 USD 스테이지 액터에서 시퀀서로 엘리먼트를 추가하고, USD 파일을 리로드하거나 언리얼 엔진을 닫고 다시 열 수 있게 되었습니다. 이때 시퀀서는 USD 스테이지 액터에서 애니메이팅 중인 엘리먼트에 연결된 상태로 유지됩니다. 이는 또한 USD 스테이지 액터에서 애니메이팅 중인 엘리먼트를 구동하는 스파스 키 애니메이션 커브를 유지할 수 있으며 구운 애니메이션을 새로운 USD 파일로 익스포트할 수 있음을 의미합니다. 이제 USD 스테이지 액터를 익스포트할 수 있으므로 해당 엘리먼트의 애니메이션을 레퍼런스된 스테이지에서 오버라이드로 익스포트할 수 있습니다.
프레임워크
스마트 오브젝트 - 월드 파티션 지원

스마트 오브젝트가 이제 월드 파티션, 데이터 레이어 및 퍼시스턴트 레벨에서 원활하게 작동합니다. 또한 스마트 오브젝트가 내비메시 및 피직스를 사용하도록 지원하여 슬롯 가용성을 높였습니다.
블루프린트 타입 변경 자동 형변환

코드 기반의 블루프린트 노출 프로퍼티를 지원 중단하고 새롭게 프로퍼티 타입을 변경하면, 오래된 핀을 다시 연결할 때 발생하는 오류가 발생할 수 있습니다. 그 결과 핀이 오펀(orphan)되고 컴파일 오류가 발생할 수 있습니다.
UE 5.3에서는 두 타입이 모두 자동 형변환 기능을 제공하는 경우 형변환 노드가 자동으로 생성되고 그래프에 추가됩니다. 또한 새 형변환 노드가 추가될 때마다 노트가 생성되어 새 타입 변경사항을 사용하기 위해 API를 업데이트하도록 사용자에게 알려주는 알림으로 사용됩니다.
데이터 에셋 병합

비교 툴이 현재 제공하는 것 이상으로 기능을 추가하기 위한 첫 번째 단계로, 에픽게임즈는 데이터 병합 솔루션에 대한 조사를 시작했습니다. 이 첫 번째 버전은 충돌을 자동으로 해결할 수 없는 경우 데이터 에셋을 수동으로 병합할 수 있게 지원합니다.
현재는 데이터 에셋만 지원되지만 향후에는 더 많은 데이터 타입을 지원할 것입니다.
리뷰 툴 스웜 코멘트

5.2에 도입된 리뷰 툴에 이제 직접 스웜이 통합됩니다. P4를 소스 컨트롤로 사용한다면, 비교 툴로 에디터에 코멘트를 직접 표시할 수 있습니다. 개별 변경사항에 대해 코멘트를 제공하고 글로벌 리뷰 노트를 남길 수도 있습니다. 에픽은 스웜에서 간단한 메타데이터 태그를 지정하여 코멘트를 비교 툴의 오른쪽 섹션에 링크했습니다.
엔진 콘텐츠 및 템플릿
콜라보 뷰어 템플릿에서 향상된 입력 지원

콜라보 뷰어 템플릿은 여러 사용자가 동일한 3D 콘텐츠를 공유할 수 있는 환경을 제공합니다. 이를 통해 팀원 모두가 실시간으로 손쉽고 빠르게 디자인을 검토하고 커뮤니케이션을 진행할 수 있으며 문제 파악 및 콘텐츠 반복작업을 한층 효율적으로 수행할 수 있습니다.
UE 5.1에서는 향상된 입력을 위해 OpenXR 지원을 도입하고 이를 XR 애플리케이션의 권장 입력 시스템으로 지정했습니다. UE 5.3에서는 향상된 입력을 통해 지원되는 추상성과 유연성을 활용할 수 있도록 템플릿이 업데이트되었습니다.
플랫폼 SDK 업그레이드

- Windows
- Visual Studio 2022 v17.4 이상
- Windows SDK 10.0.18362 이상
- LLVM Clang 14.0.1
- .NET 4.6.2 Targeting Pack
- .NET 6.0
- 빌드 팜 컴파일 대상 IDE 버전
- Visual Studio: Visual Studio 2022 17.4 14.34.31933 툴체인 및 Windows 10 SDK(10.0.18362.0)
- Xcode: Xcode 14.2
- GDK
- 최소 Windows SDK: 10.0.19041.0
- GDK: March 2023 Update 5 GDK
- 펌웨어 버전: Recovery June 2023(10.0.22621.4819)
- 지원되는 IDE: Visual Studio 2022
- Linux
- 기본 Linux 개발
- 권장 OS: Ubuntu 22.04 또는 CentOS 7
- 컴파일러: Clang 16.0.6
- 크로스 플랫폼 개발
- 크로스 컴파일 툴체인: v22 Clang-6.0.6 기반(CentOS 7)
- macOS
- 권장 사양
- 최신 macOS 13 Ventura
- 최신 Xcode 14.1 이상
- 최소 사양
- macOS 12.5 Monterey
- Xcode 14.1
- 권장 사양
- EOSSDK
- 1.16 바이너리(1.15 헤더 포함)
- 1.15 기능 세트 제공
- 1.16 바이너리(최신 플랫폼 SDK 지원 및 WebRTC 수정)
- 1.16 바이너리(1.15 헤더 포함)
- Steam
- 1.53
- iOS/tvOS/iPadOS
- 권장 사양
- 최신 macOS 13 Ventura
- 최신 Xcode 14.2 이상
- 최소 사양
- macOS 12.5 Monterey
- Xcode 14.1
- 지원 타깃 SDK 버전: iOS 15 이상
- 그래픽 API: Metal 2.4 및 Metal 3.0
- 권장 사양
- Android
- Android Studio Flamingo 2022.2.1 Patch 2 May 24, 2023
- Android NDK r25b
- Android SDK
- 권장 사양: SDK 33
- UE 컴파일 최소 사양: SDK 30
- 디바이스 실행용 타깃 SDK 최소 사양: SDK 26
- AGDE 디버깅을 사용 중인 경우 AGDE v22.2.69+ 필요
- 빌드 툴: 33.0.1
- Java 런타임: OpenJDK 17.0.6 2023-01-17
- Switch
- SDK 16.2.0
- 최소 펌웨어 버전: 16.0.3
- Nintendo Dev Interface 2.5.5
- 지원되는 IDE: Visual Studio 2022(SDK 버전 16.2.0)
- PS4
- Orbis SDK 10.508.001
- 시스템 소프트웨어 10.508.011
- 지원되는 IDE: Visual Studio 2022
- PS5
Prospero SDK 7.00.00.38
UE5Main에 7.00.00.45 업데이트 패치가 포함됩니다. 셰이더 컴파일러 수정을 위해 권장됩니다.
- 시스템 소프트웨어 7.40.00.06
- 지원되는 IDE: Visual Studio 2022
- ARCore
- 1.37
- ARKit
- 4.0
- OpenXR
- 1.0.22
출시 노트
Animation
API Change:
- Added the first version of Mutable extension API.
New:
-
Added a new LOD threshold property to rig logic anim graph nodes in order to compute facial animation earlier than other skeletal post-processing, which might be part of the same post-processing AnimBP.
-
Added the ability to disable or skip post-process AnimBPs at lower LOD levels. You can set the post-processing AnimBP LOD threshold similarly to how you can set LOD thresholds for some anim graph nodes. Additionally you can skip the post processing anim BP graph during set points entirely, to improve performance. The speed improvements scale with the complexity of the post-processing AnimBP and as well as the amount of nodes that do not support LOD thresholds or have setup node-based LOD thresholds.
-
Added the option to filter by Sync Marker to the Animation Sequence Browser.
-
Add new output warnings when the LegIK node is missing definitions or contains references to invalid bones.
-
IK Rig and IK Retargeter now available in UEFN.
-
IK Retarget poses can now be zeroed in local space to instantly straighten limbs for more accurate retargeting.
-
Added 0.75 and custom speed to Animation Viewport ToolBar, for Animation Speed and TurnTable speed.
Bug Fix:
-
Fixed an issue that could prevent the MeshBoneReduction module from loading as soon as the MeshUtilities module starts up, as it could be needed at any time from a background thread
-
Fixed an issue by adding a guard against the use of an invalid actor pointer in the Skeletal Mesh editors.
-
Fixed incorrect localized text in the LegIK Animation Blueprint node.
-
Fixed an issue occurring when creating animation assets overriding existing assets, by enabling replacing existing animation in the options to create new assets.
-
Fixed an issue occurring when pasting anim notifies from multiple tracks to a location that did not contain the same tracks.
Removed:
- Removed null links from Mutable graphs on load. This prevents incorrect behavior and editor instability when a node saved into a graph can't be loaded.
Animating in Engine
API Change:
- Fix inverted tangents on Y axis for 2D controls.
New:
-
Added a new
ControlRig.Sequencer.AutoGenerateTrack
console variable to toggle whether control rig tracks should automatically be created for new components. -
Control Rig FBX animations can now be exported and exported between Unreal
Improvement:
-
Curve Editor filters have been improved and can now be set using ranges rather than individual selections, so you can now bake a range of frames or times.
-
Curve proximities can now be updated when there is a drag operation so that the curve tooltips show the proper time and value.
-
Curve Editor selections are now synchronized whenever new items are added to the editor.
Bug Fix:
-
Fixed an issue that could occur by delaying a level sequence asset's creation until the tick proceeding the tick the control rig actor is dropped into the viewport. This prevents the level sequence asset creation to be in the same transaction as the create actors transaction. Previously, the movie scene could be collected as garbage when undoing the action, because its creation took place during another transaction.
-
Fixed an issue that could cause a memory leak with the backbuffer Render Target not being released at the end of a render.
-
Constraints: propagate offset change so that local transform animations are synchronized.
Gameplay
New:
-
You can now use the new experimental Dead Blending AnimGraph node. This node is designed as a drop-in replacement to the Inertialization node but uses the new robust "Dead Blending" algorithm which is more equipped to handle multiple simultaneous Inertilization requests or when the Inertialization transition is between two very different poses.
-
Exposed a new method to blueprints that you can use to get the weight of a montage playing on a specified animation slot.
-
Added the following AnimNode functions:
On State Exit
,On State Entry
,On State Fully Blended In
, andOn State Fully Blended Out
. These are located in any Animation State Graph's Result Node. -
Added support for AnimNodes to show any bound functions and not have them hardcoded.
-
Added a way for users to specify the string for the default binding name of a function member reference in a blueprint by using the "DefaultBindingName" metadata tag.
-
Added support for animation sync groups when using initialization for a state machine transition.
-
Added support for explicitly specifying the transitions trigger time when using state machine automatic transition rules.
-
Added a context menu option to Animation Blueprints to create an Animation Template from the blueprint that can be used to override animations using Child Blueprints.
Improvement:
- The
PlayMontageCallbackProxy
can now be derived from, in order to support plugins that want to provide customized versions.
Bug Fix:
-
Fixed an issue that could cause a crash when using the Inertialization AnimGraph node when re-parenting the Animation Blueprint.
-
Fixed standard blending not working as expected with sync groups.
-
Improved stuck detection in Distance Matching
-
Disabled option to duplicate a state from the animation blueprint editor's tree view.
Movie Render Queue
New:
-
Fixed issue where default settings would get added to a job that already exists when clicking on the Render Movie button from Sequencer.
-
Exposed UMoviePipelineImageSequenceOutput_EXR so C++ plugins can reference it.
-
When using the Render all Cameras feature, Spawnable cameras are now skipped if their default spawn track value is false.
-
Added support for camera rotation to be preserved during a Panoramic Render.
-
Updated the Console Variables setting to display the cvars contained within each cvar preset.
Improvement:
- Added a workaround for the UI Renderer setting having issues with some Layout Widgets not liking the 720p PIE preview window.
Optimization:
- Optimized the multi-sample accumulator for RGBA images on machines with many cores.
Bug Fix:
-
Fixed issue where canceling a job reporting as a successful job for some callbacks.
-
Fixed issue where UWorldSettings::Min/MaxUndilatedFrameTime were being modified and not restored after a render.
-
Fixed UI warning about losing unsaved changes to Queues when there weren't actually any changes.
-
Fixed issue where
{camera_name}
resolved intomain_camera
when not using the Render All Cameras feature is animating onto this. -
Fixed data type issue when exporting ProRes with OpenColorIO enabled.
Rigging
API Change:
- Creation of buffers is all done within the data interface at runtime.
New:
-
Added output bone transfer list for anim node. You can now limit the bones being driven by a Control Rig AnimNode in the Animation Blueprint Graph.
-
Added half edge connectivity data interface.
-
Added unit node to check if a shape is available in the shape libraries.
-
Added support for uint32 types.
-
Added Int32 to Name node (
IntToName
) -
Added feature to update the Reference pose of a bone directly in the Control Rig Editor.
-
Added LocalChainDynamics function which creates simple chain dynamics for the given chain.
-
New skin weight editing tool enabled editing weights by painting or directly on selected vertices.
-
IK Rig/Retarget assets can now be created directly from Skeletal Meshes in the right-click menu.
-
Performance improvement to retrieve a template from its arguments.
-
IK Retargeter toolbar redesigned for instant access to common retarget settings.
- Improved physics constraint editing in the Physics Asset Editor viewport.
-
Extracted all instance data from Control Rig virtual machine and moved it to the context data struct, as a step for stateless virtual machine.
-
FBIK solver now supports animated translation at runtime. Squashing and stretching limbs can use FBIK.
- RigVM context now has to be passed as a parameter to the virtual machine functions, rather than being located in the virtual machine itself (a step towards stateless virtual machine).
Improvement:
- Skin weights on skeletal meshes can now be edited through a new API in BP or Python.
Bug Fix:
-
Fixed issue when adding curves to the output skeleton from
USkeletalMergingLibrary::MergeSkeletons
. -
Fixed Control Rig Blueprint compilation error related to missing function definition after a Control Rig Blueprint containing function references is duplicated or renamed.
-
Fixed issue caused by Control Rig Editor Details panel when exiting PIE while debugging a Control Rig instance.
- Fixed an issue where sometimes the constraint viewport widget would be drawn relative to the wrong body.
-
Fixed an issue where pressing the keyboard modifier for editing the constraint's child frame (Alt + Shift) also activated the keyboard modifier for the Lock camera to widget feature (Shift) which caused the translation widget to move erratically when editing the child frame.
-
Fix for Control Rig Editor issue when adding comments and using undo / redo.
-
Fixed Control Rig compiler issue occurring when a specific function parameter usage is found on a rig, due to invalid remapping of inline function parameters.
-
Fixed an issue in the RigVM compiler when a rig function has more than 255 operands.
-
Fix IK Retarget automatic chain mapping mode "exact all"; now it does not reset non-exact matches to none.
-
FBIK solver will now dynamically reinitialize if the number of input bones changes dynamically at runtime.
-
Cleaned up Control Rig Python files to remove mixed tab/space error in runtime.
-
RigVMController: Added an array upgrade to reroute nodes with no source or target links where the value is an array, so it can load some deprecated rigs.
-
FBIK solver now works correctly with only one effector (regression from 5.2).
-
Fix for issue when adding a pin on Sequence Node in Control Rig graph.
-
Fixed memory leak in FBIK solver (regression from 5.2).
-
Spherical Pose Reader node in Control Rig fixed so it no longer flips when the activation region fills the whole sphere.
-
RigVM plugin now has a custom serialization object version.
- Fix for Control Rig Gizmos not working properly; after a changing the asset references to Soft Object Pointers.
Deprecated:
- Deprecated all Execution data interfaces. To set the execution domain of a custom compute kernel, use the Execution Domain field in the details panels of the kernel node. Valid domains should appear in the dropdown menu after connecting either a data interface to the kernel's primary group or a component binding node directly to the primary group pin.
Runtime
API Change:
- Extended the ImmediatePhysics_Chaos API so that you can now create Immediate Physics Constraints without copying values from Constraint Instances using a new CreateJoint function that accepts a JointSettings object instead of a FConstraintInstance.
New:
-
Added a new dedicated track for Inertializations to the Rewind Debugger.
-
You can now click on Animation node tracks in the Rewind Debugger and the node will be highlighted in the corresponding Animation Blueprint to improve debugging workflows.
-
Added missing tooltips for animation state machine schemas.
-
Animation Blueprint runtime errors are now logged in the PIE log, if they were found during a game session.
-
Anim blueprint logging can now use tokenized messages to hyperlink an error to the node it came from.
-
UAnimInstance::IsSlotActive() is now thread safe.
-
Player nodes in blendspace graphs are now added to GraphAssetPlayerInformation.
-
Reinstated some anim blueprint library methods which now use the Anim Pose API.
-
New colors to distinguish state aliases and conduits.
- Some LOD bone generation functions from the SkeletalMeshComponent have been extracted so they can be used from plugins.
- Updated the ComputeRequiredBones function to use the extracted functions.
-
Added a delegate to the SkeletalMeshComponent, so external systems can be notified when the RequiredBones get recalculated for a LOD.
-
Moved the SkeletionRemapping.h and SkeletonRemappingRegistry from private to public, to allow including these files in plugins
-
AnimBoneCompressionCodec now has a new DecompressPose function taking a FAnimBoneDecompressionData parameter, with the decompression data in the following separate array formats: translations, rotations, scales3D.
-
Added the ability to DoubleClick AnimSegmentsPanel, in order to jump to the target asset. You can also shift + DoubleClick to open it a in new window.
- Added a new compiler note and visual warnings to state machine transitions if the transition rule has logic but the flag for automatic rule based condition is set
Improvement:
-
Added a new helper function to find all external saveable packages.
-
Added current time accessors and library functions to Anim Notify events to allow for easy access to relative times and ratios.
-
Sync markers can now be managed in the same way as notifies.
-
Neural network mask curves are forwarded to RigLogic from both the Animation Blueprint node and Control Rig implementations.
Crash Fix:
-
Fixed an issue that could cause a crash when reloading a Control Rig Animation Blueprint.
-
Fixed an issue that could cause a crash when undoing or redoing an Animation Sequence edit while an async task is in flight.
-
Fixed an issue that could cause a reinstancing crash when using a custom Anim Instance proxy as a linked AnimGraph.
-
Fixed an issue that could cause a crash when calling
UAnimInstance::GetAllCurveNames
from worker threads. -
Fixed an issue that could cause a crash when compiling an Animation Blueprint during automated tests.
-
Fixed an issue that could cause a crash when right-clicking a modified curve node in a template Animation Blueprint.
-
Fixed an issue that could cause a crash when unloading animation assets in a game feature plugin that are referenced by editor thumbnails.
-
Fixed an issue that could cause a speculative crash during automated tests.
Bug Fix:
-
Fixed an issue that could cause a regression with curve inertial blending due to the curve refactor.
-
Fixed an issue that could cause the start position to be ignored when using sync groups.
-
Fixed an issue that could cause an ASan issue when unregistering property type customizations on shutdown.
-
Fixed an issue that could prevent the creation of a child Animation Blueprint in the Content Browser.
-
Fixed an issue that could cause a crash when opening a template Animation Blueprint with the Curves tab open.
-
Fixed an issue that could cause meshes to be distorted when the Leader Pose nod.
-
Fixed an issue that could cause blending to incorrectly skip blending in and out when using inertial blending curve filtering.
-
Fixed an issue that could cause Anim Node Functions to not be called in versioned builds when multiple are bound to the same Animation Blueprint node.
-
Fixed an issue that could cause cached poses to be invalid on subsequent evaluations of an AnimGraph.
-
Fixed an issue that could cause stack corruption caused by calling an Anim Node Function with an altered signature.
-
Fixed an issue that could cause out-of-bounds access in Control Rig curve I/O.
-
Fixed an issue that could cause distorted meshes when assigning assets using skeleton compatibility.
-
Fixed an issue that could cause curves to be missed intermittently in cooked content.
-
Fixed an issue that could cause bone LOD filtering to display incorrect results during automated tests.
-
Fixed an issue that could cause the Layered Blend per bone node to not work correctly with per-bone curve filtering.
-
Fixed an issue that could cause out-of-bounds access in PoseAssets that have additional poses with their respective curves.
-
Fixed an issue that could cause fired notifies to not be reached when looping by clamping remaining time.
-
Fixed an issue that could cause the virtual bone menus to not appear when adding additional virtual bones.
-
Fixed an issue with the Control Rig Anim Node that could cause the Rigid Body Anim Node in a post process AnimBP to stop working.
-
Fixed an issue that could cause OOM issue on consoles by reducing default alignment requirement of memory allocations in RigLogic.
-
Fixed an issue that could cause performance problems when multiple faces (DNAs) are loaded during gameplay.
-
Fixed issue when attempting to collect sync markers in a montage with an invalid slot track index.
-
Fixed
bCanUseMarkerSync
to default to true even when the animation asset did not have any sync markers. -
Fixed
bCanUseMarkerSync
being true for followers when all valid markers were filtered out. -
Fixed issue when linking/unlinking anim layers from UGameplayAbility::EndAbility.
-
Animation editor now correctly applies preview mesh from a compatible skeleton.
-
Fixed issue when filtering preview mesh on template anim BPs.
-
Fixed Anim BP asset definition correctly displays option to create child Anim BP.
-
Fixed issue when adding curves to anim sequences and immediately getting the bone pose.
-
Fixed issue in UBlendSpace::TickFollowerSamples due to hard coded bLooping flag.
-
Fixed NaN crash in FAnimNode_LinkedInputPose::Evaluate_AnyThread.
-
Ensure a clamped normalized time stays within the 0-1 range in the Blend Space Evaluator.
-
Fixed "Start" animation notify event for state machine transitions not being fired when bSkipFirstUpdateTransitions flag is set to false.
-
Fixed an issue that could cause a reinstancing crash in linked anim layers or graphs.
-
Fixed an issue that could cause use-after free when duplicating animation attributes.
-
Fixed an issue that could cause a crash when deleting a sync marker at the SyncMarkers Window, when finding an AnimMontage during the process.
-
Fixed a but that would only look at player controllers, and not something like AI controllers, when considering viewpoints for auto significance calculation.
-
Fixed an issue that could cause the GetLinkedAnimLayerInstanceByGroup tp not work for non-implemented layers with no instance assigned.
-
Fixed an issue that could cause the Details panel to disappear when making curve metadata edits.
-
Fixed an issue that could cause the preview instance from not being re-selecteable after selecting an external anim instance to debug.
-
Added some missing definitions for the UAnimInstance's function GetRelevantAssetPlayerInterfaceFromState.
-
Fixed an issue that could cause a crash in FMirrorSyncScope.
-
Fixed an issue that could cause blendspace sample entries from expanding when a sample animation is changed.
-
Fixed an issue that could cause a crash on loading an anim BP with pose hander nodes that require skeleton updates to their animations.
-
Added a missing ENGINE_API tag to SkeletetonRemappingRegistry, as it is required to use it from outside of the engine
-
Fixed an issue that could cause a crash when using an incorrect bone index type usage in UAnimationSequencerDataModel::GeneratePoseData.
-
Fixed an issue that could occur by ensure when transforming bone indices during animation compression.
-
Fixed an issue that could cause an issue with the SkeletalMeshComponent ComponentIsTouchingSelectionFrustum, as it was returning false positives due to missing check.
-
Fixed an issue that could cause issues with the FBX Import due to a name restriction not allowing bone names to start with a number at RigVM hierarchies.
-
Fixed an issue that could prevent the Animation Sequencer from triggering notifies repeatedly when using an animation mode track set to Use Anim Blueprint in a Level Sequence, by adding a parameter to the SkeletalMeshComponent SetAnimationMode function that allows not re-initializing the AnimationScriptInstance.
-
Fixed an issue that could cause a crash when using the PoseableMeshComponent, when the component is being incrementally unregistered and the unregistering process takes longer than the time limit set in the component.
-
Fixed an issue that could cause a crash when using one of the Animation editors when closing one viewport while additional viewports are open.
-
Fixed an issue that could prevent the BlueprintEditor from being refreshed after adding an animation layer node into an animation graph.
-
Fixed an issue that could cause an issue during an AnimComposite animation notify extraction when playing in reverse order.
Deprecated:
-
Added a deprecation warning for
AnimNode_StateResult.h
located inAnimGraphRuntime
module since the file got moved toEngine/Animation
. -
Removed the deprecated mirroring functionality from SkeletalMesh.
Sequencer
New:
-
Added the ability to create Takes for Subsequences.
-
You can now add comments for shots and Sequencer sections.
-
Added support for tags when bindings are copied and pasted in Sequencer.
-
Added the option to select the material parameter collection asset from the track in Sequencer.
-
Reassigned the
LevelSequenceEditorSettings.h
to public. -
Added command bindings for composition overlays to the Cinematic Viewport.
-
Exposed the ability to access setters and getters for audio section looping, suppress subtitles, and attenuation functions.
-
The Sequencer's Key editor now edits selected keys if they are selected. Otherwise, it edits at the current time as usual.
-
Bound recording commands in the Take Recorder now play in world space so that they work in Editor and in PIE.
-
The Clock Source menu is now always visible even in SubSequences, but is only editable when the Sequence Editor is focused on the root sequence.
- Several improvements have been made to the Sequencer's Import EDL:
- Added the support of KEY CLIP NAME
- Sequencer now parses the timecodes from the end of the line.
- If the EDL contains a shot multiple times, subsequent shots will be created in Sequencer when importing, corresponding to the EDL shots.
-
You can now change the Sequencer folder color of multiple folders by multi-selecting.
-
Sequencer Track filters are now saved in preferences.
-
Added a new transaction for toggling Show Marked Frames Globally.
-
Added support for a start offset to camera animations.
-
Upgrade audio track to use the new ECS evaluation.
-
Moved level-sequencer-specific editor code to the LevelSequenceEditor plugin.
-
Moved sequencer customizations to the editor view-model.
- Add the following improved edge interaction for sections:
- You can now use draw easing handles as rounded triangles sized to match the grip size, instead of the previous bitmap.
- Easing handles are bigger, with bigger hit-testing area to make selection easier.
- Exposed key size through the section interface in addition to grip size.
-
Added support for blend types and multiple rows for material parameter tracks (widget and MPC).
-
Exposed camera animation parameter to detail views.
-
String properties and String tracks now use the new ECS evaluation.
-
Add ability to lock marked frames on the time slider.
-
Register/unregister the camera animation stand-in object from its own module.
-
Added new user-defined bindings to Sequencer. This change adds the ability to define custom logic, using the directory blueprint, for object bindings. Instead of binding to the usual possessable or spawnable, this will optionally run arbitrary BP logic defined by the user to resolve the bound object. This makes it possible, for instance, to bind to the player pawn, or any other actor that might not exist at edit time. The UI is similar to that of the event track, and therefore reuses the director blueprint endpoint picker. There is however a new blueprint extension to compile these functions into the spawnables and possessables, and of course a spot to call these functions when appropriate.
-
Added a new key that you can use to allow the player to be closed.
-
You can now expand skeletal animation sections back to the left.
-
Added new feature: Smart Auto Key.
-
Smart Baking for Constraint Baking, Space Baking, Snapper, Control Rig collapsing and Baking Transforms.
-
Swap Root Bone on Track.
-
Animation Mode: Disable selection when clicking on an axis, avoids losing selection when manipulating.
-
Curve Editor: Make normalized mode scrollable and panable. This makes sure that if you frame to the normalized mode now it doesn't use the max/min values but defaults.
-
Control Rig: Shift now moves camera to stay with Control Rig when moving.
-
Curve Editor: Keep Output bounds the same even if curves are destroyed so you can select/deselect and keep their curve bounds.
-
Take Recorder now supports up to eight audio input sources for multi-track audio recording.
-
Added time scrubbing to Sequencer and Curve Editor to match Viewport behavior.
-
Added native accessors for common float/color light properties to improve performance when setting properties following sequencer evaluation.
-
Curve Editor: Added option to show constraint/space bars.
- Linked Anim Sequences are now editor only.
Improvement:
-
Take Recorder Timecode setting names now default to the same as Anim Sequence so that aligning works.
-
Removed the Sequencer's Add (+) button text rollover visibility. Now the text is a tooltip so that there's no overlap with key editor buttons.
-
Added the Sequencer's Browse to Actor property back to the actor's right-click context menu.
-
Control Rig Controls filter is no longer enabled by default in Sequencer. You can optionally enable it, and your preference will be saved between sessions.
-
Trim and Preserve now calculate the correct transform when the attached component isn't the root component.
Crash Fix:
- Fixed an issue that could cause a crash when sorting sections on load.
Bug Fix:
-
Fixed an issue that could prevented the ability to toggle on or off tags inside of shots and subsequences.
-
Fixed an issue that could cause new keys to be added when attempting to update an existing key.
-
Fixed an issue that could cause the group manager to not refresh when performing an undo or redo command.
-
Fixed an issue that could prevent the group manager selection to not function properly with folder paths.
-
Fixed an issue with path track evaluations that could cause component velocity to not be set properly when an object is moved by the path track.
-
Fixed an issue that could cause regenerating waveforms during playback to not function correctly by adding a slight delay to eliminate hitches.
-
Fixed an issue that could cause duplicate entries in the property menu.
-
Fixed an issue that could cause Show Marked Frames Globally to not be marked as a UPROPERTY so that it gets serialized.
-
Take Recorder: Fixed range for camera cut section so that it works for subsequences when recording cameras.
-
Remove unnecessary creation of camera cut track and section because they're already created when a camera is added.
-
Fixed an issue that could cause animation sequence to be marked dirty, due to the spawnable being modified, if the sequence is evaluating.
-
Fixed mute/solo nodes when hierarchy changes by tracking old and new nodes paths.
-
Fixed issue when the widget is replaced and no longer valid.
-
Fixed issue where duplicating keys is not undoable and doesn't update the UI properly.
-
Fixed an issue by keying the material parameter collection instance's current value if it exists, rather than always just the default value.
-
Fixed an issue by compensating for transform origin when adding an object's transform to Sequencer.
-
Fixed track row names when row indices have been remapped or a new row has been added.
-
Fixed an issue that could occur when pasting a possessable, by only parenting it to the pasted target if the possessable's class is not an actor, such as a component. This fixes an issue where an actor could be pasted into another actor.
-
Fixed an issue by ensuring the CineCamera actor's name is unique when creating as possessable. Normally this is done in the actor factory but here we spawn the actor directly.
-
Check for valid animation on skeletal animation FBX export.
-
Fixed issue where calling scripting functions (AddKeyInChannel, RemoveKeyFromChannel, SetDefaultInChannel, ReoveDefaultFromChannel, SetTimeInChannel, SetValueInChannel) is not undoable and doesn't update the UI properly.
-
Fixed an issue by initializing layers for spawned actors. This fixes issues where if you add a spawnable to a layer, hide the layer, and then reopen the sequence in a new level, the spawnable won't be visible and won't respond to layers in the new level.
-
Fixed an issue that could prevent Snap Sections in the Timeline by using the Source Timecode so that it takes tick resolution into account
-
Fixed an issue by preventing all camera actors from being selected in the camera cuts menu even if it is hidden.
-
Fixed an issue that could cause small sections to result in negative time-to-pixel conversion.
-
Fixed an issue by carrying over the previous view target from a previously playing level sequence, if any, so that the last sequence played restores the actual original view target, and not the previous sequence's camera. This fixes issues with stuck cameras when some sequences are played on top of each other.
-
Fixed an issue that could cause a crash when using the context menu in the Camera Cuts track to try and select an unspawned spawnable.
-
Fixed an issue by preventing global custom accessors from being unregistered on shutdown.
-
Fixed an issue that could cause recycling of view-models when track layouts are rebuilt. This fixes some UI issues with keys and sections being moved between track rows.
-
Fixed an issue that could cause a crash when shakes are previewed in Sequencer or in the Camera Shake Previewer tool.
-
Fixed an issue that prevented initial material parameter values to be cached correctly.
-
Fixed an issue that could cause a crash when recompiling a user widget while Sequencer is open.
-
Fixed an issue that could cause the Snap to Interval tool to not function when Snap to Keys and Sections was not selected.
-
Fixed an issue by restoring aspect ratio axis constraint directly on the player if the level has changed during sequence playback.
-
Fixed an issue by correctly restoring the Sequencer editor playback speed on stop and pause operations.
-
Fixed an issue that could cause the key editor widget to not be cleaned up correctly when a track goes from 1 to 2 or more rows.
-
Fixed an issue that could cause a crash when dragging an item from the Place Actor menu over a sub-scene section.
-
Fixed a UI issue where the preview for the section length shown was only as long as the first sub-sequence asset, not the longest asset in your drag or drop selection.
-
Fixed an issue that could cause Sequencer runners to detach and attach to linkers in interwoven ways.
-
Fixed an issue that could cause the Additive From Base blend type to be missing an icon in the UE5 style.
-
Fixed an issue by taking play-rate into account for blend times between blending camera cuts.
-
Fixed an issue that could cause a Control Rig Component to be constantly reinitialized when used in Sequencer.
-
Fixed an issue that could cause incorrect blending out of sequencer camera shake patterns.
-
Fixed an issue by not calling the NotifyMovieSceneDataChanged() function when pasting tracks. This fixes an issue with Niagara not setting up its data correctly after pasting a track.
-
Fixed an issue that could cause interactions to be incorrectly handled between the normal track area and the pinned track area.
-
Fixed an NVVM refresh issue that could cause view-models who already have a recycle list would not recycle their children. This meant that a re-used track-row view-model would not get its children cleared out before it is rebuilt with new underlying data.
-
Fixed an issue with the Channel Curve Models in Sequencer Curve Editor that could cause the tracking interpolation type of neighboring keys to not operate properly when a new key was added.
-
Fixed an issue that could cause the MovieSceneSequenceExtensions::GetBindingId to not be properly exposed to python scripting.
-
Fixed an issue that could cause ease-in curves to not show properly when a section starts at time 0 that also does not have an ease-out.
-
Fixed an issue by not caching pre-animated state on entities that are being torn down.
-
Fixed an issue that could cause BOOL and INT curves to not be drawn past left or right-most key value in Curve Editor.
-
Fixed an issue that could cause a null check in Movie Scene playback.
-
Fixed an issue that could cause autosizing of subsections, audio sections, and skeletal animation sections, to not function properly, as they were all missing taking into account start or end offsets.
-
Fixed an issue that could cause a spawnable binding to be overridden during the sequencer, the spawned actor will get left behind, creating duplicate characters. Now, when a binding is invalidated, and we detect an overridden binding, Sequencer checks if a spawnable is registered, and if so, destroys that spawnable.
-
Fixed an issue by setting a zero value on an additive Control Rig section, so it doesn't always add and uses default interpolation.
-
Fixed an issue by adding the sequencer ability to change the SkeletalMesh asset from a Skeletal Mesh Component in cooked builds.
-
Snapper: Use default key type when setting keys.
-
When changing time via translate hotkeys get all changes first, then apply them to avoid double transforms with space/constraint keys.
-
Control Rig: When looking for a binding that constrains a Control Rig, it takes into account the Control Rig so it picks the correct Actor or its component. For certain setups the face and body rig both bind to the same component on the Control Rig, but bind differently on the Sequencer side.
-
Fix for missing or incorrect timecode values being stored in audio assets when recording with Take Recorder.
-
Constraints baking: changed the tangent type to the default for the keys at compensation to avoid inserting keys that may have flat tangents.
-
Control Rig: Fix keying weighted additive sections.
-
Fix copying actors in Sequencer that live in sublevels, you can end up selecting the wrong Actor.
-
Only sync curve selection when updating the tree if we have no curves, otherwise this will blow away what the animator is working on.
-
Fixed silent failure case in Sequencer when scrubbing audio at low frame rates.
-
Fixed an issue that occurred when applying an FFT filter with insufficient number of keyframes selected in Curve Editor.
-
Calling PasteBindings() from Blueprints or Python correctly returns the newly created bindings.
-
Linked Anim Sequences work with nested sequences.
-
Curve Editor: Don't show the space or constraint key bar spaces unless there is a space.
-
Snapper: Do not include controls without shapes when snapping to avoid issues.
-
Animation Mode: Restore Gizmo Scale when leaving/entering Animation Mode.
-
Linked Anim Sequence: Only dirty if the data is changed, not if refreshing or changing sequences.
-
Control Rig: Make sure it is on game thread when handling initialize events, fix possible issues with procedural rigs.
-
Fixed Sequencer player playback replication synchronization to only happen once per tick.
Deprecated:
-
Deprecated the GetBoundObjects as it is incompatible with Spawnables. It is recommended to use ULevelSequenceEditorBlueprintLibrary::GetBoundObjects because it operates on the currently opened sequence in Editor and can return valid spawnable objects.
-
Remove Matinee's PostInterpChange, as it is not often used or compatible with projects.
Synthesis
New:
-
Added progress bars when creating and compressing Morph Targets.
-
Added support for using Physics Blend Weight alongside Physics Control Component.
-
Added a new
UpdateKinematicFromSimulation
flag to BodyInstances. This allows kinematics to be treated the same as dynamic objects when simulating with async physics. The flag defaults tofalse
, so there is no change in the default behavior, unless using the Physics Control Component, which sets the flag by default. -
You can now get the current or target transforms with Physics Control Component.
-
You can now set the Physics Control Component to use manual updates.
-
The Physics Control Component damping ratio in the PhysicsControlMultiplier struct has now been exposed.
-
You can now bulk edit Physics Control Component settings, such as the target positions and orientations.
-
You can now reset the physics transforms to the cached targets when using a Physics Control Component.
-
Added the ability to use profiling mark up when using a Physics Control Component.
-
Removed the NNI from ML Deformer VertexDeltaModel and NearestNeighborModel.
-
Fixed an issue that could cause a crash when initializing the ML Deformer on Linux operating systems.
Improvement:
- Improved ML Deformer reconstruction quality:
- The ML Deformer reconstruction method now uses a smoothed L1 loss function, adding a new beta Smoothing Loss property to the training settings.
- The reconstruction method also now uses cosine annealing learning rate scheduler, which removes the Learning Rate Decay setting.
-
The ML Deformer now displays a warning when using the Vertex Delta Model, that it should not be used in production.
-
The ML Deformer now uses extra Get functions to get private members.
-
Verbose logging has been added where non-verbose logging wasn't needed.
-
Added additional null safety checks to the ML Deformer.
-
The ML Deformer now prevents sampler reinit when not needed.
-
ML Deformer models can now specify the number of floats per bone.
-
The ML Deformer now detects changes in vertex count, and shows a warning in the morph target section, when dynamic Morph Target updates aren't possible until after retraining.
-
Improvement the cleanup of the external Morph Targets, which also clears out the weight data.
-
Improved the component reinits by reducing the number of units.
-
Improved the rendering of bones inside the ML Deformer asset editor.
- The Initialise Physics Control Component control strengths are now set to
0
by default, instead of1
.
Crash Fix:
-
Fixed an issue that could cause a crash by preventing the ML Deformer from updating dynamic Morph Targets when it is not possible
-
Fixed an issue that could cause a crash when the local bone transforms on the skeletal mesh component were empty.
-
Fixed an issue that could cause a crash when creating a new actor blueprint, adding the blueprint to a skeletal mesh and ml deformer component, then setting a neural morph model as ML Deformer asset, and selecting the vertex delta model mesh deformer in the skeletal mesh component.
Bug Fix:
-
Fixed an issue that could cause the ML Deformer asset to behave incorrectly. This could likely happen when aborting during training, or changing assets after training, and saving. Now, the editor correctly sets section indices inside the Morph Targets, rather than just including all sections and sorts the Morph Target deltas by vertex number.
-
Fixed an issue that could cause unexpected behavior when using curves in the Local Model.
-
Fixed an issue that could cause the ML Deformer editor to enter a state where the timeline does not function properly after changing the input of an asset, such as a property on a skeletal mesh.
-
Fixed an issue that could cause compatibility checks to fail after training.
-
Fixed an issue that could cause a check to fail in debug mode.
-
Fixed an issue by setting the Physics Blend Weight property to 1 by default when using a Physics Control Component to simulate physics. This ensures that using a mixture of kinematic and dynamic bodies works with skeletal meshes.
-
Fixed an issue that could occur where the ML Deformer time sampling was incorrect.
-
Fixed an issue that could occur when render graph errors in ML Deformer Vertex Delta Model.
-
Fixed some issues that could occur with ML Deformer Vertex Delta Model inferences.
-
Fixed an issue that could occur with the VertexDeltaModel which caused animation to appear frozen.
-
Fixed an issue that could cause a module in ML Deformer to be missing.
-
Fixed an issue that could cause an incorrect mismatched vertex error in MLDeformer.
Removed:
- Removed a substring redirect from the ML Deformer, which wasn't needed anymore and triggered a warning in the log.
Editor
API Change:
- There is no support for OpenGL on Linux, so the imaging and usdImaging USD libraries that depend on OpenGL are excluded on that platform.
New:
-
Added editor performance setting to control
r.VSyncEditor
. - Added support for overriding enum value display names on a per-property basis.
- This can be specified by the Enum Value Display Name Overrides meta-data, and is a semi-colon separated list of
Name=DisplayName
pairs where the Display Name can be a raw string or a NS/LOCTEXT style localized value.
- This can be specified by the Enum Value Display Name Overrides meta-data, and is a semi-colon separated list of
-
Added Source Code Access plugin for the 10X editor.
-
Added a Copy References and Copy Paths button to the editor asset menu.
-
Disabled real-time viewports when the editor process is in the background and
bThrottleCPUWhenNotForeground
. -
Optimized advanced copy by running its consolidate step less frequently.
-
Added new option for PNG import to fill RGB into transparent neighbors always, even on complex alpha channels. Previously was only doing RGB fill on simple binary transparency. This is configurable in Texture Import Settings.
-
Added a Fixup Group Actors function.
-
Added support for Windows ARM64, Linux, and Mac.
-
Changed floating point textures to default to BC6H compressed texture format on import, rather than RGBA16F. Existing textures are not changed. The format chosen by default can be set in the Texture Import Settings config; for VFX users may set it to default to 32 bit texture formats.
-
Added support for automatically wiring inputs when creating a node from a specific output.
-
Enabled easy command line override of shared linear encoding (
-ForceSharedLinearTextureEncoding=True/False
). -
Fixed 32-bit size limits and bugs that prevented use of very large images (such as file sizes over 2 GB). Unreal should now be able to import very large images, only limited by memory use and the target platform or VT size limits, which is currently 16k x 16k for non-VT and 4 GB built size for VT.
-
Added button to Media Plate to browse to the material asset.
-
Updated the Fracture editor with a display of imported collision shapes in the convex tool if they are available and enabled. The display supports convex, box, sphere and capsule imported shapes.
-
Sound Cue Nodes now obey Class Viewer Filters.
-
Updated the Plastic SCM plugin to version 1.8.0.
-
Modified advanced color space transformations and source encoding overrides on textures to utilize the OpenColorIO library.
-
Added basic SCC support to Content Browser file data sources. This is enough to support the basic operations (on add, delete, move, rename), as well as the revision control file menu (to allow sync, revert, check-in, history, and diffing).
-
Added a context menu entry to perform asset validation on specific actors.
-
Upgraded OpenEXR version to 3.1.6.
-
Included the imaging and usdImaging libraries in the engine's build of USD.
-
Exposed
SetIgnoreBoundsForEditorFocus
as Blueprint callable and addedGetIgnoreBoundsForEditorFocus
. -
Exposed single click action within SGraphPanel to allow hooking custom logic.
-
Adding a new Cook Metadata file that gets generated adjacent to the development asset registry. This will be the home for metadata about the cook that is unrelated to assets moving forward. Currently this contains dependency information regarding the enabled plugins at cook time, as well as plugin size information that gets written to the cook metadata file during staging, if enabled.
-
Upgraded USD version to v23.02.
-
Properties Menus drawn from the Sequencer now obey the Property Editor Permissions List.
-
Updated icons for Check-in Changes and Sync Latest status bar buttons.
-
Added ability to revert conflicted files in the Submit Files window.
-
Added the
-AssetRegistryCacheRootFolder= commandline
option to allow you to choose where to write the asset registry cache files. -
Added number of convex to the statistics widget in the Fracture editor.
-
Made the histogram Set Inspected Attribute method in the Fracture editor to be more resilient to ill formed geometry collections.
-
Triggered an autosave if there are any unsaved changes when a user clicks check-in changes.
-
Updated the debug focus plane bounds to not be taken into account anymore when focusing on a cine camera in the editor, making the viewport focus on the actual camera itself.
-
Improved editor startup performance related to populating
FAutocastFunctionMap
entries. -
Improved editor asset scan performance.
-
Updated the Variant manager properties list to include static mesh and overlay material properties.
-
Updated
SyncBrowserToObjects
use const arrays and addSyncBrowserToObject
. -
Added Blueprint Display Name to Blueprint Generated Class editor tags to permit aliased class names in cooked editor.
-
Added a tooltip to the toggle visibility button in the scene outliner and the Pin button in the scene outliner.
-
Renamed Mobile Preview ES3.1 (PIE) to Standalone Game Mobile.
-
Renamed Vulkan Mobile Preview (PIE) to Standalone Game Vulkan Mobile.
-
Renamed Mobile Preview (PIE) to Standalone Game Target Device Mobile.
-
Renamed Preview Rendering Level to Preview Platform.
-
Rename DebugText in EditorViewport from Feature level: to Preview Platform:.
-
Added a callback to get notified when the
UObject
garbage collection finishes purging objects. -
Loaded components ( including the one in blueprints ) are now properly updated when using Dataflow to generate a Geometry Collection asset.
-
Added parameter to enforce the cluster number when using the connectivity data in the Fracture editor.
-
Prevented non-server standalone instances from using Server Map Name Override.
-
Added the ability for objects to have alternate selection outline colors picked from a palette.
- Added support for statically and dynamically registering documentation redirects to allow licensees to override engine level documentation links without duplication / adding boilerplate menu overrides. Documentation redirects can be registered statically through INI editor config files or dynamically in code through the IDocumentation interface.
Improvement:
-
Updated the asset registry exporter to output to CSV to facilitate import into common database frontends. Additionally, support outputting dependency information based on a set of primary asset type roots for help in analyzing the source of build size.
-
Updated the function
UContentBrowserAssetDataSource::CreateAssetFilter
to improve performance. For a large project with a lot of paths using a recursive search on all the folders, the change reduced the time it took to create the filter by about 86%. -
Improved the backend filter compilations of the asset views by adding a system to cache some part of the filter compilation.
-
Improved connectivity tool visualization in the Fracture editor:
- Centers are now displayed.
- Added controls for line thickness, point size, and colors.
Bug Fix:
-
Fixed a crash accessing null pointer on shutdown of editor.
-
Corrected Clear Thumbnail not working if asset is not already loaded into memory.
-
Fixed it so Additional Server Game Options in the Play in Editor options applies to externally launched dedicated servers as well as listen servers.
-
Corrected the clear on pie checkbox to work by putting in the correct path.
-
Fixed editor ensure startup when stats is not defined.
-
Fixed crash on exit in stall detector thread when editor closed by call to
RequestEngineExit()
. -
Updated Ability System Component function to check the Spec's ability pointer before use.
-
Fixed crash on shutdown if a web browser window was open.
-
Fixed nested virtual roots (from aliases) failing to resolve correctly in the Content Browser.
-
Fixed regressions when undoing a deleted one-file-per-actor post-save.
-
Fixed the details panel failing to restore expansion state when running deferred actions.
-
Fixed an issue with the content browser not always showing the path filters. The
SLATE_ARGUMENT
to determine if it should be shown was not initialized. -
Fixed a crash bug with Advanced Copy, where two asset dependencies with the same name would flatten down to overwrite each other.
-
Fixed crash when creating a parameter from a datatable asset or any asset.
- Fixed a couple of issues where packages were aggressively dirtied:
- Call cancel on the transaction if it is actually a camera movement input.
- Reset package dirty state when a widget drag is canceled (for example with escape key).
-
Made
FBoxes
IsValid
flags editable, otherwise editor-modified boxes will compare equal to the CDO and so not be saved. -
Usee
FLinearColor
for screen fades so that extreme values behave consistently between the editor and the runtime. -
Fixed Variant Manager opening an extra empty window.
-
Fixed Unreal Editor's crash when using Unreal Remote.
-
Fixed a crash where a Thumbnail Pool could be deleted while it is ticking because the asset view that owned it was destroyed while generating a thumbnail.
-
Fixed a crash on editor shutdown where the transactors for ISM typed element handles were cleaned up too aggressively.
-
Reworked component visualizer visibility to key off draw debug variable. When this is disabled, the component visualizer will still draw if the component is directly selected, and will allow editing this way. Supports helper splines for PCG workflows that are intended to be hidden by default to the user.
-
Fixed a memory leak caused by a circular dependency from the delete asset window. This also fixed a general performance degradation of the editor when deleting assets because of the leaking assets pickers widget.
-
Fixed an issue where the gizmo would rotate on an axis from keybinds, even if the user had selected a valid axis on the gizmo.
- Fixed a crash when prtining typed element debug ID.
- Speculative fix for seen once crashes in typed element debug ID printing.
-
Fixed duplicates being wrongly reported when adding elements to map or set properties in the editor, where the key type is a
UClass*
key and the class name is a subset of a name which already exists as a key. -
Fixed an issue where the hovered/active gizmo hit proxy is incorrect when mouse tracking restarts This was causing the indirect manipulation axis to persist as new buttons were pressed, which would result in the wrong axis getting manipulated.
-
Updated the level editor place actors menu to respect Class DisplayName overrides.
-
Fixed an issue where an invalid
FName
could cause category path look up to assert. -
Fixed the Convert to Static Mesh actor's tool to now handle Instanced Static Mesh Components (and HISM components) properly.
-
Fixed the inability to revert level file deletion in Check-in Window.
-
Fixed an issue that prevented the use of the property matrix on textures.
-
In the Subversion settings, only the path of the Executable Location setting will be used and any executable name after the path will be ignored.
-
Fixed a bug where the asset registry cache would not be written in certain situations related to synchronous scanning.
-
Implemented auto-save on check-in.
-
Fixed issue that prevented deleted objects from being restored on Revert All.
-
Fixed issue that caused not saving deleted files during Delete workflow to result in errors after sync.
-
Fixed issue that caused added and saved files to disappear after Sync Latest.
-
Fixed a bug where the class redirector of a renamed Blueprint asset would not be applied until the asset was loaded, causing the new class type to be missing from UI selection.
-
Modified
CleanupAfterSuccessfulDelete()
to check if deleting a package is supported by source control first, and only if that is not the case, mark it for local deletion. This fixes an issue where deleting a file checked out by someone else (when working offline) and choosing only to save locally resulted in the file not being deleted on the local file system. -
The packages Core Redirect are no longer case sensitive (regression introduced in a previous version). Since package names are stored in case insensitive
FNames
, the redirectors should be case insensitive as well. -
Fixed a memory corruption issue related to
UK2Node_EvaluateProxy
. -
Fixed an issue where when moving multiple directories at the same time in the content browser, the asset references weren't always being updated correctly, leaving some assets pointing to invalid asset paths.
-
Fixed a crash that could occur during the static mesh build step.
-
Fixed an issue where the asset registry state of an cooked plugin would remove some of the needed development tags from an asset that already exist in the Editor Client Asset Registry.
-
Fixed a crash for the Cloth editor that occurred during shutdown due to SharedPtr cycle.
- Updated Approximate Actors method of Merge Actors to properly detect and return an error if the occlusion method removes all triangles in the approximation mesh.
Deprecated:
- Deleted DDS Loader and HDR Loader functions which were previously deprecated.
Content Pipeline
New:
-
Fixed many image importers to gracefully handle malformed files instead of crashing.
-
OBJ translator distinguishes multiple polygon groups with different materials within a group.
-
Virtual textures no longer allow the NoMips MipGenSetting, as VTs require mips in all cases. LeaveExistingMips is only allowed if the entire mip chain is provided. This generates a texture build warning, and the texture is forced to generate mips.
-
PSD loader support has been made more robust, and support for RLE compressed 16 bit PSDs has been added.
-
Optimized I/O usage when utilizing the reference chunk database for packaging.
-
When CADKernel mesher is the default mesher, if a failure occurs, the process of the file is relaunched with TechSoft mesher.
-
A post process of the static mesh during the import has been disabled. It can be reactivated by setting the CVar
ds.CADTranslator.SewMeshIfNeeded = true
-
Added CVar ds.CADTranslator.EnableUnsupportedCADFormats to enable all unsupported CAD formats.
-
Improved quality of OBJ format material translator. Most of the basic and extended sets of parameters(and corresponding maps) are now supported. Illumination modes are extrapolated.
-
Added a CVar USD.SkipMeshTangentComputation to skip computation of tangents for static meshes. This can help import performance when the tangents are not needed.
-
USD: Baked mesh deformations can now be imported as GeometryCache assets.
-
Files with geometry caches loaded on the stage will now have associated tracks in the USD level sequence.
-
GeometryCache track section parameters in level sequence are now exposed to Blueprint.
-
AUsdStageActor can now be derived in C++ from other plugins than USDImporter.
-
Alembic: Face set names, when available, are now used as material slot names on geometry cache (and static and skeletal mesh) and can be used with SetMaterialByName in Blueprint.
-
Added support for extracting RootUV values from the Alembic UVsParam instead of the groom_root_uv attribute.
Bug Fix:
-
The import of assets via the asset tools now validates that the destination path is mounted and avoids crashing if this is not the case.
-
Fixed issue caused by updating a texture via a render target while it is being built/compiled.
-
Removed redundant data from telemetry of USD/AxF/MDL/Datasmith importers, Dataprep.
-
Fixed issue importing obj/gltf/datasmith/mtlx when a texture is missing.
-
Fixed matrix issue for Autodesk Alias format (.wire).
-
Fixed issue for longlat textures with LeaveExistingMips set.
-
Importing partial mip chains generates output to a full mip chain.
-
Made the paper2D on object reimported safe to use in a cooked editor and made the existing code more robust by not having issues if you are missing the SourceTexture metadata.
-
Made the Blueprint node for the function MigratePackages of the AssetTools non pure. This adds the missing execution pin this node should have.
-
Fixed possible issue when streaming multiple instances of the same GroomCache at the same time.
-
Alembic: Fixed possible computation error when composing hierarchy of transforms.
-
Fixed GeometryCache ignoring "Receive Decals" setting with Deferred Decal materials.
-
Alembic: Fixed import generating no animation when importing GeometryCache with "Flatten Tracks" and skipping the import of the first track.
-
Alembic: Fixed frame time computation error at import that could cause timing issue.
Datasmith
New:
-
Added a USD Stage import option to enable/disable the import of Groom and Groom Binding assets.
-
[USD Importer] Added UnrealUSDWrapper functions for registering USD plugins by path.
-
[USD Importer] Added UE wrapping for
UsdPayloads
,UsdReferences
, andUsdVariantSets
from USD API. -
Added resource size tracking for Geometry Cache assets stored in the USD Asset Cache.
-
Added support for using Interchange's MaterialX translator when opening or importing USD Stages with references to MaterialX files.
-
[USD Importer] Added config setting and API for setting the default search path for USD's default resolver.
-
[USD Importer] Added a file format arguments parameter to find/create/export functions of SdfLayer wrapper.
-
Added support for exporting LevelSequences with animation constraints to USD.
-
Added support for UV transform shader nodes connected to primvar readers, when opening or importing USD Stages.
-
[USD Importer] Added wrapping for token-based API schema functions (
CanApplyAPI()
,ApplyAPI()
, andRemoveAPI()
) onUsdPrim
from the USD API. -
Added support for geolocation to Datasmith API.
-
Added new C++ events to the Usd Stage Actor:
OnStageLoaded
andOnStageUnloaded
. -
Implemented automatic regeneration of UAssets whenever the source USD prims were updated on the opened USD Stage.
-
[USD Importer] Added optional
EUsdLoadPolicy
parameter toFUsdPrim::Load()
to mirror the USD API, allowing the underlying prim to optionally be loaded without loading any of its descendants. -
Added support for parsing USD Materials that use multiple UV sets (primvars).
Improvement:
-
The USD Stage Editor's right panel can now display prim relationships, metadata, and attribute metadata (once an attribute is selected).
-
[USD Importer] Exposed
UsdStage::CreateClassPrim()
on theUE FUsdStage
wrapper. -
[Solidworks] Components made from identical parts now reuse exported meshes.
-
When opening USD Stages, only materials bound by at least one prim will be parsed by default.
-
[3ds Max Exporter] Shared exported meshes for RailClone or ForestPack entities now use the same mesh.
-
You can now cancel loading the USD Stage by clicking the "X" on the dialog to pick the default USD Asset Cache for the project.
-
StaticMesh, SkeletalMesh and GeometryCache assets generated from USD Stages will now have the default material instead as a fallback, instead of fully unassigned material slots.
-
You can now create LevelSequence bindings to transient actors and generated components when opening USD Stages, from any LevelSequence. Those bindings will use the new Sequencer Dynamic Bindings feature to automatically repair themselves whenever they are broken due to the stage being closed or reloaded.
-
Importing skin weight profiles is now significantly faster.
-
[Solidworks] Exploded Views now export for each of configurations as additional variants
-
Changed the translucency lighting mode used by the USD preview surface reference materials to "Surface ForwardShading", to improve behavior in scenes with multiple translucent objects.
-
[Sketchup] Geolocation information is now exported.
-
Expanded the USD Asset Cache to support persisting Materials, Skeletal Meshes and Static Meshes to disk.
-
[Solidworks] Greatly improved AutoSync reaction time to material changes for bigger models.
-
[Solidworks] Model Tab is now toggled after exporting animation.
-
[Solidworks] Added plugin prerequisites to the installer to support installation on clean machines.
-
The USD Stage Editor now shows internal prim references when selecting a prim.
-
When baking materials to USD, diffuseColor will now bake as black as a fallback to retain the same visual appearance as in UE.
Crash Fix:
-
[Solidworks] Fixed crashes caused by enabling AutoSync.
-
Fixed a crash that would occur when changing collapsing rules on the USD Stage Editor in some scenarios.
-
[Solidworks] Fixed a bug that could cause an infinite reimport after deleting a component.
-
Fixed a crash that could occur when importing materials from USD which overrode previously imported materials.
-
[Solidworks] Fixed a crash that could occur when re-enabling DirectLink source.
-
Fixed an crash that could occur when trying to open or import USD Stages with skeleton prims that have more than one root bone.
-
Fix crashes related to Skeletal Mesh Components when importing USD Stages over previously imported actors and assets.
-
Fixed a crash that could occur when exiting the engine during the process of saving USD Stage changes.
-
Fixed a crash that occurred when undoing the addition of transform track keys in some scenarios, such as when manipulating the LevelSequence generated by opening an USD Stage.
-
Fixed a crash that occurred when importing USD files via automated tasks (like Python scripts) with no specified import options.
-
[Rhino] Fixed an export crash that occurred when exporting meshes with multiple UV sets.
-
Fixed a crash that occurred when translating USD point instancer prims with unexpected prims inside their prototypes, when opening or importing USD Stages.
Bug Fix:
-
[Solidworks] Actor visibility is now set appropriately in the Datasmith scene tree on export if it's suppressed in the selected config.
-
[Solidworks] Unused materials are now handled correctly in exported scenes.
-
Fixed USD Stage import options that weren't being autofilled from the currently opened stage actor when using the Actions → Import option on the USD Stage Editor.
-
HierarchicalInstancedStaticMeshComponents spawned when translating USD Point Instancer prims will no longer be missing their StaticMesh assets, if the source prototypes were being shared via the USD Asset Cache.
-
USD prim kinds will no longer be ignored when deciding if a prim subtree collapses or not.
-
[Solidworks] Exporter will now install as expected if only version 2023 is available.
-
Fixed an issue that would cause missing Static Mesh Components when importing some types of USD Stages generated by exporting Unreal levels with StaticMesh assets with multiple LODS.
-
Fixed visibility handling issues that occurred when traversing Mesh prims in order to generate Geometry Cache assets when opening or importing USD stages.
-
Switching render context (or other similar options) on the USD Stage Editor options will now update the Static Mesh Components on the level with new material assignments as expected.
-
Exporting levels to USD without any levels selected will no longer generate files.
-
AnimSequence assets generated from USD will no longer fail to drive morph target (blend shape) animations.
-
Setting material overrides on spawned components will no longer write to unexpected USD prims if the Static/SkeletalMesh/GeometryCache asset is shared via an USD Asset Cache.
-
[Revit] Fixed duplicated IDs for Level elements.
-
USD Stage Control Rig integration will no longer fail when using Control Rigs that modify their own topology in their construction scripts.
-
Fixed an issue related to material overrides on components that spawned when opening USD Stages with collapsible subtrees.
-
The mesh vertex count and Nanite material collapsing limits are now checked when collapsing large meshes from USD.
-
Direct link now works when offline.
-
The USD Stage Editor will no longer generate invalid reference or payload paths when adding references or payloads if the target file is near the engine binary.
-
[DatasmithImporter] Fixed a bug that would occur when reimporting DirectLink static mesh with changed material ordering.
-
Fixed an issue related to how material names were being used for texture assets when fully importing stages from USD.
-
[Sketchup] Available SketchUp versions will no longer be disabled in the installer.
-
[Solidworks] Fixed an issue which prevented proper shutdown of Solidworks.
-
Chosen material purpose will now be used when parsing material assignments directly for the generated mesh assets when opening an USD Stage.
-
Fixed a slowdown which occurred when trying to display array attributes with many entries in the USD Stage Editor.
-
[Solidworks] Removed the -1 on spot light scale.
-
UDIM textures will now be parsed from USD Stages as expected.
-
[Solidworks] Fixed a sync/export bug that occurred when the plugin was enabled manually (not on startup).
-
Fixed a bug that could cause the material overrides layer to be empty in some scenarios when exporting levels to USD.
-
Adding and removing USD layers will now automatically reload animations on the generated LevelSequence as expected.
-
Fixed issues related to handling the export of levels to USD with Static or SkeletalMesh assets with multiple LODs, leading to broken references or missing material assignments in some cases.
-
The "Save USD Layers" dialog will no longer be shown when switching Stage options on the USD Stage Editor.
-
Mesh prims without the SkelBindingAPI will no longer be incorporated into the generated SkeletalMesh assets when opening or importing USD Stages.
-
Groom and Groom Binding assets now import from USD Stages as expected.
-
Using the Actions → Import option to import an opened USD Stage will no longer lead to unexpected results if the chosen import options differ from the options used by the currently attached USD Stage Actor.
-
[Navisworks] Tooltips now appear as expected when docking/undocking plugin UI.
-
Fixed an issue that occurred when exporting Unreal levels to USD. The exporter will no longer fail to retrieve actors when exporting "only selected", if those actors belong to a sublevel.
-
[Solidworks] Deleted sub-assemblies are now removed from the Datasmith scene on sync.
-
Fixed an issue which could corrupt imported textures settings.
-
GroomBinding assets will now be set on the Groom components when opening USD Stages with Grooms as expected.
-
Animations on the generated LevelSequence will now be refreshed when adding or removing USD sublayers from an opened USD Stage.
-
The landscape material baking process will now generate consistent textures when exporting levels to USD.
-
[Solidworks] Fixed an issue involving Part materials exporting inconsistently in multiple configurations.
-
[Revit] Fixed a Direct Link error associated with the Datasmith Exporter for Revit 2018.3.
-
[Solidworks] Fixed an issue involving the deleting a sub-component of a sub-assembly.
-
USD Stages with animated meshes (that led to Geometry Cache assets being generated) will no longer be left permanently opened in some scenarios.
-
[Solidworks] Fixed a miscalculation involving child components variant transforms.
-
Fixed broken baked material references when exporting USD stages on Linux.
-
The USD Stage Actor will no longer write to the USD Stage when updating component properties on the level even if those properties are bound as tracks on the currently opened Sequencer.
-
Fixed an issue which could cause missing StaticMeshes on HISM components generated when opening or importing USD Stages with point instancer prims with LOD prototypes.
-
Fixed an issue which could cause missing static mesh components when opening or importing USD Stages with Light prims that have child Mesh prims.
-
UsdTransform2d
UV transform shader nodes when opening or importing USD stages on Linux will now parse as expected. -
Actors spawned when importing USD stages via the Actions → Import button on the USD Stage Editor will no longer be marked as transient and disappear when loading into PIE or reloading the level.
-
The USD Stage Editor and UsdStageActor will no longer use an old generated UAsset when a stage option is changed.
Deprecated:
-
The FUsdPrim::HasPayload() function was deprecated in favor of HasAuthoredPayloads() to mirror the USD API.
-
[USD Importer] Deprecated the
HasAPI()
function that takes an optional instance name parameter and replaces it with one- and two-FName parameter overloads that match the one- and two-token counterparts on UsdPrim from the USD API.
Framework
New:
-
Limited the number of paths reported in changelist descriptions generated by editor collection checkins to 1000. You can control this by setting the Cvar
Collections.MaxCLDescriptionPathCount
. -
Added ability to change the importing behavior for assets so that if you import on top of a redirector, you'll instead import on top of the asset that redirector points to. Set the CVar AssetTools.FollowRedirectorsWhenImporting to 1 for this behavior.
-
Added an optional integration with Helix Swarm that provides a way for users to view/post comments from the UE changelist review tool.
Crash Fix:
-
Fixed a crash that occurred when copying actors in an editor from before 5.1 and then pasting the actors in a editor newer then 5.1.
-
Fixed crash when duplicating levels that contain a Level Blueprint.
-
Fixed intermittent editor crash when loading certain changes in the changelist review tool.
Bug Fix:
-
Fixed missing '#changelist validated' tag when submitting without editing the changelist text.
-
Added
bIgnoreEditorOnlyReferences
toAssetReferencingPolicySettings
in the Asset Reference Restrictions editor plugin. When true (which is the new default), the reference checker will ignore editor-only references to things like editor utility components. -
Input axis events now forward to the Editor World extension collection and give extensions an opportunity to consume input.
Landscape
API Change:
-
FMaterialCachedHLSLTree was not updated but already doesn't support the same features as the legacy HLSL material translator (e.g. AllowMultipleCustomOutputs).
-
Code accessing the Landscape GUID identifiers on instanced Landscapes now needs to take into account that instanced Landscapes modify their Landscape GUIDs. If you need the original value from the landscape asset, access it via
GetOriginalLandscapeGuid()
.
New:
-
Added command to dump a report of all landscape grass data currently used on landscape components: grass.DumpGrassData [optional: -csv -fullnames -showempty -detailed -byproxy -bycomponent -bygrasstype -full]
-
Added possibility for UMaterialExpressionCustomOutput to limit the max number of outputs. Displays an error when the material is using more than the max allowed number.
-
Added threshold to dirty landscape textures detection (CVars "landscape.DirtyHeightmapThreshold" / "landscape.DirtyWeightmapThreshold")
-
Added CVar landscape.DumpDiffDetails (to be used in conjunction with landscape.DumpHeightmapDiff and landscape.DumpWeightmapDiff) to dump additional details about the diff introduced on a given heightmap/weightmap.
-
Added Include Border to the landscape tool's component brush. Since the border is shared with neighbors, oftentimes the user wants to paint within the bounds of the component but not on the border.
-
Added blueprint getter and setter to WaterMeshOverride.
-
Added a new collision heightfield visualization mode to visualize the chaos material per-vertex.
-
Added the ability to synchronize LOD levels and eliminate geometry seams across adjacent Landscapes, by setting their LOD Group Keys to matching non-zero values.
-
Reworked landscape property sharing and override.
-
Added LandscapeInherited and LandscapeOverridable meta tag to mark shared properties.
-
Enforced synchronicity between shared properties when editing and loading ALandscape and LandscapeStreamingProxy.
-
Created textures with no mipchhain if used in as a layer height or weight.
-
Prevented computing the landscape texture hash twice when it has changed.
-
Multithreaded building of nanite meshes from Landscape geometry
-
Added the ability to store landscape heightmaps in a compressed representation to save disk space, at the expense of slower loading. Enable using landscape.ShowCompressHeightMapsOption to show this option.
-
Build Physical Materials command rebuilds all physical materials
-
Added new CVar to control heightmap detailed change tracking. Split
landscape.DirtyHeightmapThreshold
intolandscape.DirtyHeightmapHeightThreshold
andlandscape.DirtyHeightmapNormalThreshold
. -
Added a gamma function to the paint tools strength to make more of the slider range useful for painting.
-
Adds Landscape BP Brush visibility layer editing.
-
Added FLandscapeBrushParameters struct that should be used to pass arguments when rendering a layer.
-
Added BP Brush visibility layer toggle in Landscape Editor.
-
Added visibility layer editing for LandscapeCircleHeightPatches and LandscapeTexturePatches.
-
Added helper method to determine if a layer info object name is a visibility layer.
-
Added ability to create multiple nanite components per Landscape Proxy if it has more than 64 components.
-
Added the ability to create multiple copies of a Landscape via Level Instancing.
-
Updated M_ProcGrid material to have nanite enabled.
Improvement:
-
Increased the maximum landscape grass type outputs from 18 to 32.
-
Save Modified Landscapes now acts as a way to fix every landscape actor that needs to be updated because of discrepancies.
-
Added viewport message for when Nanite meshes need to be regenerated. The message now indicates the number of landscape proxy actors needing updating.
-
Landscape heightfield now uses unlit vertex color material to better visualize physical materials.
-
Prevented updating water info until after a landscape painting operation is finished.
-
Modified ALandscapeProxy detail panel to reflect how the properties are shared.
-
Modified ELandscapeToolTargetType to be an enum class, usable by blueprints.
Bug Fix:
-
Fixed Open World map landscape normals.
-
Prevented all Runtime Virtual Textures from being invalidated when entering landscape mode just because we build a thumbnail material.
-
Disabled Save Modified Landscapes hyperlink in the map check after the action has been executed by the user.
-
Fixed Nanite landscape mesh object names, which were not guaranteed to be unique anymore.
-
Removed RF_Transactional flag from the static mesh since this data is not meant to be transactional.
-
Fixed bad tangent space computations for various landscape utilities.
-
Factorized redundant code in landscape for accessing weightmap/heightmap data.
-
Added CPU traces to LandscapeTrace.
-
Fixed important slowdown when using a landscape brush with a large radius.
-
Fixed Inactive world types interacting with Runtime Virtual Texture that caused changelist validation to create a new virtual texture producer.
-
Fixed visibility weightmaps being generated when using landscape patches. They are now only generated when a patch actually writes visibility.
-
Fixed missing landscape actor in landscape tools for debug visual log.
-
Fixed undo of Nanite-enabled landscape proxy deletion that didn't properly invalidate the Nanite component on redo.
-
Made bEnableNanite and NaniteLODIndex shared properties for landscape proxies so at cook time there is no ambiguity over whether Nanite is enabled or not on a given proxy.
-
Added map checks for when shared properties on proxies are not up-to-date.
-
Fixed ModifiedPackages system in ULandscapeInfo.
-
Changed outer of the Nanite static mesh.
-
Made the NaniteComponent TextExportTransient. Copy and pasting no longer leads to the mesh being shared between actors.
-
Made the NaniteComponent DuplicateTransient. Saving as a map no longer leads to the mesh being shared between packages.
-
Fixed crash when listing textures using the listtextures console command after having deleted a landscape actor.
-
Fixed Landscape Nanite Content Id taking into account the landscape material's StateId, leading to landscape actors being invalidated on 2 branches where the landscape material were not at the same version.
-
Fixed Landscape Nanite static meshes having a non-hash based Guid, leading to new DDC keys being generated when the meshes are invalidated.
-
Fixed navigation data being generated for nothing and being invalidated right after generation when building landscape Nanite meshes.
-
Corrected nanite mesh build not being cancellable when started from Build All Landscape.
-
Fixed rare case of desynchronization between CachedLocalBox and heightmap data.
-
Removed incorrect ULandscapeNaniteComponent from ALandscapeProxy's OwnedComponents upon copy/pasting.
-
Fixed performance issues related to landscape heightfield in show collision mode by using static draw commands.
-
Prevented landscape heightfield collision components being invalidated because of editor throttling.
-
Fixed a crash when copying a water body component in isolation. Spline component was not valid and crashed in PostDuplicate.
-
Fixed landscape component count display in editor when selecting streaming proxies.
-
Corrected water bodies which do not affect the landscape to still search for a landscape.
-
Corrected an issue where newly streamed in water bodies would not render into water info texture. Newly streamed in actors are forcibly hidden until all streaming is complete.
-
Fixed a crash in landscape when it contains null entries in LandscapeComponents.
-
Fixed landscape getting dirty even when the detected difference is lesser than the detection threshold.
-
Fixed landscape heights being incorrect after Sculpt Undo operation.
-
Override PostActorCreated to build WaterInfoMesh properly when spawning an actor using the UWorld::SpawnActor method.
-
Fixed an issue where Landscape Resize was not preserving all relevant landscape settings.
-
Fixed a rare crash when using the Landscape Editing modes.
-
Fixed a crash when alt-dragging or duplicating the landscape gizmo actor.
-
Fixed a crash when updating property permissions outside landscape mode
-
Fixed a crash when adding spline control points to a hidden landscape.
-
Fixed an issue with landscape LOD calculation that sometimes caused Landscape edges to have a higher-than-expected LOD.
-
Fixed a potential overflow security issue importing landscape PNG files.
-
Landscape Streaming Proxies were not being unloaded correctly if painted or sculpted in landscape mode.
-
Fixed a crash when creating multiple landscapes with regions
-
Fixed crashes and other unexpected behavior on Undo after adding a new LayerInfo to a Landscape Layer.
-
Fixed incorrect water velocities with some scalability settings.
-
Fixed an issue with large Instanced Foliage paint brushes taking a very long time when the Radius option is used.
-
Fixed an issue with normal calculations along the edges of landscapes.
-
Fixed a rare crash when double clicking a landscape spline control point tangent box.
-
Fixed a crash when undoing the creation of a landscape.
-
Fixed texture corruption when undoing mask painting back to the first mask paint operation.
Deprecated:
-
Removed the baked landscape GI texture system.
-
Removed Render method for BP Brushes, RenderLayer should now be used.
Scripting
New:
-
Added blueprint functions to convert from classes and soft class references to the TopLevelAssetPath struct used by asset utility functions.
- Exposed
GetClassPathName
,GetStructPathName
, andGetEnumPathName
to Editor Scripting, which return a TopLevelAssetPath containing the type info. For example:unreal.MyClass.static_class().get_class_path_name()
unreal.MyStruct.static_struct().get_struct_path_name()
unreal.MyEnum.static_enum().get_enum_path_name()
-
Exposed
FPlatformTime::Seconds()
to scripts in Unreal Editor. -
Added a function to convert a normal widget blueprint to an editor utility widget.
-
Custom icons can now be configured for Scriptable Tool Blueprints in the Class Settings.
- The
UScriptableInteractiveTool
class now exposes a Blueprint-overrideableOnGizmoTransformStateChange
event, which is called when a user starts and ends a Gizmo transform interaction, or on undo/redo of such an interaction.
Crash Fix:
- Fixed a crash that would occur when using an Editor Blueprint as the root of another Editor Widget Blueprint.
Bug Fix:
-
UE now only generates Python stub code when running full editor.
-
Changed Python remote execution to bind to localhost as the default multicast adapter.
UI
New:
-
In the Place Actor Window, Volume objects and recently-placed elements are now properly localized.
-
Implemented deep copy for sets in
CopySinglePropertyRecursive
. -
Added an Icon extension point to the content browser path view that allows icons to be placed to the right of the item text.
-
The asset auditor now shows the staged sizes of assets if they are present in the asset registry, and also makes sure that tags show the data from the selected asset registry rather than the one in memory. Previously, the size displayed in the asset auditor would be uncompressed data estimated by looking at how much data the cooker output to disk. With the introduction of asset registry writeback (in the project packaging settings), the compressed sizes can be written back to the development asset registry. When viewing such development asset registries, those sizes are now displayed.
-
Added a Browse button to the Level Editor Toolbar.
-
Improved UX around unsupported assets in the Content Browser by removing unnecessary menu options and adding an indicator to the tooltip.
-
SBlueprintActionMenu
checkbox text is no longer cut off. -
Changed the sorting of names in the scene outliner and changelist window to be in natural order, similar to OS file menus.
-
The Content Browser immediately flushes the config on adding/removing a folder from favorites to make sure the action is saved if the editor crashes.
-
In the DataflowGraphEditor, you can press the F key to zoom to fit either the selected nodes or the entire graph.
Bug Fix:
-
Opening a texture in the texture viewer now always shows Final encoding.
-
Fixed an issue where the color curve editor wouldn't update when gradient stops were moved.
-
Fixed the gradient preview in the Color Curve Editor.
-
Fixed an issue in the Reference Viewer preventing users from typing the address of non-package paths into the address bar.
-
In the Actor details view, archetype edits that occur while archetype instances are actively selected will now correctly sync the "reset to default" state.
-
Fixed a typo in FMessageDialog remark.
-
Folder names in the Content Browser now wrap properly with ellipses similar to asset names.
-
Fixed an issue where it was not possible to drag-and-drop below rows that have expanded items.
-
Fixed a drag-and-drop issue for Input Mapping Context that was not moving the element at the desired position.
-
Fixed tooltips that could appear on top of foreground programs.
UX
API Change:
- Changed message log action token so it doesn't disappear when the action has been executed, it becomes disabled instead. Visibility is only tied to the action's Execute callback validity now. This affects all actions where
CanExecuteAction
can return false.
New:
-
Added the ability for different verbosities in the Output Log to ignore category filter and always display.
-
Added option to auto select items in revision control revert window to reduce redundant actions for users.
-
Set the asset filter in
UAssetToolsImpl::CreateAssetWithDialog.
This uses the Factory supported class as a filter for assets in the Save Asset As dialog. -
Migrated most main menu entries under Edit, Window, and Tools to the newer ToolMenus system.
-
Fixed a typo in the tool for importing glTF files.
-
Removed the Starship Gallery test suite from the editor. It was not designed to run inside the editor and can therefore cause crashes.
-
Sorted the viewport's Perspective > Placed Cameras menu by name to make it easier to use.
-
Improved overflow behavior of text on Notifications by adding ellipses and showing the full text on hover.
-
Reskined the Property Matrix to bring it up to standards with the UE5 style.
-
UX Improvements for the Restore Open Asset Tabs notification that shows up when you launch the editor. These include the notification staying active until you make a choice and the ability to remember your selection in the future.
-
Added a Recent Assets menu to the level editor and all asset editors for quick access to any assets you recently opened.
-
Added an option to the Outliner context menu to bulk edit components in the Property Matrix.
-
Modeling Mode favorites are now saved across editor sessions.
-
Added the ability for modes to add a secondary toolbar below the level editor toolbar to house mode specific tools.
-
Removed user-visible ES31 editor references and replace it with Mobile.
Improvement:
-
Closed the suggestion box when using the keyboard shortcut (tilde key, usually) to switch between status bar console input to Output Log console input.
-
Auto-adjusted the editable text box size so the content for long console command is more visible.
-
Optimized a variety of hotspots during the texture build path not associated with encoding the actual image, including decoding of source image and metadata generation.
-
Updated text overflow behavior of the Window > Save Layout > Save Layout As panel.
Bug Fix:
-
Adjusted the color to full brightness or opacity when picking from the color wheel/spectrum if it was previously almost black or transparent.
-
Fixed a bug in some tables where header text could drift horizontally relative to row text of the same column.
-
The viewport toolbar now correctly collapses its buttons as needed even on displays that use DPI scaling.
-
Fixed an issue where tab headers would appear to be wiggling when a tab was being closed.
-
Updated tabs in windows separate from the main editor from no longer getting lost when Dock in sidebar is clicked.
-
Fixed a crash on shutdown in the Outliner when an item tried to unregister from the Uncontrolled Changelists module in its destructor after the module was unloaded.
Foundation
New:
-
Allowed UBT to build individual plugins as though they were local.
-
Introduced Network component to CQ Test.
-
Prevented approved reference images to be copied to html test report for successful test.
-
Introducing Code Quality Test plugin. Extension of the Unreal Engine FAutomationTestBase to provide test fixtures and common automation testing commands.
-
Avoided displaying missing reference when image comparison was successful.
-
Allowed levels to turn off garbage collection clustering so that actors can be deleted.
Improvement:
- UAT addcmdline (RunCommandline) is now passed during launching of application on all platforms, where previously it could be embedded in UECommandLine.txt. It improves iteration times on some platforms as final bundle doesn't need to be rebuilt every time.
Crash Fix:
- Fixed crash when using Automation Wait node in BP when AutomationController is not loaded.
Bug Fix:
- Avoided a crash with Screenshot Functional Tests in PIE client net mode.
Build
New:
-
Added "UnrealInsightsBuildConfiguration" option to the BuildAndTestProject build graph so the CompileTools step can build Shipping, Debug, or Development configurations of Unreal Insights.
-
Added the option to throw exception when plugin in DisablePlugins list is enabled by another plugin's dependency.
-
Added EngineIncludeOrderVersion for UE5.3
-
Made the AutomationTool emit an error code when it terminates on an exception. This will result in failing the operation instead of reporting a false success.
-
BuildUAT.bat\BuildUBT.bat will suppress all messages from file compare.
-
Added support for Clang PCH chaining: https://clang.llvm.org/docs/PCHInternals.html#chained-precompiled-headers.
-
Added support to compile separate files in VisualStudio using the "Compile" menu item when you right click on the files.
-
Added flags to CSV metadata for LTO and PG_Instrumentation. LTO will be true if Link Time Optimisation is enabled. PG_Instrumentation will be true if Profile Guided Optimisation is currently in Instrumentation mode for gathering PGO profiling data. This change can be used to show if a particular build was running under these parameters when looking at CSV performance reports.
-
Broke several hidden circular dependencies between engine modules.
Improvement:
-
Tweaked the engine PCHs to improve compile times.
-
Improved overall Visual Studio project generation time by updating the UBT code to be thread safe and run in parallel.
Bug Fix:
-
Previously the "-ini:" command line argument may have been ignored when sent to UBT. These will now be applied.
-
Previously when multiple "Target" command line arguments were passed to UBT, ConfigCache::ReadHierarchy could read arguments from other Target arguments. It will now only read from the intended "Target" command line argument.
-
Fixed an issue where the public dependencies weren't being added to the include path list.
-
Fixed some random intellisense compile issues.
Deprecated:
- Deprecated TragetInfo::bUseMallocProfiler toggle. It is no longer used as MallocProfiler2 and FMallocProfiler runtime is removed in favor of UnrealInsights.
Core
API Change:
-
This breaks backward compatibility where WriteToString is used as a type or in a context where it would be copied.
-
Deprecated the FMessageDialog overloads that take the title by-pointer; use the overloads that pass it by-value instead.
-
Rename FInterpCurve
::InaccurateFindNearest into FInterpCurve ::FindNearest.
New:
- Added additional FPackageName::ObjectPathToX functions:
- ObjectPathToPathWithinPackage, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "MyAsset:SubObject.AnotherObject"
- ObjectPathToOuterPath, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "/Game/MyAsset.MyAsset:SubObject"
- ObjectPathToSubObjectPath, eg) "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "SubObject.AnotherObject"
-
The behavior of ObjectPathToObjectName has been fixed to always return the leaf-most object name within the path (eg, "/Game/MyAsset.MyAsset:SubObject.AnotherObject" -> "AnotherObject"). Any code that relied on the old behavior should use ObjectPathToSubObjectPath instead.
-
Added FParkingLot, a framework for building locks and other synchronization primitives, based on WTF::ParkingLot from WebKit Added FMutex, a 1-byte mutex that is neither fair nor recursive, based on WTF::Lock from WebKit Added TUniqueLock and TDynamicUniqueLock, based on std::unique_lock.
-
Added UE_LIFETIMEBOUND macro to TStringBuilder to catch some cases where pointers are kept into temporary string builders.
-
Added -DDC-VerifyFix command to overwrite existing records and values that differ from newly generated records and values when using -DDC-Verify.
-
Added AppendV to TStringBuilder.
-
Converted WriteToString for TStringBuilder from a type to a function.
-
Added FMonotonicTimePoint and FMonotonicTimeSpan as an API for the monotonic clock exposed by FPlatformTime::Cycles64.
-
The PackageStore backend is now used to resolve dependencies for MemQuery requests.
-
ReplicationGraph amortize the cost of dormant Actor cleanup by allowing gathering Actor lists for one connection at a time.
-
Added FManualResetEvent, a 1-byte manual-reset event that is more efficient than FEvent.
-
Added FRecursiveMutex, an 8-byte unfair recursive mutex built on top of ParkingLot, as a drop-in replacement for FCriticalSection.
-
Added MemoryTrace implementation for Linux platform.
-
Added EnvOAuthSecretOverride parameter to Unreal Cloud DDC to allow providing an auth secret in the environment.
-
Refactored ListTexture command to output more data about UTexture derived classes.
-
When AGGRESSIVE_MEMORY_SAVING define is enabled, array slack growth factor will be set to 1.25x factor instead of an old ~1.375x This helps to save memory on platforms with no memory commit on a page fault for large arrays that are allocated directly by a page allocator and it saves memory on all platforms for smaller arrays (typically up to 64KB in size) that are allocated by a higher level allocator like MallocBinned.
-
Added TInstancedStruct to provide a type-safe wrapper for using FInstancedStruct in C++.
-
Added parallel decoding of FCompressedBuffer for targets with editor-only data.
-
Added FEventCount, an event type that provides a mechanism for avoiding a race between waiting and signaling through the use of a signal count token, and that is more efficient than FEvent.
-
Added -ExportBuildOutput command to include outputs in exported derived data builds.
-
Added partial implementation of GetResourceSizeEx for NiagaraComponent and NiagaraSystem.
-
Added a public API for structured log formatting in Logging/StructuredLogFormat.h
-
Added a way to upgrade existing sparse class data. Objects using sparse data can now override the ConformSparseClassDataStruct function to perform a custom upgrade step when loading a BPGC using a sparse data struct that no longer matches its archetype.
-
Added a new setting to CppStandardEngine so this can be controlled separately from the engine module.
-
Made AssetManager require engine use. The engine startup will give a fatal error if the AssetManager is not present.
-
Added ReverseIterate range adapter for reverse-iteration over ranges.
-
Adding ISaveGameSystemModule module, comparable to the platform chunk install module. Example usage added to Windows platform, allowing projects and Windows platform extensions to override the default save system.
[PlatformFeatures] SaveGameSystemModule=MySaveModule
-
Replaced enable-if/disable-if overloads with if constexpr blocks.
-
Allow any engine module to access Internal include paths from other modules.
-
Added a CBaseStructureProvider concept for detecting if a type is supported by TBaseStructure. Deleted the concept-checking second template parameter from TStructOnScope, which doesn't work so well with forward-declared types.
-
Added TCallTraits::ConstPointerType overrides for common smart pointer types so that they you can look up a TSmartPtr
in a map or set with a TSmartPtr key. Fixed some const incorrectness caused as a fallout. -
Cooker and SavePackage: Move calls to BeginCacheForCookedPlatformData and ClearCachedCookedPlatformData from SavePackage into the cooker to satisfy the contract that objects do not have Clear called until the Save is completed.
-
Added lifetime-bound annotation to TOptional::Get parameter to catch dangling references when an rvalue argument is bound to an lvalue reference.
-
Upgraded to PROJ 9.1.1 and VS 2022
-
Added SupportedTargetTypes attribute, allowing for ModuleRules to be marked as supported for only specific TargetTypes (Editor, Game, Client, Server).
-
Added SupportedPlatformGroup attribute, which will resolve to a SupportedPlatform attribute that contains all the platforms in that group.
-
Allow SupportedConfigurations attribute on ModuleRules.
-
Enabled tvOS support for Electra Media Player.
-
Added Engine.ini:[AssetRegistry]:CommandletsUsingAR to identify commandlets that should load the AssetRegistry at startup.
-
Removed legacy hash table locks when collecting garbage as they are no longer used.
-
Added range support for Algo::Partition.
-
Updated MFW's PlayerFacade with reworked handling for playback control and timing for "v2 timing" players like Electra.
-
Added a UE_REQUIRES macro which replaces the UE_CONSTRAINT* macros and is concept-compatible.
-
Support for project-specific BuildConfiguration.xml and Programs during project file generation.
-
Allow overriding bWarningsAsErrors on a per module basis for Unreal Build Tool.
-
Option to write MSVC SARIF files for any errors and warnings when compiling or analyzing for Unreal Build Tool.
-
Added Fwd.h headers for WeakObjectPtrs.
-
Limited Fastbuild process count.
-
Added support for intrusive TOptional null states. Added intrusive TOptional null states to TFunctionRef and TSharedRef as examples.
-
Moved untracked memory coming from the third party Eigen library into the UE allocators, making it trackable.
-
FInterpCurve
::InaccurateFindNearest has been improved. According to the accuracy of the new algorithm result, it has been rename into FInterpCurve ::FindNearest. -
Added Max display to containers in .natvis.
-
Improved comments for UE_DEPRECATED examples, adding examples for class templates and function templates.
-
Added the ability to implement a function override that can decide to force garbage collection if the engine is close to reaching UObject count limit.
-
Allow overriding windows application icon with TargetRules.WindowsPlatform.ApplicationIcon for Unreal Build Tool.
-
UE_FNAME_OUTLINE_NUMBER memory optimization.
-
Added TargetRules.bWarnAboutMonolithicHeadersIncluded to control UE_IS_?.
-
Changed [Get|Set]WrappedUObjectPtrValues to take a flag which says whether the pointer is 'in container' or not.
-
Allow usage of incredibuild on macOS.
-
Allowed TFunction's debugger visualiser to be set at a global level via UE_ENABLE_TFUNCTIONREF_VISUALIZATION.
-
Added FMRSWRecursiveAccessDetector that is zero-initializable, supports upgrading a reader access to a writer access recursively, and destruction from inside an access
-
Added override to the temp directory to a subfolder, and allow specifying a directory to use instead of the default %TMP% in BuildConfiguration.xml for UnrealBuildTool.
-
Added WindowsTargetRules setting to control Inline Function Expansion Level for UnrealBuildTool.
-
Updated support for minimum cpu arch for x64 platforms. Replaces ModuleRules.bUseAVX. MinimumCpuArchitectureX64, valid values are None, AVX, AVX2, & AVX512.
-
Allowed OpenVDB to be enabled via a macro in the .Build.cs rather than hardcoded at a platform level.
-
Shared common THIRD_PARTY_INCLUDES* macro definitions between compilers rather than between platforms.
-
Upgraded msvc preferred version to 17.6-14.36.
-
Allow multiple DPCVars processed in a loop to allow for multiple entries form the command line.
-
Added the option to dump per class UObject counts to log when the maximum number of UObjects limit is reached.
-
Implemented -CookIncludeClass=Class1+Class2+. This allows cooking only packages containing an instance of the given class or classes. This relies on assetregistry dependencies to find all packages that would ordinarily be cooked. Packages found through dependencies that are discovered only during load of their referencer are not guaranteed to be cooked.
-
Used a release channel enum instead of a boolean to check if a toolchain is preview or not, so we can support additional release channels for Unreal Build Tool.
-
Added debugger member expansion to FString, TStringView and FName to allow individual character indexing, and allows the raw char buffer to be accessed from a Referenced String or Name array.
-
Enable deterministic msvc compiles by default for shipping configuration for UnrealBuildTool.
-
Added move semantics and removed other unnecessary TSharedPtr reference count churn to TSlotBase::operator[] declarative syntax.
-
Added ExecuteOnGameThread as a wrapper for FTSTicker::GetCoreTicker.
-
Added UE::Tasks::MakeCompletedTask method that produces an already completed task with given result value.
-
Updated RiderSourceCodeAccess.
-
Added operator to TMap's key iterators.
-
Added key iterator tests.
-
Added UE_LIFETIMEBOUND to bit iterators and bit references to warn when lifetime issues occur (like holding onto an iterator to a temporary bitarray).
-
Added UniqueBy to remove duplicates from a range from a projection to apply to the elements, similar to std::ranges::unique.
-
Added FStringFormatArg to natvis.
-
Added FindFrom function to TBitArray to allow a user to provide a start index when searching for a value.
-
Allow cheat extensions to add bugit logging.
-
Added FTopLevelAssetPathFastLess and FTopLevelAssetPathLexicalLess function objects for performing comparisons on FTopLevelAssetPath.
-
Added serializers for TPagedArray.
-
Added Algo::Includes, based on std::includes.
-
Allow MallocStomp2 allocator to be used in the windows editor.
-
Oodle is now updated to version 2.9.10b
-
Added a checkbox option for PriamryAssetLabels to not include/follow redirectors.
-
Added FCoreDelegates::OnCommandletPreMain and FCoreDelegates::OnCommandletPostMain This allows things to hook in to provide additional initialization or shutdown logic for any commandlet that may be run.
-
Added a way for objects to specify property overrides local to the save context of a package.
- Added two new commands to UAT:
- VirtualizeProject - Used to run the virtualization process on an entire project.
- RehydrateProject - Used to reverse the process on an entire project.
-
Replaced FInstancedStruct versioning implementation to use archive custom versioning.
-
Make serialization symmetrical so struct serialized in cooked builds can be loaded in Editor builds.
-
Added a new Settings parameter to a new FPlatformProcess::GetApplicationSettingsDir function for getting
%appdata%
in Windows, and$HOME
in macOS and Linux. -
Moved #includes around in the shared Engine PCHs so the PCHs are hierarchal. This fixes issues where removing or adding a private module dependency would drastically change compile times because the includes in the PCHs were different.
-
StaticMesh Asset Validation now verifies that an uncooked StaticMesh Asset has valid a LOD0 SourceModel.
-
The virtualize and rehydrate project commandlets now accept the command line parameter '-PackageDir=' limiting the operation to the given directory.
-
FEditorBulkData is now thread safe.
-
Added a new commandline parameter '-LocalOnly' to the 'GeneratePayloadManifest ' commandlet. This new parameter should be used to generate a manifest containing only payloads that are stored locally on disk.
-
Added FindComponentByTag method to Actor class, which returns the first component in an Actor with a given type and tag name.
-
Added support to give actions in UBT "weight". "Weight" is an average measurement of how many cores and memory an action uses. Using one core with a normal amount of memory for an action would be a value of 1.
-
Added a simple S3 HTTP client.
-
A new error flow has been introduced. If a payload fails to pull we now block the editor and show the user a dialog allowing them to retry the operation or quit the editor. We no longer allow the editor to continue with missing data due to the danger of corrupting existing packages on disk.
-
A warning is now logged when attempting to virtualize a package with a package version older thanUE 5.0, as the package would need to be re-saved in order for virtualization to work with it.
-
Enabled virtualization on static meshes and audio assets by default rather than being opt in.
-
The commandlet 'ValidateVirtualizedContent' now validates that all virtualized payloads in a project can be found in persistent storage. The previous functionality has been moved to a new commandlet 'CheckForVirtualizedContent'.
-
Updated the logic that determines which dependencies a shared PCH has. This new logic goes through all the includes of the pch header and finds the actual headers and modules used. This creates a smaller list of dependencies than before, which is later used to determine whether it is safe or not for the PCH to be used by other modules.
-
Enabled profile guided optimization support when using Intel ICX compiler 2023.1.
-
Enabled msvc strict conformance mode by default for projects set to BuildSettingsVersion.V4.
- Added GetPropertyInstanceWithin to CPPStructOps so that classes like FInstancedStruct can have their internal properties reflected by property paths.
Improvement:
- Improved multi-edit behavior of instanced struct instances
- Editing multiple instanced struct instances will now edit the properties of the common struct of all instances (like object editing), rather than only editing instanced struct instances using the same struct type as the first instance being edited.
-
Always compile engine modules with C++20, unless the platform doesn't support it. Any module that sets bTreatAsEngineModule will be upgraded to c++20 unless it has already overridden it to c++17
-
Optimized StreamableManager::OnPreGarbageCollection.
-
Optimized TFunctionRef calling, as it can never be null. .
-
Removed FullLoadAndSave; it has been replaced in efficiency by MPCook, and further optimizations (concurrent save, async load) will also exceed it even without MPCook or Incremental Cook.
-
Improved deprecation comments surrounding the use of string conversion types and macros.
-
Improved comments on TBox and TIntRect to indicate how their Intersect, Contains, and IsInside Of functions handle overlaps on their borders. Fixed FVector parameter in TBox::IsInsideOrOnXY.
-
Optimized TChunkedArray::Add for speed.
-
Improved Clamp codegen.
-
Improved Swap codegen.
- Optimized FScriptMapHelper::FindInternalIndex
- FScriptSetHelper::FindInternalIndex now returns INDEX_NONE when the user provided index is out of bounds.
Crash Fix:
-
Fixed crashes and errors when using OIDC functionality from DesktopPlatform.
-
Fixed a crash after a failed request lookup in the CotF server.
-
Fixed a crash when shutting down the media player.
-
Fixed a crash when duplicating object with a within class in component instance data cache.
-
Fixed crash when doing recursive async loading in the legacy loader.
Bug Fix:
-
Updated FPaths::Combine method to work with FStringView.
-
Sparse data properties will be favored if they match the name of a deprecated object property. This allows Blueprints to function when object data is moved to sparse data, and the original object property deprecated.
-
Added a few missing definitions that were preventing "Debug Editor" builds of projects that disable GC from linking.
-
Fixed structured logging to work with Live Coding.
-
Added ElementType to TSubclassOf.
-
Fixed alignment and thread safety issues in FMallocStomp and TConcurrentLinearAllocator.
-
Fixed error reporting during execution of static destructors to avoid crashing on a destroyed lock.
-
Fixed merging and filtering of partial records in the derived data cache hierarchy.
-
Fixed vtable constructor to UAssetRegistryImpl to invoke the proper base class constructor. Code would asset during a Live Coding session. However, the asset registry does not support live coding.
-
Fixed using the TMap element after removal.
-
Fixed mismatch string formatting argument in SavePackage2.
-
Fixed assert firing in Debug mode when calling FScriptArrayHelper::MoveAssign.
-
Fixed FName == C string bug and added string view comparisons.
-
Fixed FStringView's operator!= which could result in circular overload resolution.
-
Added perfect forwarding of delegate Execute arguments.
-
Added a static assert when casting a non-UObject to an IInterface.
-
Set the chunks of the generated package equal to the chunks of its generator.
-
Fixed a mismatched user-defined copy constructor/assignment operators and their associated bugs.
-
Fixed a potential invalid quote count in CSV parser and added overloaded constructors for move semantics.
-
Fixed TSortedMap's key iterators which didn't compile.
-
Fixed issue where Electra Media Player would return incorrect HDR information after seeks.
-
Made FPlatformProcess::WritePipe use proper UTF-8 conversion rather than truncation.
-
When collecting objects referenced by properties, the property owner object will no longer be excluded and instead the owner of the reference list will be excluded to make sure all references are property exposed to the Garbage Collector.
-
Changed a texture on a material instance will now add the new texture to the material's Garbage Collector cluster.
-
Fixed JsonSerializer output where data loss occured when NumberStrings were being written as numbers, instead of strings.
-
Made ensure conditions likely when !DO_ENSURE.
-
Fixed inverted logic in FBindingObject::IsA<>.
-
Updated GenerateTLH to build and touch the output file with one command, to prevent cases where the .tlh doesn't exist and isn't created. Allow typelib headers to be generated when using the clang compiler, by using the toolchain's compiler to generate them instead.
-
Fixed TBitArray being implicitly constructible from a TBitArray of another allocator to stop accidental dangling references when constructing a const bit iterator with the wrong allocator type.
-
Fixed implicit conversions when comparing or doing bitwise operations between bit arrays with different allocators.
-
Removed 1 extra virtual function call (or more if ArrayDim > 1) from object-based CopyScriptVM property functions by having an implementation per property type instead of a top level override, also removing the need for the FSoftObjectPtrProperty::CopyScriptVM overloads.
-
Fixed invalid string length handling in FCborReader::ReadNext.
-
Allow AdditionalPlugins for use in multiple projects.
-
Fixed inverted assert conditions in Algo::Heap method.
-
Fixed FThreadSafeCounter64's copy constructor taking FThreadSafeCounter.
-
Automation Tool will now respect specified error level for commandlets.
-
Added a check for invalid counts in FScriptArrayHelper::Resize.
-
Fixed THIRD_PARTY_INCLUDES_END for Clang on Windows.
-
UnrealBuildTool will not pass /Zm unless specifically overridden.
-
Added a check for invalid reserves in TSet.
-
Fixed TMap::FilterByPredicate discarding template arguments in return type.
-
Fixed Clang static analysis false positives in our operator delete overrides by disabling them.
-
Removed redundant Unbind call from TDelegate's destructor.
-
Added guards to stop property size calculation overflowing.
-
Fixed Unreal.natvis to allow container indexing in the debugger.
-
Made FHeightField::FData::Serialize avoid using TArray
>, as FBoxFloat3 is immovable and shouldn't be used by movable allocators. -
Object Handles will be initialized with the actual global UObject array capacity instead of the max UObject count value from ini since the actual array capacity may be larger.
-
Fixed broken bAddDefaultIncludePaths UBT setting.
-
Fixed a GeoReferencing issue where the data files were not found in a sandboxed environment.
-
Fixed incorrect size being reported by TArray's overflow checker. Fixed negative int32 sizes being reported as large uint64 sizes..
-
Fixed EnumAddFlags and EnumRemoveFlags to not require operators on the enum.
-
Made TIsCharType work with cv-qualified types.
-
Made sure running out of available UObject slots crashes regardless of checks being enabled or not otherwise it will silently result in stomps or out of memory crashes.
-
Added weak pointer to archetype cache to prevent returning stale pointers.
-
FProperty references resolved in PostLoad will now properly add their referenced objects to the bytecode owner UStruct's reference list.
-
Fixed rsca for toolbox 2 0 in rider.
-
Non-nullable object properties should now have a default object value assigned to them in case of serialization errors.
-
Fixed mismatch string formatting argument in core test.
-
Replaced some TArray operator new usage.
-
Fixed a bug that truncated the lost of valid paths when emitting an error about an invalid package name.
-
FMicrosoftPlatformString::Strupr is now consistent with other platform implementation and works with non-null-terminated strings.
-
FScriptMapHelper::Iterator and FScriptSetHelper::Iterator post-increment operators were pre-incrementing.
-
Made BuildU[A|B]T.bat explicitly call the Windows find.exe utility.
-
Fixed DrawDebugCircle to draw correct number of segments.
-
Fixed LLM not setting the program size.
-
Fixed UEngine::DrawOnscreenDebugMessages function which was returning the wrong value.
Deprecated:
-
Deprecated the FMessageDialog overloads that take the title by-pointer; use the overloads that pass it by-value instead.
-
Deprecated Engine::FindAndPrintStaleReferencesToObject as it was moved to FReferenceChainSearch.
-
Deprecated Engine::FindAndPrintStaleReferencesToObject and moved PrintStaleReferencesOption to its own file for better compile iterations. Moved FindAndPrintStaleReferencesToObject to ReferenceChainSearch.
-
Deprecated four FBulkData flags that no longer serve any useful purposes: BULKDATA_Unused, BULKDATA_ForceStreamPayload, BULKDATA_SerializeCompressedBitWindow and BULKDATA_BadDataVersion
-
Starting to remove support for delegate policies as they are incompatible with threadsafe delegates.
-
Removed usage of TRemoveConst and deprecated it.
-
Removed the deprecated rebasing Actor and the dependency to the rebasing offset.
-
Deprecated hashing arrays and TCHAR* with GetTypeHash.
-
Deprecated TScriptDelegate
. -
Replaced TModels traits class with TModels_V.
-
Deprecated UE_GC_TRACK_OBJ_AVAILABLE macro and simplified available UObject count tracking.
-
Moved FScriptSetHelper::HasElement and FScriptMapHelper::HasKey to the editor.
-
Removed DISABLE_DEPRECATION macro.
-
Removed UUnsizedIntProperty and UUnsizedUIntProperty which have been broken since the move to FProperties.
-
Removed UE::Core::Private::FWrappedObjectPtr, since it's unnecessary now that we have FObjectPtr.
-
Deprecated TRemoveCV.
-
Replaced TIsTArray trait class with TIsTArray_V.
-
Made ApplicationWillTerminateDelegate thread-safe: deprecated FCoreDelegates::ApplicationWillTerminateDelegate (because thread-safe delegates can't be statically initialised) and added FCoreDelegates::GetApplicationWillTerminateDelegate accessor for a thread-safe delegate.
-
Deprecated global Sort and StableSort functions. They only support an index type of int32 and can produce unexpected/undesirable behavior due to their use of TDereferenceWrapper. Uses of these functions have been replaced with the versions in the Algo namespace.
-
It is no longer possible to virtualize engine content and so the following config file options have been deprecated:
- Engine:[Core.VirtualizationModule]:FilterEngineContent
- Engine:[Core.VirtualizationModule]:FilterEnginePluginContent
Removed:
-
Removed GIsUCCMakeStandaloneHeaderGenerator since C++ UHT no longer uses engine types.
-
Removed core delegates deprecated in 5.2.
-
Removed the old FTicker that was deprecated in 5.0
-
Removed EGCOptions::WithClusters to reduce the number of template instance permutations in Garbage Collector code and improve compile times.
Dev Tools
New:
-
Removed C++ Unreal Header Tool (UHT).
-
Ported C# Unreal Header Tool
UhtBuffer
to new objects that use ArrayPool. - Add non-persistent metadata to the
CsvProfiler
.- By default csv metadata persists between captures which may be problematic if capturing different modes that have specific metadata since prior captures can pollute future ones.
- This change adds a
CSV_NON_PERSISTENT_METADATA
macro which sets metadata that is cleared once the current capture ends.
- [UnrealVS]
- Added "Generate Assembly" menu option that asks UBT to compile a single file and generate an assembly file.
- Upgraded
UnrealVS.vsix
to version 1.84.3
-
Added the ability to define new documentation policies and specify a default policy.
-
Added ability in UHT for arrays to be sized using
static_cast
. -
Added the
Build
directory as a location UBT scans for UBT plugins. -
[PerfReportTool] Added support for date formats and disabling column word wrap.
-
Added the ability to compute a hash from a slice of an array.
-
Modified UHT to not emit unused
#define
directives. -
Updated UBT project code analysis to 4.2 and text encoding to 6.0.
-
Added the ability to set the
IoHash
directly in the file hasher - [UnrealBuildTool]
- Added option to generate assembly files while compiling C++ files.
- Supported only on MSVC compiler for now.
- Generated files have the
.asm
extension and are located in the same Intermediate folder as the corresponding.obj
.
-
Added generic double buffer async file reader with the ability to specify buffer sizes.
- [Horde] Optimizations to Horde storage when dealing with larger data:
- Added ability to specify buffer size with
FileNodeWriter
methodsCreateAsync
andAppendAsync
. - Added ability to copy a
FileNode
tree directly into a stream without creating the nodes themselves. - When reading data, avoid creating
byte[]
for the cache if the cache is not enabled. - Reduced default read size from 15MB to 1MB when caching isn't enabled.
- New
ReadNodeAsync
method that invokes a callback with the data instead of creating the node instance. TreeWriter
uses the current packet's full memory buffer size to detect the need to resize indead of the max packet size.- New bundle test for the streaming of
FileNode
directly to a stream.
- Added ability to specify buffer size with
-
Removed comment and tooltip metadata from shipping builds.
-
Added Apple Silicon native binaries for
GitDependencies
. -
Added
ErrorIfNotFound
option toMoveTask
to allow throwing an error if the specified file is not found. This option is disabled by default. -
Optimized Visual Studio created projects and they are now much smaller.
-
Added validation logic to Unreal Build Tool (UBT) to ensure that plugins do not have dependencies on any plugin that is sealed.
-
[UGS] Error dialogs shown at the end of syncing (unresolved files, files needing deletion etc) are now focused when the UGS window is selected. In addition the UGS taskbar entry flashes before showing these modal dialogs and at the end of the sync to try and get the users attention.
- Added a new
bEnableLibFuzzer
option for desktop platforms.
Improvement:
-
Improved C# UHT file reads by limiting the buffer size to reduce garbage collection stress.
-
Modified the
ComputeAsync
hash method to provide a file size hint so it can default to a larger buffer size to improve performance. -
Modified the
ComputeAsync
hash method to use the double buffer reader above. -
Enhanced UHT to be able to parse more C++ attributes.
-
Improved checks for keywords placed in invalid conditional blocks.
Crash Fix:
-
Fixed Hot Reload and Live Coding to not bother serializing delegates and bulk data. Delegate serialization was causing asserts with new concurrency checks and could have resulted in crashes in the past.
-
Fixed live coding shutdown to eliminate a crash on exit.
-
[UGS] Disabled "Open Project..." when right clicking in the main window unless the context menu was opened over a valid tab. This prevents a crash when attempting to open an invalid project.
Bug Fix:
-
Fixed Unreal Build Tool (UBT) log event level check that resulted in spam to the logger.
-
Fixed issue where modules that were not currently loaded could prevent live coding from patching modules that were.
-
Fixed issue where using live coding with the Clang compiler would generate "unresolved external" errors.
-
Live Coding no longer generates errors about object files being missing after a source file is removed from a unity file by live coding.
-
Removed unnecessary iteration in
GetMaxEnumValue
in UHT. -
Fixed issue with UBT where the
UE_TARGET_NAME
isn't the actual target name. This resulted in Hot Reload and Live Coding to no longer work when used with a non-unity build. -
Fixed C# UHT to allow functions with parameters in
WITH_EDITORONLY_DATA
blocks. -
Fixed issue where the check for first header include was not being reported as an actual warning/error.
-
Fixed issue where Live Coding would fail with "unresolved external symbols" when used with Clang.
-
Fixed Live Coding Console to handle the patching of coroutines.
-
Fixed C# UHT strict documentation tests for function.
-
Fixed an issue with Live Coding where large projects might not have enough memory reserved around libraries preventing patching.
-
Fixed an issue where C# UHT metadata did not issue value change errors in metadata.
-
Fixed an issue in Live Coding preload module support where, if a module name is known but not currently loaded, then the engine would generate a check.
-
Fixed an issue where C# UHT failed to generate an error when an interface function was marked as
BlueprintPure
. -
Fixed an issue where UBT failed to detect C# UBT plugins in the game folder.
-
Fixed an issue in C# UHT where, if a structure referenced itself, then it would end up in an infinite loop.
-
Fixed a rare threading crash when starting
UnrealPak
. -
Fixed an issue where, if Unreal Header Tool (UHT) export code threw an exception, the build did not display the error message or fail the build.
-
Fixed UHT issue where invalid code would be generated if all
FieldNotify
properties in a class were marked as editor-only data.
Deprecated:
- [UnrealFrontend] Disabled old Profiler (
UnrealFrontend/SessionFrontend/Profiler
).- Old Profiler was deprecated in UE 5.0.
- Use
Trace/UnrealInsights
instead. - Added
UE_DEPRECATED_PROFILER_ENABLED
global define toggle. This is off by default. This allows you to temporarily re-enable Profiler if needed; seeUnrealFrontend.Target.cs
. - Profiler module/code will be removed in a future UE version.
Removed:
- [UnrealFrontend] Removed the deprecated
MEMORYDUMP
run command.
Insights
New:
-
Added FInstallBundleSuppressAnalytics class to help suppress install bundle analytics that avoid spamming during a specific bulk operator.
- Enabled Unreal Trace Server for all platforms.
- Unreal Trace Server now supports all desktop platforms (Win64, Mac, Linux).
- Precompiled binaries are now included for Linux and Mac. This removes the need to run Unreal Insights program when tracing on those platforms.
- Added user interface for displaying connection status to trace store.
- Added logic to re-connect when the connection to the store server is lost.
-
Added user facing message events in TraceLog. Previously, errors in TraceLog would silently stop traces without any information to the user. This adds a way to receive those messages and log them using regular engine logging.
-
The new session id is now used when requesting a process current trace session. This resolves the issue with getting the current session, when the machine has many live sessions running at the same time.
-
Added persistent settings for Unreal Trace Server which allows setting changes to be retained after restart. Settings can be changed without restarting the server.
-
Added UE_TRACE_METADATA_RESTORE_SCOPE(MetadataId) macro.
-
Added alloc event callstack id and free event callstack id in tooltip of the Callstack column for Memory Insights.
-
Added a package field to the asset metadata scope, in addition to the existing asset name and object class fields.
-
Added the "screenshot" trace channel to the "default" channel preset.
-
Symbol resolving now automatically tries to remap known packaged renamed binaries to their original filename.
-
xmake is now used for building Unreal Trace Server on all platforms.
-
Added LLM tracking for TraceLog memory usage.
-
Made TimingView.AutoScroll option persistent in ini file for Timing Insights.
-
In Timing View, when Ctrl is pressed while clicking an event to be selected, the time interval that includes both the old selected event (if any) and the new selected event will be also selected.
-
Added "Project Name", "Other Metadata" info, if available and added "TraceId" as an optional metadata.
-
Added FD3D12Adapter::TraceMemoryAllocation and D3D12PoolAllocator to resolved symbols filter in Memory Insights.
-
Added support for unlimited number of heap specs in Memory Insights. Previously, it was limited to 256 heap specs.
-
All trace files now contain a metadata field with a session id and a globally unique trace id. Session id can be set from the command line to group session from many machines together. If no session id is specified a random one is generated.
-
Memory Insights / Mem Allocs table: - Improved the status bar text display of query info, query status, number of allocs and added number of filtered allocs.
-
Added status bar text info for selected items (including the total alloc count and total mem size of selected items).
-
Added tracing for the existing "Stats_GPU_*" float counters when "stats" trace channel is enabled.
-
Added project field in session info event, separate from the app name. Previously we used project name rather than app name if it was available.
-
Added Get*ProviderName public API for all providers. Refactored the IModule derived classes to ensure consistent implementation.
-
Tree Table View improvements:
- Increased font size and updated text colors (ex.: when tree node is hovered/selected/filtered).
- Added default icons and colors for tree nodes.
- Added custom color for group nodes created by Callstack and Tags groupings.
-
Clip tracing of asset loading debug name to 1024 characters.
-
Updated Unreal Insights version to 1.04.
-
Memory Insights: Added option to include heap allocs in mem queries.
-
Memory Insights: Added analysis support for NeverFrees heaps.
-
Added limit for the number of log warnings generated.
-
Added EnterScope_TB / LeaveScope_TB (timestamps relative to BaseTimestamp) events ans to EnterScope_TA / LeaveScope_TA (absolute timestamps).
-
Network insights - Modified filtering to include sub-events when filtering packet content events.
- Added delta time display of selected range of packets. Filtering now supports using filter by NetId and EventType in combination, which is useful to highlight specific events for a specific instance.
Improvement:
- Users can now change store settings in Unreal Insights. Currently the user can change:
- Store directory: The directory where new traces are stored.
- Watch directories: A set of directories monitored for trace files. For example users can add their download folder and automatically see downloaded traces in the session browser.
Optimization:
- Refactored the IProvider / IEditableProvider interface for Trace Services to avoid diamond problem.
Crash Fix:
- Fixed crash in Frames track when there are no frame series created yet.
Bug Fix:
-
Fixed a deadlock that occured when stopping a trace with the "Open Trace in Insights" option enabled.
-
Avoid locking TraceAuxilliary destination and connection type while issuing delegates.
- Restored Uri functionality for traces (backward compatibility with current/older UTS).
-
Disabled a trace session after it was renamed, until the trace id is properly updated the trace name changes color to grey.
-
Fixed focus for the trace sessions list (initial focus and after renaming a trace).
-
-
Improved Session Browser UI responsiveness when using a remote/slow trace store connection.
-
Fixed opening a trace from a remote trace store. The new UnrealInsights process is launched by specifying the store address in addition to store port. The trace id can now be specified as hex number (prefixed by 0x).
-
Return allocator result in the case of zero sized allocations. Remove checks for zero sized allocations in Trace's allocation wrappers leaving it to the allocator implementation to decide. Analysis already supports zero sized allocations (as long as they have unique addresses).
-
Fixed late connect for the Counters trace channel.
-
Changed TraceAuxilliary internal management of tracing status and trace destination.
- Tree Views for Allocs Table, Tasks, Packages now have Separated tree view node filtering by hierarchy filtering. The order of async operations was changed. Node filtering (i.e. advanced filtering using the Filter Configurator) is applied first. Then grouping + aggregation is applied. Then sorting is applied. Finally, the hierarchy filtering (i.e. text search) is applied.
- This enables text search (hierarchy filtering) and advanced filtering (node filtering) to be used in the same time. Also, the aggregation is now applied only once. These changes enables significant performance improvements for the tree operations, especially when node filtering is applied.
-
Disabled Rename/Delete trace files when using a remote trace server.
-
Fixed updating the list of traces. If list is scrolled on bottom it will remain scrolled on bottom also when new traces are added.
-
Fixed initial channels example (including a typo) and usage of "default" preset to include "region" and "screenshot" channels (Connection tab).
-
Fixed trace recorder IP address to be prefilled with correct IP or host name of (remote) trace server (Connection tab).
-
Trace store uses entire path for id. Only using the stem hides files with the same name present in multiple mounts.
-
Fixed a missing check to make sure the entire packet was sent. This guards against any low level transmission errors.
-
Updated Unreal Trace Servers readme to reflect dynamic ports used.
-
Fixed missing channel check for metadata restore scopes.
-
Fixed Trace.Screenshot not working when not running PIE or simulation.
-
Fixed realloc scopes for the video memory allocations. Previously only realloc scopes for system memory were supported.
-
Fixed late connect support for the "stats" trace channel. Changed the batch trace event to always start with an absolute timestamp value (instead of being relative to previous event).
-
Reduced the overhead of stats tracing when the "stats" channel is not enabled.
-
Fixed memory tracing for block allocators used by TConcurrentLinearAllocator ,FOsAllocator, FAlignedAllocatorInternal, and FOutputDeviceLinearAllocator's block allocator.
-
Fix to try to update symbol search path until module provider is created. Previously the symbol search path string was updated only whenever the panel was reset, which doesn't always correspond to when the module provider was created, leaving the string blank until the panel was recreated.
-
Counters: Fixed "Export Values/Operations" incorrectly saving all values/ops for selected counter even if a timing selection is made in the Timing View.
-
Counters: Added name of the selected counter in the default filename when exporting values/ops.
-
Changed zoom in and out with mouse wheel to auto-pin the hovered track in the Timing View.
-
When opening the profiling directory from the Insights Status Bar Widget, the folder will be created if it does not exist.
-
Fixed trace analysis for scoped trace events.
-
Added explicit support for counters with dynamic name.
-
Added support for hierarchical Clear and Restore scopes. The Clear/Restore scopes replaces the current metadata stack with an empty/saved metadata stack and restores the previous metadata stack at the end of scope.
-
Fixed scope of metadata and mem tag for mem allocations made by the trace system (extends scope over the original allocator calls). So, heap allocations will inherit same "trace" tag.
-
Fixes for traced metadata scopes applied in tasks.
-
Fixed log messages in memory analysis regarding TagTracker errors when memalloc channel is not enabled.
-
Fixed time for scoped events to be relative to base timestamp at runtime. This allows packing on 8 bytes (as in trace protocol 5).
- Level streaming profiling is now disabled on the server by default.
Deprecated:
-
Removed RenderCore's FTracingProfiler which is deprecated since UE 4.26. Please use Trace system and Unreal Insights instead.
- Added UE_STATS_MEMORY_PROFILER_ENABLED to toggle on/off code related to MemoryProfiler in STATS system. It still requires STATS to be enabled and "-MemoryProfiler" to be specified in cmd line.
- This is off by default as MemoryProfiler in STATS system functionality is deprecated in UE 5.3. For memory profiling, use instead Trace/MemoryInsights and/or LLM.
- Removed the deprecated MemoryProfiler runtime:
- Removed the deprecated MemoryProfiler2 tool. Use Unreal Insights (Memory Insights; -trace=memory) instead.
Removed:
- Removed usage of MessageLog on analysis thread. With this change direct usage of MessageLog in the analysis engine is replaced with a callback system which allows the user of TraceAnalysis to implement display of the messages themselves.
Framework
New:
-
Moved all FInstancedStruct code that depends on the Engine module into a new StructUtilsEngine module. This allows modules that can't depend on the Engine to use FInstancedStruct.
-
Added nested containers support to PropertyBag (TArray
>) with a max depth of two. -
Added a DisallowedPlugins list that restricts which plugins can be used.
-
Added an experimental Plugin Reference Viewer tool that displays a plugins dependency graph. The experimental tool is disabled by default. You can enable the PluginReferenceViewer Access tool from the plugin browser window.
-
Added a new 'Sealed' plugin concept that will prevent other plugins from depending on a plugin.
-
Fixed an issue that would result in broken package references when creating new plugins using a plugin template that contains assets.
-
Added a NoCode plugin descriptor property that prevents a plugin from containing any code or modules.
-
Added a plugin template
subfolder
property to define the sub folder a new plugin will be created within. -
Fixed an issue where creating a new plugin that could sometimes fail if the asset register scan is still pending during the plugin creation.
AI
New:
-
Added the experimental plugin Learning Agents. Learning Agents allows you to train AI characters using machine learning. This enables you to augment or replace traditional game AI, such as those written with behavior trees or state machines. In particular, the plugin allows you to use reinforcement and imitation learning approaches. In the long term, Learning Agents aims to be useful in a range of applications, including physics-based animations, game-playing NPCs, and automated QA testing.
-
Converted AI-related Asset Actions to Asset Definitions. This applies to State Trees, Behavior Tree, Blackboards, and Environment Queries.
Bug Fix:
- Fixed an issue where ZoneGraph would automatically build when the Build Zone Graph While Editing flag was enabled in Project Settings.
Deprecated:
- Deprecated UAvoidanceManager::bAutoPurceOutdatedObjects. Please use bAutoPurgeOutdatedObjects instead.
AI Behavior Trees
New:
-
Add a Default Blackboard config option for Behavior Trees.
-
Exposed Behavior Tree Editor functionality to be inheritable and accessible from other modules. Also introduced some smaller Behavior Tree Editor UX improvements.
-
Added a tooltip to the Behavior Tree context menu node descriptions.
Crash Fix:
- Fixed an issue where setting the KeyType to None in the base class of UBlackboardKeyType_Object would cause a crash.
Bug Fix:
- Fixed an issue where the BehaviorTreeEditorModule custom Toolbar Extenders were not being applied correctly.
AI Debugging
New:
- A newly created row in VisualLogger will now be hidden if all added items are filtered out by category verbosity.
Improvement:
- DebugDrawService now uses synchronization objects for delegate unregistration to prevent RecreateRenderState_Concurrent from registering and unregistering delegates from multiple threads.
Bug Fix:
- Fixed the position of the debug text for UE_VLOG_OBOX.
AI Navigation
API Change:
- FZoneGraphPathFilter now has an optional fourth FZoneGraphTagFilter parameter in its constructor.
New:
-
Added FZoneGraphTagFilter to FZoneGraphPathFilter so that FZoneGraphAStarNode can perform pathing requests using a given tag filter. Fixed UZoneGraphTestingComponent to properly use QueryFilter when performing a pathing request.
-
The oversized dirty area warnings now work with active tile generation (including Navigation Invokers). This fixes multiple unnecessary warnings when dirty areas are not touching the active tiles.
-
Added AgentMaxStepHeight to FNavMeshResolutionParam.
-
Added a display message when the Navigation Mesh version is compatible, but not the latest.
-
Added Navigation Invoker priorities (ENavigationInvokerPriority).
-
Fixed an issue where using LazyModifiersGathering by reading the resolution after GatherNavigationDataGeometry resulted in an Navigation Mesh resolution issue.
-
Added a task count and task wait time per layer to the CSV Profiler.
-
Added a log category and logs detailing invoker registration to LogNavInvokers.
-
Added a NavInvokers CSV category and track invokers count in CSV to the CSV Profiler.
-
Added tile generation history and stats when LogNavigationHistory is set to Log.
-
Increased the height where the Navigation Mesh can generate (now using 29 bits instead of 15, allowing 26000 km of altitude when using 5 cm CellHeight).
-
Changed rcCompactSpan to use rcSpanUInt for y.
-
Bumped the priority of dirty tiles near Navigation Invokers when sorting by invokers priority.
-
Added support for Geometry Collections in UNavModifierComponent. Before this change, a UNavModifierComponent on a Geometry Collection would not find the physics for the proxy mesh and fallback on an arbitrary FailsafeExtent.
-
Added support for Navigation Mesh resolution when doing async navdata gathering.
-
Added a console variable to toggle Navigation Mesh resolution.
-
Added NavMeshResolution to UNavModifierComponent.
-
Renamed the navigation console commands prefix from n. to ai.nav.
Improvement:
-
Added Navigation Mesh generation optimization when using it with Hierarchical Instanced Static Meshes. This avoids gathering unnecessary geometry when building tiles.
-
Added optimizations to UHierarchicalInstancedStaticMeshComponent::GetOverlappingBoxTransforms.
Crash Fix:
- Fixed an issue where modifying the NavigationRelevantData array during garbage collection (when FRecastTileGenerator::AddReferencedObjects is called) would result in a crash. The change moves emptying NavigationRelevantData to the main thread so that it does not occur at any moment.
Bug Fix:
-
Fixed a memory leak in FNavigationOctreeElement operator and added move operators.
-
Fixed an issue that would result in a crash if there was no Navigation System.
-
Fixed an issue in UGeometryCollectionComponent where the bIsDynamicObstacle flag from UNavCollisionBase was not taken into account when exporting UGeometryCollectionComponent.
-
Made UWaterMeshComponent not navigation relevant. This fixed an issue with hundreds of Navigation Mesh tiles being dirtied when adding a UWaterMeshComponent.
-
Fixed an issue where building navigation when there was nowhere to build caused reduced editor performance.
-
Fixed an issue when using the async flag where saving files using source control in WorldPartitionNavigationDataBuilder would cause an error. This fixes the "MarkForAdd, Error: Failed mark the file" issue that could occur during build.
-
Fixed Navigation Mesh holes on steep slopes caused by a rasterization issue (this also fixes Navigation Mesh issues in stairs). Also added the ai.nav.EnableSpanHeightRasterizationFix console command to disable the fix if needed.
-
Fixed an issue that would result in memory corruption from FRecastTileGenerator::MarkDynamicAreas.
-
Fixed an issue where using SAVE_Async would not wait for async file writes before adding packages to source control.
AI Smart Objects
New:
-
Moved registration to BeginPlay and unregistration to EndPlay for components used in a Game world. This will allow conditions to rely on a fully initialized Actor in case they need to access other components. It will also make it easier to spawn an Actor with a SmartObject component and set up its definition before finishing the spawning.
- Added new methods to the API to filter a list of request results or slot handles by evaluating the selection preconditions.
- Filter methods can accept external data as a struct with properties whose name and type match the WolrdConditionContext.
- FSmartObjectUserContext has been introduced to cover the common case of passing in a user Actor to the context.
- UserDescriptor is now stored as an instanced struct in the runtime slot.
- Claim methods now receive a user descriptor.
- Removed slot event delegate and reused the runtime instance one instead.
- Listeners can now filter for a given slot using Event.SlotHandle.
- Removed User Tags from the SmartObjectWorldConditionSchema. The User Tags are part of the query filter. Conditions requiring User Tags could fetch them from the Actors passed in the context.
-
Public methods relying on EvaluateConditionsForFiltering now validate that the Slot Handle is set and not stale. In such a case, a log message will be emitted that suggests to the user to call IsSmartObjectSlotValid to handle that scenario on the call site and avoid the log.
-
Added IsBoundToSimulation to the SmartObjectComponent to differentiate a registered component (valid Handle) from a registered component bound to the simulation (linked to its runtime instance).
-
Added unit tests for IsBoundToSimulation, RemoveComponentFromSimulation, and UnregisterSmartObject sequence to simulate the EndPlay issue.
-
Removed dependency on MassEntity to store slots.
- A new icon is now used for SmartObjectPersistentCollection, SmartObjectComponent and SmartObjectDefinition.
Improvement:
- Improved Blueprint integration with the Smart Objects subsystem.
- Deprecated the pure version of FindSmartObjects and added a new non-pure Blueprint wrapper that allows proper iteration of the returned objects.
- Changed the subclass parameters to use values instead of const references to allow direct selection on class pins.
Bug Fix:
-
Fixed an issue with container removal where removing multiple sequential entries in a batch would result in improper recomputed bounds.
-
RemoveComponentFromSimulation is now properly unbinding the component.
-
Unbinding a component from the simulation won't invalidate the registered handle anymore; this is handled by the FSmartObjectContainer.
-
Removed obsolete RuntimeCreatedEntries which was replaced by the registration type.
-
DebugUnregisterAllSmartObjects will no longer cause an ensure when calling EndPlay with the previous fixes.
AI State Tree
New:
- Added the ability to disable States and Tasks. In addition, it is now possible to force a condition result to true / false.
Improvement:
- Improved the way that property names are reconciled when they change.
- Added PropertyGuid to FStateTreePropertyPathSegment to allow reconciliation.
- Changed Blueprint class and User Defined Struct property names.
- Changed FStateTreePropertyPath to optionally handle property redirects and BP/UDS name changes.
- Renamed UpdateInstanceStructsFromValue to UpdateSegmentsFromValue to better reflect its use.
- Improved State Tree editor bindings to update when BP/UDS properties are changed.
Bug Fix:
- Fixed an issue that would result in ID clashes when duplicating transactions. In addition, added several editor fixes.
API
New:
-
The plugin manager can now find plugins using a plugin descriptor.
-
Instance static mesh components API improvements.
-
Added array view version of batching transform updates.
-
Added option for passing sorted array to removal function.
Audio
New:
-
Added a function to override the runtime format in FSoundWaveData.
-
[Audio Modulation] Added AD Envelope Generator. This is useful for temporarily modifying the volume of a control bus.
-
[MetaSound] Added support for integral underlying types to TEnum.
-
Added Deactivate All Bus Mixes BP function. This is useful to clear out all active mixes when changing game state.
-
[MetaSound] Added the ListenerOrientation and SourceOrientation parameter interfaces.
-
The WaveTable plugin now supports fidelity and performance tuning and a more intuitive data usage mode for sampling and granulating.
-
Added Runtime MetaSound Builder to support building MetaSounds via code or Blueprint and auditioning in the MetaSound DSP graph in real-time.
-
Added functions to SynthComponent for setting pre-sends and post-sends for AudioBuses and SourceBuses.
Improvement:
-
The IsSeekable method in USoundWave is now virtual.
-
You can now get the values of non-audio outputs of playing MetaSound Sources. See UMetaSoundOutputSubsystem for more information.
-
Added Modulation Destinations to the Synth Component.
-
[MetaSound] TVertexAnalyzerForwardValue now remembers LastValue to prevent unnecessary data pushes.
-
[MetaSound] Added support for passing parameters.
-
Changed the address of audio parameter transmitters from using AudioComponentID to a hash derived from NodeWaveInstanceHash, PlayOrder, and the Component ID.
-
WaveTableBanks now support serialization as 16-bit assets and perform runtime bit-depth conversions where necessary.
-
Abstracted the Waveform Editor toolset into a utility collection to be used as generic sample sequence display tools.
-
Refactored Waveform Editor Widgets to remove the use of RenderData.
-
You can now re-import assets within the Waveform Editor.
-
Audio inputs now use WASAPI for device management on Windows operating systems.
-
[Sound Cues] When Override Attenuation is selected, Attenuation Settings will now gray out to better communicate the override.
-
Added a NumRepeats field to the TriggerRepeat MetaSound node.
Crash Fix:
-
Fixed a crash that would occur when reimporting an audio file over a Sound Wave marked as Ambisonic.
-
Fixed a crash that would occur when importing audio files.
Bug Fix:
-
[MetaSound] TVertexAnalyzerForwardValue now initializes LastValue on first execution as expected.
-
Fixed a bug where logging the default audio settings displayed 0 for max channels.
-
[Audio Modulation] Added a missing tooltip on the Control Bus Mix Stage Value parameter.
-
[Audio Modulation] Fixed a bug where Audio Component Modulation ignored inheritance from SoundWave.
-
[MetaSound] TVertexInterfaceGroup's variadic constructor arguments are ensured to be move-constructible to the group's base type.
-
Fixed a bug where a member could share a name with an existing namespace member already on the parent MetaSound Source.
-
[MetaSound] The WavePlayer node will now immediately fire OnFinished if no WaveAsset is passed in.
-
Wave file metadata chunks will now be preserved in USoundWave assets when converting bit depth of the source file.
-
Fixed an issue with bus and submix sends on muted Sound Waves.
-
Fixed a miscalculation related to a WaveTableBank's entry tail percent.
-
[Sound Cues] Fixed a divide by zero bug in the Enveloper node.
-
Fixed a bug that would cause audio to not play in sequences when cooked audio is referenced in the current level.
Deprecated:
-
Deprecated the Steam Audio Plugin.
-
Deprecated the Modulator parameter on the Modulation Destination Settings.
Blueprint
New:
-
Added facility to make explicit and validate UBlueprint and UBlueprintGeneratedClass subclasses. Subclasses can publish their mappings from the methods: IKismetCompilerInterface::OverrideBPTypeForClass, IKismetCompilerInterface::OverrideBPTypeForClassInEditor, and IKismetCompilerInterface::OverrideBPGCTypeForBPType.
-
Blueprint functions that take parameters by reference no longer require Blueprints that call the function to connect the pin corresponding to the parameter(s) that are passed by reference. This makes it easier to toggle a Blueprint parameter to be passed by reference.
-
Linear Color ToHex is now exposed to Blueprint.
-
Added a Blueprint callable function to shuffle an array using a 'random stream' for the source of randomness.
-
Added gather search data for BlueprintExtensions. This is used by the FindInBlueprint system.
Crash Fix:
- Fixed potential crash when
bFavorPureCastNodes
is enabled.
Bug Fix:
-
Fixed a typo in the FGraphNodeCreator class description.
-
Fixed the asset loader to preserve component transform in the editor after a Blueprint has been reparented.
-
Fixed a bug that could cause sparse class data to be lost on load after reparenting a Blueprint.
-
Fixed a bug that prevented you from moving a Blueprint to a location that has a redirector that points to a Blueprint. This can often happen if you move a Blueprint then attempt to move it back.
-
Both Find-in-Blueprint and Blueprint namespace asset discovery are now deferred until after the initial asset registry file scan is complete.
-
Soft class objects are now included in a cooked set When using CookSettings.SkipOnlyEditorOnly assets referenced by Blueprint bytecode.
Blueprint Compiler
Improvement:
- Improved redirect support for Blueprints. A reflected Blueprint type can now be changed without breaking existing content, so long as an autocast function exists for the two types.
Crash Fix:
-
Fixed a rare crash during Blueprint compilation after removing a variable from a component and compiling. The compiler was delta serializing against an archetype of a different type.
-
Fixed a crash when a skeleton class's CDO is accessed when the native class its based on is using sparse class data.
Bug Fix:
-
Improved handling for variables that were moved out of a class and into the corresponding sparse class data.
-
Stale DelegateSignatureGraphs are now removed before compiling, child Blueprints no longer improperly mutate their parent's delegate properties.
-
ExpandEnumAsExecs now always uses first Exec if an argument name matches Enum value (resubmit) ExpandEnumAsExecs was using an ambiguous pin lookup.
-
Fixed erroneous deprecation of BreakVector3f for float-based math functions.
-
Fixed a bug in Blueprint compilation that occurred when a Blueprint was recompiled when it had garbage subclasses.
-
Fixed references to trashed function objects after generating delegate properties during a batched Blueprint asset compile with inter-batch dependencies.
-
Avoid potential collisions with existing non-transient objects when creating transient event stub graph artifacts during Blueprint ubergraph compilation.
Removed:
- Removed HasNativeBreak from FVector3f.
Blueprint Editor
New:
-
Added the ability to mark custom events as private. Added default FunctionFlags values that custom events would need for specifiers. Modified the UI to show the access specifier drop down for both function entry nodes and custom events.
-
By default, the editor will no longer mark outer level/OFPA assets as dirty when propagating default value changes to instances that already match the archetype's value. Instances will still be marked dirty if the default value change results in the instance value becoming realigned with the archetype.
-
Added new Blueprint editor settings to control how assets selected in the Content Browser will generate pre-bound actions when invoking the Blueprint graph context menu. The default settings now disable this feature in order to improve menu responsiveness.
-
By default, the editor will no longer mark an outer level/OFPA asset as dirty after manually compiling its underlying Blueprint type.
-
Non-blocking context menu UI mode is now enabled by default in the Blueprint graph editor.
Improvement:
-
Optimized async Blueprint context menu building by avoiding resorting and inserting nodes in the desired order.
-
Improved performance of Blueprint debugger by only populating the children of visible properties and not recursing further.
Crash Fix:
-
Fixed crash in SGraphPin::GetPinLabel after removing pins from a node.
-
Fixed crash when compiling a Blueprint after invoking Undo in the editor.
-
Fixed an editor crash when editing sparse class data fields in Blueprint class defaults.
Bug Fix:
-
Reduced the amount of graph refreshes performed in the Blueprint editor, reducing hitching and flickering when making changes in the Blueprint graph editor.
-
Fixed Private and Protected functions from not displaying in the context menu in child Blueprints.
-
Fixed bug that would cause properties in an object's sparse class data to not display as altered in the diff panel, even if they had been altered.
-
Fixed malformed asset resulting from duplicating a Blueprint with sparse class data.
-
Fixed variables that are dragged and dropped to the node with split struct pins from not being added.
-
Fixed issue where disconnecting an orphan pin would cause ensure to trigger due to an invalidated graph pin.
-
Fixed the potential for data loss when loading hierarchical Blueprint class assets with circular dependencies asynchronously in the editor.
-
Fixed the Blueprint Namespace entry widget's tree view from not working properly when only one root item matches the search box filter text.
-
Dragging new connections from interface(output)->object(input) will now include an explicit autocast node. Additionally, it is no longer possible to connect an array of interfaces output pin to a function call node's Target input pin. These changes apply to new connections only; existing connections will continue to work as before.
-
Fixed a bug that prevented copy pasted Actor Components from being removed.
-
Deferred validation of user-defined struct types in the pin type selector list until selection time for the member variable type widget in the user-defined struct asset editor. Invocation of the pin type selector menu for member variables is now a bit faster as a result.
-
The editor will no longer orphan pins during Blueprint graph node fixup if they are linked to an autocast or other implicit conversion node that supercedes the original link.
-
Avoided unnecessary serialization of editor-only references at cook time when analyzing Blueprint assets for external imports.
-
Relocated where we purge stale references from the Blueprint editor's MRU document list in order to avoid attempts to resolve those paths during asynchronous asset loads.
Blueprint Runtime
Improvement:
- Optimized UUserDefinedStruct::InitializeStruct by avoiding redundant operations for STRUCT_IsPlainOldData macro instances.
Bug Fix:
-
Fixed a memory scribble when constructing struct literals with bitfields.
-
Added runtime capacity checks to Blueprint-facing script container library API to mitigate crashes due to integer type overflow.
-
Fixed a bug that caused circular component attachments when changing the constructor of native classes.
Gameplay
API Change:
-
It is now safe to call Super::ActivateAbility in a child class. Previously, it would call CommitAbility.
-
This will make it a little easier to write triggers/modifiers in Enhanced Input that want to access the Local Player if they want access to the User Settings object to check aim sensitivity or other things.
-
This is useful piece of state for games to use during pawn initialization.
-
Commands are prefixed with AbilitySystem.
-
GameplayTagQueries that are empty are ambiguous and should be handled on a case-by-case basis by the caller.
-
We can go back to the old way of loading the source texture if this breaks something with the "Paper2d.DisableSyncLoadInEditor" CVar flag.
-
passing nullptr into SDetailsViewBase::HighlightProperty no longer does nothing and will instead un-highlight all properties
-
This is a critical fix if you are attempting to use the input device subsystem.
New:
-
Added an option to a Targeting System's AOE Targeting Task to offset based on relative space rather than world space.
-
Moved TargetingSubsystem functions into the same metadata category.
-
Added ULocalPlayerSaveGame base class to the engine that provides utility functions for saving and loading a save game object for a specific Local Player. This wraps the existing save/load logic on GameplayStatics and provides functionality needed to properly support save/load on non-PC platforms.
-
OnAvatarSet is now called on the primary instance instead of the CDO for instanced per Actor Gameplay Abilities.
-
Added the source location of the AOE task trace as the _TraceStart _of any _FHitResult _returned by that task so users have that information available after targeting.
-
Input slots now support enum ranges.
-
Updated enhanced input settings to allow deferral of settings updates.
-
MatchAnyTags, MatchAllTags, and MatchNoTags tag queries now have exposed make nodes in Blueprint.
-
Marked UTargetingTask as Abstract so it can't be chosen for EditInlineNew properties.
-
Added Data Store for Collision parameters used by the AOE targeting Task.
-
Added hook to override collision data from the data store in the AOE Targeting Task.
-
Exposed Async Task in the Perform Targeting node so we can get the Targeting Handle before get targeting results.
-
Added GetPlatformUserIndex function to LocalPlayer and fixed comments to explain the different indices.
-
Expanded AInfo's constructor to support a default ObjectInitializer parameter, covering cases where derived classes could override the default constructor and miss AInfo-specific initialization.
-
Allow both Activate Ability and Activate Ability From Event in the same Gameplay Ability Graph.
-
AnimTask_PlayMontageAndWait now has a toggle to allow Completed and Interrupted after a BlendOut event.
-
Post-process settings from camera shakes and camera animations are now handled as overrides, rather than base world values.
-
Added aspect ratio axis constraint override on camera components.
-
Added a GetOwningLocalPlayer function to the UPlayerInput class.
-
GAS: Added a GameplayTagQuery field to FGameplayTagRequirements to enable more complex requirements to be specified.
-
Added a ReceivedPlayerController function to UPlayer, called from it's owning Player Controller when the owning APlayerController pointer is now valid on that player. Alongside this, add a "OnPlayerControllerChanged" delegate to ULocalPlayer and Local Player Subsystems for an easy hook in.
-
Introduced FGameplayEffectQuery::SourceAggregateTagQuery to augment SourceTagQuery.
-
GAS: ModMagnitudeCalc wrapper functions have been declared const.
-
Marked all exec pins as advanced view on Input Action event nodes except for "Triggered".
-
Added continuous Input Injection to Enhanced Input.
-
Added support for setting AllowedTypes on FPrimaryAssetId function parameters. To use this, add UPARAM(meta = (AllowedTypes = "SomeAssetType")) to a parameter.
-
Added EKeys::AnyKey support to Enhanced Input.
-
GAS: Extended the functonality to execute and cancel Gameplay Abilities & Gameplay Effects from a console command.
-
Added the ability to perform an "Audit" on Gameplay Ability Blueprints that will show information on how they're developed and intended to be used.
-
FGameplayTagQuery::Matches now returns false for empty queries.
-
Exposed FDateTime's To/From Unix Timestamp functions to Blueprints.
-
Added support for properly replicating different types of FGameplayEffectContext.
-
Updated FGameplayAttribute::PostSerialize to mark the contained attribute as a searchable name.
-
FGameplayEffectContextHandle will now check if data is valid before retrieving "Actors".
-
Retain rotation for Gameplay Ability System Target Data LocationInfo.
-
Gameplay Ability System now stops searching for PC only if a valid PC is found.
-
Updated GetAbilitySystemComponent to default parameter to Self.
-
When diffing assets, their detail panels now have colored highlights signifying the changed properties.
-
Updated the comments on the Enhanced Action Key Mapping and the Input Action asset to be explict about the order of which modifiers are applied. Modifiers defined in individual key mappings will be applied before those defined in the Input Action asset. Modifiers will not override any that are defined on the Input Action asset, they will be combined together during evaluation.
- Added callback options with metadata on FInstancedPropertyBag
- Added a TypeFilter callback to filter out some types when changing the type of a property
- Added a RemoveCheck callback to cancel the removal of a property
- Added a generic way to invoke
-
You can now merge DataAssets that are conflicted in revision control by right clicking on them in the content browser and selecting "Revision Control/Merge".
-
Implemented support for changing default type in PropertyBag detail view Also move Metadata names to a seperate header to reference all available metadata values for StructUtils
-
Added a Debug Display Name string to Player Controller input modes. This is useful for doing a quick debug session of why input may not be getting to the player because it could be consumed by the UI.
-
Added clarification to the TouchInterface directions.
-
Marked functions as virtual in AbilityTask_WaitTargetData.
-
Added an advanced setting on the Input Action for the input accumulation behavior. This setting would allow you to change an input action to cumulatively combine input from different Action Key Mappings instead of always accepting the mapping with the highest key value. A practical example of when to use this would be for something like WASD movement, if you want pressing W and S to cancel each other out.
-
Added filtering on containers you can use with Properties for StructUtils.
-
Added SSourceControlReview::OpenChangelist method to allow external code to open the changelist review dialog.
-
Diff tool overhaul that allows asynchronous diffing and improves diff accuracy for details panels.
-
Added a EHardwareDeviceSupportedFeatures and EHardwareDevicePrimaryType enums to hardware device identifiers. These allow hardware device identifiers to set flags for themselves to identify some common traits that they have and check what kind of support they have. These are config flags that provide your game a method to change what they support for a given input device and add custom hardware types if desired.
-
Added support for instanced struct object references in DataTable and DataRegistry.
- Allow for input injection based on a player key mapping name as well as a UInputAction pointer. We can do this by keeping track of the UInputAction* associated with each player mapping. Keep track of the owning Platform User ID of each player mappable key profile so that you can access the Local Player without needing to get the outer of the profile, which will be useful for custom profile subclasses.
Improvement:
-
Refactored camera shakes' time management.
-
Improved post-process settings blending between view targets.
-
Added option for ProjectileMovementComponent to avoid interpolation transform updates on some frames when an object isn't as relevant. Default version is based on not recently rendered but can be extended.
-
Added FScopedMovementUpdate around movement of interpolated component in ProjectileMovementComponent. This avoids moving its child components more than once if it then again simulates during the tick.
Crash Fix:
-
Fixed a crash when trying to apply gameplay cues after a seamless travel.
-
Fixed a crash caused by GlobalAbilityTaskCount when using Live Coding.
-
Fixed UAbilityTask::OnDestroy to not crash if called recursively for cases like UAbilityTask_StartAbilityState.
-
Fixed a crash caused by having entries added to the _AsyncTargetingRequests _while they were being processed (When an async targeting request node is chained with another one). Now we queue those and process them at the end of the tick.
-
Fixed AddTimedDisplay crash when changing a level.
-
Prevented a crash when attempting to add an invalid subobject class type with the Subobject Data Subsystem.
-
Fixed a crash caused by AGeometryCollectionISMPoolActor holding a garbage pointer.
-
Fixed a crash when diffing an Animation Blueprint.
-
Fixed a crash when diffing asset additions and removals in the review tool.
Bug Fix:
-
Use existing GameplayCueParameters if it exists instead of default parameters object in RemoveGameplayCue_Internal.
-
Changed Play in Editor initialization to create game instance subsystems before it creates and initializes world subsystems to match how it works in packaged games and map transfers.
-
Fixed GetInputAnalogStickState double-to-float wrapper from calling the wrong function.
-
GameplayAbilityWorldReticle now faces towards the source Actor instead of the TargetingActor.
-
Cache trigger event data if it was passed in with GiveAbilityAndActivateOnce and the ability list was locked.
-
Fixed RawScores from getting populated incorrectly in Targeting System Tasks.
-
Fixed an issue with Blueprint Debugging 'StepOver' command stopping in incorrect Blueprints.
-
TargetingSelectionTask_AOE now respects source actor rotation instead of being axis-aligned.
-
Skip processing TargetingTaskSet elements that are null.
-
Fixed SCS_Node Actor scenecomponents from not getting re-registered correctly after Build events.
-
Fixed some issues with blending out some infinite camera shakes.
-
Fixed composite camera shake pattern duration info as shown in sequencer.
-
Support has been added for the FInheritedGameplayTags to update its CombinedTags immediately rather than waiting until a Save.
-
Fixed Actor loading in the editor to correctly set the transform when a native root component changes class during reparenting.
-
Fixed issue affecting the timing of server-forced pawn position updates when time dilation was involved.
-
Limited the length of a player mappable name to the max length of FName's to properly check for the max length. This fixes a possible ensure that you could get if you used a name that's too long.
-
Fixed regression that would cause erroneous "AttachChildren count increased while detaching" error when a USceneComponent was garbage collected
-
Prevented AActor::RerunConstructionScripts from calling a redundant SetWorldTransform inside ExecuteConstruction when the transform hasn't changed. This was causing error accumulation in the relative and world transforms of a component that has an attach parent.
-
Fixed character movement issue that could prevent client moves from being submitted at the intended rate when time was dilated.
-
Fixed issue where a Character could intend to stay vertical (aligned with gravity) but unable to change pitch or roll to get there.
-
Moved ShouldAbilityRespondToEvent from client-only code path to both server and client.
-
Fixed an issue where subobjects that are stored in container properties (TArray, TSet, and TMap) would not show up in the details panel if they were created dynamically at runtime.
-
Newly created Blueprint Child Classes are now marked as Transactional and therefore allow undo immediately upon creation, rather than after first save.
-
Fixed pathing warnings when working with certain types of data assets and data tables.
-
Only attempt to auto upgrade to Enhanced Input if the project has a name. This solves an issue where you would get toasts about EI from the project launcher.
-
Check for null world pointer before starting/stopping shakes.
-
Added some data validation for Combo Step Completion and Cancellation States to make sure at least one state is set.
-
Do not attempt to synchronously load the source texture of a Paper2D sprite if we are already in the ASYNC loading thread. This can occur in the editor if cooked content is enabled, on post load of the sprite asset.
-
Fixed FAttributeSetInitterDiscreteLevels from not working in Cooked Builds due to Curve Simplification.
-
Set CurrentEventData in GameplayAbility.
-
Ensure MinimalReplicationTags are set up correctly before potentially executing callbacks.
-
Made Blueprint functions on the camera animation subsystem gracefully handle null pointers.
-
Fixed comment for UPawnMovementComponent::AddInputVector.
-
Fixed ShouldAbilityRespondToEvent from not getting called on the instanced GameplayAbility.
-
Gameplay Cue Notify Actors executing on Child Actors no longer leak memory when gc.PendingKill is disabled.
-
Made AActor::SetActorTickEnabled virtual.
-
Fixed an issue in GameplayCueManager where GameplayCueNotify_Actors could be 'lost' due to hash collisions.
-
WaitGameplayTagQuery will now respect its Query even if we have no Gameplay Tags on the Actor.
-
PostAttributeChange and AttributeValueChangeDelegates will now have the correct OldValue.
-
The minimal view info has been correctly reset to prevent parameters from "leaking" from one view target to the next.
-
Applied current scale and easing value to post-process settings weight
-
Fixed FGameplayTagQuery from not showing a proper Query Description if the struct was created by native code.
-
When bIgnoreAllPressedKeysUntilRelease is true, don't only ignore key presses for keys that were in the previous key mappings, but for every key.
-
Fixed not being able to Copy & Paste the Mappings list in an Input Mapping Context.
-
Only modify config files if the project has a name, which avoids modifying default engine ini files from the project launcher.
-
Fixed package load warning when loading changelists in the review tool that contain non-asset files.
-
Resetting the value of the action value bindings when the action is not present in the current mappings.
-
Added a "Force Reset" flag to device properties that gets set when PIE ends. This fixes an small bug where the light color or trigger effect could persist between PIE sessions.
-
Updated text exporting of objects (used for copy/paste) to sanitize property names containing special characters that would otherwise break the parser on import
-
Marked the FKey::KeyName as EditAnywhere so that its value is correctly propagated if it is changed on a subobject. Without this, the KeyName property will be filtered out when determining if a property has changed on a subobject, leading to an unusable UPROPERTY. This has no effect visually in the editor since the FKey has a custom details row.
-
Fixed non-deterministic behavior during cook time with regard to the Scale Method pin in on SpawnActorFromClass nodes
-
Fixed a regression that caused SDetailsViewBase::HighlightProperty to not support nullptr and thus removing any way to unhighlight a property
-
Fixed an issue where some key mappings would incorrectly be displayed as overriden in the "showdebug EnhancedInput" command. This was happening because the AddUnique call to the array would always add a new mapping, since it was comparing the instanced arrays of modifiers and triggers.
-
Removed an invalid "break" in a loop that created an order dependant check for chorded actions being blocked.
-
Fixed the Input Device Subsystem not finding a valid Game World in a packaged windows project.The subsystem was searching for a PIE only play world, not a cooked game world as well.
-
Fixed an issue when comparing enhanced action mappings during RebuildControlMappings because of a deep copy of the modifiers and triggers arrays, so any time we compare a new instance to old instance it would return false no matter what.
-
Fixed a bug that caused OneFilePerActor Actors to always diff the local asset against itself instead of against a previous version.
-
Ensure that the UAbilitySystemGlobals::InitGlobalData is called if the Ability System is in use. Previously if the user did not call it, the Gameplay Ability System did not function correctly.
-
Fixed route gamepad to second window. When this setting is enabled, if you have a gamepad connected to the editor, all gamepad inputs will be routed to the next PIE window.
-
Reduced false positives in text-based asset diffs by excluding export paths from the diff.
-
Fixed a bug that caused RefreshPropertyObjects in SKismetInspector to not get garbage collected.
Deprecated:
-
Removed unused function FGameplayAbilityTargetData::AddTargetDataToGameplayCueParameters.
-
Removed vestigial GameplayAbility::SetMovementSyncPoint
-
Deprecated UPlayerMappableInputConfig in favor of the new UEnhancedInputUserSettings with 5.3.
-
Deprecated the FPlayerMappableKeySlot and all its related functions for 5.3, along with all the old player mapped key functions in favor of UEnhancedInputUserSettings.
Removed:
-
Removed unused replication flag from Gameplay tasks & Ability system components
-
Removed ensure when no combo actions are present. Logs a warning instead.
Mass
New:
-
Simplified UMassActorSpawnerSubsystem subclassing by moving post actor spawn steps from SpawnActor into SpawnOrRetrieveFromPool. SpawnActor now calls World->SpawnActor.
-
Added the bRandomize property to FMassTransformsSpawnData to control whether UMassSpawnLocationProcessor assigns transforms randomly (defaults to true to maintain current behavior) or if false, assigns transforms in order.
Bug Fix:
-
Fixed a bug in FMassEntityManager::BatchDestroyEntities where the ObserverManager wasn't being informed of the entity deletions, causing fragment destructors not to run.
-
Fixed processor execution flag for world for PIE.
-
Fixed multithreading access detector in FMassBatchedEntiityCommand's Add methods.
Networking
New:
- [NetBitArray]
- Added
IsBitSet
. - Added
CombineMultiple
to run bit operations on two const bit arrays in 1 loop. - Added
ToString
that prints how many set bits the array currently has. Slightly expensive do not abuse with active logs. - Added
FNetBitArrayPrinter
utility functions.
- Added
- [Network]
- Added
FNetContext
for user code to tell if inside a real network RPC or not. - Added support to
FNetContext::IsInsideNetRPC
in both Iris and legacy.
- Added
- [NetBitArray]
- Added
InitAndCopy
functions onFNetBitArray
. Used to quickly construct a bit array from an existing source, either bitarray or bitarrayview. - Added
Set
functions used to overwrite the bitarray with the word operations of two other arrays.
- Added
- [SubObject Replication]
- Added cvar
net.SubObjects.DetectDeprecatedReplicatedSubObjects
. - When enabled, it will ensure that it detects that
ReplicateSubObjects
is implemented in a class that switched over to the new registration method. This is only available in development builds.
- Added cvar
-
[NetDriver] Added
FWorldDelegate::OnNetDriverCreated
delegate called after anyNetDriver
was created. -
[Iris] A struct derived from a struct with a custom Net Serializer somewhere in the hierarchy is no longer required to implement a Net Serializer itself. The custom Net Serializer is automatically used appropriately and additional replicated properties will be replicated as expected.
-
Clients now disconnect on a bunch error when Iris is enabled. This prevents trying to deserialize packets indefinitely. When an error is set, it's unrecoverable.
-
FNetBitArray
can now be used in range-based for loops. This loops over set bits and gives you the index of the set bit. -
Added documentation to Network Prediction plugin
README
file. - Added
ELifetimeCondition
COND_Dynamic
support.COND_Dynamic
allows for a property to decide its actual replication condition after instantiation of the actor/component rather than being the same for all instances.- The condition can be changed using the macros:
DOREPDYNAMICCONDITION_INITCONDITION_FAST
: when used in the object'sGetReplicatedCustomConditionState
implementationDOREPDYNAMICCONDITION_SETCONDITION_FAST
: in any other place where it's appropriate to change the condition.- If the condition is never modified, thus remaining
COND_Dynamic
, the property will always replicate when changed. It's possible to use theDOREPCUSTOMCONDITION_
macros on properties with this condition.
- [Iris]
NetObjectConnectionFilter
is now available for Iris replication. This can be used to dynamically filter objects to only replicate to certain connections.- The main use case is when objects added to this filter may also be dependent objects as dependent objects override dynamic filtering, but not any type of static filtering.
-
Added additional Insights CPU scopes in Network Prediction plugin code.
-
Added a unit test program for the Network Prediction plugin that covers basic simulation ticking in forward prediction and interpolation modes.
-
ReplicatedPredictionKeys
now explicitly copiesReplicatonID
andReplicationKeys
to properly support being initialized with preservedReplicationID
. - Net Driver updates:
- Collect the amount of packets sent and received by each connection, each frame.
- Output the average and max per-connection packets received and sent every frame in CSV Profiler.
- Added
net.ForceOnePacketPerBunch
console variable to force every packet to contain a single bunch. This can be used to debug rare ordering issues when two actors are dependent, but should not.
-
Added
net.AlwaysUpdateGuidReferenceMapForNetSerializeObjectStruct
console variable to always updateGuidReferenceMap
entries forNetSerialize
structs with object properties, in order to prevent issues with old property values being applied when the struct's object reference is remapped. CVarNetEnableDetailedScopeCounters
is now cached in a global variable in order to prevent unnecessary work getting the console variable value every conditional scope cycle counter.ReplicateCustomDeltaPropTime
is now only recorded if the object has any custom delta properties.
Crash Fix:
- Fixed the seamless travel handler to handle PIE renaming for the transition map the same way it does the destination map. This fixes a crash with multiplayer PIE where it tries to reuse the same map package
Bug Fix:
-
Fixed
GetNetMode
to work properly in Play in Editor for functions likeInitGame
called halfway through world startup, and fixed related issues withEnableListenServer
and dedicated server PIE worlds. -
[ReplicationGraph] Added fix to prevent sending multicast RPCs on a channel that is closing but not yet cleaned up.
-
[ReplicatedSubObject] Fixed refcount breaking due to accessing invalid memory from a
TSet
iterator after having removed the iterator. - [RepGraph]
- Fixed log spam caused by actors going outside the legal world bounds and staying OOB.
- Only log a warning once when the actor goes OOB.
net.ReplicationGraph.PrintGraph
now prints the list ofDynamicSpatializedActors
monitored by the Grid2D node.
- Fixed an issue where actor channels were closed due to level being unloaded/streamed-out destroying NetStartupActors unless the channel had been explicitly broken.
- This behavior can be disabled by setting the console variable as:
net.SkipDestroyNetStartupActorsOnChannelCloseDueToLevelUnloaded 0
.
- This behavior can be disabled by setting the console variable as:
-
Fixed behavior of simulated proxies controlled by the Network Prediction plugin when there's no autonomous proxy, such as when a client un-possesses a pawn and doesn't immediately possess another one. Interpolation of simulated proxies now continues while there's no local autonomous proxy.
-
FastArraySerializer
is no longer allowed to modify state of Archetype or CDO when initializing base state as this lead to inconsistencies with assignment ofReplicationID
-
Fixed issue with missing detection of items being marked dirty.
-
Fixed issue with
NetTraceReporter
crashing when processing certain trace files. - Fixed an issue where
FNetBitArray::FindLastZero
returned index out of bounds for array sizes not aligned with the size of the storage.
Deprecated:
- [NetDriver]
- Deprecated
NetServerMaxTickRate
variable and replaced them withGet
/Set
functions. - Added
FOnNetServerMaxTickRateChanged
delegate. Register to receive callbacks when the server tick rate changes.
- Deprecated
- Deprecated obsolete packet handler components.
Removed:
-
Removed calls to
SetNetVersionsOnArchive
andSetNetVersionsFromArchive
and redirectFInBunch::GameNetVer
andFInBunch::EngineNetVer
to use the internal connection pointer. -
Removed
FloatCastChecked
inPreFrameReceive
to fix an assert with a largeDeltaTime
that could occur in certain circumstances.
Level Design and Art Tools
Geometry Core
New:
-
Added the ability to store and fetch temporary debug named-FDynamicMesh instances via global C++ functions
UE::Geometry::Debug::StashDebugMesh()
andFetchDebugMesh()
. A new cvargeometry.DynamicMesh.EnableDebugMeshes
must be set to 1 to enable this functionality. A console commandgeometry.DynamicMesh.ClearDebugMeshes
can be used to clear the debug mesh set. -
The
FConvexDecomposition3
class now has a merge-only API, which can be used to approximate an input set of convex hulls with a smaller number of convex hulls. -
Added Transform and Inverse Transform functions to Geometry Core's TPlane3.
-
Added Transform Normal and Inverse Transform Normal functions to Geometry Core's VectorUtil.
-
Added a
FSphereCover
concept as a new, optional representation of negative space forFConvexDecomposition3
. This can be used to guide the merge phase of convex decomposition, more accurately keeping the convex hulls away from the object's negative space. Multiple methods are provided to generate a sphere covering that efficiently covers the negative space, with settings to allow some leeway to ignore negative space in small gaps or near the object surface. -
The Clipper2 wrapper in the Geometry Algorithms module now supports taking the intersection, union, difference, and exclusive-or of arrays of polygons.
-
Added FindAllHitTriangles function to get all the triangles intersected by a ray (not just the closest one).
-
Dynamic Mesh Component now provides the option to control which color-space conversion is applied to Vertex Colors when creating the Render Buffers from the
UDynamicMesh
vertex color attribute (SRGB to Linear, Linear to SRGB, or No Conversion). This option is exposed as the Color Space Mode property on the class, as well as via new Blueprint functions Set Vertex Color Space Transform Mode and Get Vertex Color Space Transform Mode. The default is to not apply any conversion or transform. -
DynamicMeshComponent now supports specifying custom vertex color remappings in C++, by passing a lambda to the new API function
SetVertexColorRemappingFunction
. ClearVertexColorRemappingFunction and HasVertexColorRemappingFunction have also been added. -
Added the Clear Vertex Color Remapping function.
-
Added the Has Vertex Color Remapping function.
-
Added a Split Attribute Welder function.
FSplitAttributeWelder
can be used to weld split-attributes that share the same vertex in the parent mesh.
Bug Fix:
-
Fixed exact predicate float control settings for clang, making exact predicates work correctly on platforms where clang was configured to use fast math.
-
Made the Geometry Core AABB types respect the
IsValid
flag on conversion to or from the Core FBox type. -
Dynamic Mesh Component can now render a wireframe overlay in shipping builds, if an Engine wireframe material is available.
-
Prevented an issue where the editor might crash when determining the number of UV channels during mesh conversion.
-
Fixed issue in
TMeshSimplification
where explicitly-constrained vertices could result in collapses that ignore geometric constraints.
Geometry Script
New:
-
Added two functions that compute the shortest distance between mesh points: Get Shortest Vertex Path (using Dijkstra ) and Get Shortest Surface Path (using intrinsic mesh edge flips.)
-
Added the ability to trace a straight line on a mesh surface through geodesic functions.
- Added new mesh bone weight functions for getting information about individual bones of the skeleton stored in the dynamic mesh:
- Get Root Bone Name
- Get Bone Children
- Get All Bones Info
- Get Bone Info
-
Added the function Blur Mesh Vertex Colors for blurring mesh vertex colors.
-
Added the function Transfer Bone Weights From Mesh for transferring bone weights from one mesh to another.
-
Created new functions Discard Bones From Mesh and Copy Bones From Mesh.
-
Dynamic meshes now inherit the skeleton information when converting from skeletal meshes.
-
Create New Skeletal Mesh Asset From Mesh (LODs) can now use the proportions of bones stored in the input dynamic meshes. This is enabled through the Use Mesh Bone Proportions flag in the Geometry Script Create New Skeletal Mesh Asset Options.
-
Added Create New Static Mesh Asset From Mesh LODsand Create New Skeletal Mesh Asset From Mesh LODs functions for creating static and skeletal meshes from an array of LODs instead of just a single mesh.
-
Added the Append Bounding Box function, which takes an
FBox
instead of separate box parameters -
Added the Mark For Mesh Rebuild Blueprint function to Generated Dynamic Mesh Actor, which allows other Blueprints to explicitly queue up a Mesh Rebuild event without re-running the Actor Construction Script.
-
Added Get Vertex Connected Triangles, Get Vertex Connected Vertices, and Get All Split UVs At Vertex functions, which can be used to query the one-ring triangles or vertices of a vertex, as well as the set of split UVs at a vertex in a given UV channel
-
Added the ability to run Delaunay Triangulation on an input set of points, and optionally a Constrained Delaunay Triangulation that preserves specified edges as well.
-
Updated the dynamic mesh component to expose new Blueprint functions Notify Mesh Updated and Notify Vertex Attributes Updated. These functions can be used to force either a full or partial update of the rendering buffers for the Component after the
UDynamicMesh
has been modified with deferred notifications. -
Added the function Recompute Normals For Mesh Selection to allow normals recomputation to be limited to a mesh selection.
-
Added the Compute Mesh Local UV Param function, which can compute an Discrete Exponential/Log Map (ExpMap) UV parameterization on a bounded-geodesic-radius area of a mesh. The subset of computed vertex/UV pairs is returned as output, rather than set on a mesh UV channel.
-
Added a Channel Pack node which has up to four input textures and creates an output texture where the RGBA channels are sourced from the inputs.
-
Added a new function, Select Mesh Elements In Box With BVH allowing efficient range queries on large meshes using a bounding box and an AABBTree.
-
Added the Get Mesh Volume Area Center function to compute the center of mass for a mesh, as well as volume and surface area.
-
The dynamic mesh component's Externally Provided tangent type setting has been renamed From Dynamic Mesh.
-
Added new polygon and path offset functions.
-
Added new functions and data types for managing simple polygons (polygons without holes) and lists of general polygons (polygons with support for optional holes) in 2D.
- Editor-only functions Stash Debug Mesh and Fetch Debug Mesh have been added, which can be used to save temporary copies of
UDynamicMesh
objects associated with string names. The cvargeometry.DynamicMesh.EnableDebugMeshes
must be set, otherwise these functions are ignored.
Improvement:
-
Updated the polygon triangulation functions to have better error handling and a more robust winding-number-based fallback mode to generate better results in cases where input polygon edges overlap.
-
Recompute Normals function now has a
bDeferChangeNotifications
option. -
Updated the Copy Mesh From Component function to support Instanced Static Mesh Components; each instance of the static mesh is appended to the output mesh
-
The Bake Texture function was updated to expose an option to control the type of texture filtering applied.
-
Updated dynamic mesh components to use the tangents provided on their dynamic mesh by default, and the setting controlling this tangent source is now also exposed in the UI under the Dynamic Mesh Component properties.
Bug Fix:
-
Removed incorrect clamping of the Radial Samples parameter in Append Disc.
-
Fixed an issue where passing an invalid path to Geometry Script's new asset utility functions could cause a crash. Package names are now automatically sanitized before use by these functions.
-
Fixed issue where Create Skeletal Mesh Asset From Mesh was not assigning materials correctly.
-
Fixed a crash when splines with duplicate constant points are converted to polylines.
-
Updated modules in the GeometryScripting plugin that are Runtime-capable to load in the PreDefault loading phase, before user construction scripts that may depend on Geometry Script.
Modeling Tools
New:
-
Added a Mesh Topology Selection Mechanic which enables or disables different selection modes in the details customization.
-
Added a Generate Lightmap UVs option under the New Mesh Objects settings in the Modeling Tools Project Settings panel. If enabled, this will enable light map UVs on any new static mesh created within Modeling Mode.
-
Moved the Bake RC tool from Mesh Modeling Tools Exp to Mesh Modeling Tools Editor Only Exp module.
-
Adding a two-sided vertex color material. Same as Mesh Vertex Color Material but with Two Sided checked. Useed the new two-sided material in the cloth weight map paint tool so that we can paint on the back side of the 2D panels.
-
The Bake Transform and Edit Pivot tools now update all LODs by default, not just the active LOD, and exposed an 'Apply to All LODs option to control this behavior.
-
Updated Simplify To Minimal Planar to work on the boundary of meshes.
-
Added the Copy From Inputs option in Mesh to Collision tool to transfer existing simple geometry over to the target.
-
Added helper methods to count the number of Actor Components which match Target Requirements to assist with special tool needs.
-
Added helper methods to test for existence of volume components and components that support UVs in Tool Targets.
-
Updated the box finding code in
MeshSimpleShapeApproximation
to prefer to orient the boxes such that they align with the world frame better. -
Harden and improved various conversions between dynamic meshes and volumes, to make modeling tools work more reliably on volumes.
-
Added a Gradient Interaction type to the Cloth Paint tool. The user selects high and low vertices and a gradient is automatically computed between them.
-
Added the Mesh Vertex Paint Tool has been added to Modeling Mode. This Tool can be used to directly paint asset vertex colors (but not per-instance override vertex colors).
-
Created the Draw Spline tool for drawing splines and spline-based blueprints.
-
Added a Revolve Spline tool.
-
Moved various settings from the secondary toolbar to the cog icon in quick settings, since the secondary toolbar is not enabled by default in some builds.
-
Added a PolyGroupID option to the Bake Textures and Bake Vertex Colors tools.
-
Exposed mesh simplification options in the Mirror and Plane Cut tools, to reduce excess triangulation along the cut and mirror plane.
-
Added a reusable geometry selection visualization system intended to be used in modeling tools with minimal boilerplate.
-
Unbinded the toggle gizmo action in some tools from a default hotkey to prevent users from accidentally pressing it and thinking that the tools are broken. Users can still set their own hotkey if their workflow benefits from it.
-
Adjusted how the Combined Transform Gizmo displays scale axis handles when only two axes are needed. The old approach had the handles react to the camera direction at all times, causing issues in the UV Editor and inconsistent orientations of the handles relative to the plane in the case of only two axes. The new approach only is reactive to the camera in cases of one or three axes and locks the handles into a single plane if exactly two axes are configured in the gizmo.
-
Added a Simple Collison Editor tool to assist with editing of simple collision primitive shapes directly within Modeling Mode for static and dynamic meshes.
- Added Subdivide tool improvements dealing with meshes with open boundaries:
- Factor out extra corner finding code from PolyEd and add support for it in the subdivide tool.
- Added support for rounded corners for mesh boundaries.
- Override subdivision scheme during tool usage rather than just at tool start, to allow extra corners to fix some issues.
- Added some clarifying comments about schemes.
-
Changed the Mac bindings for grid size changes in Cube Grid tool to Option + A/D because Option + E is consumed by Mac.
-
Added geometry selection support to the Normals tool.
-
Added an edge simplification operation to the PolyEdit tool.
- Added a Mesh Splines tool, which creates meshes from a selection of spline components. The tool enables triangulation and extrusion of the splines, as well as Boolean combinations of the spline shapes.
Improvement:
-
Updated the Weld Mesh Edges tool to optionally merge attributes.
-
Improved the documentation of options in the SubDiv tool.
-
The BakeRC tool now outputs a material which is configured to use any generated textures.
-
UModelingObjectsCreationAPI
was extended to support materials by duplicating a given material. -
Updated the Pattern tool to have an option to place a random selected object at each pattern position, rather than always placing all selected objects at each position.
-
Updated the Mesh To Collision, Convert, and Transfer tools to properly handle simple collision on Dynamic Mesh Components.
-
Updated the Displace Mesh Tool to show feedback about the vertex and triangle counts of the output mesh.
-
Moved the preview settings to above the list of generated textures in the BakeRC tool
-
Updated Volume to Mesh tool's tooltips to better reflect the tool's behavior.
Bug Fix:
-
Fixed a bug where the Trim tool starts a potentially expensive boolean calculation when only the opacity color alpha changes.
-
Updated the New Mesh Objects options under Modeling Tools Project Settings to be used more consistently by all Modeling Mode tools that create new mesh objects.
-
Prevented several UV modeling tools from launching on volume targets, which are not applicable target types.
-
Fixed an issue where the viewport level collision rendering would not correctly show the updated collision geometry after accepting the results of the Mesh to Collision tool.
-
Fixed the static mesh to dynamic mesh conversion not recomputing tangents with the recompute tangents option set, in some cases.
-
Improved checks for launching tools against assets that might be cooked in the editor.
-
Updated the Pattern Tool to emit contextually correct static mesh actors.
-
Fixed
GetElapsedComputeTime
so that the preview material kicks in after the proper delay. -
Updated the Convert Tool to no longer copy incorrect Material IDs to the output mesh if the the Transfer Materials option is disabled.
-
Prevented several tools from running on volume targets since the operations didn't apply to that target type.
-
Dynamic mesh components now show vertex colors when the setting to show vertex colors is enabled in the viewport.
-
Fixed an issue where the Extrude Path tool generated a result with incorrect extrusion in some cases.
-
Hit-testing for the rectangular scaling and plane-translation handles in the Modeling Mode gizmo has been improved.
-
Fixed per-channel baking of curvature and ambient occlusion for the Bake Vertex tool.
-
The Subdivide tool now works on Mac and Unix targets.
-
Fixed previous collision geometry incorrectly remaining visible when Collision Type was changed in the AutoLOD tool. Now only the collision geometry for the active Collision Type is shown.
-
Fixed various tooltips, edit conditions and reset buttons in the AutoLOD tool
-
Fixed an issue where the PolyCut tool would generate a bad result if the cutting polygon was self-intersecting.
-
Updated the Bend operation in the Warp tool to support negative bend angles.
-
Fixed a crash in the Edit Pivot tool when multiple tool targets are backed by the same asset.
-
Fixed static mesh components created by modeling tools to set to static mobility by default, instead of movable.
-
Improved Project and Remesh tool's Target Edge Length tooltip, explaining why it's not starting at the default value hardcoded into the property.
-
Replaced the wireframe visuals in UV Layout Preview to use Mesh Elements Visualizer, to address Z-fighting visual artifacts in wireframe displays.
-
Fixed an issue in the Pivot Actor tool where changing the transform using the gizmo did not cause the reset to default arrow to appear in the details panel.
-
Fixed a crash in the Subdivide tool when adding Extra Corner Vertices was enabled for some meshes. Extra Corner Vertices can now only be added along open boundaries.
-
Adjusted the Project tool's settings to properly disable the smooth filling options when smooth filling is disabled.
-
Fixed a crash in the Bake Transform tool when some selected meshes have the same source asset.
-
Fixed issue with the Recompute UVs Op where an ensure would fire when no components contained at least one full triangle.
-
Updated the Simplify tool to conditionally disable the Prevent Normal Flips and Prevent Tiny Triangles, depending on the simplify algorithm used. This also enables support for the Prevent Tiny Triangles and Prevent Normal Flips under certain tool settings.
-
Updated The Voxel Blend and Voxel Offset tools to warn about possible artifacts when processing meshes with open boundaries when the Vox Wrap Preprocess option is not enabled.
-
Fixed computation of edge collapse lerp parameter which reduces artifacts in UV layers when remeshing.
-
Fixed readability issue in mesh statistics display.
-
Adjusted the behavior of the Mesh Visualizer settings to properly disable when the Visible property is checked off.
-
Prevented a crash when asset editors are closed with local changes during an asset reload, due to the static mesh tool target checking for transaction success incorrectly.
-
Fixed speckles in border regions when creating textures using the BakeTX tool.
-
The Mesh to Volume tool automatically simplifies models with too many faces for the BSP processing code to handle, preventing the editor from hanging when large meshes are converted to volumes with this tool.
-
Fixed a crash in the Paint Maps tool that occurred on painting on a mesh with no attributes then attempting to undo.
-
Disabled the rendering of the indicator circle in the Seam Sculpt tool, since it was not needed for the tool's functioning and caused visual confusion.
-
Fixed incorrect handling of texture source format BGRE8 in
UE::AssetUtils::ReadTexture
. -
Updated the Mesh Tangents tool to warn users when attempting to copy tangents from a mesh that does not have tangents.
-
Changed the smoothing weight scheme to IDT Cotangent in the Hole Fill tool.
-
Updated the Hole Fil tool to re-check for mesh seams to constrain between iterations of remeshing.
-
Removed the stylus plugin from Modeling Mode, because of a performance issue that occurs when the stylus plugin is enabled.
-
Updated USkinnedAsset to allow a potentially running AsyncTask to finish before deleting it.
-
Updated the mesh visualization component used by many modeling tools, including Simplify and Remesh, to correctly distinguishes between normal and tangent seams, rather than treating both seam types as normal seams.
-
Updated the Editor 2D Mouse Wheel Zoom Behavior Target in the Interactive Tools Framework to make the clip plane math work out if the camera has negative z coordinates.
Procedural
New:
-
Created convenience functions in PCG data collections and PCG blueprint to remove some boilerplate.
-
Added substring/matches search which support wildcards in the PointFilter node for string types.
-
Provided a method to convert points along Landscape Spline into points on a Spline Component. Works best with single path or circular Landscape Splines.
-
Added missing steepness controls to the Volume, Spline, and Mesh Sampler nodes.
-
Added support for soft object reference user parameters & soft object pointers internally. Behaves like generic soft object paths but with the appropriate type narrowing.
-
Added support for overridable texture in the Get Texture Data node.
-
Added Loop node that behaves like a subgraph but will pass on a single data from the designated loop pins (first pin only by default).
-
Renamed Attribute Operation node to Copy Attribute.
-
Copy Attribute now uses the Attribute from another Attribute Set source (with an extra pin). New pin is marked (and shown) un-used if the pin is not used.
-
$Index
is now a valid accessor to access the index of a point. -
Improved behavior of Get Actor Data node for PCG partition actors in the case of Single Point.
- Added an option to merge all points when querying multiple actor data with single point .
-
Added an option to ignore self in the Get Actor Data node.
-
Added SoftPath getter and setter support in PropertyBag to interact with properties that are SoftObjectPtr or SoftObjectClass.
-
PCG Tracking system is now centralized, improving performances.
-
The PCG Static Mesh Spawner now respects the ISM component type selected in the component descriptor, with the exception of changing to an ISM if the selection is HISM and the mesh is using Nanite.
-
Added a OneMinus node.
-
Added a Make Rotator attribute.
-
Some native nodes now have a Preconfigured Settings entry in the context menu, to quickly add a node with the wanted settings.
-
Preconfigured settings are available for Custom BPs, in the class settings.
-
Changed DensityNoise into AttributeNoise node, to support noise on all attributes.
-
Added aliases support on overridable PCG parameters in Settings, to facilitate deprecation.
-
Added ability to spawn Actor by attribute in the Spawn Actor node.
-
Added inspection support for subgraphs in the PCG editor.
-
Improved attribute operations by propagating the first non-param pin.
-
Input to propagate can now be overridden in the settings.
-
Added default value concept for all Make operations.
-
Changes that trigger PCG re-generation now cancel ongoing generation more efficiently. This should have a positive impact on landscape editing with PCG content and ensure that no stale data is present.
-
Added @Last and @Source as new Attribute Selectors.
@Last
gets the latest modified attribute. @Source gets the attribute specified by the input. -
None becomes a valid attribute name.
-
Added a new Point Filter Range node, to filter on a range.
-
Read-only accessors are now throwing an error if it is used as an output accessor.
- Added Is Cacheable Override for more fine-grained control when needed.
Improvement:
-
Improved naming for nodes with custom names and blueprint nodes in the node palette.
-
Improved support for name clashes, especially in BP exposed variables.
-
Properties need to be exposed to be added to the Attribute Set using the Get Actor Property node.
-
Seed for new nodes is not constant, but dependent on the node name. Seeds are kept as-is for existing nodes, to not break existing graphs.
-
Replaced Creates Artifacts with Is Cacheable in PCG blueprints to be clearer. Previously cached blueprints which did not have Creates Artifacts checked should be manually updated to set the 'Is Cacheable' flag to true.
-
Added getters for input/output pin properties by label in settings. Renamed getters on data collection to clarify it is done by label.
-
Added Get Target Actor, to be used instead of accessing the Target Actor variable directly. Refrain from getting the Target Actor variable on PCG Spatial data directly. Instead use the Get Target Actor method on the context.
Bug Fix:
-
Fixed some instances where PCG would access pending kill landscapes in some instances when getting landscape proxies.
-
Forced usage of the landscape original GUID for the landscape cache in cases where landscapes are instanced.
-
Fixed an issue where the world ray/volumetric query parameters would not be properly overridable.
-
Fixed outstanding bug in the metadata partition where the partition would not behave correctly for non-string values
-
Fixed the Landscape Blend Layer not sampling correctly when using 2x2 Subsections.
-
Fixed distance checks between the same source and target would lead to checking points against themselves.
-
Fixed issue with PCG partition actors not reacting to landscape changes before a full graph refresh.
-
Fixed issue where numerical values were not accepted for MakeTransform and MakeVector.
-
Improved logging for Metadata operation, making it easier to know why an operation is failing.
-
Fixed issue where the Create Spline node was ignoring custom tangents.
Deprecated:
-
Support
@SourceName
(previous behavior of None = Create attribute with the same name as input). Not exposed. Used for deprecation. -
Support
@LastCreated
(previous behavior of None = Get the latest created attribute in input). Not exposed. Used for deprecation.
UV Editor
New:
-
The UV Editor now supports a UV distortion visualization feature. When enabled, it computes a per triangle distortion value of the triangle's UVs vs its world space positions. This is then displayed as a color blind friendly color overlay on the 2D UV mesh. The feature supports several metrics for distortion and one metric for relative texel density over the mesh.
-
Moved UV Editor plugin from Experimental plugin directory to the Editor plugin directory.
-
Refactored unwrapped to applied selection conversion slightly to make it more convenient for areas of the code outside of the selection mechanic to perform conversions.
Bug Fix:
-
Changed the Quick Translate options in the Transform tool to produce a single undo entry for the corner transforms.
-
Corrected issue where focusing on selections in the 3D viewport was using selections on the unwrapped 2D mesh instead.
-
Corrected issue where the background grid was being incorrectly drawn due to mishandling of minimum and maximum Y-axis bounds.
-
Adjusted the language in the Transform tool's tooltips to be more consistent between different direction buttons.
World Building
API Change:
-
In PIE, UWorldPartitionLevelStreamingDynamic::RequestLevel now behaves like what ULevelStreaming::RequestLevel.
-
ULevelStreaming sets ULevel::StreamedLevelsOwningWorld so that ULevel::PostLoad can now set the level OwningWorld. Since UWorldPartitionLevelStreamingDynamic creates a memory level, it sets the OwningWorld right before loading OFPA actors.
New:
-
Added a delay to AddToWorld of a partitioned world if this same partitioned world hasn't finished removing it's sub-levels triggered by a prior RemoveFromWorld.
-
Added a LevelStreamingPersistence experimental plugin. LevelStreamingPersistenceManager handles persistence of tagged object properties when streaming-out/in levels. Persistent object properties that are tagged as public can be accessed and modified even when the level is not loaded.
-
Added UDataLayerManager which is local to each WorldPartition. Instanced world partition maps can now maintain their own Data Layer runtime states.
-
Added helpers UWorld::GetDataLayerManager and UWorldPartitionBlueprintLibrary::GetDataLayerManager which will automatically find the associated DataLayerManager.
-
Added World Partition Runtime Grid origin in grid settings to help properly align game content on runtime grid cells (for example landscape proxy actors)
-
Added a Preview Grid Level option to preview other levels of the grids
-
Added the ability to edit data layers of a level instance when editing the level instance.
-
Added editing data layer of level instance when editing the level instance even when the main world is not partitioned.
-
Added support for Make Current on Level instance DataLayerInstances when editing a level instance.
-
Unreal Engine now Includes time spent in FLevelStreamingDelegates OnLevelBeginMakingVisible/OnLevelBeginMakingInvisible and ULevelStreaming::BroadcastLevelVisibleStatus in their respective time budget.
-
The WorldPartitionSubsystem is now responsible for sorting cells and executing cell loading and activation for all registered world partitions.
-
Add Project Setting for default value to assign to new Level Instances
-
Packed Level Actors now avoid updating blueprints if packing result is unchanged.
-
DirtyFilesChangelistValidator now outputs the assets that need to be saved during changelist validation.
-
New IsMainWorldOnly actor property for filtering actors when they are being used in a Level Instance.
Improvement:
-
Optimized UpdateStreamingState for Server streaming, It now computes ClientsVisibleLevelNames once for all registered world partitions.
-
Added the wp.Runtime.UpdateStreamingStateTimeLimit command for incremental updates of registered world partitions (disabled by default). This is only useful when there's a lot of registered partitioned worlds.
-
Lowered the Net Update Frequency for HLOD actors (AWorldPartitionHLOD) in case they're ever set to replicated.
-
Any actor inheriting from AWorldPartitionHLOD with replication turned on will be affected, since there is now a NetUpdateFrequency of 1 by default as opposed to the default 100.
-
Changed default value of wp.Runtime.UpdateStreaming.EnableOptimization to true.
-
Set UDataLayerManager::SetDataLayerInstanceRuntimeState to BlueprintAuthorityOnly.
-
Replaced import data layer menu option with drag and dropping level instance data layers into main world AWorldDataLayers.
-
Disabled changing visibility and editor loading of DataLayerInstances of editing level instance.
-
Changed font from bold to bold+italic on DataLayerInstances containing actors that are part of editor selection.
-
Colorized and appended (Current) to the WorldDataLayer of the editing Level Instance in the DataLayer Outliner.
-
Optimized World Partition UpdateStreamingSources. Saves 1ms on project using >300 instances of partitioned worlds.
-
Moved initialization of game instanced world partition to happen when the level starts to be added to the world instead of when it is loaded.
-
Moved the uninitialization of game instanced world partition to happen when the level starts to be removed from the world instead of when it is done being removed from the level.
-
Centralized the initialization/uninitialization logic in WorldPartitionSubsystem
-
Instanced world partition IsServerStreamingEnabled/IsServerStreamingOutEnabled now forwards the logic to their parent world partition (if any) when using project default modes.
-
Disabled replication of WorldSettings on levels created for world partition streaming cells.
-
Added other missing deprecated UDataLayerSubsystem methods.
-
World Partition now relies on World's NumStreamingLevelsBeingLoaded instead of computing its own number of loading cells.
-
Fixed Data Layer asset paths when loading WorldPartitionActorDescs.
-
Level Instances with bEnableStreaming=true will now act as regular World Partitions when loaded on their own. Big Level Instances can now be partially loaded outside of their owning world.
Bug Fix:
-
Fixed UDataLayerManager::SetDataLayerRuntimeState helper to avoid having to resolve a DataLayerInstance for a Data Layer asset.
-
Fixed the case where an instanced world partition was added to the world, then removed from the world, then re-added to the world without being unloaded first.
-
Fixed deprecated UDataLayerSubsystem::GetDataLayerInstances to properly map to UDataLayerManager::GetDataLayerInstances.
-
Fixed pending cells to be loaded and to be added to the world not updating their cell sorting info.
-
Fixed UWorld::CanAddLoadedLevelToWorld to work with multiple world partitions.
-
Properly hooked Data Layers menu extenders and pass selection to delegate.
-
Fixed broken foliage instance selection after deleting an instance
-
Corrected missing initializations in FInstanceUpdateCmdBuffer ctor
-
Uninitializing a partitioned world should always trigger unloading of all cells regardless if server streaming and/or server streaming out are enabled/disabled.
-
Fixed replay playback not resetting runtime data layer states to their initial state.
-
In PIE, UWorldPartitionLevelStreamingDynamic::RequestLevel now behaves like what ULevelStreaming::RequestLevel does. ULevelStreaming sets ULevel::StreamedLevelsOwningWorld so that ULevel::PostLoad can set the level OwningWorld. Since UWorldPartitionLevelStreamingDynamic creates a memory level, it sets the OwningWorld right before loading OFPA actors.
-
Added server's client visible level names in update streaming state hash.
-
Fixed rare case where a WP streaming cell would contain an actor and this actor is also an editor-only reference of another actor of this cell. In this case, the editor-only reference must not be part of the WP streaming cell.
-
WorldPartitionSubsystem no longer updates streaming sources on the server when none of its registered world partition has server streaming enabled.
-
When sorting world partition cells, world partition doesn't rely on cell grid level, but instead uses grid cell extent to sort cells between multiple grids.
-
Fixed how MaxCellsToLoad is computed by World Partition to limit the total number of loading and pending load streaming cells.
-
Fixed infinite loop in Level streaming caused by UWorld::RemoveFromWorld completing in non incremental removal move after first starting in incremental mode and not resetting CurrentLevelPendingInvisibility.
-
Prevented async loading flush when world partition cell is activated.
-
Fixed bug where garbage marked levels were not given unique names, causing them to be reloaded.
-
Attached Actor Pre/PostSaveRoot transform fix.
-
Fixed cooked FunctionalTest not getting discovered for WorldPartition maps
-
Recompile skeleton class after clearing SimpleConstructionScript to avoid component name clashes when adding the new components to Packed Level Actor blueprints.
Deprecated:
-
Removed DataLayerSubsystem since DataLayerManager supersedes its functionality.
-
UWorldPartitionRuntimeCell::IsLoading, UWorldPartition::UpdateStreamingState and UWorldPartition::CanAddLoadedLevelToWorld have been deprecated.
-
Removed CanBeUsedByLevelInstance. Level Instances that are World Partition-enabled still get embedded in their parent world grid independent of the value of bEnableStreaming.
Removed:
-
Removed menu option Create Data Layer under
DataLayer as it will never be allowed for DataLayerInstanceWithAsset since it is created without any valid DataLayerAsset. -
Removed suffix - WorldDataLayers on parent node of DataLayerInstances in the DataLayer Outliner
Localization
API Change:
- Implemented async loading of localization data, and extended dynamic loading to handle explicitly loaded plugins.
BeginInitGameTextLocalization
andEndInitGameTextLocalization
have been removed as part of this change.- You would now just use
InitGameTextLocalization
(which is async) followed byFTextLocalizationManager::WaitForAsyncTasks
.
New:
-
Implemented
MinimumGroupingDigits
forFastDecimalFormat
. - Enabled "min two" grouping for Spanish by default.
- This can be disabled via the
Localization.SpanishUsesMinTwoGrouping
console variable. - When enabled, "1234" formats as "1234" rather than "1 234", but "12345" still formats as "12 345".
- This can be disabled via the
-
Added an overload of
FTextProperty::Identical_Implementation
that lets you control the fallback lexical compare mode. - Implemented async loading of localization data, and extended dynamic loading to handle explicitly loaded plugins.
- This change takes the existing support for async loading that was added for game localization data and expands it to cover all localization data.
- Async localization tasks are chained together as dependencies to preserve the existing order of operations, and can be waited on at any point (eg, after a loading screen) by calling
FTextLocalizationManager::WaitForAsyncTasks
(though the engine init flow takes care of waiting for you unless you're loading additional plugin/chunked localization data). - This change takes the existing support for dynamically loading chunked localization data on PAK chunk load, and extends it to support dynamically loading any additional localization data.
- This is used by the engine to support dynamically loading the localization targets associated with explicitly loaded plugins. These loads are all async, so must be waited on if you need them to block.
- Added the
Localization.DumpLiveTable
command to dump the current live table state to the log. This can be optionally filtered using any of the following wildcard arguments:Namespace
: The namespace to filter against.Key
: The key to filter against.DisplayString
: The display string to filter against.
- The validator to make sure localized assets do not contain dangling redirectors now properly considers the case where the localized and non-localized assets are both redirectors that point to the same respective path.
Bug Fix:
-
Always use a space and a comma as the group and decimal separator when using RAE-style Spanish numbers.
-
Fixed an assert when gathering localization data from a World Partition world that had already been loaded as the editor world.
-
Fixed text created from
FText::FindText
with a null source string failing to resolve correctly if the language changes.
Online
New:
-
Add Join in Progress to list of social debug commands.
-
MPA activity now set/unset in sync with joinability privacy. If undesired, set
setMpaActivityInPrivateSession
totrue
. - Added replacements for deprecated IAP blueprint nodes:
- Make an In-App Purchase v2 has been replaced by the new "Start an In-App Purchase" node.
- Process any New Unprocessed Purchases v2 has been replaced by the new "Get known In-App Receipts" node.
- Query for Owned Purchases has been replaced by the new "Query for Owned In-App Products" node.
- Restore In-App Purchases v2 has been replaced by the new "Restore Owned In-App Products" node.
- New nodes allow validation/granting logic to be reused because they share common types for the receipts on their outputs.
- Also added "Finalize In-App Purchase Transaction" so licensees can finalize the transactions using the receipts after processing.
- All transactions should be finalized. Any non finalized transaction locally or server side will be refunded by GooglePlay and not finalizing locally the transactions on iOS may lead to bad performance
- The recommended flows in a game should be:
- On startup/after login "Query for Owned In-App Products", then validate/grant the missing products and finalize those receipts.
- When the user initiates a purchase using "Start an In-App Purchase" validate/grant the products and finalize the receipt.
- Any time the game may need to check for updates on products it can "Query for Owned Purchases" if they need a full update or "Get known In-App Receipts" if it is not interested in updating data from store servers.
- After that products can be validated/granted and receipts should be finalized.
- "Restore Owned In-App Products" does the same as "Query for Owned Purchases" on Android.
- On iOS it calls restoreCompletedTransactions on the payment queue thus making available all already processed receipts for non consumable transactions.
-
Added a conditional in the
BuildPatchServices
system to ascertain if the destination file system is currently throttled, and, if so, stall file writing. - Convert online subsystem defines to be global FNames to avoid a lookup every time we use one.
Improvement:
-
Improved POSIX ICMP code and added a console command to test ICMP directly.
-
Moved
USocialDebugTools::PrintExecCommands
to protected so it can be overridden by subclasses.
Deprecated:
- Marked deprecated IAP blueprint nodes and created replacements:
- Make an In-App Purchase v2 has been replaced by the new "Start an In-App Purchase" node.
- Process any New Unprocessed Purchases v2 has been replaced by the new "Get known In-App Receipts" node.
- Query for Owned Purchases has been replaced by the new "Query for Owned In-App Products" node.
- Restore In-App Purchases v2 has been replaced by the new "Restore Owned In-App Products" node.
HTTP
New:
-
Added non-game thread support for http request.
-
Added http streaming download interface.
-
Added new test project WebTests with corresponding web server to test HTTP.
-
Added 64 bits length of file download support in http request.
-
Added LLM tags to
CurlHttp
allocation hooks.
Bug Fix:
- Enabled
WinHttp
websockets to be created with an empty protocol list, which results in the corresponding header not being added.
Online Subsystem
New:
-
Added a LobbyId override option to the
CreateLobby
method in the OnlineServices Lobbies interface. Added logic toLobbiesEOSGS
to use the new option. -
Added
UE_ONLINE_ERROR_EXTERNAL
macro to enable online errors to be defined outside of theUE::Online::Errors
namespace. -
Added presence tracking for OSSv2 Lobbies.
-
Added logic to trigger
OnQueryUserInfoComplete
delegates on OSS EOS. -
Added support for
BuildIdOverride
on the command line to be surrounded by quotes. -
Added
GetInterface
accessor toIOnlineServices
to allow for additional/implementation specific interfaces to be accessed via the baseIOnlineServices
.
Improvement:
- Modified
OnlineBeaconClient
login parameters to allow for more parameters than just the auth ticket.
Bug Fix:
-
Changed the default cache directory for Switch used by OSS EOS.
-
Delayed callback execution to match alternate flow paths in OSS EOS Session search code.
-
Refactored OSS EOS Friend status update handler method to trigger the appropriate corresponding UE delegates and keep a coherent state.
-
Refactored EOS Lobby Creation logic to destroy the lobby if the update step fails.
- Added critical section around
FOnlineSubsystemModule::OnlineSubsystems
.- This fixes race conditions when multiple threads are accessing
FOnlineSubsystemModule::GetOnlineSubsystem
, observed to happen as part of multi-threadedFUniqueNetIdRepl
deserialization.
- This fixes race conditions when multiple threads are accessing
-
Refactored session update code in OSS EOS Sessions interface to ensure non-owner lobby members can update their own lobby member settings, to match API functionality.
- [Online Services] Added support to handle more operation cache settings, duration based and provide a setting to cache error results.
- Limit concurrent operations in flight.
- Fixed some operations not being removed/destroyed when we are done with them.
Removed:
-
Removed unsupported members of
LobbyMember
type:PlatformAccountId
andPlatformDisplayName
. -
Removed early exit in OSS EOS'
FriendStatusChanged
method in order to handle accepted friend invites via the EOS overlay.
Pixel Streaming
New:
-
Added the ability for the bundled get_ps_servers script to pull down a release from Github.
-
Added a new framework to allow passing arbitrary configuration settings to the streaming infrastructure.
Improvement:
- The default viewer port for PixelStreaming on Linux is now 8080. Port 80 requires root privileges on Linux, so this avoids elevation.
Crash Fix:
-
Fixed a crash caused by using UPixelStreamingSignallingComponent Blueprint types.
-
Fixed a crash that occurred when using OfferToReceive on Firefox.
-
Fixed a crash that occurred on shutdown.
-
Fixed a deadlock that occurred when using DX11 on AWS instances.
-
Fixed a crash that occurred when running with -onethread and encoding VPX.
-
Fixed a crash that occurred when a port was not provided for -PixelStreamingURL.
Bug Fix:
-
Fixed a bug where the embedded signaling server would not serve the images directory as expected.
-
Fixed a bug where showcase.html would not display images when using an embedded signaling server.
-
Fixed a bug where the embedded signaling server could not connect to the frontend.
-
Server targets can now build with PixelStreaming Blueprints enabled.
-
Fixed a race condition that could occur during stats collection.
-
Fixed a bug where the minimum bitrate could be set higher than the maximum bitrate.
Platform
Bug Fix:
-
Added a check to prevent memory mapping compressed or encrypted memory made with IoStore.
-
Fixed address sanitizer compile error on current versions of MSVC.
Desktop
Crash Fix:
- Fixed a crash that occurred when playing 2 startup movies using WindowsMoviePlayer.
Linux
New:
-
Added sigaction failure check.
-
Provided an option to disable
dump_syms
where iteration speed is desirable. (-NoDumpSyms
or setbDisableDumpSyms
).
Bug Fix:
-
Stopped tooltips from popping up during window drags.
-
Replaced use of
sa_handler
withsa_sigaction
. IfSA_SIGINFO
is specified insa_flags
, thensa_sigaction
specifies the signal-handling function instead ofsa_handler
. -
Started accounting for Linux dock dimensions when computing positions.
-
Fixed
TWeakObjectPtr
s not being indexed properly in LLDB. -
Fixed launching on a remote Linux box from a Windows editor.
-
Fixrf DPI scale in Linux being incorrect on Odyssey G9 5120x1440 displays. These displays report invalid display information to the window system, resulting in very high scale values.
-
Fixed crash reporter not always showing up on Linux due to config variables being unexpectedly overridden.
-
Fixed some instances where modal window behavior on Linux didn't match other platforms.
-
Corrected some incorrect event resetting code in FramePro.
Mac
New:
-
Moved some MacMenu calls to MainThread to avoid creating errors in the Main Thread Checker, which will be fatal in future MacOS versions.
-
Added encoder fault tracking to help diagnose GPU crashes.
Crash Fix:
-
Fixed crash with Dump GPU on Macs due to missing viewport.
-
Fixed a freeze that could occur on Mac when some pop ups were displayed.
Bug Fix:
-
Fixed incorrect timestamp queries calculation on Apple Silicon.
-
On Mac, UE will no longer rebuild cached menus on every key press. This prevents an FPS drop in editor/preview when the user is pressing keys on the keyboard.
-
MacSystemIncludes
now undefinesPF_MAX
so it can be defined by UE for pixelformat instead ofsocket.h
. This is the result of a long include chain whereinCocoa.h
pulls in networking code fromPrintCore.h
, which in turn leads tosocket.h
definingPF_MAX
instead of UE. -
Added some checks on CRC to make sure it actually exists and is executable.
XR
New:
-
Added an interface within IOpenXRExtensionPlugin.h to access StereoLayers.
-
Added support for XR_FB_composition_layer_alpha_blend extension.
-
Added support for cylinder and equirect layers in OpenXR plugin.
-
Added support for XR_FB_foveation OpenXR extension.
-
Added setting to enable/disable OpenXR foveation.
-
[ARSessionConfig] Added candidate image removal methods.
-
[OpenXR] You can now disable the depth layer via cvar.
-
[PSVR2] Adjustable max eye texture size now allows for PixelDensity > 1.0 with a setting to control the limit.
Improvement:
-
Hololens device detection will now occur after editor startup by default to reduce startup time.This setting can be changed in the Hololens Project Settings.
-
ARCore SDK for Android was updated to 1.37.
-
[OpenXR] Android apps on non-Oculus Android platforms can now startup OpenXR if they are not configured for Oculus Mobile Devices by changing
vr.DisableOpenXROnAndroidWithoutOculus
to false. -
Reduced XR EControllerHand use.
-
Reduced total memory use overhead of HeadMountedDisplay modules by moving them to the XRBase plugin.
-
[OpenXRHandTracking] Improved support for using hand tracking along with controllers.
-
Packaging settings for Meta Quest devices has been changed from a list of devices to a single checkbox that enabled packaging for all Meta Quest devices.
-
OpenXR headers have been updated to OpenXR SDK 1.0.27 (2023-03-21).
-
Added a tooltip to MotionControllerComponent's MotionSource.
-
[PSVR2] Removed reliance on pre-registered buffers for reprojection.
-
[OpenXR] Runtime-supported extensions will now be logged.
-
[OpenXR] Refined CopyTexture operations for layer and spectator screen usage.
Crash Fix:
-
Fixed a crash related to planar reflection on SteamVR.
-
Fixed a crash that occurred when accessing vr.SpectatorScreenMode CVar without a controller connected.
Bug Fix:
-
[AR Pins] Fixed a bug where
TrackingToWorldTransform
andWorldScale
were updating incorrectly. -
[ARKit] ARKit anchors are now released when the ARPin is removed.
-
StereoLayerManager no longer uses invalidated FLayerData.
-
The
xr.OpenXRForceStereoLayerEmulation
console variable now picks up runtime changes only at the next VRPIE restart. -
Stereo layers are now correctly removed when their actor is destroyed.
-
Fixed a bug related to the alpha of emulated stereo layers on the HMD and spectator screen.
-
Fixed a bug where XRDeviceVisualizationComponent would not correctly start the visualization of the device model.
-
Fixed Mobile Preview VRPIE being darker than what was shown in the HMD.
-
Fixed sorting function that made world locked layers render on top of face locked layers.
-
Fixed a bug related to
FOpenXRHMD::UpdateLayer
thread safety. -
Fixed an Unknown ARCore Trackable Type assert which occurred during ARLineTrace.
-
[ARCore Trackables] Fixed a case where an ArTrackable handle was not released.
-
[OpenXR] Emulated layers swapchain will now use the prescribed layer format.
-
Fixed a bug involving a platform RHI disable check.
-
[OpenXR] Fixed a bug which occurred when stereo was disabled and re-enabled.
-
[VulkanRHI] LLM tags are now initialized earlier.
-
[ARKit] Invalid camera images will no longer be processed after pause and resume.
-
[ARKit] Camera texture resources will no longer be accessed on the delegate thread.
-
[OpenXR] Quad layers now respect component scale as expected.
-
Fixed several issues related to MotionControllerComponent Velocity.
-
[XRScribe] Pose replay will now match the original timescale instead of playing poses back as fast as possible.
-
Fixed an issue where OpenXRHMD SystemProperties was uninitialized until OnStereoStartup.
Deprecated:
-
EnableAutoLoadingSplashScreen functionality has been deprecated.
-
[ARCore] Deprecated
UGoogleARCoreFrameFunctionLibrary::GetCameraMetadata
and -
Deprecated ARCore AR Trackable Render Components.
Removed:
-
Removed the deprecated camera metadata API.
-
Removed deprecated ARCore features.
-
Removed HoloLens "Multi" packaging.
-
[ARBlueprintLibrary] Deleted functions deprecated in 4.22 and 4.26.
-
Removed
GetMobileVariableRateShadingImage
to make Variable Rate Shading behavior consistent across mobile and desktop.
Platform Mobile
New:
-
Optimized directional light uniform buffer update on mobile.
-
Added support for pixel shader version of TAA upsampling on mobile.
-
Added support for instance custom data in pixel shader while mobile GpuScene is enabled.
-
Changed Light Grid Data buffers to be StructuredBuffers.
-
Added support for ISM with mesh paint vertex color on mobile.
-
Detect hardware Cyclic Redundancy Check (CRC) instruction support on ARM platforms. Depending on the compilation environment, this can be a runtime or compile time detection. CRC is used in hash computations everywhere in the engine and this change will provide ~7x performance improvement on supported devices.
-
Replaced RHICommandListImmediate with RHICommandList to enable RDG pass parallelism on mobile platforms.
-
On Android and iOS, UE will now only update the list of receipts received from
IOnlinePurchase::GetReceipts
by user request. Receipts retrieved usingIOnlinePurchase::GetReceipts
are updated as a result of calls toIOnlinePurchase::QueryReceipts
. After a successful call toIOnlinePurchase::Checkout
, the receipt for the successful purchase is added to that list. Asynchronous transaction updates received only trigger theIOnlinePurchase::UnexpectedPurchaseReceipt
delegate. Restored transactions on iOS are automatically finished so the end user does not need to do it. - Added support to handle subscriptions on OnlinePurchaseGooglePlay and OnlineSubsystemIOS. Subscription product types are now also queried to the stores. Whether a subscription is valid or not can only be handled by server-to-server calls to the store.
- You can disable local acknowledge-and-consume by setting
bDisableLocalAcknowledgeAndConsume_
in the[OnlineSubsystemGooglePlay.Store]_
section from your.ini
files. This supports the server-to-server validation recommended by Google. - Product IDs consumed by the engine for subscription products should be composed by be the actual product ID defined in the store, prefixed by "s-".
- Several product entries will be received for a subscription product when the application invokes
IOnlinePurchase::QueryOffersById_
_ using a subscription product ID. The product ID on the received products will contain: - ++ The prefixed product ID
- ++ The base plan
- ++ The offer in the base plan
- ++ The different price points.
- As an example, this could be the list of ids created by
_IOnlinePurchase::QueryOffersById
_ requesting information for "s-test_subscription_1" (which in the store would be identified as just "test_subscription_1").
- You can disable local acknowledge-and-consume by setting
-
r.Mobile.EarlyZPassOnlyMaterialMasking
is now handled per shader platform. -
Increased ShaderComplexity cost of Masked Materials on Mobile ShaderPlatforms that do not use
MaskedInEarlyZ
. -
r.Forward.LightLinkedListCulling
is now set to 0 for platforms that do not benefit from it. This saves about 0.1ms on the GPU. -
Added support for Inline RT Shadows on Vulkan.
-
Tonemapping LUT pass now runs only when needed.
-
Added support for CollisionMode
PCM_DistanceField
on mobile platforms that support Distance Field. -
Removed
SupportsCopyImage
, as GL ES 3.2 standard hasglCopyImageSubData
. -
Volumetric Support For Mobile is disabled by default in Device Platforms. Removed bSupportsVolumetricFog from DataDrivenPlatformInfo.
-
Added a new mode for rendering local lights in the Mobile forward renderer. You can enable this mode by setting
r.Mobile.Forward.EnableLocalLights
to 2 andr.Mobile.EarlyZPass
to 1. -
Mobile Light Prepass is now disabled by default.
- Removed
bSupportsMobileDistanceField
from DDSPI in Global Distance Field For Mobile.
Crash Fix:
- Fixed a crash that occurs when enabling transmission on directional light with spot light shadow on mobile.
Bug Fix:
-
Mobile rendering now samples SceneDepth instead of fetching SceneDepthAux when full depth prepass is enabled.
-
Fixed a bug where decals are missing skylight when using the mobile deferred renderer with static lighting disabled.
-
Directional lights with a light channel of none (0) can now cast shadows on mobile deferred.
-
Fixed a bug where simple light was missing on mobile deferred.
-
Fixed a bug where static meshes are missing local light when they are dragged in editor.
-
Fixed issue where distortion pass was not using the same pixel format as a base pass.
-
Previously, objects with masks would still do mask clipping in the pixel shader even with full depth pre-pass enabled. This issue has been resolved.
-
Fix a bug where the depthRT is empty during passes when DepthStencilState is enabled while doing DrawMaterialToRenderTarget on the mobile deferred renderer.
-
Fixed a bug where a black color would render on thin translucent material on mobile.
-
Fixed IBL reflections for Surface LightingVolume.
-
Fixed a GPU crash caused by Niagara Mesh Renderer shader which occurred on IOS 13 as well as some PowerVR android devices.
-
Fixed GPUScene uploader size limit check.
-
Indirect lighting scale is now correctly applied on mobile.
-
Moved Temporal Anti-Aliasing back to the end of the post-processing chain to save bandwidth. It now filters the bloom input to get rid of the flickering white spots.
-
Fixed a modulated shadow rendering issue on mobile.
-
Fixed a bug in GenerateGlslShader that occurs when a string is a substring of another in the ReflectData.
-
Fixed handling of Target Device in Mobile Preview.
-
Quad Complexity now works correctly for mobile preview.
Android
New:
-
Added a way to provide command line to Android apps using adb shell. You can now launch Android apps from adb shell and provide a command line arguments using the parameter
-cmdline "arguments"
. -
Purchasing multiple products in one transaction is now allowed in OnlineSubsystemGooglePlay.
-
Set Java 1.8 for sourceCompatibility and targetCompatibility.
-
Capped Low-Level Memory Tracker (LLM)'s Total stat to be no less than Total Tracked on Android, since on some devices UE can't read the GPU part of the total memory allocated by the process. However, LLM does its own counting on Unreal Engine's side for GPU-related allocations.
-
Advanced binary compression is now enabled by default on Android.
-
Upgraded Android Studio (Flamingo 2202.2.1) and Gradle (7.5 and use OpenJDK 17 from 2202.2.1).
-
Added support for Lumen Diffuse Indirect without requirement for Dual Source Blending in the desktop renderer.
- Updated force feedback support on Android:
- Use VibrationEffect for intensity control.
- Forward feedback to controller(s) if
Android.UseControllerFeedback
has a value other than zero (defaults to 1). - Does not continue feedback when application is in the background.
-
Added Overflow 3 and 4 for Android OBB files. Use OverflowOBBFileLimit project setting to set number allowed. The default value for OverflowOBBFileLimit is 2, but you can set it up to a maximum of 4.
-
Updated Google-Services plugin for Firebase.
-
Updated Swappy to the latest from Android GoogleSource. Modified to always use the Java DisplayManager and refresh rate selection as it is more reliable on some devices.
-
Added additional Razer Kishi gamepad recognition.
- Added the WebViewTextureSize CVar to control Android WebBrowser texture size in
DefaultEngine.ini
.
Crash Fix:
- Fixed a crash when playing a
.mp4
from UMG.
Bug Fix:
-
Fix a bug that prevented rendering custom depth on OpenGL.
-
Fixed bug where CommitComputeResourceTables were missing for dispatching indirect compute shader on OpenGL.
-
Fixed a bug where media couldn't resume after entering the background on Android devices.
-
Changed the location of the
.apk
generated by Gradle to avoid usingoutputFileName
to redirect the.apk
location. -
Fixed a race condition when generating
.apk
in newer Gradle versions by usingcleanPackageDebug
/cleanPackageRelease
instead of manual.apk
removal. -
Forward key pressed to UI even if virtual keyboard is shown on the screen. This enables hardware keyboard usage with EditText fields.
-
Removing emoji filtering on Android. Now it's possible to type emoji's from Android on-screen keyboard.
-
Fixed IME with hardware keyboard.
-
Fixed an issue causing fingerprint scanners being falsely detected as controllers.
-
Only archive AAB if App Bundles are enabled for Android.
-
Corrected performance issues by performing updates to device vibrator intensity less frequently.
-
Fixed Xbox and Razer wired controllers on Android 12+.
-
Use /sdcard/Android/obb for OBBs for all build types. /sdcard/obb is no longer used due to storage access restrictions.
-
Clear
ANDROID_SDK_HOME
environment variable in the SetupAndroid script. This should NOT be set with new tools. -
Slight improvement to GetEntryLength in Android filesystem.
-
If the Android background downloader plugin is disconnected, it will now monitor network status and resume background downloads if reconnected.
-
Fixed OnLocationChanged broadcast for Android location services to use the game thread properly.
Deprecated:
libc++_shared.so
is no longer included in.apk
packages on Android by default, as Unreal Engine no longer supports any dynamic libs built againstlibc++_shared.so
.
iOS, tvOS, and iPadOS
Crash Fix:
- Refactored resource transitions on Metal. Removed PrologueEncoder since it's not synchronized properly. This fixed a flickering and crash issue on iPhone14 with mobile GPUScene enabled.
Bug Fix:
- Fixed a bug that occurrs when sampling SceneDepthAux in SunMask on IOS mobile deferred.
Deprecated:
- IHttpRequest implementation based on NSUrlConnection is marked deprecated. This functionality will be removed in 5.4.
Quixel
New:
- Quixel Bridge 2023.0.3 improves version handling for MetaHuman exports.
Rendering
API Change:
- If your shader references GPUScene or another field in the scene uniform buffer, the RHI validation expects a valid reference for the scene UB. If this is not set, you may see an error like this:
Shader expected a uniform buffer at slot 5 but got null instead (Shader='
' UB='Scene'). Rendering code needs to set a valid uniform buffer for this slot. This can be resolved by adding a SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSceneUniformParameters, Scene) field to the shader parameter struct and setting its value using the helper method in FSceneView. If you're having trouble identifying which shader is missing the reference, you can run with "-rdgimmediate -rdgdebug -onethread" and find the shader in the callstack.
New:
-
Added a Volumetric Clouds console variable "r.VolumetricRenderTarget.MinimumDistanceKmToEnableReprojection" to help hide reprojection issues to due to imperfect approximation of cloud depth as a single front surface. This is especially visible when flying through the cloud layer. This doesn't hide all issues but will help in a lot of cases. The problem when using this method is that clouds will look noisier when closer to that distance.
-
Optimized Volumetric Cloud shadows by using CloudSampleNormAltitudeInLayer correctly. This can result in performance wins between 5 to 10 percent.
-
Added support for Groom streaming. This allows you to load and unload content based on usage. This is experimental and disabled by default. You can use the console variable "r.HairStrands.Streaming" to enable it.
-
Added AutoLOD setting to Grooms. This allows it to dynamically adapt the number of active curves based on screen coverage. This avoids having to set this with manually discrete LODs, and adapt curve count at a more finer grain. Combined with streaming, it lowers GPU timing/memory usage. This is experimental and can be opt-in per asset. AutoLOD can be forced on all grooms with "r.HairStrands.AutoLOD.Force".
-
"WPO Disable Distance" material expression now works for non-Nanite Static Meshes.
-
Avoid unnecessary ray tracing shadow tracing for hair strands which saves 25% of shadow cost in test cases with many lights.
-
Added hair attribute value picking when attribute view mode is active.
-
Made sure GPU-scene instance count is clamped to the maximum GPU-representable index (16M), preventing overflow crashes.
-
Added ShaderPrint GPU string, which allow to upload strings to GPU(for example, asset name)
-
Added Blueprint exposed setter function for "NumCustomDataFloats" on Instance Static Mesh Component.
-
Added LOD curve/point count into the hair LOD panel.
-
Changed Groom RootUV to be optional. If an imported groom does not have RootUV imported, we no longer generate spherical mapping.
-
Make FAtlasTextureInvalidationScope public so that external code (plugins) can invalidate a particular texture (For example, for CPU data upload).
-
Added coverage threshold for hit proxy, in order to control at which coverage hair can be selected.
-
Added guide type to ease understanding/manipulation of the different types of guides. This allows editing rigging directly from the Groom Editor.
-
Added an option on the physics settings to force the Niagara component to be visible. This allows users to leverage Niagara rendering when using a custom solver.
-
Improved Distance Field Scene Management to support more than 4M instances.
-
Add Groom Memory Stats.
-
Added necessary conversions from / to the working color space in Volumetric Cloud rendering.
-
Changed how simulation cache is handled on groom to fix dynamic assignment. A groom asset now needs to opt-in to support groom cache. This opt-in ensures that interpolation data are property built for the groom asset. This option is automatically enabled when assigning a groom cache in the property grid. A groom asset with simulation cache support enabled, can now get a groom cache assigned through Blueprint at runtime. This avoids spawning actual simulation when running with a simulation cache.
-
Groom deformer (experimental) can now write out attributes (CV color, radius, etc) in addition to position. Attributes are also readable, as well as guide data.
-
Add visualization of imported attributes in Groom Asset Editor.
-
Added second Virtual Shadow Map resolution bias for moving lights along with tracking of what lights are moving. When a light stops is does a gradual transition to the original bias. Added Scalability console variables r.Shadow.Virtual.ResolutionLodBiasLocal, r.Shadow.Virtual.ResolutionLodBiasDirectional, and r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving to configure the LOD bias for a light that is currently moving.
-
Attached VRAM info to AppendStaticClientPerformanceAttributes.
-
Added per-primitive enum (ShadowCacheInvalidationBehavior) to enable users to override default engine behavior for shadow invalidations. This is useful to prevent invalidations from for example static WPO.
-
Changed GPU-Scene data to shrink as well as grow. The console variable "r.GPUScene.UseGrowOnlyAllocationPolicy" can be used to disable the new behavior.
-
Prevented instance over-allocation from crashing the editor / engine, clamping gpu-scene size to MAX_INSTANCE_ID, 16M. Added logging + on-screen message to surface the issue.
-
Added the console variable "r.CaptureNextDeferredShadingRendererFrame" to trigger capture a following deferred scene render. For example, RenderDoc or PIX.
-
Added the ability to trigger Virtual Shadow Map invalidation on Nanite LOD streaming changes. This is experimental and is controlled using "r.Nanite.VSMInvalidateOnLODDelta" (default: off).
-
Added a new global uniform buffer scoped for the scene rather than the view, and moved GPUScene from the view to this buffer. The scene UB uses RDG (unlike View), and is modular.
Improvement:
-
Reduced groom cluster resources size (~ -15%).
-
Improved groom per-CV color precision from 8/8/8bits to 11/11/10bits.
-
Improved the consistency of scene view extension calls in the game viewport and scene captures.
-
Changed cluster culling to be done in a single pass. This saves about 20% cost of the interpolation work. Clusters are not computed based on the first curve to avoid expensive cluster bound computation.
-
GPU Skin Cache update render thread optimizations. Rendering multiple Skin Cache enabled skeletal meshes should now process faster due to batching of work.
-
Improved how Groom Cache updates its data. Interpolation now runs on the GPU, and GPU resources are now cached to avoid constant reupload of the data every frame.
-
Improved the Pixel Inspector naming, fixed transparency, allowed negative values and ensured that luminance also respects the working color space.
Crash Fix:
-
Fixed crashes when importing groom-only guide cache. Also fixed a crash when importing guide with zero size radius.
-
Fixed a crash with hair with nDisplay.
Bug Fix:
-
Fixed tracing cut for Volumetric Clouds that could happen when traveling in and out of the cloud layer.
-
We now make sure we flush occlusion queries out of memory if we've turned them off.
-
Cloud shadow evaluation now works on the SkyAtmosphere when LUT are generated using async compute.
-
Fixed "GeForceNOWWrapper::GetClientCountryCode()" not writing the output parameter with the country code. (2 char country code).
-
Fixed Volumetric Cloud flickering happening after some time. The extra camera cut logic was unsafe and unstable.
-
Applied a fix for height fog on Volumetric Cloud not working when start distance is greater than or equal to 1.
-
Fixed Sky Atmosphere SkyLightLUT not accounting for overridden light direction.
-
Fixed flickering SkyViewLUT texture when viewed from afar in space.
-
Applied a fix for Static Meshes being marked dirty on load when built asynchronously.
-
Fixed hair bound with scaled transform and take into account hair width, so that large width increases correctly the bound size.
-
Fixed incorrect scratch buffer address when using more than two RayTracingScene layers causing crash or GPU hang.
-
Fixed Groom Cache (guide/strands) rendering and guide cache debug visualization
-
Fixed groom details refreshing in Blueprint.
-
Fixed how CPU bounds are computed for groom when attached to Skeletal Mesh.
-
Fixed slow opening of Groom Binding tab in Groom Asset Editor by avoiding loading assets.
-
Fixed missing groom shadow when "Hidden in Game" and "Hidden Shadow" settings are enabled at the same time with Movie Render Queue using the Path Tracer.
-
Fixed Rect Light support with MediaTexture. These textures, when assigned to a rect light, were missing invalidation to refresh their atlas content.
-
Fixed incorrect group names when the groom does not have group ID mapping.
-
Fixed hair strands rendering with stereo rendering.
-
Fixed hair scene scattering not running when the scene does not have a sky component.
-
Fixed hair physics settings working correctly with custom reset.
-
Fixed issue where the shadow mask texture was incorrectly marked as used due to the preview shadows indicator when the preview indicator was not actually rendered because of a missing Material (in cooked builds, for example).
-
Fixed a bug with Nanite Custom Depth rendering on some console platforms.
-
Fixed incorrect alpha channel output for the canvas "Translucent" blend option. It now uses "AlphaBlend" internally.
-
Fixed Directional Light preshadows in Cascaded Shadow Maps, which were broken after a recent change to WORLD_MAX for Large World Coordinates.
-
Fixed an issue where the "Draw Debug Capsule" option on Blueprint capsule components would render with incorrect scale.
-
Validate we have vertex data for the current MinLOD for InstancedStaticMeshes before creating SceneProxy, preventing a crash in some situations.
Deprecated:
-
Deprecated direct access to groom and groom binding members.
-
Deprecated Ray Traced Skylight and removed it from Project Settings.
Architecture
New:
-
Moved all immutable geometry collection rendering data into the Geometry Collection asset. This is built as part of Geometry Collection DDC contents. The scene proxy has been reworked to use this data.
-
Added optional use of "Remove At Swap" when removing instances from Instanced Static Mesh Component. Also added a console variable to force the behavior with "r.InstancedStaticMeshes.ForceRemoveAtSwap". RemoveAtSwap should be faster than the previous behavior, but may break any code that depends on the current behavior.
-
Hide MarkedForDelete resources from RenderResourceViewer
-
Added Insight asset metadata tracking on DX12 buffers
-
Added the DECLARE_UNIFORM_BUFFER_STRUCT API macro to allow decoupling of uniform buffer parameter struct declaration and definition. Uniform buffer parameter structs can be forward declared, and so can be used by third parties without making the full definition public.
-
If the morph vertex buffer hasn't updated this frame or for some frames, use the last updated morph buffer for the previous morph data, so it cancels out the motion vector. This fixes a jittery issue in the Morph Target Preview tab in editor previewing using morph sliders.
-
Added Insight memory trace DirectX12 memory allocator tracking.
-
Changed the behavior of flag checkbox based on user feedback for the Render Resource Viewer. When unticked the resources with the flag set are now hidden from display. Also remove None flag checkbox and hide Transient resources by default.
-
Added "r.SceneCapture.DepthPrepassOptimization" to speed up pre-pass depth rendering for Scene Capture. This is a short-term optimization to support certain features requiring a depth pre-pass and can only utilize SceneCapture to achieve it currently. Note turning it on means rendering after depth pre-pass (e.g. SingleLayerWater) is ignored, hence the result is different from when the console variable is off.
-
Added output owner name to rhi.DumpResourceMemory command.
-
Added Insight asset metadata tracking on DX12 textures
-
Exposed CreateSinglePrimitiveSceneUniformBuffer in the IRendererModule to make it possible to create a Scene UniformBuffer using public interface.
-
Added a context menu on selected resource, and context command to find assets in the Content Browser (shortcut CTRL+B) to the Render Resource Viewer.
Crash Fix:
-
Fixed an Editor-only GPU crash on unaligned texture copy when loading a streaming virtual texture with border less than 2.
-
Fixed a crash when trying to render with empty Geometry Collection mesh data.
-
Fixed "r.SkinCache.RecomputeTangents=0" causing crashes when rendering Skeletal Mesh with the skin cache.
Bug Fix:
-
Fixed a GPU hang that could occur when changing material type on an Runtime Virtual Texture asset.
-
Fixed GPUScene per instance HZB instance culling on mobile where previously the HZB was not being bound.
-
Fixed bad motion vectors being generated for some instanced objects.
-
Fixed bad hash calculation of virtual texture pool settings. This could lead to an issue where we did not correctly detect when the pool size settings are changing.
-
Removed render thread access of parent UTexture from FVirtualTexture2DResource. This fixes race condition check firing when the Virtual Texture sRGB flag is flipped.
-
Fixed off by one logic in check() for Static Mesh LOD count. This would trigger a check() if we used 1 less LOD than the maximum.
-
Fixed Skeletal Mesh post load being called on game thread from Niagara when actual loading is still happening from the loading thread.
-
Fixed an issue when multiple viewports are open, only the viewport in focus has valid velocity on skeletal meshes. This is fixed by switching to use GFrameCounter which is incremented once per engine tick, so multi views of the same frame share the same value.
-
Fixed the Skin Cache Editor debug visualization modes looking different from their console variable equivalent. Fixed the shading difference and the debug texts not showing up correctly.
-
Fixed Instanced Static Mesh loose params warnings in debug build. Create a loose parameter uniform buffer to capture those parameters.
Lighting
New:
-
Volumetric Fog buffer allocations are now independent from dynamic resolution scaling.
-
Sky Light created from Environment Light Mixer uses real time capture by default.
-
Added support for Rect Light Volumetric Fog light functions.
-
Fixed wrong color of translucent shadow volume when light is an atmospheric light.
-
Added Exposure as new light unit.
-
Improved order independent transparency triangle sorting precision.
-
Added Virtual Shadow Map high quality shadow filtering for translucent surface for Substrate and legacy path. This is a global opt-in feature (r.Shadow.Virtual.TranslucentQuality).
Bug Fix:
-
Fixed Subsurface Profile causes an orange rim using Ray Traced lighting at certain angles. The issue is caused by not enough penalty to the depth in the screen-space bilateral filtering.
-
Fixed missing Volumetric Fog light function from atlas for Spot Light.
-
Fixed incorrect atlas packing when textures are streamed in / out and require a full atlas refit. Also fixed a crash when Rect Light atlas force update is enabled and lights get toggled on and off.
-
Fixed a potential Ray Tracing performance issue with invalid shadow rays being traced.
-
Fix incorrect ref counting decrements when texture is removed from Rect Light texture manager.
-
Fixed unclamp radius / length for Point / Spot Lights causing visual artifacts.
-
Fixed overflow when computing Rect Light texture MIP causing incorrect atlas packing.
Lumen
New:
-
Height fog in Lumen Reflections is now partially supported (only Height Fog, not Volumetric Fog).
-
Lumen reflection on translucent now accounts for roughness and goes through the denoising process.
-
Lumen reflections with hit lighting now support multi-bounce reflections, controlled by "Max Reflection Bounces" setting in Post Process Volume.
-
Lumen Hardware Ray Tracing path is now fully compatible with async compute and it's enabled by default on supported platforms for improved performance.
-
Added boolean "Allow Front Layer Translucency" to material, which allows to control whether given material should write Front Layer Translucency. This is useful to disable small particles from using Front Layer Transparency or solve sorting issues.
-
Improved Lumen Scene tracking of primitives. Primitives are now included in the Lumen Scene only if they can be traced by a currently active tracing method.
-
Added support for Nanite Ray Tracing in Lumen HWRT and Ray Tracing Debug Visualizations
-
Increased "r.Lumen.Reflections.MaxBounces" limit to 64. It controls the max number of bounces when multi-bounce Lumen reflections are enabled.
-
Added "r.Lumen.Reflections.VisualizeTraces" debug utility. It visualizes a dedicated reflection ray traced from the current cursor position.
-
Replaced Lumen Scene visualization with Geometry Normals visualization in Lit->Lumen->Overview visualization mode. Geometry Normals view is useful to spot any issues with distance fields or ray tracing setup.
-
Added support for two sided and thin foliage shading models in Lumen hit-lighting path.
-
Enabled ray tracing culling by default in order to simplify initial setup.
-
Improved global distance field ray hit evaluation, decreasing possibility of sampling surface of an occluded object which is near to the hit point.
-
Made significant Lumen HWRT optimizations which hit-lighting optimizations targeting PC.
Crash Fix:
- Fixed a crash when setting world space radiance cache probe resolution below supported values.
Bug Fix:
-
Fixed opacity clipping not happening on Lumen front translucency.
-
Fixed geometry normals on meshes with negative scale (flipped culling) when using hit lighting reflections.
-
Fixed Lumen not working with ISM / HISM due to automatic primitive merging in surface cache.
-
Fixed an issue with "r.Lumen.ScreenProbeGather.ScreenTraces.HZBTraversal.SkipFoliageHits" when Substrate is enabled.
-
Fixed mesh card generation hangs on specific meshes due to an EmbreeRay issue where EmbreeRay.ray.tnear could end up being further than EmbreeRay.ray.tfar causing an infinite loop.
-
Fixed Material Ambient Occlusion which was incorrectly applied on top of emissive when not using async Lumen, and on top of emissive and direct lighting when using async Lumen.
-
Fixed Time material node being always set to 0 when capturing Nanite meshes into surface cache.
-
Fixed artifacts when running on GPUs supporting only 64 thread wide waveops.
-
Fixed missing reflections far away in the distance due to a hardcoded 1000000.0 cutoff in the bilateral filter.
-
Fixed surface cache corruption after surface cache atlas resize or compression settings change.
-
Fixed SWRT reflection traces feedback for mesh SDF and heightfields
-
Fixed radiance cache lag in scenes with lots of geometry detail (foliage, trees). Such scenes were requesting too many new probes per frame, preventing cached probes from getting any updates.
Materials and Shaders
API Change:
-
Please use the more efficient UMaterialExpression::GetInputsView() instead.
-
Any code explicitly using FShaderCompilerInput::bGenerateDirectCompileFile should be replaced with EnumHasAnyFlags(Input.DebugInfoFlags, EShaderDebugInfoFlags::DirectCompileCommandLine) instead.
-
FShaderCompilerEnvironment::GetDefinitions is now deprecated; only internal shader preprocessing code can now access values of preprocessor definitions. Any code which was previously retrieving definitions by value should set such values via FShaderCompilerEnvironment::SetCompileArgument (or via the helper SetDefineAndCompileArgument which can be used for values which are consumed by both the preprocessor and compilation code) and retrieve these values via FShaderCompilerEnvironment::GetCompileArgument.
-
Remove any usage of the FShaderPipelineCompileJob::bFailedRemovingUnused; it's no longer needed or used anywhere in engine code.
-
In the unlikely case there is code referencing FShaderCompilerEnvironment::RemoteServerData it should be removed if possible. If there are use cases of this for which other mechanisms (such as the new compile argument functionality) are not sufficient, please contact the UE dev team.
New:
-
Optimized material expressions concerning loop detection. This removed individual calls to UMaterialExpression::ContainsInputLoop() and instead moved graph loop search in HLSLTranslator::Translate(). Since this can be done once for all inputs, the visited node set can be shared, making the loop search algorithm O(n), which visits each node exactly once rather than O(n^2) that performs the loop check for each node independently. This optimization, combined with other optimizations, makes translating an expensive material from 5.6 seconds to 0.9 s (a material from Fortnite was used in this test).
-
Added code in Material Interface serialization function that validates the associated EditorOnlyData name to be "canonical" (name of the material followed by "EditorOnlyData"). If the name isn't canonical it may cause problems with the editor running on cooked content. The validation code will try to rename the EditorOnlyData to the correct name.
-
Added support for virtual texture feedback behind a Single Layer Water Material. We stochastically drop some writes to the feedback buffer so that we don't overwrite all of the content from the surface beneath.
-
The legacy MCPP preprocessor was removed and all shader preprocessing is now done with the new "stb_preprocess" library.
-
Made a change that modifies and future-proofs the mechanism which determines which debug outputs should be dumped for a particular shader compile input. Rather than an ad-hoc collection of boolean flags, a bitfield enum class is now used instead.
-
Added a new "compile argument" functionality on the FShaderCompilerEnvironment class. This is intended to be used for any generic arguments required by the IShaderFormat implementations as input to the actual compilation process; previously the preprocessor definitions were being abused for such arguments. This is a requirement for forthcoming work which improves the job caching and deduplication mechanisms.
-
Added functionality to validate the consistency of the shader job cache. If enabled, compilation will be run for all shader jobs, even those that would have been cache hits, and then the resulting output will be compared with the existing cached value. Output for any mismatches will be dumped to Saved/ShaderDebugInfo/CacheMismatches, with files named according to the input hash whose outputs do not match, along with log warnings indicating the mismatch and the associated filenames. Since this effectively disables the job caching mechanism by always compiling jobs, this should only be enabled locally in the case where a cache collision is suspected (which could potentially be the case when DDC is reporting non-determinism in shader maps).
-
Implemented "GetShadowReplaceState" for ray traced shadows.
-
Implemented support for explicit #error directives in the shader source in the new preprocessor library.
-
Fixed a mismatched string formatting argument in the shader compiler (for hlslccflags).
-
Dragging a cubemap texture onto a mesh in the Editor now generates a compiling Material.
-
Added camera relative origin options for object, actor, and particle Material expressions. Performing calculations in camera space is more precise and is usually faster by avoiding double precision math in Materials.
- ODSC + Staged builds — The ability to launch a staged build and only use the COTF server to process
recompileshaders
commands.- Adds a cmd line option,
-odschost=127.0.0.1
which allows the game to connect directly to the COTF server, but only to send ODSC recompileshaders commands. - If we don't have a default COTF connection (for cooking assets), we create our own connection to the COTF server.
- Refactor code to send a command to the COTF server into a function. That way if we don't have a "special" ODSC only connection we can use the command that way.
- Fixed an issue with the "RecompileShaders material" command. It would only search and find a single material and recompile it. This ignored any material instances. Now the code takes into account finding all dependent instances and issuing a recompile command for them.
- Adds a cmd line option,
-
Added cook stats to track critical path, game thread time to submit Material compile jobs. On Lyra this accounts for ~10.4% of a full cook with
-noshaderddc
and a warm cache for everything else. On CitySample this accounts for ~8.9% of a full cook with-noshaderddc
and a warm cache for everything else. - Added EffectiveParallelization to the cook analytics for shader compilation. This statistic shows up as "Shaders_EffectiveParallelization".
- NewGatherAnalytics should be grabbing the CompileStatsLock since it is reading the stats -
-
The console variable r.SSProfiles.Transmission.UseLegacy was added to use the legacy transmission profile. This is enabled by default. When legacy transmission is disabled, the transmission profile is more physically accurate. When enabled, more artistic license is possible by adjusting the ExtinctionScale.
-
ComputeAllStateCRC()was added. This provides a way to more quickly detect changes to a Material, including changes to any Material Functions or Material Instance parameters.
-
The Material option "Always Evaluate World Position Offset" was added. When enabled, World Position Offset is always evaluated for a Material, and cannot be disabled by "Evaluate World Position Offset" or "World Position Offset Disable Distance" on the component. This override is intended for Materials that should not disable World Position Offset, even for performance purposes.
- Added Shader Compilation stats to cook analytics. This adds GatherAnalytics to the various shader compilation classes allowing each of them to pass their own stats back to the cook. These stats have the base name "Shaders_" as a prefix. The goal is to capture high level stats which are good indicators of performance and are useful for catching regressions. Also added:
- Shader Job Cache stats to track Queries Hits, NumInputs, NumOutputs, and MemUsed.
- MemBudget Stats that include ShadersCompiled, TotalThreadTimeForAllShaders, and TotalThreadPreprocessForAllShaders.
-
The compiler options flags CFLAG_CullBeforeFetch and CFLAG_WarpCulling were added to control warp culling and Cull Before Fetch hardware optimizations.
-
Added the console variable r.MaterialLogErrorOnFailure which emits an error when a Material fails to compile (instead of a warning). This variable defaults to false, but you can enable it from the command line with the following: -dpcvars="r.MaterialLogErrorOnFailure=1"
- Added a cook stat to provide path time metrics on UMaterialInstance::PostLoad. This accounts for 7% of critical path time when cooking certain projects.
Improvement:
-
Optimizations in Material translation code amounting to 50% speed up. Optimized function UMaterialExpression::GetInputs() with highest exclusive run-time during material translation from 19.79% to 1.79% exclusive run time. This change caches the inputs upon expression creation by default and returns a TArrayView instead of always creating a new transient dynamic array. The optimization also simplifies code for some Expression types. Also optimized ContainsInputLoopInternal() to use a linked list of stack allocated nodes instead of Pushing/Popping from a dynamic array.
-
Don't set EarlyZ if we are sampling virtual textures but not doing any virtual texture feedback. This is a small optimization for the case of rendering with runtime virtual texture and not using feedback. Typically that can happen with landscape grass.
-
Implemented changes to hash and calculate Material Debug Name once per-Material instead of once per-shader job. FStrings are passed by reference in PrepareMaterialShaderCompileJob instead of copying them.
Crash Fix:
-
Added a check that reports errors if a parameter in a Material is bound to different values, instead of silently trying to compile the Material anyway. This was causing a crash when two Material functions containing a shared parameter bound to different values (for example, different textures) were used in the same Material.
-
Fixed access in "ItemPropertyNode.cpp" to a shared ptr constructed from a weak ptr. Code was not testing that object still exists, causing a crash when resetting Linked Material Blend Layer to Default.
-
Fixed a bug in MaterialX Luminance, which caused the Editor to crash after dragging an additional Luminance variable from the same connected node.
-
Fixed a crash caused by errors in the code for Material duplication.
-
Implemented changes to prevent the Editor from crashing when the user selects a Material whose ShaderMap contains null shaders. This change only makes the Editor more robust and prevents the crash; shaders in the ShaderMap may be null after loading due to external issues.
-
Fixed an Editor crash when Material Parameter nodes were renamed to an empty string. Empty strings are now ignored when renaming a Material Editor node.
Bug Fix:
-
Fixed too intense transmission in the Subsurface Profile shading model by extending ExtinctionScale from 1 to 100. This reduces the transmission distance when the scale is larger than 1.
-
Resolved several issues with CompileFXC.bat which prevented it from working correctly.
-
Addressed issues with the FRHIDispatchIndirectParameters size which could unnecessarily cause a full shader recompile on some platforms.
-
Fixed an issue with decals being rendered a second time in the translucent pass. This could happen for some depth of field setups, including the cine camera view.
-
Fixed an issue which caused oversaturated emissive GBuffer decals caused by shader code typo using DECAL_RENDERTARGET instead of DECAL_RENDERTARGETMODE.
-
Fixed an issue with wireframe colors on shipping builds.
-
Fixed a bug where MaterialInstanceDynamics created in the Blueprint Editor were not marked as public. This prevented the level from being saved.
-
Fixed a subsurface transmission bug where the transmission lookup table (LUT) is incorrectly built based on unit scale for the subsurface profile.
-
Fix a bug preventing some Materials from being moved to a different folder in the Content Browser. The issue was caused by an invalid state of the Material EditorOnlyData.
-
Disabled ability to override parameters that cause Material Instances to create a new shader permutation when parenting a restricted (non-base game cooked) parent. In restrictive mode, material instances could not inherit from a cooked material not in base modules. Now material instances can inherit from such restricted materials as long as they do not introduce a new static parameters permutation and thus a new shader. To prevent this, the user interface disables the checkboxes that would trigger a new shader to be created, with full validation is still performed at cook time, so even if a user manages to create a material instance with a static permutation, this would be rejected by the content worker.
-
Fixed a memory leak which occurred when Planar Reflections outside the camera view were culled without releasing the memory.
-
Solved an issue with incorrect Material EditorOnlyData name messaging being generated during cooking.
-
Fixed artifacts in the Clear Coat shading model which occurred when one of the components of the base color is exactly 0.0.
-
Fixed a bug with DistanceFieldApproxAO returning an incorrect result when the Material specifies an input Normal.
-
Fixed a bug whereby Material Instances with different sets of static parameter values and other flags would race to print out debug information, resulting in different sets of debug info from one run to the next.
-
Solved a regression in the job cache hit rate, which occurred because the debug info path was always included as part of the computation of the job input hash. This information is now excluded from the hash, restoring and potentially improving the hit rate.
-
Fixed a minor bug in the shader parameter parser functionality which was assuming only a single space between #line and the line number in line directives.
-
Fixed a crash in the Material Analyzer which occurred when a StaticComponentMaskParameter was present.
-
Fixed an enum mistake in UMaterialInterface::GetFontParameterValue.
Deprecated:
-
Reintroduced (and deprecated) the older version of ContainsInnerLoopInternal() in UMaterialExpression.
-
The FShaderPipelineCompileJob::bFailedRemovingUnused field was deprecated. The only purpose of this field was to append some information to a log message which was determined to be unnecessary.
-
The FShaderCompilerEnvironment::RemoteServerData field was deprecated. Since some IShaderFormat-specific remote compile functionality was removed, this is only used for adding unnecessary ifdef'd out debug info to associated shaders.
Removed:
- Removed
const
from GatherAnalytics since it now needs to grab the lock and call GetTimeShaderCompilationWasActive.
Nanite
New:
-
Add an option on Static Mesh for WPO not to write velocity. We default to writing velocity, but the option can be useful if we know that we have "static" WPO for things like camera-facing impostors where we don't want that to generate motion vectors.
-
Added support for Spline Mesh Component with Nanite. This is experimental.
-
Improved visual quality of selection outlines of Nanite in the editor. There are no more jittering, or occlusion issues.
-
Implemented instance culling hierarchy and support for Nanite instance culling based on this. The feature is disabled by default (r.SceneCulling), and may be considered Beta for this release.
-
Added a new show flag to enable/disable the visualization of Nanite streaming data (Show -> Nanite -> Streaming Geometry). When disabled Nanite meshes will only be rendered at the quality level that is always resident in memory.
-
Added new Explicit Tangents option to Nanite mesh settings. When enabled, the tangents are stored explicitly on disk instead of being derived implicitly at runtime. While this comes at a small additional storage cost, it can be preferable in cases where the implicit tangents are not precise enough.
-
Optimized CPU overhead of Nanite streamer
Improvement:
-
Implemented performance improvements to NaniteStreamOut.
-
New sliding window vertex cache for pixel programmable. 20% faster masked foliage rasterization in forest scene.
Crash Fix:
-
Fixed a crash that would happen in building Nanite if the mesh had no triangles.
-
Fixed a crash in the Nanite streamer that could occur on shutdown.
-
Fixed a crash in the Nanite streamer that could occur on IO errors.
Bug Fix:
-
Fixed a bug in the editor where selecting an ISM / HISM actor or component would not render selection outlines for Nanite instances.
-
Fixed the "Shadow Pass Switch" Material node for World Position Offset, Pixel Depth Offset, and Opacity Mask on Nanite materials.
-
Applied a fix for the Camera Position Material Expression node returning the wrong position for shadow views with Nanite programmable rasterization.
-
Fixed issues with selection and deletion of Nanite Foliage Instances in the editor.
-
Fixed an issue where some Nanite visible clusters' flags could get cleared, causing WPO to be disabled for them.
-
Fixed issues with Custom Depth rendering of Nanite on consoles.
-
Fixed an issue where reading custom data as a vector in a Nanite Material to calculate World Position Offset would always result in using the default value.
-
Fixed issues with rendering Nanite custom depth with multiple views (for example, split-screen and VR)
-
Added a check when the build process goes out of memory and prints better log info (error code and Graph->Num when PartGraphRecursive fails).
-
Fixed Client issue that does not respect Allow Masked Material set in the editor
-
Fixed an ensure that could trigger when Nanite meshes were loaded, but there were no Nanite meshes in the scene.
Neural Network Engine (NNE)
New:
-
NNEModelInstance has been introduced to prepare weight sharing optimizations. A runtime now creates a model, and one or multiple inferable model instances are created from a model.
-
NNE runtimes have been moved to own plugins which need to be enabled in addition to NNE to become available.
Improvement:
-
The NNERuntimeORTCpu has been updated to use the ORT 1.14.1 library.
-
UNNEModelData assets have an allow list to exclude certain runtimes from cooking it. It can be accessed by double clicking the asset. The feature defaults to an empty list which will cook for any runtime matching the previous behavior.
-
UNNEModelData assets can be reimported and opened in editor (using netron).
Deprecated:
- The old NeuralNetworkInference (NNI) has been removed, please use NeuralNetworkEngine (NNE) instead.
Niagara
New:
-
Niagara opaque particles can now collide with depth buffer without colliding with themselves. It can be achieved using the new PartialDepthBufferCollisionQuery node. This is Experimental.
-
Implemented Summary View 2.0 which allows the user to create custom views for an emitter. The primary use case is exposing specific inputs for complicated emitters, such as fluids. However, this is a useful feature to put emphasis on specific parts of an emitter.
-
Now we allow Python conversion scripts to reset values to their default and set hidden inputs on the new module.
-
Exposed Timed Niagara Effect Properties to Blueprint.
-
Added drag/drop support for emitter assets in the system editor.
-
Made visuals for convert nodes more compact.
-
Added support for curve assets to the curve data interfaces.
-
Added Collapse Categories support for the stack. If a Data Interface (any object, but primary consumers are Data Interfaces) has that flag, root level categories are skipped and instead their children are used.
-
Revamped the Stack type UI (more compact, more color, better visuals).
-
Added a setting to make numeric inputs feel snappier by updating the sim after every input change.
-
Improved metadata for module inputs.
-
Added True argument to allow the deletion of a static switch variable when no static switch is referencing it anymore.
- Added Inline enum support for static switches to Niagara.
- To use it, set a static switch node to Integer mode. The case labels are now editable. If edited, the display of the integers will show up like an enum in the Niagara stack when editing module inputs.
- To change this, access the Widget Customization entry in a variable's settings. Default is the default integer view, and Enum Style is the enum-like view.
- This is useful for one-off static switches that are kept in a single module and don't need an entire enum asset to be created and maintained.
-
Added widget support for stack inputs (sliders, min/max, volume).
-
Niagara renderers can now be moved via context action.
-
When pasting an entire emitter from one system to another, user parameters are now copied with them and added to the new system, if they don't exist yet.
-
Added age update mode dropdown to life cycle track.
-
Added a component and life cycle track by default when adding a Niagara Actor to sequencer.
-
Added a warning if life cycle track is not set up correctly for sim caching.
-
Added Python script support for deprecated module changes.
-
Changed the Reset Simulation command (hitting Space) to also resume playback if currently paused.
-
Reordered system properties.
-
User Parameters now support widget customization via the User Parameters Hierarchy Editor. This includes setting Min and Max, displaying floats or integers as sliders, and more.
-
Added a default UI state option for emitters that determine if they will be shown in Summary View or default view when added to a system or creating a new emitter.
-
Changed the Behavior Examples label to Learning Examples.
-
Added logic to ensure the emitter editor data exists when an emitter is post loaded or initialized.
- Simplified emitter properties:
- Removed Combine Event Spawn option.
- Removed Script Category property for emitters in systems.
- Removed Asset options properties for emitters in systems.
- Moved Attributes To Preserve to the advanced view.
- Hide Pre Allocation Count is now hidden if the mode is automatic estimate.
- Moved Max Delta Time Per Tick to the plugin settings.
-
Added a decal icon for the decal renderer.
-
Changed the tab names Selection and Selected Emitters in the Niagara System editor to Details, including the icon, to be more consistent with the engine.
-
Fixed pin coloring for constant value make nodes.
-
Added thumbnails for curve assets.
-
Added a context menu option to record multiple cache tracks at once.
-
Added a new scratchpad action and set parameters to suggested in menu.
-
When renaming User Parameters in the User Parameters tab, name verification is now implemented.
-
Added duplicate script variable validation and fix logic. Validation and Fix can be run via command line in editor. The commandlet can be run via the project startup command line and will print out all scripts with their given guid conflicts.
-
Added a custom search box that adds filtering for parameters in the NPC editor.
- More view settings are now saved per-asset (view location, view rotation and orbit mode) or in a config file to maintain Niagara viewport settings across sessions.
Improvement:
- Improved the UX to expose options of function script input nodes.
Crash Fix:
-
Added reallocate pins when a static switch node references a different, pre-existing script variable via renaming. This fixes a crash where the visuals expect the pins to be created under the new static switch variable.
-
Fixed a crash when trying to set uobject-attributes in the stack.
-
Refactored a temporary array of transient stack entries that could get garbage collected anytime and cause various crashes. These stack entries managed stack entries for comment nodes, so now we have a proper comment collection stack entry.
Bug Fix:
-
Added various small fixes to static switch nodes.
-
Fixed an ensure being triggered when editing any FText field in Niagara script details.
-
Fixed a bug where sim caching can lead to minute-long hitches with large numbers of particles.
-
Fixed a bug where disabled modules could generate compile warnings.
-
When applying modules that are in use in an emitter/system, the module no longer gets deselected, and the UI gets refreshed so we get live changes.
-
Fixed a bug where component renderers were still visible when another emitter was running isolated.
-
Fixed a compilation bug with disabled nodes and data interfaces.
-
Removed the search box in the Details panel of the NPC editor.
-
Fixed the scroll bar not appearing in the Niagara Parameter Collections.
-
Fixed copy paste of modules not properly pasting values for static switches in static switch chains.
-
Fixed issue when finalizing empty sim caches.
-
Removed of incorrect default pins that would show up as 'None'.
-
Fixed scratch pad parameter panel bug where if a used function had the same parameter as the script asset that owned it, it would override the asset's own parameter. UI wise it would look fine due to the same name + type, but selecting it wouldn't work as the guid wouldn't match. - Removed sub graphs adding their script variables to be used for the script parameter panel - Refactored into using the graph's script variables directly instead of using the reference map. Reference map is now only used for reference count, not for item creation.
-
Fixed copy paste of modules not properly pasting values for static switches in static switch chains.
-
Fixed system parameter panel selecting parameters in scratch pad via name instead of via guid.
-
Fixed dragdrop ops of different types than FNiagaraHierarchyDragDropOps from being used in the hierarchy editor.
-
Fixed issue when adding a new user parameter while a custom section is selected.
-
Fixed issue where the length of the life cycle track was not evaluated correctly when caching a Niagara simulation.
-
Fixed LWC issue in camera DI.
-
Fixed emitters opening up the parameter panel to "Active Module" instead of "Active Overview".
-
Fixed editor only parameters not being marked as RF_Transactional. This fixes issues with transactions not properly being recorded in Niagara.
-
Fixed issue where replacing a module with another module using the same name caused it to lose static switch inputs.
-
Fixed issue where HLSL compile errors were not correctly shown in the stack.
-
Fixed a crash when using LWC structs.
-
Fixed issue where SWC structs would appear in the UI.
-
Fixed issue where using LWC structs as module inputs would not use the correct struct converter.
-
Fixed the script variable customization to also account for parameter pins that are disconnected from an output node. This fixes an issue in which a disconnected parameter pin wouldn't show its custom pin if the value mode was set to 'custom'. Also, you no longer need to reselect a parameter after adding it to a parameter map get node to make it show the default value
-
Added additional call to replace user param references on emitters and fixed renderer attribute binding references not being fixed when renaming a user parameter.
-
Fixed issue where the wrong asset was used to initialize sequencer recording.
-
Fixed emitter assets not dirtying when disabling a sim stage.
-
Fixed loss of parameter references when updating an input parameter's name in a module. The 'BoundPinNames' array was getting updated with an incorrect parameter handle, which made the lookup for subsequent renames break
-
Fixed issue where changing versioned properties would not dirty a script/emitter.
-
Fixed issue with async raytrace data interface not issuing traces.
-
Stopped considering input pins for get nodes as parameter reference This fixes an issue where a pin that was only referenced in a get node would count 2 references, which would stop it from being renamed properly from pin as it would duplicate a new parameter
-
Fixed transform function descriptions in camera DI.
-
Fix for the Apply button in Niagara scripts only checking for the exposed version guid instead of the currently edited version.
-
Fixed missing stack refresh when changing a user parameter name.
-
Fixed issue where the Details view would not properly show rows with changed visibility after a tree refresh.
-
Fixed issue when undoing an emitter add transaction.
-
Fixed an unnecessary refresh in the parameter panel causing loss of selection after modifying a value of a variable.
-
Added metadata to allow multiline text entry for python script.
-
Fixed sequencer caching bugs.
-
Fixed Blueprint API of "spawn system with parameter" functions.
-
Fixed output & transient parameters appearing outside their own stage when opening a parameter menu.
-
Fixed Custom HLSL pins not being modifiable. Also added visibility delegates for action "Reset to Default" and "Promote to Parameter". Also changed the Pin Section name used in Niagara to use the parent section name so we no longer have 2 sections called "Pin Actions" at times
-
Cleanup of old rapid iteration parameters used name only, not type. This resulted in cases where old parameters that used the same name as a new parameter of different type would not get cleaned up.
-
Fixed multiple lookups in the merge manager that looked up by name only instead of name + type. This in conjunction with the fix above results in more stable diff process. All of this fixes an issue where some fluid emitters were showing or not showing the 'reset to parent emitter' arrow wrongly
-
'Ghost entries' no longer appear and a stack search result gets maintained even after changing a value in the stack.
-
Focusing the scratch pad manager tab when creating a new scratch pad so you can immediately rename it Made the toolkitmodebase public so that other parts in the plugin can access the tab names properly
-
Fixed "parameter for" node.
-
Fix highlighting of multiline HLSL comments.
-
Fixed issue where the simulation was always reset after a change, even when paused.
-
Heterogeneous Volumes: Introduce per-volume step size based on local-space step factors. Step size is now calculated in local space as a function of voxel width, projected along the ray direction. Toggle global step-size values to -1 (disabled). Change default MaxStepCount to 512 steps.
-
Fix for alpha-compositing issues with Heterogeneous Volumes when using the Niagara baker.
-
Sort heterogeneous volumes by camera-depth and adjust compositing to match.
Path Tracer
New:
-
Added depth pass for path tracing that matches the behavior of the rasterizer path. The output is in DepthZ so post process depth of field works now as a bonus. You can use the same depth post process material to output in Movie Render Queue. If you'd like to disable the path traced depth buffer and use the depth from the rasterizer instead, you can use "r.PathTracing.Override.Depth 0". Also, the "Output Depth" has been renamed to "Output Depth and Velocity" in Materials.
-
Added Post Process Material and Movie Render Queue support for path tracing buffers. This means that Post Process can access path tracing buffers (raw/denoised radiance, albedo, normal, variance) with unique materials using the "Path Tracing Buffer Texture" Material Expression. And, access means that output in Movie Render Queue is supported.
-
Added basic support for Substrate has been implemented. The path tracer can now handle Substrate Materials, including multi-layered ones. Substrate's MFP is mapped to random walk subsurface scattering for opaque materials and to absorption in translucent cases. We expect to see fairly close agreement in many cases, though this support should still be regarded as experimental. Support for translucency and thin shading models are expected to improve in future releases.
-
Sky meshes should be included for raytracing when using the path tracer The console variable "r.RayTracing.ExcludeSky" is now ignored when the path tracer is active.
-
Implemented support for DBuffer Material Expression functionality in Path Tracer
-
Added a Blueprint call to invalidate path tracing output. The intent of this call is to give control over cases that cannot be handled by automatic invalidations.
-
The path traced image now invalidates itself when a Skeletal Mesh morph target changes.
-
Changed refraction rays to behave more like camera rays with respect to the "Affect Indirect" primitive setting. This makes refraction and transparency behave more consistently with one another.
-
Added support for path tracing heterogeneous volumes. This uses the Voxel Grid Pipeline to create global acceleration structures to represent heterogeneous volumes in the path tracer. Creation of global acceleration structures is memory intensive. Refer to the corresponding Voxel Grid Pipeline CL 25170595 for instructions on parameter tuning to control memory and quality. r.PathTracing.HeterogeneousVolumes (default = 0) Enables heterogeneous volume rendering in the path tracer r.PathTracing.HeterogeneousVolumes.RebuildEveryFrame (default = 1) Rebuilds the acceleration structures every frame.
-
Adding volume emission to the path tracer.
Improvement:
-
Improved SSS random walk sampling.
-
Improved volume light sampling for local lights.
-
OpenImageDenoise transfers have been sped up. Some optimizations were made to the pixel readback which saves some denoising time.
Bug Fix:
-
Fixed darkening in subsurface scattering when the scattering radius is small. The code now more seamlessly blends towards the diffuse behavior instead.
-
Fixed issue where materials using non-tangent space normals could have flipped normals in some cases.
-
Fixed fireflies that can occur from the rough diffuse shading model at grazing angles.
-
Fixed the "Path Tracing Quality Switch" node in materials not working in decal materials.
Removed:
- The Path Tracing Post Processing Volume setting for Filter Width for anti-aliasing has been removed. We found the default value (3.0) is effectively the optimal one and that there wasn't much reason to change it. If you still need this property, you can use the console variable "r.PathTracing.FilterWidth" to adjust it.
Postprocessing
New:
- Added a Post Process Setting to Image Effects with Sharpen. This controls the strength of image sharpening applied during tonemapping.
RHI
New:
-
Vulkan Bindless: Push a draft implementation of the FVulkanBindlessDescriptorManager that uses VK_EXT_descriptor_buffer. Uses one descriptor set for each type of resource, each backed by a descriptor buffer. Everything is bound and visible to every shader, except uniform buffers which are bound per draw/dispatch. Uses a single pipeline layout for everything. Initial buffer sizes for each descriptor type can be configured through CVars (they do not automatically grow yet). Still very experimental, and requires multiple other features to be disabled.
-
VulkanRHI: Use array for dynamic buffer allocations and removed the hardcoded "NUM_BUFFERS=3" value. Use a fence to manage buffer availability. Do not rotate dynamic buffer usage when a staging buffer is used for the copy.
-
VulkanRHI: Vulkan SDK upgrade to 1.3.239
-
Removing full-type RHI_API uses and adding them to members that need it. This reduces export counts and is part of upcoming coding standard changes.
-
Moving D3D12 Extension includes into their own headers.
-
Updating to Agility SDK 1.610.2
-
Moving a couple DDSPI fields to Editor-only code blocks, and moving Editor-only DDSPI types into the cpp files to keep Editor includes out of the global scope.
-
VulkanRHI: Moved Engine minimum core version to Vulkan 1.1.
-
VulkanRHI: Added VULKAN_SM6. Moved features and requirements around to match what was done on D3D12 SM6.
-
Making FRayTracingGeometryInitializer not a memory layout type since nothing needs it like that anymore.
-
VulkanRHI: Use Vulkan profiles to validate support for a feature level on startup before call to CreateRHI().
-
VulkanRHI: Added Vulkan_1_3 support for shader compilation, which is used for VULKAN_SM6.
-
Improved DX12 GPU breadcrumbs that track all active, finished and not started scopes on the GPU. The new implementation logs all scopes currently scheduled or active on the GPU.
-
RHI: Avoid re-allocating the OutData array in RHIRead*SurfaceData when possible.
-
Enabled async compute by default in D3D12 on NVIDIA Ampere and newer cards.
-
The command line argument "-vulkandebug" allows usage of our distributed vulkan validation layers for both Windows and Linux.
Bug Fix:
-
Bumped nVidia minimum version to 527.27. A random issue with landscape tools has been known to be problematic for drivers less than version 526.67. The exact cause is unknown but a resolution appears to have been made in one of the 527 releases. The first version to not exhibit the problem is 527.27.
-
Fixed FRHIGPUTextureReadback to work with subrects, as well as volumes and texture arrays.
-
Fixed structure init in Vulkan RHI.
Removed:
-
Removing RHI code deprecated in 5.0.
-
Removing deprecated RHI symbols.
-
Removed CoreMinimal includes from public RHI headers.
-
Removed the deprecated RHISetComputeShader.
Substrate
New:
-
Brought back proper premultiplied alpha that can be toggled on Materials and Material Instances. Coverage over the background can be overridden from the root node when Alpha Composite Blend Mode is selected. If not plugged in, coverage of over background is off and regular blending is used.
-
Added support for decals with Substrate Materials.
-
GPU Lightmass now supports Substrate Materials.
-
Added support for glint BSDF to Substrate.
-
Ray tracing material shaders use fully simplified material for smaller payload.
-
Optimized Substrate shader compilation time.
-
Added in Material Editor complexity on Slab node.
-
Substrate now uses progressive material simplification to fit in memory. Simplifying Slabs at the bottom of the material topology first.
-
Made multiple improvements to the Material Editor Substrate tab.
-
Added support for Planar Reflections to Substrate.
-
Lumen card capture now uses fully simplified material with Substrate.
-
Added distortion coverage mode to be compatible with legacy distortion in Substrate Materials.
-
Fixed some editor pop up message due to bad bitfield macro when using Substrate Materials.
-
MFP is no longer clamped to fp111110 when in forward to be able to get to an transmittance closer to identity=1 (invisible surface).
-
Allocation of tile tile list buffers is now independent from the dynamic resolution when using Substrate.
-
When a new material is created using Substrate, a simple UE4-like lit shading model material function is used instead of a Slab. This shows that Substrate works with material function and makes material authoring simpler by default.
-
Added Substrate node for converting Index of Refraction to F0 and rotating anisotropy tangent.
-
Added Substrate Standard Surface nodes.
-
Add Specular Profile to Substrate. This allows the artist to provide a custom LUT describing specular behavior for view and light angles. The LUT can be procedurally generated or provided from a texture.
-
Added material buffer allocation policy. This allows control of how the material buffer is allocated. This is controlled with "r.Substrate.BytesPerPixel.Mode". When set to 0, allocate material buffer based on view requirement. When set to 1, allocate material buffer based on view requirement, but can only grow over frame to minimize buffer reallocation and hitches. When set to 2, allocate material buffer based on platform settings.
-
Added Byte Per Pixel view mode for Substrate.
-
Change Substrate Cloth / Sheen model to From Charlie to Disney LTC.
-
Added normal curvature-based roughness support.
-
Added Substrate Topology previsualization on the Substrate node within Material Editor.
Improvement:
- Improved Substrate diffuse color sRGB encoding.
Crash Fix:
-
Fixed a crash when assigning a Material Function onto new material that is reopened later.
-
Fixed a crash when a Substrate Material has more shared tangent basis than allowed.
Bug Fix:
-
Fixed Substrate Material Preview on nodes to account for the Substrate tree from the previewed node only. This fixed material function input / output, reroute nodes and everything in between that is not directly connected to FrontMaterial.
-
Applied a fix for Virtual Shadow Maps and Subsurface Scattering using Substrate Materials.
-
Fixed opacity clipping for translucent writing velocity.
-
DXC and SPIRV-Cross fixes to enable Substrate in D3D11.
-
Fixed Volumetric Cloud Extinction being grayscale.
-
The Unlit Shading Mode now also works with refraction.
-
Fixed emissive exhibiting different behavior when enabling Substrate.
-
Decals now do not impact the look of other substrate material when in range of effect.
-
Fixed a wrong opacity with Substrate for depth and velocity.
-
Fixed "UseDiffusion" affecting the look of simple Volume Slabs.
-
Slab now respects Additive Blend Mode.
-
Fixed bad transmittance when doing masking through a vertical layer operator and more than 2 layers.
-
Applied a fix for Substrate interacting with responsive anti-aliasing.
-
Fixed microoclusion/F0/F90 usage.
-
Brought back support for "Custom UV" on root node.
-
Substrate now properly accounts for "Allow Negative Color."
-
Fixed Lumen ScreenProbeGather ReferenceMode when Substrate is enabled.
-
Fixed Lumen ScreenProbeGather and Lumen Reflection temporal filtering with multi-BSDFs.
-
Fixed Lumen history being reset on LumenScreenProbeGather & LumenReflections when Substrate 'max BSDF count' change.
-
Fixed legacy Eye Material conversion with Substrate.
-
Avoid non-necessary initialization causing massive shader stall. Reduce base pass cost of complex material by ~50%.
-
Fixed ray traced shadows with Substrate
-
Fixed Lumen specular interreflection with Substrate.
-
Fixed Lumen ScreenProbe / Reflection history reprojection with dynamic resolution scaling when enabled. Also fix Lumen ScreenProbe normal disocclusion.
-
Fixed Lumen.Visualize.IndirectDiffuse with Substrate enabled.
-
Added support for short range Ambient Occlusion with Lumen HWRT path.
-
Fixed "IsThin" support with SSS diffusion and SSS profile diffusion (now it works as expected, and diffusion is no longer scaled incorrectly) Also fixed "IsThin" to support surface for translucent case.
-
Fixed Substrate legacy material conversion with Virtual Texture input.
-
Fixed Substrate missing tangent frame when using parameter blending.
-
Fixed increase of energy when light transmission is enabled due to incorrectly normalize phase function
-
Fixed incorrect VSM backface culling with Substrate for pixel having subsurface.
-
Fixed missing Emissive input on Hair materials with Substrate.
Simulation
Physics
API Change:
- GlobalMatrices has been deprecated and ComponentSpaceTransforms should be used instead. If there's a need to get FMatrix type, Unreal Engine provides simple ways to convert from the FTransfom type to FMatrix type.
New:
-
Added the ability to add collision profile overrides per particle, per level, and for abandoned particles on Geometry Collections.
-
Added cluster unions which are functionally equivalent to welding, but for Geometry Collections. This will eventually be expanded to support Static Meshes.
-
Introduced new external context-safe payload that can be used for Chaos acceleration structures.
-
Revamped scene query interfaces with templates to be able to accept additional types of scene query overrides.
-
Exposed a ComponentOverlapComponent function on the primitive component that also returns the overlap result.
-
Geometry Collections will not try to replicate empty internal clusters.
-
Added support for implicit object unions in OverlapQuery and SweepQuery.
-
Added an option (p.Chaos.DebugDraw.ConnectionGraphLevelOffset) to change what level of connection graph is being drawn in Chaos Debug Draw.
-
Disabled cluster particles when they no longer have children.
-
Geometry Collection particles now have a debug name set.
-
Added functions to the physics object interface to make line trace, overlap, and sweep on the UPrimitiveComponent generalizable beyond Static Meshes.
-
Modified the K2 overlap functions to return a hit result as well
-
Introduced a new FPhysicsObjectId alias to add some type clarity to the various functions on the IPhysicsComponent that deal with this ID.
-
Moved ChaosSQTypes from PhysicsCore to Chaos.
-
Exposed getters for the XR and Velocities property on geometry particles.
-
The FaceNormal is utilized in the sweep even when we hit implicit objects without a face index.
-
Added accessor functions to the FReadPhysicsObjectInterface to convert the physics object handle to the raw particle appropriate for the context.
-
The physics object interface and the Scene Query types should now be able to statically select the shape instance to operate on.
-
Added additional trace scopes for the various paths in OnSyncBodies.
-
Added functions to the physics object interface to query the hierarchy level of a particle and generate connectivity edges between particles.
-
Modified the various connectivity graph function APIs to be more flexible and to support filtering based on a "from" and "to" set of particles.
-
The physics object interface now uses const handles when possible.
-
Added a function to get the body ID from the component, given a raw game-thread particle.
-
Added support for merging collisions for contact pairs that appear with matching solver time. This removes cases where multiple hits for a contact pair would be received in a single frame with identical velocity data (since delta-V is updated per-frame). Includes information on multiple contact pairs that hit in the same solver frame to allow users to still use the same data.
-
Added torque units Nm and kg cm^2 / s^2, and force unit kg cm / s^2.
-
Added conversion utilities.
-
Optimized FPhysInterface_Chaos::SetMaterial by reusing a formerly temporary allocation.
-
Added render interpolation of the resulting offset from a physics resimulation via linear offset decay.
-
Added functionality to cache physics state of objects that are based on FPhysicsObject. The cached state is used by state replication and unlocks state/movement replication for objects like Cluster Unions which are based on FPhysicsObject.
-
Added the option to override an Actor's physics replication mode via physics object presets.
-
Added a Geometry Collection Dataflow node to simplify existing convex hulls on a Collection, with options to use either mesh-based simplification or a new dihedral angle threshold method.
-
Changed the cache collection object to be usable in Blueprints.
-
Geometry Collections now expose the IsRootBroken function to Blueprints.
- Made the following changes to Dataflow:
- Added new math library nodes.
- Moved make nodes to a separate file.
- Moved conversion nodes to a separate file.
-
Made sure the Geometry Collection custom renderer system is properly handling the bHiddenInGame flag.
-
Exposed Gravity settings on the immediate physics Actor.
-
Added the concept of internal call stack to the context to allow detection of loops in Dataflow.
-
ISM Pool optimization: made sure instantiated Static Meshed from the ISM Pool do not create their physics state.
-
Added override nodes to Dataflow.
-
Added Override properties to the Geometry Collection asset.
-
Added support for AssetUserData API to Geometry Collection assets.
-
Chaos: Optimized SpatialAccelerationCollection RemoveFrom by avoiding array allocation.
-
Added ability to set the gravity group index for a Geometry Collection.
-
Updated Geometry Collections to report sockets in their root proxy Static Meshes if they are available.
-
Added a Dataflow node to read specific float values from a float array.
- Optimized data marshalling of Geometry Collections' physics results between the physics thread and game thread.
- Removed global transforms from the payloads.
- Only send data for the transform indices that have been changed (reduced copies and memory allocations).
-
Optimized the processing of Geometry Collection physics results by using ref counting pointers instead of making copies of the entire data.
-
Added a setter on EnableNanite UProperty to Geometry Collections.
-
Added the Chaos debug command p.Chaos.DebugDraw.ColorShapesByInternalCluster to display which physics particle is an internal cluster.
-
Added support to LevelSet for the connection graph generation.
-
Added new options to the Auto Cluster tool in Fracture Mode for grid-based clustering and a minimum cluster volume option.
-
The Tiny Geo tool in Fracture Mode now has a Tiny Cluster mode, which merges tiny clusters. This includes options to control whether the clusters considered should be restricted to the current Fracture Level, or to sibling clusters in the current hierarchy, or to clusters connected via the current proximity graph.
-
Added new Fracture plugin project settings to control the default location for new Geometry Collection assets created in Fracture Mode.
-
Added a Quick Settings section to the Fracture Editor UI, to allow users to easily control the default folder for new assets and to jump to fracture project and editor settings.
-
Added a way to control at which level Geometry Collection position and velocity are replicated for clusters.
-
Added support for custom primitive data in Geometry Collection Assets.
-
The Fracture Mode now shows the Rest Collection of the first-selected Geometry Collection in the level, providing easier access to the asset.
-
Added a Get Root Index node to Dataflow for managed array collections.
-
Added Geometry Collection Dataflow nodes: Cluster Selected, Merge Clusters, and Select Target Level.
-
The Split Components setting for Geometry Collections has been renamed Split Meshes, to reduce confusion with the unrelated UE Component concept.
-
Added physics material options on to the Geometry Collection asset.
-
Added the ability to use density from the assigned material ( or the overridden ones on the component).
-
Added the ability to Apply Default from Asset on the component as a button in the editor properties.
-
Added a BranchCollection Dataflow node.
-
The Fracture Mode Materials Tool now shows and updates the materials of the Geometry Collection asset (the Rest Collection), rather than the override materials on the Geometry Collection Component.
-
The Fracture Mode Set Removal, State, and Convex tools now automatically change the Fracture Mode's Outliner Column Mode to Removal, State, and Collision, respectively on switching to the tool.
-
Chaos cloth XPBDSpringConstraints have been internally rescaled to be resolution independent. Existing constraints have their behavior changed depending on their current resolution (spring length). These constraints were not exposed through any existing cloth plugins, so minimal impact is expected.
-
The Fracture Mode Proximity Tool can now set up Geometry Collection proximity based on a measure of the contact area of the convex hulls of the bones. This allows for better filtering of connections where the bones were barely touching, or only touching along a sharp corner.
-
Added a float comparison Dataflow node. Int and Float comparison nodes are now in the Math > Compare category.
-
Added a new material-based Damage Model for Geometry Collections. It is using material tensile strength and surface area of contacts between pieces to compute damage thresholds.
-
Added a node to get the sum of convex hull volumes for a given Geometry Collection bone selection.
-
The Create Leaf Convex Hulls Dataflow node now exposes the option to run a convex decomposition on leaf nodes of a Geometry Collection, enabling more accurate convex collision.
-
Add an Uncluster Geometry Collection Dataflow node.
-
Added the ability to control server and/or client Chaos debug draw via the following console variables: p.Chaos.Solver.DebugDraw.ShowServer and p.Chaos.Solver.DebugDraw.ShowClient. Also added the p.chaos.debugdraw.seethrough console variable to control whether or not the lines are drawn over objects.
-
Cloth to Dynamic Mesh: set default material ID to zero on all sim triangles.
-
Cloth Editor: if any triangle in the render mesh has an invalid material ID, apply the default WoldGridMaterial to it.
-
Added new Dataflow nodes to support exporting of Geometry Collection surfaces, convex hulls, and sphere coverings as OBJ mesh files, and to write Strings to files for debugging purposes.
-
The Fracture Mode Convex Tool now only shows collision shapes for the current Fracture Level.
-
Added delegate InjectInputsExternal to FNetworkPhysicsCallback. This will be broadcast during InjectInputs_External.
-
Chaos Caching: Blueprints are now allowed to access the observed component's EnablePlayback and CacheCollection properties.
- Added a GetBoxLengths Dataflow node that can get the bounding box lengths for each transform in a Geometry Collection, where length can be measured along a chosen axis, the min or max axis, or the diagonal.
- Added a SelectFloatArrayIndicesInRange Dataflow node that can select indices in an array of floats where the floats match a specified value range.
-
Added a CollectionTransformSelectionFromIndexArray Dataflow node that can select Geometry Collection transforms with indices matching the values in an array of integers.
-
Made server authoritative Geometry Collection particles unbreakable on the client -
-
Added unbreakable flag to Chaos clustered particles SOA.
-
Added a new Merge Convex Hulls Dataflow node which can reduce the convex hulls used to represent collision on geometry collection bones.
-
Added GetAccumulatedTime function for obtaining the physics solver's AccumulatedTime in fixed step mode.
-
Added a new experimental Skinned Level Set primitive type for Physics Assets. This primitive embeds a Level Set into a lattice which is skinned by transferring the skinning weights from the associated mesh vertices to the lattice. This primitive can only be used by cloth simulations and is experimental. It has not been optimized.
- Added material strength information to the Chaos physics material.
Improvement:
-
Modified primitive component wake/sleep events so that they don't depend on the existence of a BodyInstance, which makes them more generalizable.
-
Geometry Collections no longer construct FName types at runtime for the removal feature related facade classes.
-
Optimized Geometry Collections by removing feature runtime execution. Also reduced its memory footprint per Geometry Collection instance.
-
Moved rendering and navigation updates from the Geometry Collection Component TickComponent method to PostPhysicsUpdate one. Also cached RootIndex in the Geometry collection asset to avoid scanning through all the transforms each time to find it
-
Geometry Collections's bool-typed managed arrays now use BitArray instead of TArray in order to save memory
-
Geometry Collection Optimization: Only enable the primary Geometry Collection Component tick function when removal features are needed (after the root breaks).
-
Optimized the memory storage of Geometry Collection clustered particle flags.
-
Chaos now uses a smaller data type to store clustered particle properties when possible and better manage memory allocation when populating the connection graph.
-
Geometry Collection ISM Pool rendering optimization: Now uses new API to pass transform more efficiently by reducing array allocation.
- Improved the convex collision generation of Geometry Collection by doing the following:
- Added Dataflow node to generate Geometry collection cluster convex collision from leaf nodes.
- Improved Fracture Editor convex visualization (display of convex union when parent convex is missing).
- Added a column to the Fracture Editor Outliner showing the number of convex and when a parent is using a union.
- Geometry Collection optimization: Changed GlobalMatrices array of FMatrix to ComponentSpaceTransforms array of FTransform. This reduces the number of back and forth conversion between FTransform and FMatrix.
Crash Fix:
-
Fixed a crash issue where clearing a Chaos property flag would cause it to try to remove a dirty proxy when that proxy still had dirty shapes.
-
Fixed an issue with cloth simulation where setting a new Skeletal Mesh asset would sometimes cause a crash.
-
Fixed Chaos unit test crash when using LevelSets in cluster union.
-
Fixed a potential crash in Geometry Collections when a physics state is created while the Rest Collection is not set. This may happen when adding a Geometry Collection component to a Blueprint while having it open for editing in the editor.
-
Fixed a crash when evaluating Dataflow terminal node from Blueprint with a name that does not exist in the graph.
-
Fixed a Chaos Cloth crash in FClothVisualization when the debug materials are loaded.
-
Fixed a crash in the Skeletal Mesh cloth painting tool caused by bone mapping indices left invalid after adding existing cloth data to a Skeletal Mesh asset using a different skeleton.
-
Fixed several bugs that could cause crashes when using Take Recorder while PIE was running with cloth simulations.
-
Fixed an issue where a Landscape would potentially dispatch a newly created physics Actor and then subsequently destroy the geometry it uses before the next physics update, leading to a crash due to use-after-free.
Bug Fix:
-
Fixed an issue where disabling a Geometry Collection particle could leave the particle in acceleration structures.
-
FReadPhysicsObjectInterface
::AreAllShapesQueryEnabled now works on both external and internal contexts. -
Chaos event dispatching no longer iterates through all the listeners even when there are no events to dispatch, resulting in a slight performance improvement.
-
Collision conversion now checks against the inner shape type to handle the case of a transformed union.
-
Applying external strain to a Geometry Collection particle should now apply even if that particle doesn't have children.
-
The Blueprint library function for finding the closest physics object will now filter based on whether the particle is enabled or not.
-
Fixed an issue where Chaos Fields would make all particles it made dynamic also enabled, which would cause Geometry Collection particles to collide against their root particle.
-
Removed ensure when drawing unions which have a single shape.
-
Fixed an issue where OnComponentPhysicsStateChanged was not getting called properly for Geometry Collections.
-
Fixed an issue where Geometry Collection events would not be registered properly after the Construction Script re-registers the component.
-
Fixed an issue where internal clusters were not being cleaned up property when children were removed from them, regardless of which path that removal came from.
-
Fixed an issue where Geometry Collection replication was relying on bFirstUpdate to determine whether or not to replicate a cluster. The particle level is used instead.
-
Fixed an issue where Geometry Collections would not properly pull the state from PrevData/NextData for some of its particles with non-interpolatable properties.
-
Fixed an issue where Geometry Collection particles were not being added to the external Scene Query queue. This ensures that they are always in the external Scene Query, even after it gets swapped.
-
Fixed an issue where Geometry Collection cluster particles had a cluster group index set on them when they were the root particle (does not have another parent).
-
Fixed an issue where the RewindData and MarshallingManager would have different sizes of their data history.
-
Fixed a crash happening when simulating physics with a Geometry Collection that has no rest collection assigned.
-
Fixed an issue where populating the physics replication cache consumed a lot of CPU time in levels with many Actors.
-
Fixed an ensure triggering from duplicate Geometry Collection particles caching in rewind data.
-
Fixed an issue that made all islands resimulate when one triggered a re-simulation.
-
Fixed an issue where the Geometry Collection RestTransform was not in sync with the RestCollection transforms, causing incorrect asset thumbnails.
-
Replaced an ensure by a non-breaking verbose log when not finding a supported collision type during cloth collision with the environment.
-
Fixed an issue in the Chaos Cloth editor where the transform gizmo and numeric input in the Preview Scene were out of sync.
-
Fixed an issue in Geometry Collections where the Mass attribute was being accessed as a Double, instead of a Float causing potential out of bounds access.
-
Fixed a Dataflow stack overflow in invalidation code when connecting nodes in a loop.
-
Made serialization of Dataflow node more robust to input and outputs changes.
-
Fixed the cloth painting material offset z-fighting with the source render section by adding a small normal offset.
-
Fixed a compilation error related to duplicated Solver symbols in TUserDataManagerPT::SetData_GT.
-
Fixed a Chaos Cloth crash when undoing mask targets in the Clothing window of the Skeletal Mesh editor.
-
New Geometry Collections now convert vertex colors from Linear to sRGB space for rendering by default, to match the behavior of Static Mesh rendering. Old assets keep the previous behavior for compatibility by default. Use the new ConvertVertexColorsToSRGB checkbox on a Geometry Collection asset to toggle this behavior.
-
Fixed an issue where in some cases Geometry Collection data would not be consistently updated, which caused an ensure on pressing 'Reset' in Fracture Mode.
-
Removed unnecessary tick function from event dispatcher base class which could lead to accumulating no-op ticks from Geometry Collection components in Post Physics tick groups.
-
Removed allocation of multi-find array in GetPendingCollisionForContactPair.
-
Fixed an issue where heightfield overlaps where not taking into account entire materials.
-
Reduced the stack reserved hit buffer sizes down to 16K from 64K in scene queries, still reserving 128 hits for queries prior to heap allocating.
-
Fixed the physics thread Geometry Collection Active attribute not being properly initialized (and taking one update cycle to do so).
-
Fixed a Fracture Mode issue where the alpha channel on Geometry Collection vertex colors would be reset to 1 when a Geometry Collection was fractured.
-
Fixed breaking model considering a parent multiple times when classifying required breaking particles.
-
Fixed children with strains not being processed when their parent cluster breaks.
-
Fixed an issue where IsHole for heightfields was returning True when no materials were present in the heightfield.
-
Disabled sleeping event handling in Geometry Collection event handler. This avoids multiple dispatches of identical sleeping events as they are handled by the scene.
-
Fixed an issue where changes to a Geometry Collection asset in Fracture Mode would not propagate to other Geometry Collection components using the same asset.
-
Updated Chaos Cache Managers to now work correctly when they're spawnable if they're observing components that belong to the cache manager itself. In particular, they will now work if they were created by adding a destruction Cache Collection to the scene. Cache Managers observing other components (e.g., cloth) continue to not be able to be spawnable.
-
Fixed an issue where FRewindData::RewindToFrame would keep dirtying particles/joints every rewind. If the game was constantly rewinding, this would cause the size of the FRewindData::DirtyParticles array to get too big.
-
Fixed an issue where Geometry Collection rendering would not match the Static Mesh rendering because the Static Mesh recomputed tangents and the Geometry Collection did not.
-
Fixed an issue where the GeometryCollectionComponent implicit generation was calculating incorrect sizes for box clusters.
-
Updated Chaos Cloth caching to store the necessary transforms to playback with the correct transforms. Existing caches will continue to work as before (e.g., if they did not require the additional transform information, they will continue to work).
-
Fixed an issue where undoing the creation of a new Geometry Collection would leave a broken asset, which could crash the editor if used. We no longer transact the creation of the Geometry Collection asset, so the asset will persist in a valid state.
-
Fixed an issue where a tiny triangle could make cloth simulation with self collisions very slow.
-
Fixed repeated calls to update Geometry Collection particle views during Geometry Collection proxy initialization.
-
Fixed an issue where the altered rigid clustering advance was considering all top level particles for breaks, instead of only considering the particles that were strained. This greatly reduces the steady state cost of the breaking model.
-
Fixed an issue in Geometry Collections where removal of random generated timer values were not consistent between client and server.
-
Fixed an issue with Geometry Collection caching where caching was not properly recording and replaying if the break event notification was not set on the Geometry Collection.
-
Fixed a Chaos Cloth bug where the shared config ownership was preventing a Skeletal Mesh asset from being saved after adding their clothing data to another Skeletal Mesh.
-
Fixed an issue where the Explode Amount slider was not working when the selected Geometry Collection was inside a Blueprint.
-
Fixed the Chaos Cloth Deformer when using a mirrored transform.
UI
New:
- UE attempts to select the best solution when opening files using Visual Studio source code accessors.
Bug Fix:
-
Fixed clamping issue in
SAnalogSlider
where the MinValue and MaxValue were ignored when navigating with a controller. This behavior is now consistent when using a mouse or a controller. -
Fixed a bug where navigating past the min or max value of
SSlider
would invalidate the widget and call a value change delegate despite not changing the value. -
In
USlider
, fixed a MVVM notification and delegate that were not called when the value was changed from code.
Slate
New:
-
Moved
STextScroller
implementation from CommonUI to Slate. -
Added cache functionality to
SDropTarget
for expensive AllowDrop operations. This is turned off by default. By default, OnAllowDrop is called every frame, which is user bound. SettingbUseAllowDropCache
totrue
will cache AllowDrop the first time it is called. The cache is cleared whenever a drag & drop operation starts. -
Added
OpenComboBox
function toSObjectPropertyEntryBox
widget -
Added ObservableArray pattern to ListView, TitleView and TreeView in Slate. The TreeView implementation only supports the new pattern for the root items, as that is where performance improves the most when it is changed. The observable array automatically notifies the view when an item is added/removed from the array.
- Slate batching improvements for large element sets:
- Group similar elements at compile time using tuples.
- Merge similar renderbatches in same-typed element buckets (currently for box and lines only).
- Reserve verticies / elements in a batch before using them.
-
Slate element creation is now batched per element type to improve instruction coherency.
-
It is now possible in
SHeaderRow
to specify the text overflow mode by providing a value of typeETextOverflowPolicy
to the new argumentOverflowPolicy
. -
UE now resaves Slate PNG files with incorrect sRGB profile, logging PNG filename during libpng warnings and errors.
-
Added widget state, which is intended to be used by external systems to generically respond to widget changes regardless of type.
-
To avoid temporary array allocations per draw, Slate now uses static indexes for both text and shaped text where possible.
-
Retained widgets now group by element type.
- You can now add a widget inside the global window overlay.
Bug Fix:
-
When UE creates a Modal window using
FSlateApplication::AddModalWindow
, if it can't find the Slate Virtual Window, it falls back to a non-modal window. -
Slate only allows explicit navigation if the target widget is enabled.
-
SlateFontInfo now limits Outline to 1024.
-
Fixed an issue where a widget in scroll box could get stuck in its hover state.
-
Fixed issue where mouse position would not be calculated correctly when dragging a scroll area.
-
Added Variation Selector characters to the list of characters that require full text shaping.
-
Fixed scroll box scroll lag that occurred when scrolling by holding the scroll bar with the mouse.
-
Fixed an issue causing ellipsis to appear on multiple lines on multline text, and for each text block in each line for combination of multiline + rich text or multiline + bidirectionnal text, instead of having a single ellipsis as expected.
-
Fixed an issue causing ellipsis to not show or be misplaced on text with multiple runs, such as rich text or bidirectionnal text. This bug was more likely to happen on left to right text.
-
Fixed ellipsis not showing or showing the wrong side for multiline right-justified text, or right-to-left text that was left-justified.
-
Fixed a bug that prevented selecting an item in the list view when the list view was empty.
-
Combo boxes no longer always trigger a value change event when opened.
-
Added support for the
-nullrhi
command option to all standalone Slate applications. -
Fixed an issue where tooltips could be spawned while not using a mouse.
-
The PropertyViewer's container now rebuilds when a Blueprint is recompiled. Depending on whether UE performed full rebuilds or skeletal rebuilds of Blueprints, they were not always marked as "newer class exists."
-
Fixed SlateTextureAtlas creating free nodes in empty slot lists that have dimensions smaller than what can be used by glyphs. The code previously created two nodes as long as one of them exceeds the minimum dimension. In practice, this results in iterating over 94+ unused elements each time a glyph is added. With this update, it should only create the smaller node if it exceeds the minimum.
Deprecated:
- Removed & deprecated
FSlateDataPayload
used by Slate elements. Relevant data is instead built into subclasses to avoid indirection. For example, instead of usingFSlateBoxPayload
, useFSlateBoxElement
.
UMG
New:
-
Adding Desired Focus widget to UserWidget. This new property makes it possible for the user widget to forward the focus to one of its children when it receives focus. It can be set at runtime and in UMG Designer as a default value.
-
URichTextBlock::ClearAllDefaultStyleOverrides
is now BlueprintCallable. -
Added
OnIsItemSelectableOrNavigable
delegate to list views. -
UListViewBase
: Added pure virtualOnIsItemSelectableOrNavigable
function.OnIsSelectableOrNavigableInternal
checks ifOnIsItemSelectableOrNavigable
is bound, and if it is, it returns its value. -
IMPLEMENT_TYPED_UMG_LIST
: AddedOnIsItemSelectableOrNavigableDelegate
. This oiverridesOnIsItemSelectableOrNavigable
and returnsOnIsItemSelectableOrNavigableDelegate
. -
Added support for specifying Input Configs from BP for activatable widgets.
- Added several debug CVars to CommonUI:
CommonUI.Debug.WarnDesiredFocusNotImplemented
– Provides a warning when activating widget without GetDesiredFocusTarget implemented.- Added CVars to track Input Config changes:
CommonUI.Debug.TraceConfigChanges
CommonUI.Debug.TraceConfigOnScreen
CommonUI.Debug.TraceInputConfigNum
CommonUI.Debug.CheckGameViewportClientValid
– Provides a warning when using CommonUI without CommonGameViewportClient.CommonUI.Debug.WarnAllWidgetsDeactivated
– Provides a warning when deactivating all widgets.Slate.Debug.TraceNavigationConfig
– Logs when navigation config changes in Slate.
-
Moved UMG/FieldNotification files for Viewmodels to the FieldNotification module.
-
Added support for Viewmodel FieldNotify broadcast on Blueprint-defined variables.
-
Added Editor Utility version of UMG widget components to prevent serialization conflicts.
-
Added a delayed to when Viewmodel bindings are ticked by a world. If the widget changed worlds, the binding might not be ticked anymore.
-
Filter Viewmodel context creation type per class. Use
MVVMAllowedContextCreationType
orMVVMDisallowedContextCreationType
to allow or disallow types. -
Added
COMMONUI_API
toFUIInputAction
and some related functions inUCommonUIInputSettings
. -
The View Binding picker now filters conversion functions by display name and by keyword.
-
In the View Binding panel, the Add button now adds the widget the user has selected in the UMG designer. You can change this behavior, and it is saved in a setting (Add Binding Mode).
-
Added support for ascent and descent override for FontFaces, which you can edit in the Font Face editor.
-
Added the ability to scale font size in the font editor's preview.
-
Views are no longer added to the WidgetBlueprintGeneratedClass if there are no bindings.
-
Added a Blueprint view to the AssetSearch. The module is not added by default because it depends on the AssetSearch plugin.
-
Added a menu extension to Viewmodel editor. The Bindings panel is now "MVVM.ViewBindings.Toolbar" and the viewmodel panel is "MVVM.Viewmodels.Toolbar"
-
Return the World of a widget when it's valid. Added a message when the widget cannot be added to the World.
-
Added the Viewmodel tag data to the UserWidget generated class. It was present on the blueprint asset but that data is not present in cooked build.
-
Added a callback to add tag data to a widget's generated class asset.
-
Added the Auto execution mode for Viewmodels. Auto will decide at compile time if it should run the binding immediately or on a delay. A binding will be run in delay mode if the binding can be triggered from more than one field.
-
Added extension to insert a Customization for the Designer DetailView from a Blueprint extension.
-
Removed the need to have a SourcePath for ComplexConversionFunction in Viewmodels. The source data is inside the function itself and the fieldnotify name is already saved in the class binding.
-
Updated GetBindingInfoFromFieldPath to support nesting a Viewmodel inside another Viewmodel.
-
Added a unit test for the GetBindingInfoFromFieldPath function.
-
Added DoesInitializeAtConstruction on the View class to support manual initialization. When the flag is false, the user is responsible for initializing the view.
-
Added ReevaluateSourceCreator for Viewmodels. A source discovered at compile time and added to the list of SourceCreator may need to be evaluated if the path contains a notify. This function is similar to SetViewModel but finds the new value from the SourceCreator.
-
Exposed Viewmodel properties to the Details panel. You can now inspect Viewmodels with the Object Inspector. You can then see which Viewmodel is attached/bonded to the View.
-
Added support for nesting Viewmodels inside Viewmodels.
-
Added support for Viewmodel sources that are not UserWidget properties. The compiler generates the missing path.
-
Viewmodels now use
FText::Identical
to compareFText
. -
Added Viewmodel performance stats to the runtime View.
-
Added an option to log all Viewmodel bindings after compilation. Enable the CVar
MVVM.LogViewCompliedResult
to log this information. -
Added a virtual method so that CommonInputProcessor can be overriddenoverriden.
-
You can select an abstract class as a Viewmodel class, but you can't create an instance from an abstract Viewmodel class.
-
Added Resolver, a new way to select a Viewmodel. You can extend the Resolver and can implement your own logic on own to find/create the Viewmodel.
-
Updated style defaults on UMG widgets to use default style cache.
-
Added option to hide the BindingWidget, NavigationSimulation, Pallets, and Hierarchy windows from the UMG Designer.
-
Renamed CommonUI
FUICameraConfig
toFActivationMetadata
. -
Added a message at compile time notifying when 2 Views will be used at runtime.
-
Added unit test for FieldNotificationDelegate for Viewmodels.
- Added support for custom pins for complex conversion functions.
Crash Fix:
- Fixed a crash in the loading screen when clicking the X window button before the end of the Loading Screen.
Bug Fix:
-
Fixed an issue where multiple default action prompts could appear on CommonUI buttons when disabled and re-enabled.
-
Correction to Favorite features in UMG Designer to allow more than one Widget to be favorited when the Library Window is shown.
-
The Design View Widget sets the desired size of the selection border to 0 to prevent the UMG Design View from representing the layout of 0-sized widgets incorrectly.
-
Fixed an issue that prevented CommonUI actions from updating when the activated root doesn't support activation focus.
-
Applied fixes to Analog Cursor functionality to support gamepad-driven cursor movement.
-
Viewmodels are no longer overridden when set before widget initialization.
-
Fixed an issue preventing Blutility classes from being included in other modules.
-
The Viewmodel system now tests if the Binding library is loaded before accessing it.
-
Fixed an issue preventing users from renaming Viewmodels from the details panel.
-
Moved the Global Viewmodel Collection to GameInstance subsystem to allow PIE and splitscreen.
-
Fixed retainer widgets not rendering in editor. These are now configurable via 'Slate.EnableDesignerRetainedRendering'.
-
Fixed a bug where removing a View Binding didn't return the correct state of the bindings.
-
Fixed the order of delegates in Viewmodels when adding and removing delegates while a delegate is executing.
-
Before deleting a Viewmodel, UMG will now check if the Viewmodel is in use by looiking through its bindings and conversion functions.
-
Updated the compiler error message for Viewmodels when a field is not found, most likely due to a missing FieldNotify.
-
Fixed accessing private UFunctions in Viewmodels with AllowPrivateAccess.
-
Fixed the ViewModel IsBindingValid error message, which did not include the full property type.
-
Fixed Viewmodel field pickers that do not show function when there is no filter.
-
Added support for arrays of object bindings in Viewmodels (the same way BP does).
-
UMG now detects circular reference in the widget tree at compilation.
-
Fixed an issue preventing widgets from registering multiple enhanced input actions.
-
Fixed an issue which caused cached slots in the viewport subsystem to fail to update when modified in a Blueprint's construction script.
-
Fixed CommonUI Action Domains not resetting config on editor reload.
-
Changed the displayname of some Viewmodel properties.
-
Changed the error message for when a Viewmodel field does not exist to include a possible solution to the problem. This tests if the field exists on the downcast struct instead of the previous property owner struct.
Deprecated:
- Removed the specialized Viewmodel editor in favor of using the Blueprint base editor instead.
Virtual Production
IO
New:
-
Added a tool for making fine adjustments to the nodal offset by hand.
-
Added an anamorphic distortion model and support for calibrating an anamorphic lens to the Camera Calibration plugin.
-
[Remote Control] Exposed websocket server bind address in project settings.
-
[Aja] Add options for HDR support.
- [Rivermax] Additions to Rivermax:
- Added more logs in the output stream for missing chunks.
- Changed rivermax output scheduling when stalls are detected.
- Added a Rivermax TRO override console variable.
-
Added HDR support for blackmagic media output.
-
Added additional deinterlacing methods and the ability to provide your own deinterlacer for video input.
-
[Remote Control] Added a setting to control allowed origins.
-
Added new frame locking mode to Rivermax capture.
-
[Remote Control] Enforce passphrase usage for clients outside localhost by default.
-
Added OCIO support for Aja and Blackmagic media sources. You can now select an OCIO configuration to be applied to your SDI feed before it's displayed in the engine.
-
Added media capture markup to track frames.
- Enabled new style output by default on any newly created media texture.
Improvement:
-
Changed Rivermax RTP timestamp to reduce media latency seen by analyzers.
-
Moved media capture sync point to its own thread for frame locking work.
Crash Fix:
-
Added protection against crash during Rivermax initialization when prerequisites are not met.
-
Fixed a Remote Control crash that occurs when invoking a setter method on a property in
CreateRCCall
.
Bug Fix:
-
Fixed Media Plate tiles and mips support in scene captures.
-
Fixed an issue where pre-cached EXR tiles missed updates with the Media Plate.
-
[Remote Control] Fixed Websocket server from keeping port open after changing it.
-
[Remote Control] Fixed remote control presets sometimes not finding objects in Play-In-Editor (PIE).
-
Fixed a race condition preventing Rivermax input stream to play.
- Fixed remote control crashes:
- GEditor was accessed without testing for nullptr.
PropertyWatchers
are now only used in-game
except for transform properties.- In
PropertyWatcher->CheckForChange
,IsIdentical
was called onLastFrameValue.GetData
without first checking if the last frame value had any data in it.LastFrameValue
should now be correctly initialized if it couldn't be done at the creation of the property watcher.
- Fixed Media Capture pooled render targets becoming invalid in the rendering thread during garbage collection.
Deprecated:
-
Deprecated the
UImgMediaPlaybackComponent
and its functionality has been entirely superseded by the Media Plate. -
[Media Capture] Deprecated
FMediaCaptureOptions
ResizeSource
in favor ofResizeMethod
.
nDisplay
New:
-
Added a new tab to the ICVFX panel to display the stage actor's details panel and components list. This allows users to edit any property on the stage actor without needing to go to the level editor window.
-
Added ability to alphabetically sort nDisplay cluster nodes and viewports in the tree view in the nDisplay editor.
-
Added global chroma key settings to nDisplay stage actor that can be used by any ICVFX camera, as well as for any overlapping chromakey when enabled.
Bug Fix:
-
Ensured the media plate material instance constant is properly transacted.
-
Fixed OpenColorIO display-view transforms not working on nDisplay nodes.
-
Fixed an issue where the buttons on the left panel of the color grading drawer overlap with other UI elements if the splitter was dragged too far to the left.
-
Fixed
UDisplayClusterGameEngine::Init
potentially corrupting command-line arguments during parsing. If a quoted argument contained a space (such as a path), other common sequences such as\n
and\t
, or octal escapes, were mishandled.
Deprecated:
- Deprecated the Custom Chroma key Enable flag, which has been replaced by a combo box in the parent chroma key settings that determines what kind of chroma key is used for the ICVFX camera.
Rendering
API Change:
- Assets must be re-saved to gain efficiency improvement. The asset must also be resaved if the configuration changes or when the library version is updated.
New:
-
Exposed OpenColorIO CPU color transforms on textures to editor blueprints.
-
Exposed OpenColorIO active viewport configuration control to editor blueprints.
-
Improved OpenColorIO asset load times by caching generated resources into the UAsset.
-
Added premultiplication and alpha inversion controls to the OpenColorIO public rendering interface.
-
Added OpenColorIO support for automatic conversions to and from the engine working color space when configs have a defined interchange color space.
Improvement:
- Updated default media plate material in Composure to new style output (regular color texture sampler).
Bug Fix:
-
Fixed in-game OpenColorIO to ensure it remains active when a high resolution screenshot is taken.
-
Patched the OpenColorIO library to disallow 1D texture resources.
-
Added the option to select
.ocioz
files in OpenColorIO configs. -
Fixed texture Derived Data Cache (DDC) invalidation for advanced source color and encoding settings.
Tools
New:
CineCameraRigRail
updates:- Added checkbox option to set all inheritance options at once.
- Added option to visualize and manipulate point rotation in the context menu.
- Implemented Drive Mode in the rig rail.
- Implemented speed visualization in the rig rail.
-
Disabled speed heatmap when
CineCameraRigRail
is driven by Sequencer. -
Added a mechanism to multi-user which enables clients to request preloading of level sequence assets.
-
Integrated the new multi-user level sequence preloading functionality into Sequencer Playlists.
-
Reintroduced the
bCheckReferencesOnDelete
editor setting. This is used by stage operators to prevent long running operations in fast paced environments. - Render Grid plugin:
- Made the render grid blueprint graph be an editor-time blueprint graph, to support editor-only blueprints.
- Made non-transient variables in render grid assets work again.
Improvement:
-
Fixed jumping current position when switching drive mode.
-
Fixed several bugs and issues in Render Grid plugin:
- Added multiple new blueprints.
- Added additional python example scripts
- Cleaned up the render grid UI.
Bug Fix:
-
[Virtual Scouting] Fixed user getting stuck and unable to deselect actors if both hands are holding an interact tool. Second tool now falls back to the navigation tool if the context menu is activated.
-
[Virtual Scouting] Prevent users from selecting zoom lens in VR Viewfinder. If lens options are changed during editor session by editing Project Preference > Cinematic Camera, VR Viewfinder will respect newly added lenses.
-
[Virtual Scouting] Disabled collision on camera mesh in Viewfinder tool.
-
The UDP message processor does not start processing messages until the PostDefault phase of engine startup. Users should not rely on the UDP message processor at startup.
-
Fixed missing key frames when importing 30 FPS ARKit takes recorded by the Live Link Face iOS app, using the Live Link Face Importer plugin.
업그레이드 노트
Animation
Runtime
Upgrade Notes:
- Added the Animation Compression Library (ACL) Plugin as an Engine plugin and set the ACL Plugin as the default animation compression codec. Licensees already using the ACL Plugin from the Unreal Marketplace with binary builds of the engine will automatically upgrade to the new version. Those using a source version of the ACL Plugin will have to remove their old version and bring any code changes manually over. New animations will use the ACL Plugin while old animations will continue to use their current codec.
Sequencer
Upgrade Notes:
- [Sequencer] Duplicating a shot or creating a new take now retains the shot's color tint.
Editor
API Change:
- Added API to
NodeTestGraphBuilder
to explicitly define custom names when connecting input/output nodes to the test graph.
Foundation
Core
Upgrade Notes:
- Deprecated
TDepletableMpmcQueue
as it uses spin-waiting that can cause priority inversion and subsequently deadlock on some platforms. UseTConsumeAllMpmcQueue
instead ofTDepletableMpmcQueue
.
Dev Tools
Upgrade Notes:
- LazyObjectPtr and ObjectPtr are no longer allowed as TMap keys in blueprint-enabled function arguments.Functions utilizing TMaps with an ObjectPtr as a key must be changed to use the raw pointer.
Framework
Blueprint Editor
Upgrade Notes:
- Input Event nodes are no longer allowed in animation blueprint event graphs. Instead, set a property value on the animation blueprint and set it in an input-enabled actor.
Gameplay
Upgrade Notes:
-
[Modular Gameplay Effects - Gameplay Ability System (GAS)] Moved some gameplay effect functionality into optional components. All existing content will automatically update to use components during PostCDOCompiled, if necessary.
-
Changed the default aspect ratio constraint to maintain Y FOV since camera FOV is now always handled as horizontal FOV. If preserving the exact framing for a given window size is important, you can specify the old setting value (maintain X FOV) in DefaultEngine.ini.
-
Added Enhanced Input User Settings, which stores player mappable keys and other input settings in a save game object. This feature is off by default and can be enabled in the Enhanced Input developer settings or in a config file.
-
Made the behavior of Enhanced Input when flushing the pressed keys consistent with the legacy system. This behavior is Default ON, but can be toggled off in the Project Settings > Enhanced Input.
Level Design and Art Tools
Geometry Core
API Change:
- Added a new
FLocalPlanarSimplify
class to provide an algorithm to locally simplify triangles connected to a specified set of edges, which is useful to improve mesh quality after operations that tend to add extra vertices only in known regions of a mesh – such as plane cuts and polygroup edge insertions. It is now used by the FMeshPlaneCut algorithm to improve the resulting mesh quality.
Modeling Tools
Upgrade Notes:
- The MatEd tool now warns the user if they have removed materials that are used by the mesh. If the user accepts the result with this warning active, the faces that used the removed material will be re-assigned a valid material, so the MatEd tool now cannot create meshes with invalid material assignments.
Procedural
Upgrade Notes:
-
The Spline Sampler now has a toggle to choose between bounded and unbounded sampling. To preserve behavior, previous Spline Samplers will remain unbounded. Newly created samplers will be bounded by default.
-
The Difference Node now better adheres to a common standard. Source Inputs are iterated on and Difference Inputs are combined into a union before the operation takes place. Previous nodes will receive an injected Union node along their input edge to preserve older behavior.
-
Refactored usage of TargetActor so it is used to do artifact targeting. In PCG blueprints, instead of using the TargetActor variable on PCGSpatialData, please use the GetTargetActor call on the PCGContext, passing it the previously used PCGSpatialData. When retrieving the target actor, use Context->GetTargetActor(SpatialData) instead of SpatialData->TargetActor.
Online
Online Subsystem
Upgrade Notes:
-
Refactored OSS EOS logic surrounding setting the BucketId for Sessions and Lobbies on creation and searches. Any BucketId can be set now from the game side by adding a setting with the following key FOnlineSessionSettings::Settings:
OSSEOS_BUCKET_ID_ATTRIBUTE_KEY
-
Added config toggle for OSS EOS to use EOS_Achievements_UnlockAchievements instead of unlocking achievements through stats. Added deprecation marker for stat implementation, to be removed in 5.4. To be added to a relevant engine config file:
[OnlineSubsystemEOS] bUseUnlockAchievements=True
-
Added bUsesPresence as an attribute in OSS EOS Sessions and Lobbies to retrieve it reliably instead of inferring it from other data. Wrapped new logic in config option bUseSessionPresenceAttribute. To be added to a relevant engine config file:
[OnlineSubsystemEOS] bUseSessionPresenceAttribute=True
Pixel Streaming
Upgrade Notes:
- Multiple Pixel Streaming streamers supported on one signaling server. This requires streamer id to be uniquely set and the updated Pixel Streaming infrastructure from Github.
Rendering
Lighting
Bug Fix:
- Fixed a bug related to light bounds for volumetric fog rendering.
Simulation
Physics
Upgrade Notes:
-
Added Predictive Interpolation, a new type of physics replication. Predictive Interpolation is a replication method that replicates behind the last received state from the server (interpolates), while still allowing for local physics manipulation (predictive). This replication is experimental and still a work in progress. The replication can be accessed by switching on Physics Prediction in Project Settings and then setting the Physics Replication Mode to Predictive Interpolation on the actor. Ensure the actor is set to replicate, replicate movement and the root component to simulate physics.
-
[Geometry Collection] The 'Bone Selected Material' has been removed from the user-facing materials list on Geometry Collection Components, simplifying the user experience, and removing the ability for the user to break Fracture Mode selection visualizations by changing this material.
UI
Slate
Upgrade Notes:
- Exposed the console variable
Slate.EnableInvalidationPanels
to shipping builds. Ensure the console variable is not in your .ini file to keep the previous behavior.
UMG
Upgrade Notes:
- Added viewmodel capability on all blueprints that implement the notification interface and removed the hidden viewmodel editor from the build. If you used the old editor, the regular blueprint editor should take over but you'll need to mark your properties as FieldNotify manually.
Virtual Production
Tools
Upgrade Notes:
-
Enabled multi-user support for Procedural Content Generation (PCG) actors.
-
GPU Memory and CPU Memory stats have been added to the Stage Monitor Tool.
-
Landscape Actor support has been enabled for multi-user.
-
Multi-user session information has been exposed in editor-only blueprints.
-
Improved the display of Live Link Face App in Switchboard tool.
-
Added multi-user custom event sequencing.
-
The
UE_ADDITIONAL_PLUGIN_PATHS
environment variable is now only supported in editor builds.