언리얼 엔진 5.0 출시 노트

언리얼 엔진 5.0의 신규 및 업데이트된 기능 개요

Choose your operating system:

Windows

macOS

Linux

새 소식

언리얼 엔진 5.0은 게임 개발자와 다양한 산업의 크리에이터들이 그 어느 때보다 큰 자유, 퀄리티, 유연함을 제공하는 차세대 리얼타임 3D 콘텐츠 및 경험을 실현할 수 있도록 합니다.

다음과 같은 기능이 추가되어 어떤 규모의 개발팀도 창작의 자유를 최대한 발휘할 수 있습니다.

  • 혁신적인 퀄리티: 나나이트, 루멘 등 세대를 뛰어 넘는 비주얼 퀄리티, 월드의 완전 동적 구현 같은 기능을 갖춘 혁신적인 신기술을 탑재해 보다 몰입감 넘치고 사실적인 인터랙티브 경험의 구현을 현실로 만들어 줍니다.

  • 더 넓은 월드: 더 크게 상상해 보세요. 언리얼 엔진 5.0은 확장 가능한 콘텐츠를 이용해 플레이어가 탐험할 수 있는 광활한 월드를 제작하는 데 필요한 툴과 에셋을 제공합니다.

  • 차세대 애니메이션과 모델링: 아티스트 친화적인 새 애니메이션 제작, 리타기팅, 런타임 툴을 대폭 확장된 모델링 툴세트와 결합해, 반복작업을 줄여 창작 속도가 더욱 빨라집니다.

  • 더 빠른 시작: 세련되고 유연한 UI를 통해 처음 시작하기 적합하게 업데이트된 산업별 맞춤형 템플릿, 기존 사용자도 새 버전으로 무리 없이 이전할 수 있는 마이그레이션 가이드 등 사용자 경험과 효율성이 향상되었습니다. 언리얼 엔진 5.0은 이전보다 더 쉽게 사용하고 학습할 수 있는 툴입니다.

렌더링

루멘 글로벌 일루미네이션 및 리플렉션

루멘은 씬과 라이트 변화에 즉각적으로 반응하는 완전 다이내믹 글로벌 일루미네이션 및 리플렉션 솔루션입니다. 아티스트와 디자이너는 루멘을 활용하여 더욱 다이내믹한 씬을 제작할 수 있습니다. 태양의 각도를 바꾸거나, 손전등을 켜거나, 외부의 문을 열거나, 벽에 구멍을 내면 상황에 따라 간접광과 리플렉션이 적용됩니다.

이 시스템은 밀리미터 단위의 디테일한 환경에서 킬로미터 단위의 광활한 환경까지 무한한 바운스와 간접 스펙큘러 리플렉션으로 디퓨즈 인터리플렉션을 렌더링합니다.

루멘 글로벌 일루미네이션 및 리플렉션 활성화

루멘 글로벌 일루미네이션 및 리플렉션 비활성화

이제 아티스트와 디자이너는 사전 연산된 라이팅이 텍스처에 베이크되어 있는 스태틱 씬에 얽매이지 않습니다. 개별 스태틱 메시에 대한 라이트 맵 UV를 구성하거나 라이팅을 다시 빌드할 필요 없이 에디터 내에서 변화를 바로 확인할 수 있어 시간이 크게 절약됩니다.

루멘은 효율적인 소프트웨어 레이 트레이싱을 구현하여 글로벌 일루미네이션 및 리플렉션이 다양한 그래픽 카드에서 실행되도록 지원하는 동시에 고급 비주얼을 위한 하드웨어 레이 트레이싱도 지원합니다.

언리얼 엔진 5 얼리 액세스 출시 이후로 루멘에서 향상된 사항은 다음과 같습니다.

  • 루멘 GI 및 리플렉션을 위한 완전한 하드웨어 레이 트레이싱 파이프라인

  • 매트릭스 어웨이큰스에서 차세대 콘솔에 탑재

  • 파 필드 하드웨어 레이 트레이싱(Far Field Hardware Ray Tracing)으로 넓은 시야 범위 지원

  • 고퀄리티 리플렉션을 제공하는 피드백 기반 표면 캐시

  • 콘텐츠 문제 해결에 유용한 루멘 시각화 뷰 모드

  • 특히 폴리지에 나타나는 파이널 개더(Final Gather) 퀄리티 향상

  • 특히 유광 리플렉션 및 이동하는 오브젝트 뒤쪽에 대해 리플렉션 디노이저 향상

  • 반투명 및 볼류메트릭 포그의 글로벌 일루미네이션 퀄리티를 높여 주는 반투명 파이널 개더

  • 랜드스케이프 지원

  • 멀티 바운스 글로벌 일루미네이션과 리플렉션에 보이는 GI의 퀄리티를 높여 주는 라디오시티 파이널 개더

  • 퀄리티/퍼포먼스 교환을 위해 유저 인터페이스에 루멘 세팅 노출

  • 서브서피스/양면 폴리지 셰이딩 모델 지원

자세한 정보는 루멘 글로벌 일루미네이션 및 리플렉션 문서를 참조하세요.

나나이트 가상화 지오메트리

나나이트의 가상화된 마이크로폴리곤 지오메트리 시스템을 사용하면 방대한 양의 지오메트릭 디테일이 포함된 게임을 만들 수 있습니다. ZBrush 스컬프트에서 사진측량 스캔까지 수백만 개의 폴리곤으로 구성된 영화 수준의 소스 아트를 바로 임포트하고, 리얼타임 프레임 레이트를 유지한 채로 눈에 띄는 퀄리티 손실 없이 수백만 번 배치할 수 있습니다.

나나이트는 인식 가능한 디테일만 스마트하게 스트리밍 및 처리하여 트라이앵글 수와 드로 콜의 제약을 크게 줄입니다. 노멀 맵에 디테일을 굽거나 디테일 레벨을 직접 작성하는 등 시간이 걸리는 작업을 제거하여 창작에만 집중할 수 있습니다.

image_3.png

언리얼 엔진 5 얼리 액세스 출시 이후로 나나이트에서 향상된 사항은 다음과 같습니다.

  • 디스크에서 나나이트 메시의 크기를 줄이는 최적화 컨트롤

    • 가장 중요도가 낮은 데이터를 제거함으로써 손실 압축에 가깝게 만들어 개발 과정에서 메시를 최적화할 수 있습니다. 예를 들어 테크 데모 ‘나나이트 세계의 루멘'에서는 조각상 중 하나의 가슴 부분에서 눈에 띄는 차이 없이 트라이앵글의 88%(및 디스크 크기)를 줄일 수 있었습니다.

  • 압축 기능을 향상해 동일한 퀄리티의 나나이트 메시를 사용할 때 차지하는 공간을 20%까지 줄일 수 있었습니다.

  • UE4에서 UE5로 프로젝트 변환 시 나나이트 검사 툴(Nanite Auditing Tool) 이 나나이트를 활용할 수 있도록 기존 콘텐츠의 대량 이동을 보조하고, 지원되지 않는 기능이 활성화되는 것 처럼 개발 과정에서 깨지게 되는 나나이트 콘텐츠를 진단합니다.

    image_4.png

    • 나나이트 검사 툴은 두 카테고리에서 스태틱 메시를 검사합니다.

      • 오류(Errors) 에서는 알파 테스트, 월드 포지션 오프셋, 픽셀 뎁스 등의 요소와의 머티리얼 비호환성과 같은 나나이트 활성화 메시에 관련된 이슈를 표시합니다.

      • 최적화(Optimize) 에서는 비호환성이 감지되지 않았다면 나나이트가 적용되지 않은 메시에서 나나이트를 활성화할 수 있는 방법을 표시합니다.

    • 메인 메뉴에서 툴(Tools) > 나나이트 툴(Nanite Tools) 을 선택하여 나나이트 검사 툴을 이용할 수 있습니다.

  • 나나이트 메시에서 와이어프레임, 셰이더 복잡도 최적화 같은 일반 뷰 모드를 지원합니다.

    • 셰이더 복잡도 뷰 모드는 픽셀당 셰이더 인스트럭션 개수를 히트맵으로 표시해 렌더링된 오브젝트를 전부 표시합니다. 나나이트에서 기존 머티리얼 복잡도 뷰 모드를 사용하면 8x8 타일당 나나이트 지오메트리의 고유 머티리얼 수를 보여주는 히트맵을 표시합니다. 이는 나나이트 패스에서 머티리얼의 일관성을 정의할 때 유용한 메트릭입니다.

  • 나나이트 메시를 향상해 UV 이음새에서 아티팩트 없이 라이트맵을 지원합니다.

  • 이제 Windows에서 나나이트를 사용하려면 DX12가 필요합니다. DX11 지원은 중단됩니다.

자세한 정보는 나나이트 가상화 지오메트리 문서를 참조하세요.

버추얼 섀도 맵(베타)

버추얼 섀도 맵은 언리얼 엔진 5의 나나이트, 월드 파티션 기능을 활용해 차세대 다이내믹 섀도잉을 실시간으로 제공합니다. 영화 수준의 에셋과 대규모 오픈 월드를 지원하는 데 필요한 높은 퀄리티의 섀도를 일관되게 제공합니다.

기존 다이내믹 섀도잉 기법은 소규모 또는 중간 규모의 월드로 제한되는 경우가 많고 디자이너와 아티스트가 퍼포먼스를 위해 퀄리티를 희생해야 했습니다. 반면 버추얼 섀도 맵은 가장 필요한 곳의 퀄리티를 자동으로 높여 주는 단일 통합 섀도잉 메서드를 제공합니다. 이제 사실적이고 부드러운 반그림자 및 컨택트 하드닝을 통해 먼 거리에 걸쳐 작은 오브젝트 및 큰 오브젝트에 일관된 퀄리티의 섀도를 적용할 수 있습니다.

퍼센티지-클로저 필터링(Percentage-Closer Filtering, PCF)의 균등하게 블러를 적용하고|세밀한 디테일을 제거합니다.

섀도 맵 레이 트레이싱(Shadow Map Raytracing, SMRT)은 컨택트 하드닝을 통해|실제처럼 부드러운 섀도를 구현합니다.

언리얼 엔진 5 얼리 액세스 이후로 버추얼 섀도 맵 시스템에서 향상된 사항은 다음과 같습니다.

  • 레벨 에디터의 새로운 시각화 모드

    image_7.png

  • 버추얼 섀도 맵과 디스턴스 필드 섀도를 통합해 파 필드 렌더링을 구현함으로써 폴리지가 있는 씬 향상

  • 더 많은 지오메트리 타입 추가 지원

  • (단순) 서브서피스 및 폴리지 머티리얼 추가 지원

    • 서브서피스 프로파일 및 투과는 아직 지원되지 않습니다.

  • 캐싱의 견고성, 퍼포먼스, 퀄리티 향상

  • 대규모 월드 좌표 지원

  • (실험단계 기능) 별도 스태틱 캐싱 지원

  • 이제 Windows에서 버추얼 섀도 맵을 사용하려면 DX12가 필요합니다. DX11 지원은 중단됩니다.

자세한 정보는 버추얼 섀도 맵 문서를 참조하세요.

템포럴 슈퍼 해상도

나나이트 마이크로폴리곤 지오메트리와 차세대 게임의 퀄리티에 대한 기대로 화면에 표시할 수 있는 디테일이 그 어느 때보다 높아졌습니다. 이 기대감을 충족시키기 위해, 언리얼 엔진 4의 하이엔드 플랫폼용 템포럴 안티 에일리어싱(Temporal Anti-Aliasing, TAA)의 대안으로 템포럴 슈퍼 해상도 알고리즘을 새로 개발했습니다.

템포럴 슈퍼 해상도는 언리얼 엔진에 기본 내장되어 높은 퀄리티의 업샘플링을 제공하고 폭넓은 하드웨어를 지원합니다. 템포럴 슈퍼 해상도는 디폴트 안티 에일리어싱 메서드이며 모든 프로젝트에서 활성화되어 있습니다.

템포럴 슈퍼 해상도의 특징은 다음과 같습니다.

  • 1080p의 낮은 입력 해상도로 네이티브 4K 렌더 퀄리티에 가깝게 출력해 프레임 레이트 및 렌더링 퀄리티를 모두 향상합니다.

  • UE4의 템포럴 안티 에일리어싱 사용 시, 디테일이 정교한 배경에서 보이던 고스트 현상이 줄어들었습니다.

  • 복잡도가 높은 지오메트리에서 플리커링이 줄어들었습니다.

  • 콘솔에 다이내믹 해상도 스케일링을 지원합니다.

  • D3D11, D3D12, Vulkan, Metal, PlayStation 5, Xbox Series S|X를 지원하는 모든 하드웨어에서 실행됩니다.

  • DirectX 12 셰이더 모델 6을 지원합니다.

  • 셰이더가 PlayStation 5 및 Xbox Series S|X GPU 아키텍처에 맞게 최적화되었습니다.

다음의 비교 예시에서는 네이티브 4K 렌더링과 1080p 해상도 업스케일링이 적용된 4K 렌더링 간 프레임의 퀄리티 및 퍼포먼스 차이가 나타납니다. 템포럴 슈퍼 해상도를 사용하면 네이티브 4K 해상도에 가까운 이미지 퀄리티를 달성하면서도 GPU의 프레임 시간을 약 50% 단축할 수 있습니다.

네이티브 4K 해상도로 렌더링된 4K 프레임|프레임 시간: 57.50ms

1080p 해상도로 렌더링된 4K 프레임(r.ScreenPercentage=50)|프레임 시간: 33.37ms

각 비교 이미지에서 4K 이미지는 이 페이지의 너비로 제한됩니다. 줄어들지 않은 전체 해상도로 이미지를 보려면 우클릭한 뒤 새 탭에서 열기 또는 다른 이름으로 이미지 저장 을 선택합니다.

향상된 패스 트레이서(베타)

패스 트레이서는 언리얼 엔진 5.0에서 또 다시 향상되어 물리적으로 더욱 정확하고 타협 없는 결과를 구현합니다. 실측 자료(Ground Truth)와의 비교 및 단일 프레임 렌더에 사용할 수 있으며, 시퀀서의 무비 렌더 큐와 함께 사용해 프레임을 렌더링하면 고퀄리티 시네마틱을 만들어낼 수 있습니다.

이번 버전에서는 다음과 같은 사항이 향상되었습니다.

  • 머티리얼 지원:

    • 헤어(실험단계 기능)

    • 알파 채널

  • 네이티브 레이 트레이스드 뎁스 오브 필드

  • 이제 두께를 가진 유리가 (비어 법칙이 적용된) 컬러 흡수를 지원해 두꺼운 색유리에 사실적인 굴절이 구현됩니다.

    image_10.png image_11.png image_12.png image_13.png

  • 아티스트는 PathTracingQualitySwitch 표현식을 사용해 실시간 래스터 패스의 룩과 퍼포먼스를 희생하지 않고도 패스 트레이서에 대한 머티리얼 작동을 향상시킬 수 있습니다.

  • 샘플링 및 퍼포먼스 향상

자세한 정보는 패스 트레이서 문서를 참조하세요.

로컬 노출 포스트 프로세싱

로컬 노출은 아티스트가 제어하는 파라미터 내에서 노출에 맞춰 로컬 조정을 자동으로 적용하는 새 기법입니다. 기존 글로벌 노출 시스템을 이탈했을 때도 이 기술로 하이라이트 및 섀도 디테일을 모두 보존할 수 있습니다.

특히 다이내믹 라이팅으로 다이내믹 범위가 넓어진 까다로운 씬이 존재하는 프로젝트에서, 단일 글로벌 노출 조정으로는 과도한 하이라이트 및 완전히 어두운 섀도를 피하기 어려운 경우에 유용합니다.

예를 들어, 동적으로 시간대가 변하는 게임에서 플레이어는 문이나 창문 너머로 매우 밝은 야외가 보이는 실내 씬처럼 노출 대비가 높아 게임플레이를 방해하는 씬을 마주칠 가능성이 높습니다. 로컬 노출을 사용하면 씬마다 세심하게 제작한 라이팅을 구현할 수 없는 경우 훨씬 일관적인 최종 이미지를 얻는 데 도움이 됩니다.

로컬 노출: 활성화

로컬 노출: 비활성화

로컬 노출 프로퍼티는 포스트 프로세스 볼륨(Post Process Volume)렌즈(Lens) > 로컬 노출(Local Exposure) 카테고리에서에서 찾을 수 있습니다.

image_16.png

씬에 로컬 노출이 어떻게 적용되는지 확인하려면 레벨 뷰포트의 표시(Show) > 시각화(Visualization) 메뉴에서 시각화를 사용합니다.

image_17.png

로컬 노출에 대한 자세한 정보는 자동 노출을 참조하세요.

포스트 모션 블러 반투명

(월드 내 UI 요소 등) 특정 이펙트는 현재 반투명 패스 내에서 렌더링될 경우 모션 블러 및 템포럴 안티 에일리어싱과 같은 포스트 프로세싱 이펙트로 인해 퀄리티가 저하되고 아티팩트가 발생할 수 있습니다.

언리얼 엔진 5.0에서는 아티스트가 모션 블러나 템포럴 안티 에일리어싱에 영향을 받지 않는 반투명 머티리얼을 생성할 수 있도록 새로운 포스트 모션 블러 반투명 패스를 도입했습니다.

머티리얼의 디테일 패널 프로퍼티에서 포스트 모션 블러 패스에 반투명 머티리얼을 할당할 수 있습니다. 반투명(Translucency) > 고급(Advanced) 섹션의 반투명 패스(Translucency Pass) 드롭다운 메뉴에서 모션 블러 후(After Motion Blur) 를 선택합니다.

모션 블러를 적용한 파티클 시스템

모션 블러 후 반투명 패스를 적용한 파티클 시스템

지금은 이 패스에서 뎁스 테스트를 지원하지 않습니다. 즉, 모션 블러 후 설정으로 렌더링된 오브젝트는 씬에서 카메라에 더 가까이 있는 오브젝트가 있더라도 가려지지 않습니다.

머티리얼 에디터 접기 가능한 노드

노드 접기 는 머티리얼 에디터의 새 기능으로, 이 기능을 사용하면 여러 개의 머티리얼 표현식 또는 함수를 선택해 머티리얼 그래프에서 단일 노드로 접을 수 있습니다. 노드 접기는 복잡한 머티리얼 네트워크를 간단하게 만들어 가독성과 인터랙션성을 높여 줍니다. 언제든지 접은 노드를 우클릭한 후 컨텍스트 메뉴에서 노드 펼침(Expand Node) 을 선택하면 접은 노드의 기존 환경설정을 복구할 수 있습니다.

image_20.gif

DirectX 12

이제 언리얼 엔진 5의 기능을 사용해 Windows PC의 RHI를 구현할 때는 Microsoft의 DirectX 12(DX12)를 권장합니다. 에픽에서는 엔진에서 DX12 지원을 강화하는 동안 메모리 관리, 기능 무결성, 안전성을 최우선으로 고려할 예정입니다. 언리얼 엔진 5에서 새로 생성한 프로젝트는 기본적으로 DX12를 사용합니다.

Vulkan

언리얼 엔진 5의 Vulkan RHI는 여러 번의 안정성 및 기능 업데이트를 통해 데스크톱 및 모바일에서의 효율이 향상되었습니다. Linux에 나나이트, 루멘(소프트웨어 레이 트레이싱 전용) 등 언리얼 엔진 5 기능이 지원됩니다.

사양에 대한 자세한 정보는 하드웨어 및 소프트웨어 사양 문서를 참조하세요.

대규모 오픈 환경을 위한 월드 파티션

월드 파티션은 에디터와 런타임에서 사용되는 데이터 관리 및 스트리밍 시스템으로, 스트리밍을 관리하고 데이터 경쟁을 줄이기 위해 월드를 수많은 서브레벨로 직접 나눌 필요가 없게 해 줍니다.

월드 파티션을 사용하면 월드가 단일 퍼시스턴트 레벨로 존재하게 됩니다. 에디터에서 월드는 2D 그리드로 분할되고, 데이터는 월드 파티션 에디터 창에서 관심 영역에 기반하여 부분 로딩됩니다. 다른 방식으로는 메모리에 맞지 않거나 로딩하는 데 오랜 시간이 걸렸을 대규모 월드를 처리할 수 있습니다. 쿠킹하거나 PIE로 시작할 때 월드는 런타임 스트리밍에 최적화된 그리드 셀로 나뉘어 개별 스트리밍 레벨이 됩니다.

image_21.jpg

월드 파티션은 언리얼 엔진 5.0 얼리 액세스 출시 이후로 다음과 같이 향상되었습니다.

  • 새로운 오픈 월드 및 빈 오픈 월드 디폴트 맵 타입

  • 스트리밍 소스에서 커스텀 셰이프 지원

  • 랜드스케이프 브러시 지원

  • 월드 파티션 레벨에서 배치 프로세스를 자동화하고 데이터를 생성 및 수정하는 새로운 빌더 커맨드릿

월드 파티션은 오픈 월드 및 빈 오픈 월드 맵 타입뿐만 아니라 게임용으로 설계된 대다수의 새 프로젝트 템플릿을 사용할 때 기본적으로 활성화되어 있습니다.

월드 파티션 사용에 대한 자세한 정보는 월드 파티션 문서를 참조하세요.

월드 파티션 데이터 레이어

월드 파티션 데이터 레이어는 에디터에서, 그리고 런타임 시 레이어를 활성화 및 비활성화해 조건부로 월드 데이터를 로드하도록 설계된 시스템입니다. 데이터 레이어는 에디터에서 월드를 체계적으로 정리하는 훌륭한 방법입니다. 또한 게임 내 서로 다른 시나리오를 처리하고 동일한 월드의 다양한 베리에이션을 생성할 때도 사용할 수 있습니다. 이 방식으로 밤과 낮을 다르게 구성할 때나 퀘스트 완료 후 월드에 변화가 생기도록 할 때 적합합니다.

에디터의 '데이터 레이어(Data Layers)' 탭이나 액터의 '디테일(Details)' 패널에서 데이터 레이어를 제어할 수 있습니다.

image_22.jpg

자세한 정보는 월드 파티션 - 데이터 레이어 문서를 참조하세요.

액터당 한 개의 파일

새로운 액터당 한 개의 파일(One File Per Actor) 시스템은 월드 파티션과 함께 작동하여 대규모 월드에서 공동 편집을 더욱 쉽게 만들어 줍니다. 레벨 에디터는 개별 액터를 단일 모놀리식 레벨 파일로 그룹화하지 않고 자체적인 파일로 저장합니다. 즉, 전체 레벨이 아닌 소스 컨트롤에서 필요한 액터만 체크아웃하면 됩니다.

이 기능은 월드 파티션을 사용할 때 기본적으로 활성화되어 있습니다.

자세한 정보는 액터당 한 개의 파일 문서를 참조하세요.

자동 그리드 기반 HLOD

자동 그리드 기반 계층 레벨 오브 디테일(HLOD) 시스템은 월드 파티션으로 작업하는 동안 커스텀 데이터 구동 HLOD 레이어를 만들어, 로드한 지역 외부에 표시되는 다수의 스태틱 메시 액터를 최적화합니다. 이 기능은 인스턴스드 스태틱 메시 컴포넌트(ISM), 혹은 언로드 된 월드 파티션 그리드 셀에 표시될 프록시 메시를 사용하는 최소한의 HLOD 세트를 제공해, 드로 콜의 수를 줄이고 퍼포먼스를 향상합니다.

image_23.jpg

이 프록시 메시는 기존 액터 지오메트리를 사용해 생성되며, 단순화 작업을 거쳐 메모리 사용량이 감소합니다.

자세한 정보는 월드 파티션 - 계층형 레벨 오브 디테일 문서를 참조하세요.

대규모 월드 좌표

이제 대규모 월드 좌표(Large World Coordinates, LWC)가 언리얼 엔진 5에서 더블 정밀도 데이터 베리언트 타입을 지원합니다. 부동 소수점 정밀도를 향상하기 위해 UE5의 모든 엔진 시스템 전반에서 커다란 변화가 이루어졌습니다. 새로운 엔진 시스템에는 건축 시각화, 시뮬레이션, 렌더링 (나이아가라 및 HLSL 코드), 대규모 월드 스케일 프로젝트 등이 있습니다. 대규모 월드 좌표를 UE의 모든 곳에서 실행하고 노출하도록 많은 개발 작업을 진행했지만, 원래 지점에서 멀리 떨어진 일부 시스템의 경우 아직 해결하지 않은 정밀도 문제 때문에 몇 가지 제한이 존재합니다.

라이선스 이용자는 코드를 바로 이 신규 데이터 타입으로 옮기기 시작할 수 있으나, 엔진의 전 시스템이 대규모에서도 지금처럼 효율적으로 작동하는지 확인한 후, 5.1 버전에서 대규모 월드에 대한 생성 및 배치를 정식으로 지원할 예정입니다. 이후 최대 월드 크기의 디폴트 값을 매우 큰 수치로 설정할 것입니다.

언리얼 엔진 4에서는 32비트 플로트 정밀도 타입으로 인해 월드의 크기가 제한되었습니다. LWC는 코어 데이터 타입으로 64비트 더블을 제공하여 프로젝트 크기를 크게 향상시킵니다. 이 변화로 대규모 월드를 구축할 수 있게 되었으며, 액터 배치 정확도 및 오리엔테이션 정밀도가 크게 향상되었습니다. 대규모 월드 좌표는 더블 타입을 사용하기 때문에, PhysX 피직스 시스템 은 UE5와 호환되지 않습니다.

대규모 월드 실험에 관련된 자세한 정보는

[대규모 월드 좌표](making-interactive-experiences/Worlds/large-world-coordinates/)
문서를 참조하세요.

애니메이션

컨트롤 릭 향상

컨트롤 릭은 이제 정식 버전으로 바뀌어 디폴트로 활성화되며, 언리얼 엔진 5.0에서 캐릭터를 리깅하고 애니메이팅할 수 있는 여러 새로운 툴, 기능 모드를 지원합니다.

애니메이션 모드

애니메이션 모드(Animation Mode) 는 더욱 애니메이션 친화적인 인터페이스를 제공하도록 향상되었습니다.

애님 아웃라이너(Anim Outliner)애님 디테일(Anim Details) 패널에서 컨트롤 및 프로퍼티 목록을 필터링 할 수 있게 되어 선택 사항과 키프레임 어트리뷰트를 손쉽게 관리할 수 있습니다.

image_24.png

애니메이션 워크플로를 보조할 수 있는 여러 툴도 제공됩니다. 이 툴에는 컨트롤에 사용한 포즈를 저장하고 재사용할 수 있는 포즈 툴(Pose Tool), 뷰포트에서 키프레임별 움직임을 시각화할 수 있는 모션 트레일 툴(Motion Trail Tool)이 포함됩니다.

image_25.png

애니메이션 모드에 대한 자세한 정보는 애니메이션 모드 페이지를 참조하세요.

스페이스 전환

스페이스 전환 으로 컨트롤의 부모를 빠르고 쉽게 변경할 수 있습니다. 이 기능을 사용하면 새 스페이스가 실시간으로 생성되어 시퀀서 내에서 키프레이밍되거나, 컨트롤 릭 에셋에서 미리 구축할 수 있습니다. 결과적으로, 복잡한 컨스트레인트 전환 로직을 생성할 필요 없이 컨트롤의 공간적인 부모를 동적으로 변경할 수 있습니다.

SpaceSwitch.gif

애니메이팅 시 스페이스 전환을 사용하는 자세한 방법은 스페이스 전환 페이지를 참조하세요.

노드작업 향상

블루프린트 워크플로와 더욱 비슷해지도록 컨트롤 릭을 만들 때 노드 작업 동작을 추가하고 향상시켰습니다.

이제 컨트롤 릭 내에서 함수 를 생성할 수 있습니다. 함수를 활용하면 큰 그래프를 더욱 잘 정리하고 로직을 반복하며 컨트롤 릭들 간에 기능을 손쉽게 공유할 수 있습니다.

image_27.png

또한 배열 도 생성 및 저장할 수 있어 아이템 세트 관리가 더욱 쉬워졌습니다. 이 새 배열 타입은 컬렉션 타입을 대신해 배열 아이템을 추가 제거, 작업할 수 있는 새 노드 세트를 다수 제공합니다.

image_28.png

Python 스크립팅

이제 컨트롤 릭에서 Python 스크립팅 을 사용하여 리깅 프로세스에 필요한 워크플로를 자동화하고 툴을 생성할 수 있습니다. 컨트롤 릭 Python 로그 를 사용하여 명령을 리버스 엔지니어링하고 스크립트를 복사하여 다른 프로젝트에 공유할 수도 있습니다.

image_29.png

자세한 정보는 컨트롤 릭 Python 스크립팅 페이지를 참조하세요.

IK 릭 및 IK 리타기터

IK 릭 시스템은 IK 솔버(신규 풀 바디 IK 포함)를 인터랙티브하게 생성하고 이 솔버들에 타깃 목표를 정의하는 메서드를 제공합니다. 이 결과로 생성된 IK 릭 에셋을 애니메이션 블루프린트에 임베딩하여 런타임에서 목표를 제어할 수 있습니다. 이 새로운 리타기팅 메서드는 제거된 언리얼 엔진 4의 리타기팅 매니저의 기능을 대신합니다.

image_30.png

또한 IK 릭은 IK 리타기터(IK Retargeter) 를 사용하여 서로 다른 스켈레탈 메시 간의 애니메이션 리타기팅을 향상시킬 수도 있습니다. 이 새 리타기팅 시스템을 사용하면 두 스켈레톤 사이에 애니메이션을 정확하게 전달할 수 있습니다. 런타임 시 전달하거나 오프라인 익스포터를 사용하는 애니메이션 블루프린트 및 시퀀스를 복제하면 됩니다.

Retarget.gif

IK 릭 및 IK 릭 리타기팅에 대한 자세한 정보는 IK 릭 페이지를 참조하세요.

블렌드 스페이스 향상

블렌드 스페이스는 언리얼 엔진 5.0에서 다양한 신기능과 새 동작을 포함하도록 개선되었습니다.

스무딩

스무딩(Smoothing) 은 다양한 스무딩 타입과 시간을 손쉽게 설정할 수 있도록 바뀌었습니다. 선형(Linear), 이즈 인/아웃(Ease In/Out), 스프링 댐퍼(Spring Damper) 등 여러 타입의 보간을 선택할 수 있습니다.

다양한 스무딩 프로퍼티에 대한 자세한 정보는 블렌드 스페이스 에셋 디테일 섹션을 참조하세요.

Smoothing.gif

블렌드 스페이스 그래프

이제 블렌드 스페이스 그래프 를 생성하여 애니메이션 블루프린트에서 바로 블렌드 스페이스를 생성할 수도 있습니다. 이러한 그래프를 통해 애니메이션 블루프린트에 특화된 블렌드 스페이스를 생성하고, 다른 에셋으로부터 분리시키며, 샘플 로직을 편집할 수 있습니다.

블렌드 스페이스 그래프에 대한 자세한 정보는 블렌드 스페이스 사용하기 페이지를 참조하세요.

image_33.png

블렌드 스페이스 분석

블렌드 스페이스 분석 으로 블렌드 스페이스 샘플 배치 및 관리를 자동화할 수 있게 되었습니다. 로코모션, 조준 등 가장 일반적인 블렌드 스페이스 셋업에 사용 가능한 몇 가지 분석 함수가 제공됩니다.

블렌드 스페이스 분석에 대한 자세한 정보는 블렌드 스페이스 분석 페이지를 참조하세요.

BSAnalysis.gif

되감기 디버거

되감기 디버거(Rewind Debugger) 의 도입으로 애니메이션 디버깅이 더욱 향상되었습니다. 특정한 시점으로 일시정지, 스텝 및 되감기하는 액터 및 애니메이션 이벤트의 게임플레이 타임라인 캡처를 사용할 수 있습니다. 씬에서 디버깅할 액터와 오브젝트도 쉽게 선택할 수 있습니다. 되감기 디버거를 통해 게임플레이 애니메이션이 라이브로 재생될 때 어떻게 작동하는지 더 깊이 이해할 수 있게 되었습니다.

스켈레톤 향상

애니메이션 미러링

이제 미러 데이터 테이블(Mirror Data Table)Mirror 노드 를 사용하여 애니메이션 블루프린트에서 캐릭터 애니메이션을 손쉽게 미러링할 수 있습니다. 미러 데이터 테이블로 애니메이션 시퀀스뿐만 아니라 커브, 싱크 마커, 노티파이도 미러링할 수 있습니다.

이 기능에 대한 자세한 정보는 애니메이션 미러링 페이지를 참조하세요.

Mirroring.gif

스켈레톤 호환성

새로운 스켈레톤 호환성(Skeleton Compatibility) 프로퍼티로 장황한 리타깃 또는 리임포트 워크플로 작업 없이도 다른 스켈레톤 간 데이터를 공유할 수 있습니다. 이 기능을 사용하면 유사한 스켈레톤이 애니메이션 시퀀스, 애니메이션 블루프린트, 블렌드 스페이스 같은 애니메이션 데이터를 쉽게 공유할 수 있습니다. 스켈레톤 호환성을 유지하려면 호환하려는 스켈레톤의 이름이 동일해야 합니다.

CompatibleSkeletons.gif

향상된 로코모션

이제 언리얼 엔진 5.0에 다양한 게임플레이 시나리오에 맞춰 애니메이션을 조정하는 기능이 포함됩니다.

디스턴스 매칭

애니메이션 블루프린트에서 새로운 디스턴스 매칭(Distance Matching) 기능을 사용하여 게임플레이 애니메이션의 속도와 재생을 절차적으로 관리합니다. 디스턴스 매칭을 사용하면 애니메이션 재생을 애니메이션 커브 데이터를 사용하는 캐릭터 모션에 동기화합니다. 해당 조정을 스트라이드 워핑 에 결합하여 흔한 발 미끄러짐과 관련된 문제를 해결할 수 있습니다.

DistanceMatchingOff.gif

DistanceMatchingOn.gif

디스턴스 매칭 없음

디스턴스 매칭 사용

포즈 워핑

이제 포즈 워핑(Pose Warping) 으로 캐릭터의 보폭 방향, 걷기 속도, 발 배치를 절차적으로 변경할 수 있습니다. 포즈 워핑은 애니메이션 포즈의 컴포넌트를 동적으로 워프할 수 있는 애니메이션 블루프린트의 새 노드 세트입니다. 이러한 노드를 사용하면 캐릭터의 복잡한 애니메이션을 개발하는 데 필요한 수작업이 줄어듭니다.

새 노드와 그 기능에 대한 자세한 정보는 포즈 워핑 페이지를 참조하세요.

OrientationOFF.gif

OrientationON.gif

오리엔테이션 워핑 없음

오리엔테이션 워핑 사용

모션 워핑

신기능 모션 워핑(Motion Warping) 으로 캐릭터의 루트 모션을 동적으로 워프합니다. 모션 워핑을 사용하면 애니메이션 노티파이를 이용해 ‘워핑 윈도'를 정의한 뒤 블루프린트에서 설정하여 임의의 타깃으로 워프할 수 있습니다.

자세한 정보는 모션 워핑 페이지를 참조하세요.

MotionWarpingResult.gif

머신 러닝 디포머

이제 새로운 머신 러닝(Machine Learning, ML) 디포머를 사용하여 실시간 메시 디포메이션을 생성할 수 있습니다. ML 디포머의 목표는 영화 수준으로 오프라인에서 작업된 디포메이션을 실시간으로 가져오는 것입니다. 이 작업은 선형 스키닝된 스켈레탈 메시 위에 보정 디포메이션을 적용하는 방식으로 작동합니다. 이렇게 보정을 적용하면 오프라인 디포메이션에 더욱 근접하게 보입니다. 보정은 머신 러닝 알고리즘에 의해 학습됩니다.

ML 디포머를 훈련하는 데에는 복잡한 디포메이션과 선형 스키닝을 둘 다 사용하는 변형된 예시 포즈가 수천, 수만 개 필요하고 디포머는 그 예시 포즈들의 차이를 학습하여 런타임에 적용합니다. 에픽은 훈련 데이터 생성을 돕기 위해 Maya 플러그인도 만들었습니다. 하지만 이 플러그인을 반드시 사용해야 하는 것은 아닙니다.

이 기능은 아직 완전히 실험단계에 있습니다. 메모리가 상당히 많이 필요하며 아직 퍼포먼스가 최적화되지 않았습니다.

ML 디포머 사용법에 대한 자세한 정보는 머신 러닝 디포머 사용하기 페이지를 참조하세요.

pants.gif

오디오

메타사운드

완전히 프로그래밍 가능한 머티리얼 및 렌더링 파이프라인을 가진 머티리얼 에디터와 유사한 이 새로운 시스템을 통해 오디오 렌더링의 모든 측면을 관리하여 차세대 프로시저럴 오디오 경험을 끌어낼 수 있습니다.

메타사운드는 게임 데이터 및 블루프린트의 오디오 파라미터와 오디오 이벤트를 사용하여 사운드를 샘플 단위로 정확하게 제어 및 변조합니다. 또한 메타사운드 내에서 메타사운드를 구성하고, 파라미터 인터페이스를 정의 및 구현하고, 사용자 워크플로를 효율화하는 프리셋 시스템을 사용하도록 해 줍니다.

메타사운드는 사운드 큐 전반에서도 퍼포먼스가 크게 개선되었으며, 서드파티 플러그인에서 사용할 수 있는 완전 확장 가능 API를 제공합니다.

image_43.png

프로젝트 어쿠스틱

image_44.png

에픽은 마이크로소프트(Microsoft)의 프로젝트 어쿠스틱(Project Acoustics) 팀과 협업하여 UE5용 프로젝트 어쿠스틱 플러그인을 심층 통합했습니다. 프로젝트 어쿠스틱은 오디오 프로퍼게이션, 리버브 및 기타 고급 음향 프로세싱의 시뮬레이션을 가능하게 해 주는 베이크된 차세대 음향 시스템입니다. 퍼포먼스 및 확장성에 중점을 둔 프로젝트 어쿠스틱은 이미 수많은 AAA 게임에서 활용하고 있으며, 곧 모든 언리얼 엔진 사용자가 언리얼 마켓플레이스에서 사용할 수 있습니다.

프로젝트 어쿠스틱에 대한 자세한 정보는 마이크로소프트의 프로젝트 어쿠스틱 개요에서 읽어보실 수 있습니다.

지오메트리 툴

지오메트리 툴은 모든 산업의 언리얼 아티스트들에게 모든 해상도에서 메시를 생성 및 편집할 수 있는 다양한 툴을 제공합니다. UE 5.0에는 모델링, 베이킹, UV 편집에 필요한 새로운 툴 및 향상된 툴의 호스트가 포함됩니다. 아키텍처 기술의 발전은 이러한 향상을 지원하여 미래를 위한 프레임워크를 만듭니다.

image_45.png

모델링 툴

트랜스폼 툴
  • 모델링 모드의 트랜스폼 툴에서 스냅 및 정렬 기능을 확장하여 여러 메시의 작업 시간이 대폭 단축되었습니다.

스내핑
  • 폴리에디트 스내핑 - 폴리에디트 툴에 스냅 및 정렬 기능이 추가되었습니다.

  • 볼륨 및 다이내믹 메시 버텍스/에지 스내핑 - 이제 볼륨 및 다이내믹 메시에 버텍스 및 에지 스내핑 기능을 사용할 수 있습니다.

프리미티브 툴
  • 프리미티브 추가 툴 중 계단 생성기에서 플로팅, 커브, 나선 계단을 지원합니다.

  • 다이내믹 메시 액터/컴포넌트 - 모델링 툴 내부에 볼륨뿐만 아니라 다이내믹 메시 액터 및 컴포넌트 타입도 추가되었습니다. 다이내믹 메시 액터는 프로젝트 세팅에서 활성화할 수 있습니다. 다이내믹 메시 액터는 에디터에서 시리얼라이즈, 복사, 옮기기 등의 작업을 수행할 수 있고 PIE 및 빌드된 게임에서 작동합니다. 현재는 복합 콜리전만 지원하고 있으며, 단순 콜리전 지원은 향후 추가할 예정입니다.

폴리 편집 툴
  • 폴리 편집 툴의 성능 및 효율성 면에서 다수의 향상 작업이 이루어졌습니다.

    • 에지 루프 삽입 - 에지 루프 삽입 툴에 루프를 정지시키는 문제 그룹(쿼드 아님)을 강조하는 기능이 추가되었습니다. 이를 통해 삽입 관련 제한을 보다 쉽게 파악하고, 사용자가 툴을 도우려면 그룹 토폴로지를 어떻게 조정해야 하는지 힌트를 얻을 수 있습니다.

    • 그룹 에지 삽입 - 그룹 에지 삽입 툴을 폴리 편집 툴로 이전해 워크플로를 개선하고 툴의 이동 경로를 단축했습니다.

    • 평면 컷 - 사용자가 정한 컷 방향에 따라 선택한 면을 컷하는 자르기 툴이 추가되었습니다.

    • 재트라이앵글화 - 재트라이앵글화는 선택한 폴리그룹에 있는 트라이앵글을 재계산합니다.

    • 범위 선택 - 이제 모든 메시 컴포넌트 타입의 폴리에디트에서 범위 선택을 사용할 수 있습니다.

    • 익스트루드 - 익스트루드에 방향, 측정 방향, 폴리그룹 생성 옵션이 추가되었습니다.

    • 그룹별 단순화 - 모델링 작업을 반복한 뒤 토폴로지의 효율이 감소할 수 있습니다. 그룹별 단순화는 사용자가 정의한 영역에 기반해 메시를 수정하는 강력한 툴입니다.

    • 푸시/풀 - 푸시/풀 툴은 ‘불린 익스트루드'의 역할을 합니다. 토폴로지 편집 대신 익스트루드 된 메시는 덩어리로 작동하며 더하기/빼기 처리됩니다. 이를 통해 메시에 구멍을 내는 등의 작업이 가능합니다.

    • 베벨 - 새로운 베벨 툴이 폴리에디트에 추가되었습니다.

큐브 그리드 툴
  • 큐브 그리드 툴은 에셋이나 레벨을 신속하게 개발할 수 있는 툴입니다. 툴에는 다음과 같은 옵션이 있습니다.

    • 그리드 유닛 선택/선택 해제

    • 선택한 대상 푸시/풀

    • 그리드 크기 조정

    • 그리드를 직각이 아닌 방향으로 변경/스냅

LOD 매니저
  • LOD 매니저 를 사용하면 뷰포트에서 직접 LOD를 조사하고 관리할 수 있습니다.

    • 고해상도 소스 모델에서 LOD0 복원

    • 뷰포트의 컨텍스트에서 개별 LOD 프리뷰

    • 소스 모델 및 렌더 데이터 LOD 비교

피벗 액터
  • 피벗 액터 툴은 선택한 액터의 빈 액터 부모를 새로 생성합니다. 이 기능은 기존 DCC의 ‘로케이터'와 유사합니다. 피벗 액터를 사용하면 쉽게 트랜스폼을 제어하고 관리할 수 있습니다.

서브디비전
  • 서브디비전 툴을 사용하면 모델러 및 스컬프터에서 다양한 서브디비전 기법을 이용해 메시를 더 높은 해상도에 추가/스무딩해 적절한 해상도를 생성할 수 있습니다. 해당 툴의 현재 지원 기능은 다음과 같습니다.

    • 이중선형 서브디비전 - 이중선형 서브디비전을 사용해 간단히 폴리그룹을 서브디비전할 수 있지만 부드러운 표면은 생성할 수 없습니다.

    • 루프 서브디비전 - 루프 서브디비전은 트라이앵글 메시에 직접 적용됩니다. 폴리그룹 토폴로지가 있는 메시와 폴리그룹이 없는 메시에 모두 적용할 수 있다는 뜻입니다. 적용 시 비슷한 부드러운 표면을 생성합니다.

    • 개방형 서브디비전/캣멀-클라크 - 캣멀-클라크(Catmull-Clark)는 쿼드 메시를 대상으로 상대적으로 간단하고 체계적인 폴리그룹 토폴로지에 의존하도록 설계되었습니다.

    • 새 폴리그룹 - 서브디비전의 레벨별로 새 폴리그룹을 생성하는 옵션이 존재합니다. 이 옵션을 사용하면 폴리 편집처럼 툴을 이용해 지속적으로 수정/모델링할 수 있습니다.

폴리컷
  • 폴리컷 툴을 개선해 메시 부울 기반 연산 기능을 추가했습니다. 새 모드에서는 절단 시 한 개 이상의 레이어를 통과하거나, 커브를 절단 시 대상 메시의 에지를 지나 계속 진행할 수 있습니다.

불린
  • 메시 불린 및 셀프 유니언을 대폭 향상했습니다. 이제 툴을 사용해 로우 레벨 메시 연산에 도입된 가짜 에지를 제거할 수 있습니다. 이 에지들은 여러 번의 연산을 거치는 동안 축적되어 정밀도 오류를 일으킬 수 있습니다. 이번 향상은 견고성과 효율성에 중점을 두었습니다.

트림 툴
  • 트림 기능을 메시 부울 툴에서 자체 툴로 이전했습니다. 새로 생긴 툴에는 잘라낼 지오메트리의 면을 선택하는 옵션을 추가했습니다.

래티스 디포머
  • 래티스 디포머 툴에 다음 기능을 추가하여 강화했습니다.

    • 소프트 디포메이션 모드 옵션

    • 래티스 포인트 컨스트레인트

워프 디포머
  • 플레어 툴에 더 단순한 인터랙션을 위해 업데이트한 기즈모와 동반되는 프로파일 타입용 옵션을 추가했습니다.

  • 새 원본 메시 표시 옵션을 추가했습니다.

  • 이제 스냅 기즈모로 오브젝트를 월드에 스냅할 수 있습니다.

  • 기즈모를 중앙으로 시프트 하는 옵션이 추가되었습니다.

  • 벤드 툴에 툴의 성능과 용도를 개선한 기능이 추가되었습니다.

    • 디포머를 사용하는 동안 한쪽 면을 한곳에 고정할 수 있습니다.

    • 시각화를 적용할 경우, 메시가 구부러진 동안 아래에서 위로 향하는 선이 기즈모 중심을 통과하며 어떤 식으로 바운드되는지 보여 줍니다.

    • 상위/하위 바운드 사용 시 벤드에 예상 이펙트가 늘어납니다.

스컬프팅
  • 버텍스 스컬프팅 패널의 UX 패널 디자인을 수정했습니다. UX를 개편하며 중요한 몇 가지 사항을 개선했습니다.

    • 이전 브러시 유형 및 감쇠 드롭다운 목록을 플라이아웃 패널에서 더 큰 아이콘으로 교체해 효율성과 가독성을 개선했습니다.

    • 새로운 커스텀 타일 뷰 에셋 선택 툴이 이제 브러시 알파 마스크에 사용됩니다.

    • 이제 알파 마스크 선택 툴이 로컬 사용자 환경설정 컬렉션 기반 필터를 지원합니다. 사용자는 이 필터를 사용하여 새로운 최근 사용 목록 등 자주 찾는 알파 마스크 세트로 바로 이동할 수 있습니다.

  • 활성화된 브러시 스탬프 및 알파 마스크는 뷰포트에서 브러시 인디케이터의 일부로 표시됩니다.

메시 단순화
  • 메시 단순화 툴에 기존 메시를 최적화하는 옵션이 추가되었습니다.

    • 기존 위치(Existing Positions) 감소 메서드가 추가되었습니다. 이 메서드는 원본 메시의 일부 기존 버텍스 위치를 그대로 유지하면서도 단순화된 메시를 생성합니다.

    • 폴리그룹으로 단순화(Simplify by Polygroup) 사용 시 단순화에 사용할 컨스트레인트만 사용해 폴리그룹을 분류합니다. 이 옵션은 폴리에디트 툴에서도 사용가능합니다.

    • 지오메트릭 허용치 컨스트레인트를 추가했습니다.

메시 프로젝트
  • 메시 프로젝트 툴에 파라미터와 퍼포먼스를 추가해 향상했습니다.

리메시
  • 리메시(Remesh) 툴에서 리메싱을 사용하기 전에 서브디비전을 진행하는 옵션이 추가되었습니다. 로우 폴리곤 메시를 리메싱할 경우, 미리 루프 혹은 캣멀-클라크 서브디비전을 사용하기 때문에 결과 메시가 원본 폴리곤 구조의 면을 상속하지 않도록 막을 수 있어 유용합니다.

메시 디플레이스먼트
  • 디스플레이스(Displace) 툴에 다수의 에디션을 추가했습니다.

    • PN 트라이앵글 서브디비전 - PN 서브디비전은 평면 트라이앵글을 커브드 메시로 대체해 더 부드러운 버전의 메시를 정의합니다.

    • 새로운 테셀레이션 알고리즘 - 유니폼 및 PN 트라이앵글 테셀레이션 진행 시 속도 및 세분화 퀄리티를 향상하는 새 메시 테셀레이션 메서드를 구현했습니다. 결과값이 테셀레이션 셰이더와 훨씬 비슷해졌습니다.

    • 텍스처 맵을 이동할 때 채널을 선택합니다.

    • 2D 텍스처에 스케일, 타일을 적용합니다.

    • 대비 커브의 강도를 조정합니다.

볼륨 생성 및 편집
  • 볼륨 생성 및 편집 기능에 몇 가지 중요한 에디션을 추가해 향상했습니다.

    • 이제 프리미티브 툴, 폴리 익스트루드, 폴리 회전 등의 제작 툴에서 스태틱 메시 대신 볼륨(선택 가능한 볼륨 타입 포함)을 내보낼 수 있습니다.

    • 이제 불린 혹은 평면 컷처럼 새로운 파생 오브젝트를 내보내는 편집 툴에서 입출력 모두에 볼륨을 사용할 수 있습니다.

복셀 블렌드 및 감쇠
  • 복셀 블렌드 툴에서 커스터마이징 가능한 부드러운 감쇠로 CSG 감쇠를 실행할 수 있습니다.

재키팅
  • 눈에 보이지 않는 지오메트리를 제거하는 데 사용하는 재키팅 툴을 개선했습니다.

    • 가려진 트라이앵글에서 새 그룹을 생성하는 기능을 옵션으로 추가했습니다. 이 옵션을 사용하면 제거하기 전에 조금 더 뚜렷하게 제어할 수 있습니다.

    • 제거하기 전에 선택된 가려진 트라이앵글의 선택 범위를 줄일 수 있습니다. 사용 시 트라이앵글의 과도한 제거를 방지할 수 있습니다.

스태틱 메시 에디터 모델링 툴
  • 새로 추가된 StaticMeshEditorModeling 플러그인으로 스태틱 메시 에디터에서 메시 에디팅 툴을 사용할 수 있습니다. 지금은 스태틱 메시 에디터에 자동 LOD, LOD 매니저, 인스펙터 툴만 표시됩니다. 인스펙터 툴을 사용해 UV 심 및 메시 바운더리 강조, 셰이딩 된 영역에 와이어프레임 적용, UV 체크보드 등 스태틱 메시 에디터 내부에서 쉽게 발견할 수 없는 수많은 메시 정보 타입을 시각화할 수 있습니다(나나이트가 활성화된 메시도 해당).

베이크 및 메시 어트리뷰트(베타)

언리얼 엔진 5는 텍스처링 및 머티리얼 베이킹 툴세트를 한층 확장하고 업데이트했습니다. 텍스처 및 머티리얼 베이킹은 에셋 개발에서 매우 중요한 부분입니다. 베이킹 툴은 LOD 생성에 중요한 역할을 할 뿐만 아니라, 에디터에서 바로 고급 머티리얼을 생성하는 워크플로를 만듭니다.

image_46.jpg

텍스처 베이크

베이크 툴은 언리얼 엔진 5.0 얼리 액세스 출시 이후로 다음과 같이 다양하게 향상되었습니다.

  • 입력 노멀과 베이크된 노멀 결합

  • 멀티 샘플링

  • 지오메트릭 베이크 타입 추가

  • 앰비언트 오클루전 퍼포먼스 향상

  • 버텍스에 어트리뷰트 베이크

  • 텍스처에서 버텍스로 베이크

  • 텍스처 필터링

  • UV 레이어 지원

  • 이펙트 또는 텍스처로 텍스처 맵 프리뷰

모두 베이크 툴

새로운 모두 베이크(BakeAll) 툴은 모델링 모드에서 사용 가능합니다. 텍스처 베이크(Bake Texture) 툴은 단일 메시의 디테일을 타깃 메시에 베이크하는 솔루션을 제공하는 반면, 모두 베이크(Bake All) 툴은 여러 소스 메시의 디테일을 상대적으로 폴리곤 수가 적은 단일 타깃 메시에 구울 수 있도록 지원합니다.

UV 편집(베타)

언리얼 엔진 5.0 내 UV 편집 툴이 크게 업데이트 및 확장되어 에디터 내부에서 직접 UV를 생성하고 편집하는 기능이 극적으로 확대되었습니다.

새로운 UV 에디터 패널

image_47.jpg

새로운 UV 에디터 패널은 UV 레이아웃을 편집하는 주요 작업 공간입니다. 2D UV 패널은 레이아웃 패킹과 UV 오리엔테이션을 평가하는 주요 영역으로, 다음을 지원합니다.

  • 2D 선택 및 트랜스폼

  • UV 채널 비저빌리티

  • UV 채널 복사, 추가, 제거

  • 자동 및 아일랜드별 언랩

  • 컷 앤 쏘우 연산

  • 3D 프리뷰

  • 텍스처 디스플레이

프로젝트 UV 툴
  • 프로젝트 UV는 유저들이 요청한 수많은 기능을 지원하도록 완전히 재작성되었습니다.

    • 이제 월드-스페이스 치수가 상대 바운드 대신 사용되며, 일관된 크기의 타일링 UV를 생성하기 위해 툴 사용 간에 고정할 수 있습니다.

    • 폴리 편집(PolyEdit) 및 트라이앵글 편집(TriEdit) 툴에서 페이스 선택 전송을 예비 지원합니다.

    • 이제 여러 UV 채널을 지원합니다.

    • ExpMap UV 알고리즘: ExpMap UV 메서드는 곡면 형태를 따르며, 평면 프로젝션과 유사합니다. 표면이 휘어 프로젝션 평면에서 멀어질 때 발생할 수 있는 극단적인 텍스처 스트레칭 현상이 방지되며, 로컬에 투영되는 데칼 모양을 더 정확하게 유지됩니다.

자동 UV 툴
  • 자동 UV 툴은 하이 폴리 메시에서 UV를 구축하는 새로운 프로세스를 갖추도록 업데이트되었습니다. 새 옵션에서는 여러 단계를 하나의 작업으로 결합했습니다(작은 패치 생성, 패치 병합, 파이널 UV 생성, UV 패킹). 개별 파라미터의 미세조정 및 반복 사용이 더 쉬워져서 더 적은 시간에 퀄리티가 높은 UV를 제작할 수 있습니다.

언리얼 에디터 인터페이스

유저 인터페이스 업데이트

언리얼 엔진 5를 제작하며 일관성 있고 간결한 유저 인터페이스(UI)를 업데이트했습니다. 디폴트 컬러를 이전보다 어두운 기본 테마로 조정했습니다. 사용자는 에디터 개인설정(Editor Preferences) 에서 테마(Themes) 를 설정해 에디터를 취향대로 커스터마이징할 수 있습니다. 아이콘은 보다 조밀하고 통일성 있는 형태로 업데이트했습니다.

콘텐츠 드로어, 사이드바 탭, 메뉴 생성 같은 신규 기능을 통해 원하는 툴에 손쉽게 접근하고, 뷰포트에 최대 스페이스를 구현할 수 있습니다.

image_48.png

콘텐츠 드로어

콘텐츠 드로어콘텐츠 브라우저 오버레이를 실행하는 신규 기능입니다. 콘텐츠 드로어로 패널을 도킹할 공간을 걱정하지 않고 빠르게 에셋을 찾을 수 있습니다. Ctrl+스페이스 바 를 누르면 콘텐츠 드로어를 열 수 있습니다. 아니면 콘텐츠 드로어의 탭 이름을 클릭해 드로어를 펼쳐도 됩니다. 콘텐츠 드로어는 에디터 레이아웃에 고정하거나 기존 콘텐츠 브라우저와 함께 사용할 수 있습니다.

사이드바 탭

사용자는 이제 패널을 에디터 양쪽에 배치된 사이드바 탭에 도킹할 수 있습니다. 탭을 도킹해 스크린 공간을 가릴 필요 없이 자주 사용하는 패널에 접근할 수 있습니다. 얼리 액세스를 출시 후로 핀을 눌러 패널이 열린 채 고정할 수 있도록 업데이트했습니다.

로딩 및 배경 진행도 표시

프로젝트가 실행되는 동안 스플래시 화면에 표시되는 디테일을 추가해, 로드하는 동안 더 많은 컨텍스트롤 제공하고 가시성을 개선합니다.

image_51.gif

에디터 상태 표시줄의 우측 하단에 백그라운드 작업 진행도를 알려주는 인디케이터가 추가되었습니다. 이 프로그레스 바는 모든 백그라운드 작업의 진행도를 표시하며, 이 표시줄을 펼쳐 관련 작업별 진행도를 확인할 수 있습니다.

디테일 패널

디테일 패널의 상단에 추가된 섹션 프로퍼티의 관련 카테고리에 신속히 접근해 스크롤 비용을 줄일 수 있습니다. 또한 주어진 액터 타입의 디테일 패널 상단에 자주 사용하는 프로퍼티를 즐겨찾기로 추가할 수 있습니다.

생성 메뉴

이제 레벨 에디터 의 메인 툴바에 생성 버튼이 생겼습니다. 배치 가능한 액터와 퀵셀 브리지 혹은 언리얼 마켓플레이스 같은 콘텐츠의 소스에 빠르게 액세스할 수 있습니다. 액터는 드롭다운 메뉴에서 뷰포트로 직접 드래그하거나 카메라의 정면에서 빠른 배치를 클릭해도 추가할 수 있습니다. 이 방식으로 액터를 배치하면 이전처럼 액터 배치 패널을 레벨 에디터의 레이아웃에 고정하지 않아도 됩니다.

image_53.png

퀵셀 브리지 통합

퀵셀 브리지가 언리얼 에디터에 직접 통합되었습니다. 에디터 레이아웃에서 퀵셀 브리지를 고정한 뒤, 에셋을 레벨로 직접 드래그하면 추가할 수 있습니다. 퀵셀 브리지 패널은 레벨 에디터 메인 툴바에 새로 추가된 생성(Create) 메뉴를 누르거나 창(Window) > 퀵셀 브리지(Quixel Bridge) 에서 액세스할 수 있습니다.

image_54.png

언리얼 엔진 5.0 프리뷰 버전을 이미 설치한 분은 사용하기 전에 퀵셀 브리지를 최신 버전으로 업데이트해야 합니다. 해당 플러그인은 에픽게임즈 런처에서 업데이트할 수 있습니다.

언리얼 엔진에 통합된 퀵셀 브리지의 자세한 정보는 다음 문서를 참조하세요.

다중 탭 모드

복잡하고 추가 UI 요소 표시가 필요했던 일부 모드를 디폴트 툴바와 모드 세팅 대신 탭 시스템에 포함되도록 재설계했습니다. 이 변경사항은 프랙처 모드와 애니메이션 모드에 해당합니다. 탭을 닫은 경우 항상 창(Window) > 에디터 모드(Editor Modes) 에서 탭을 선택하여 다시 열 수 있습니다.

image_55.png

검색 가능 메뉴

이제 서브메뉴가 있는 메뉴에서 검색을 할 수 있게 되었습니다. 검색 기준과 일치하는 모든 서브메뉴 내 액션에 액세스할 수 있도록 표시됩니다.

image_56.png

메뉴 및 위젯 개편

명료성과 사용성을 개선하기 위해 일부 메뉴를 개편했습니다.

  • 액터 컨텍스트 메뉴를 재작성했습니다. 이 메뉴에 포함된 요소는 선택 메뉴, 액터 메뉴 또는 컴포넌트 메뉴의 메인 메뉴 바에서 찾을 수 있습니다.

  • 에디터에서 툴을 생성하는 개발자들을 위해 다수의 위젯을 Editor/EditorWidgets에서 Developer/ToolWidgets으로 이동했습니다.

라이라 스타터 게임

image_57.gif

언리얼 엔진 5 출시와 함께 라이라(Lyra)에 대해 알려드릴 수 있게 되어 매우 기쁩니다. 라이라는 새로운 게임을 만드는 출발점 역할을 하고 언리얼 엔진 5.0 프레임워크를 이해하는 데 필요한 리소스를 학습하도록 도와주기 위해 제작된 신규 예제 게임플레이 프로젝트입니다.

image_58.png

모듈식 구조인 라이라에는 언리얼 엔진 5.0 개발과 함께 정기적으로 업데이트되는 코어 시스템 및 플러그인이 포함되어 있습니다. 포함된 핵심 기능:

  • 크로스 플랫폼 호환성 및 확장성

  • 에픽 온라인 서비스 및 콘솔 온라인 서브시스템용 온라인 멀티플레이어 및 크로스 플레이 지원

  • 선택 가능한 두 가지 게임플레이 모드 지원: 엘리미네이션(팀 데스매치) & 컨볼루젼(거점 점령)

  • 커스터마이징된 게임플레이 어빌리티 시스템

  • 나이아가라 FX

  • 메뉴 세팅, 컨트롤러 키 스틱, 체력/마나/탄약 디스플레이 등 프로젝트의 게임플레이 콘셉트에 사용되는 언리얼 모션 그래픽(UMG) 위젯 클래스 및 UI 아이콘(해당 UI 기능은 라이라 말고 다른 게임에도 사용할 수 있도록 모듈식으로 제작)

  • 모든 폰과 호환 가능한 로코모션 애니메이션 에셋, 사운드, 무기 시스템 등 최적화된 수작업 콘텐츠

  • 새로운 UE5 마네킹 매니(Manny)와 퀸(Quinn)(메타휴먼과 동일한 코어 스켈레톤 계층구조를 공유해 애니메이션 시스템과 호환되는 플레이어블 캐릭터)

image_59.gif

도시 샘플 프로젝트

image_60.png

도시 샘플 프로젝트는 디자이너와 개발자들이 어떤 식으로 새로운 시스템과 개선된 기존 시스템을 다양하게 결합해 광범위하고 매력적인 환경을 만들 수 있는지 탐구할 수 있는 놀이터 같은 공간입니다. 해당 예제는 PlayStation 5, Xbox Series S|X 하드웨어로 출시된 매트릭스 어웨이큰스: 언리얼 엔진 5 익스피어리언스 테크니컬 데모와 동일한 에셋으로 제작했습니다.

언리얼 엔진 5에서는 신규 기능 및 개선된 기능을 사용해 디자인, 배치, 역동적 라이트 설치가 가능한 대규모 월드를 아주 디테일하게 제작해 시각적으로 큰 충격을 선사할 도시를 구현할 수 있습니다. 도시는 규칙 프로세서를 사용한 절차적 생성을 이용해 설계 및 제작하였으며, 다음 기능을 사용해 실감 나는 도시를 구현합니다.

  • 월드 파티션을 액터당 파일 하나 기능과 결합해 레벨 스트리밍 및 에디터 워크플로 효율을 향상합니다.

  • 나나이트를 활용해 높은 퀄리티로 시각화 마이크로폴리곤 지오메트리 사용을 활성화합니다.

  • 루멘으로 하드웨어 레이 트레이싱을 사용해 다이내믹 글로벌 일루미네이션 및 리플렉션을 생성합니다.

  • 버추얼 섀도 맵으로 도시에 일관적이고 높은 해상도의 섀도잉을 제공합니다.

  • 매스 AI로 교통의 작동 및 시각화와 메타휴먼 라이브러리에 기반해 만들어진 군중을 관리합니다.

  • 카오스 피직스로 비히클 및 디스트럭션 시스템을 구동합니다.

  • 메타사운드 시스템으로 도시에 어울리는 사운드를 가득 채웁니다.

  • 나이아가라를 파티클 시스템에 사용합니다.

  • 이외에도 많은 기능을 사용합니다!

인공 지능

image_61.png

언리얼 엔진 5.0에 탑재되어 새로 출시되는 기능들로 그 어느 때보다 신뢰도 높은 AI 에이전트를 만들 수 있게 되었습니다. 매스 엔티티(Mass Entity) 기능을 사용하면 데이터 지향 계산의 프레임워크가 제공됩니다. 이를 씬에 존재하는 수만 개의 AI 에이전트 시뮬레이션을 포함해 퍼포먼스가 중요한 경우에 사용할 수 있습니다.

또한 언리얼 엔진 5.0에 AI 에이전트 및 플레이어와 인터랙션할 수 있는 레벨에 배치된 오브젝트 컬렉션인 스마트 오브젝트(Smart Objects) 가 추가되었습니다. 이 시스템은 손쉽게 구성이 가능하며, 씬에 전례 없는 수준의 인터랙션성을 추가할 수 있습니다.

언리얼 엔진 5.0에서는 매스 회피(Mass Avoidance)존 그래프(Zone Graph) 와 같은 기능으로 AI 에이전트 내비게이션이 크게 개선되었습니다. 매스 회피로 매스 엔티티 시스템을 사용하는 모든 엔티티에서 고성능 회피를 사용할 수 있고, 존 그래프로 특정한 내비게이션 플로를 활용한 효율적인 장거리 내비게이션을 사용할 수 있습니다.

함께 출시되는 스테이트 트리(StateTree) 는 확장 가능한 범용 계층 스테이트 머신으로, 비헤이비어 트리의 선택 툴과 스테이트 머신의 스테이트 및 트랜지션을 결합하여 만들었습니다. 스테이트 트리를 통해 안정적이고 체계화된 고성능 로직을 만들 수 있습니다.

매스 엔티티(실험단계 기능)

매스 엔티티(MassEntity) 는 플레이어가 높은 수준의 퍼포먼스에서 시뮬레이션된 수만 개의 엔티티와 상호작용하도록 해 주는 데이터 지향 계산을 위한 프레임워크입니다.

image_62.gif

매스 엔티티의 주요 데이터 구조는 프래그먼트(Fragment) 로, 계산에 사용되는 최소 단위의 데이터 조각을 나타냅니다. 프래그먼트의 종류로는 트랜스폼, 속도, LOD 인덱스 등이 있습니다. 프래그먼트는 컬렉션으로 그룹화 가능하며, 이 컬렉션의 인스턴스는 ID와 연계될 수 있습니다. 이 컬렉션 인스턴스를 엔티티(Entity) 라고 부릅니다.

엔티티 생성은 객체 지향 프로그래밍의 클래스 인스턴싱과 유사합니다. 그러나 엔티티는 클래스와 기능을 엄격하게 선언하는 대신 프래그먼트 컴포지션으로 빌드되고 이 컴포지션은 런타임에서 변경할 수 있습니다. 예를 들어, 엔티티의 컴포지션은 트랜스폼과 속도처럼 두 가지의 프래그먼트를 포함할 수 있습니다.

스마트 오브젝트(실험단계 기능)

스마트 오브젝트(Smart Objects) 는 레벨 내 배치되는 오브젝트로, AI 에이전트와 플레이어가 상호작용할 수 있습니다. 스마트 오브젝트는 상호작용에 필요한 모든 정보를 포함합니다.

image_63.png

스마트 오브젝트는 글로벌 데이터베이스의 일부이며, 공간 파티셔닝 구조를 사용합니다. 따라서 위치, 에이전트와의 근접성, 태그와 같은 필터를 사용하여 런타임에서 쿼리가 가능합니다.

크게 보면 스마트 오브젝트는 예약 시스템을 통해 사용할 수 있는 레벨 내 활동세트를 나타냅니다.

매스 회피(실험단계 기능)

매스 회피(Mass Avoidance)매스 엔티티(MassEntity) 와 통합된 포스 기반 회피 시스템입니다. 이 시스템은 매스 엔티티 시스템을 사용하는 모든 엔티티에 높은 퍼포먼스의 회피를 제공합니다.

image_64.gif

존 그래프(실험단계 기능)

존 그래프(ZoneGraph) 는 메타데이터를 사용하여 특정한 내비게이션 플로(차선, 보도, 산책로 등)를 표현하는 가벼운 내비게이션 시스템으로, 월드의 물리적 표현에 집중하는 내비메시(Navmesh)와 반대되는 기능입니다. 메타데이터는 세그먼트로 연결된 점과 점을 잇는 통로 구조로 표현됩니다.

image_65.png

image_65b.png

이 시스템은 AI 에이전트의 효율적인 장거리 내비게이션에 사용할 수 있습니다. 또한 구체적인 내비게이션 플로를 레벨에서 직접 지정해 레벨 내 에이전트 내비게이션에 높은 수준의 컨트롤을 수행할 수도 있습니다.

스테이트 트리(실험단계 기능)

스테이트 트리(StateTree) 는 언리얼 엔진의 확장 가능한 범용 계층형 스테이트 머신으로, 비헤이비어 트리의 셀렉터 와 스테이트 머신의 스테이트트랜지션 을 결합하여 만들어졌습니다. 이를 통해 안정적이고 체계화된 고성능 로직을 만들 수 있습니다.

image_66.png

스테이트 트리에는 트리 구조로 정렬된 스테이트가 있습니다. 스테이트 선택은 트리의 어느 위치에서든 트리거될 수 있습니다(최초 선택은 루트에서 트리거). 선택 과정에서 각 스테이트의 조건 입력(Enter Conditions) 이 평가되며, 통과할 경우 선택은 스테이트의 자손 스테이트로 넘어갑니다.

스테이트를 선택하면 리프 스테이트부터 루트 스테이트까지 모든 스테이트가 활성화됩니다. 각 스테이트는 이밸류에이터(Evaluator), 태스크(Task), 트랜지션(Transition) 으로 구성됩니다.

피직스

디폴트로 활성화된 카오스 피직스

카오스 피직스(Chaos Physics)는 언리얼 엔진 5에서 사용 가능한 가벼운 피직스 시뮬레이션 솔루션으로, 고도로 커스터마이징 가능할 뿐만 아니라 차세대 게임의 요구 조건에 맞도록 처음부터 새로 제작되었습니다.

image_67.png

이 시스템의 주요 기능은 다음과 같습니다.

  • 리지드 바디 다이내믹(Rigid Body Dynamics) 및 래그돌(Ragdolls)

  • 리지드 바디 애니메이션(Rigid Body Animation) 노드 및 클로스 피직스(Cloth Physics)

  • 디스트럭션(Destruction)

  • 비히클(Vehicle)

  • 피직스 필드(Physics Field)

  • 유체 시뮬레이션(Fluid Simulation)

  • 헤어 시뮬레이션(Hair Simulation)

카오스 피직스 시스템은 기존 피직스 시스템을 대체하며, 비동기 피직스 시뮬레이션, 견고한 디스트럭션 시스템, 피직스 필드, 유체 시뮬레이션 등 새 주요 기능이 추가되었습니다. 또한 배정밀도 월드를 완전히 지원합니다.

카오스 디스트럭션

image_68.gif

카오스 디스트럭션(Chaos Destruction) 시스템은 실시간으로 시네마틱 퀄리티 수준의 디스트럭션을 얻기 위해 사용되는 툴 컬렉션입니다. 이 시스템은 훌륭한 비주얼을 제공할 뿐 아니라 퍼포먼스에 최적화되어 있으며, 아티스트와 디자이너가 지오메트리 컬렉션이라는 새 에셋 타입과 직관적인 비선형 워크플로를 사용해서 콘텐츠 제작 및 프랙처링 프로세스를 더 세밀하게 제어할 수 있게 해 줍니다.

미리 프랙처링된 지오메트리를 사용하는 시뮬레이션 에셋을 구성하고 동적으로 생성된 리지드 컨스트레인트를 활용하여 시뮬레이션 중에 구조적 연결을 모델링합니다. 시뮬레이션 내의 결과 오브젝트는 피직스 필드 및 콜리전 등 환경적 요소와의 상호작용을 기반으로 연결된 구조에서 분리할 수 있습니다.

또한 카오스 디스트럭션에는 런타임에서 퍼포먼스에 미치는 영향을 최소화하면서 복잡한 디스트럭션을 원활하게 리플레이할 수 있는 새 캐시 시스템도 포함되어 있습니다.

카오스 디스트럭션은 나이아가라, 오디오 믹서 등의 다른 언리얼 엔진 시스템과 쉽게 통합되어 시뮬레이션 중에 파티클을 스폰하거나 특정 사운드를 재생합니다.

카오스 비히클

image_69.gif

카오스 비히클(Chaos Vehicles)은 언리얼 엔진 5의 새로운 비히클 피직스 시스템의 한 부분입니다.

카오스 비히클은 휠이 2개인 모터사이클부터 6개, 8개 또는 그보다 더 많은 휠이 달린 비히클까지 모두 지원합니다. 또한 이 시스템은 전진 및 후진 기어 구성을 개수에 제한 없이 지원합니다.

뿐만 아니라 카오스 비히클은 차대의 특정 위치에 다운포스나 업리프트를 제공하는 에어로포일 표면을 몇 개든 포함하여 구성할 수도 있습니다. 이러한 표면은 자동차 스포일러, 심지어 항공기 날개까지 시뮬레이션할 수 있습니다.

또한 비히클 차대를 직접적으로 더 잘 제어하도록 다수의 아케이드 스타일 포스를 추가할 수도 있습니다. 일반적인 예시로는 모터사이클을 똑바로 서 있게 해 주는 직접 토크 적용이나, 헬리콥터의 피치 또는 롤 직접 컨트롤이 여기에 해당합니다.

비히클 디포메이션

image_70.gif

매트릭스 어웨이큰스: 언리얼 엔진 익스피어리언스 출시에서 카오스 비히클을 활용해 견고한 디포메이션 시스템을 선보이며 차량이 파손될 때 사실적인 디포메이션을 표현했습니다.

이 신규 디포메이션 시스템은 컨트롤 릭과 카오스 비히클 시스템의 향상된 기능을 결합해 비히클 별로 다른 디포메이션을 표현합니다. 비히클의 운전 역학을 활용하고 질량 중심을 수정하며 매번 다른 충돌을 연출합니다.

시스템에서는 비히클 주변에 배치된 여러 피직스 바디를 사용해 콜리전을 감지합니다. UE5에 도입된 컨스트레인트 가소성 기능을 사용하면 특정 임계점을 지난 피직스 컨스트레인트를 영구적으로 분해할 수 있습니다.

언리얼 엔진 5에 블루프린트로 컨스트레인트의 어트리뷰트를 쿼리 및 수정하는 기능을 추가해, 디포메이션을 보다 세분화된 방법으로 조작할 수 있도록 했습니다. 뿐만 아니라 디자이너들은 게임플레이 도중 다이내믹 피직스 바디의 계층구조를 활성화 및 비활성화해, 피직스 시뮬레이션에 속한 여러 파트를 활성화 혹은 비활성화하고 퍼포먼스를 향상할 수 있습니다.

마켓플레이스에서 무료 데모를 다운로드하여 시스템을 테스트하고 더 많은 내용을 학습할 수 있습니다.

카오스 클로스 시뮬레이션

image_71.gif

카오스 클로스(Chaos Cloth) 시스템은 완전히 새로운 파라미터 및 사용자 컨트롤이 특징으로, 이 기능을 사용해 클로스 시뮬레이션의 요구에 맞는 다양한 룩을 손쉽게 생성 및 관리할 수 있습니다.

클로스당 콜리전 지원 증가부터(>32) 디버그 드로 CVARs, 마스크 컨트롤 추가까지, 카오스 클로스는 퀄리티가 높은 클로스를 그 어느 때보다도 쉽게 제작할 수 있도록 설계되었습니다. 또한 콜리전 백스탑을 시각화하기 위한 직관적인 컨트롤, 보다 유용한 애님 드라이브는 물론 향상된 바람도 제공됩니다.

언리얼 엔진 클로스의 완전히 새로워진 부분은 블루프린트 인터랙터 노드를 사용해 런타임에서 클로스를 더욱 제어할 수 있는 기능입니다. 또한 클로스 이펙트를 특정 지점에 적용할 수 있는 필드를 지원할뿐만 아니라 월드 콜리전을 손쉽게 생성할 수 있는 기능도 추가했습니다.

피직스 필드

image_72.gif

피직스 필드 시스템(Physics Field System) 을 통해 런타임에서 공간 내 특정 영역의 카오스 피직스(Chaos Physics) 시뮬레이션에 직접 영향을 줄 수 있습니다. 이 필드는 리지드 바디 및 클로스에 힘을 가하거나, 지오메트리 컬렉션 클러스터를 깨뜨리거나, 프랙처 리지드 바디를 고정 또는 비활성화하거나, 리지드 바디 애니메이션 노드 및 클로스와 상호작용하는 등 다양한 방식으로 피직스 시뮬레이션에 영향을 미치도록 구성할 수 있습니다.

그리고 피직스 필드 시스템은 나이아가라, 머티리얼 등 다른 엔진 시스템과도 통신할 수 있습니다. 이 시스템에서는 특정 위치의 필드를 평가할 수 있는 내장 함수로 피직스 필드를 샘플링할 수 있습니다.

나이아가라 유체 시뮬레이션

언리얼 엔진 5.0에는 유체 이펙트를 실시간으로 시뮬레이션할 수 있는 아티스트 친화적인 툴 세트가 포함됩니다. 여기에는 나이아가라 에디터 내에서 사용할 수 있는 다양한 GPU 기반 시뮬레이터, 재사용 가능 모듈, 견고한 데이터 구조 등이 있습니다. 고급 사용자라면 광범위하게 노출된 파라미터를 활용하여 필요한 만큼 시뮬레이션을 수정할 수 있습니다.

image_73.gif

유체 시뮬레이션 시스템은 게임과 시네마틱에서 사용할 수 있는 실시간 환경의 복잡한 유체 이펙트를 생성하도록 디자인되었습니다. 시스템을 사용하여 복잡한 시뮬레이션을 다양한 사용 사례에 사용 가능한 플립북 텍스처로 베이크할 수도 있습니다.

유체 시뮬레이션에 대해 자세히 알아보려면 마켓플레이스에서 콘텐츠 샘플 프로젝트를 다운로드하고 유체 시뮬레이션 문서를 확인하세요.

비동기 피직스 시뮬레이션

이제 언리얼 엔진 5 사용자는 게임 스레드가 아닌 별도의 자체 피직스 스레드에서 피직스 시뮬레이션을 실행할 수 있습니다.

피직스를 자체 스레드에서 실행할 경우의 주요 장점은 시뮬레이션이 균일한 틱 간격으로 실행되어 예측 가능한 결과가 나온다는 점입니다.

또한, 이 기능을 사용하여 시뮬레이션이 항상 예측 가능한 방식으로 동작하도록 미세 조정할 수 있습니다. 그리고 이 동작은 서버와 클라이언트가 피직스를 같은 속도로 틱하게 하여 결과를 동기화하기 쉽게 하므로 네트워크 피직스의 토대 역할도 합니다.

나이아가라

대규모 월드 좌표 지원

언리얼 엔진 5.0에서는 대규모 월드 좌표 에서 작업하여 단일 레벨에서 훨씬 더 커다란 월드를 빌드할 수 있습니다. 메인 엔진에서 구현할 때는 대규모 월드 좌표 출시 노트에서 언급한 것처럼 플로트 대신 더블을 코어 데이터 타입으로 사용합니다. 따라서 정밀도가 32비트에서 64비트로 높아집니다.

그러나 나이아가라에서는 CPU와 GPU에서의 렌더링을 최대한 효율적으로 유지하기 위해 더 경제적인 접근법을 계획해야 했습니다. 따라서 더블을 구현하는 대신, 월드에 그리드 시스템을 구현했습니다. 한 플로트에는 그리드 내 나이아가라 시스템의 위치를 저장하고, 다른 플로트에는 월드에서의 그리드 위치를 저장합니다.

image_74.png

그러므로 나이아가라에는 대규모 월드 좌표와 함께 작업하기 위한 고유한 설정이 있습니다. 자세한 내용은 나이아가라의 대규모 월드 좌표 페이지를 참조하세요.

시뮬레이션 스테이지

시뮬레이션 스테이지(Simulation Stages) 는 이전 언리얼 엔진 버전의 실험단계 기능이었습니다. UE5의 시뮬레이션 스테이지는 이제 정식 버전이며, 나이아가라 에디터에서도 바로 사용할 수 있습니다.

이미터 업데이트나 파티클 업데이트와 같은 나이아가라 스택의 그룹 자체가 바로 시뮬레이션 스테이지입니다. 하지만 원하는 이펙트에 필요한 만큼 시뮬레이션 스테이지를 추가할 수 있습니다. 시뮬레이션 스테이지는 구성 가능한 스테이지로, 이를 통해 나이아가라 에디터가 계산 및 반복작업을 수행하도록 할 수 있습니다. 배열, 2D 그리드, 3D 그리드, 렌더 타깃, 파티클 세트 전반의 반복작업 여부를 정의할 수 있는 for 루프와 같다고 볼 수 있습니다.

image_75.png

또한 콘텐츠 샘플(Content Examples) 프로젝트의 Niagara_Fluids 샘플에서 시뮬레이션 스테이지가 중요하게 활용된 사례를 볼 수 있습니다. 일부 이미터의 경우 시뮬레이션 스테이지가 수십 개 이상 존재할 수 있습니다.

image_76.png

GPU 레이 트레이싱 콜리전(실험단계 기능)

언리얼 엔진에서는 콜리전 모듈을 사용하는 레벨의 오브젝트와 충돌하도록 파티클 시스템을 구성할 수 있습니다. 이전 언리얼 버전에서는 GPU 이미터를 사용할 때 이 모듈에서 몇 가지 옵션을 고를 수 있었습니다. 일반적으로는 환경의 시뮬레이션을 생성하는 뎁스 버퍼(Depth Buffer) 옵션을 가장 많이 사용했습니다. 이 솔루션은 비용이 적게 들지만 정확도도 낮습니다. 모양이 정확하게 그려지지 않고, 파티클이 화면에서 벗어나면 즉시 사라집니다.

UE5에서는 콜리전 모듈이 GPU에서 레이 트레이싱을 사용하는 옵션이 추가되었습니다. 이미터와 그 파티클이 화면에 있을 때나 없을 때나, 또는 오브젝트 뒤에 숨겨져 있을 때도 콜리전이 레이 트레이싱을 사용하여 정확한 결과를 계산해 냅니다.

이 계산은 비동기식으로 진행되므로, 나이아가라 콜리전이 한 프레임 뒤에 진행됩니다. 이 기능을 사용하려면 하드웨이 레이 트레이싱도 필요합니다.

이 실험단계 기능을 활성화하는 방법에 대한 자세한 내용은 GPU 레이 트레이싱 콜리전 문서를 참조하세요.

퍼포먼스 예산 책정

게임을 빌드할 때는 씬 컴포지션에 따라 FX 워크로드에 많은 변동이 있을 수 있습니다. 특정 범위 밖에 있거나 예산 사용량을 초과하는 인스턴스를 컬링하는 등 퍼포먼스 관리에 도움이 될 만한 작업을 하고 싶을 수 있습니다.

퍼포먼스 예산은 이펙트 타입(Effect Type)의 일환으로 환경설정할 수 있습니다. 이펙트 타입 에셋을 사용하면 다양한 세팅을 환경설정한 다음 나이아가라 이펙트 컬렉션에 전반적으로 적용할 수 있습니다. 이 옵션은 모두 예산 스케일링(Budget Scaling) 이라는 항목에서 설정할 수 있습니다. 자세한 내용은 퍼포먼스 예산 책정 문서를 참조하세요.

image_78.png

캐스케이드 컨버터

캐스케이드-나이아가라 컨버터는 캐스케이드 에셋을 나이아가라로 이주시킵니다. 캐스케이드 에셋을 우클릭한 뒤 나이아가라 시스템으로 변환(Convert to Niagara System) 옵션을 선택하여 액세스할 수 있습니다.

변환 작동 방식과 관련하여 내부적으로 향상된 기능은 다음과 같습니다.

  • 이제 나이아가라 스크립트가 종속성순으로 자동 배치됩니다. 즉, 더 이상 사용자가 직접 모듈 순서를 수정할 필요가 없습니다.

  • 라이트 렌더러 변환이 향상되었습니다.

  • 이제 캐스케이드 셰이프 모듈이 새로운 나이아가라 셰이프 로케이션 모듈로 전환됩니다.

모듈 변경사항

이번 언리얼 엔진 버전에는 몇 가지 모듈에 변경되거나 추가된 사항이 있습니다.

Shape Location

박스, 스피어, 실린더, 토러스 로케이션 모듈 지원이 중단되었습니다. 이 네 가지 모듈은 셰이프 로케이션(Shape Location) 모듈로 종합 및 대체됩니다. 이 모듈에서는 원하는 셰이프를 선택한 뒤 그에 맞게 세팅을 조정할 수 있습니다. 또한 링/디스크원뿔 셰이프가 추가되었습니다.

image_80.png

Add Velocity

점에서 속도 추가 , 선형 속도 추가 , 원뿔로 속도 추가 모듈 지원이 중단되었습니다. 이 세 가지 모듈은 속도 추가(Add Velocity) 모듈로 종합 및 대체됩니다. 이 모듈에서는 속도를 추가할 모드를 선택할 수 있으며 그에 따라 설정이 조정됩니다.

image_81.png

Update Mesh Orientation

메시의 오리엔테이션을 벡터로 , 비행 오리엔테이션 , 퓨어 롤 오리엔테이션 모듈 지원이 중단되었습니다. 이 세 가지 모듈은 메시 오리엔테이션 업데이트(Update Mesh Orientation) 모듈로 통합되었습니다. 이 모듈에서는 원하는 메시의 방향을 선택하고 그에 맞게 세팅을 조정할 수 있습니다.

image_82.png

기본적으로 메시 오리엔테이션 업데이트 모듈은 이전 메시 오리엔테이션 업데이트 모듈과 동일하게 회전 속도(Rotation Rate)로 설정됩니다.

파티클 초기화

이전 버전에는 두 개의 모듈이 있었습니다. 바로 파티클 초기화리본 초기화 입니다. 이제 리본 기능이 파티클 초기화 에 병합되었습니다.

image_83.png

스태틱 변수

자체 커스텀 모듈을 제작할 사용자를 위해, 나이아가라 스크립트 에디터에 스태틱 변수(Static Variables)라는 새 기능을 추가했습니다. 스태틱 변수는 컴파일 시간 후에도 변경되지 않는 정보를 포함한 변수입니다. 수학 연산을 하고 싶은 정보를 저장하거나 스택 내 다수의 모듈을 통해 전파하는 데 사용할 수 있습니다.

새 스태틱 변수를 생성하려면 '파라미터(Parameters)' 창의 더하기 기호(+)를 클릭하면 됩니다. 파라미터 패널에서 생성할 수 있는 스태틱 변수 타입으로는 스태틱 부울(Static Bool)과 스태틱 int32가 있습니다. 스태틱 변수가 빨간색 S로 표시되는 모습을 볼 수 있습니다.

image_84.png

스태틱 변수를 사용하여 이미터에서 옵션을 설정한 뒤, 해당 옵션을 서로 다른 시뮬레이션 스테이지에서 사용할 수 있습니다.

image_85.png

스태틱 변수는 모듈의 스태틱 스위치를 구동하는 데에도 유용하게 사용할 수 있습니다. 특히 세팅할 하이레벨 옵션이 많은 복잡한 이미터에 적합합니다. 일반적으로 이 옵션은 모듈 스크립트 내 스태틱 스위치를 사용하여 생성됩니다. 따라서 선택된 옵션에 따라 유저 인터페이스 내 요소를 표시하고 숨길 수 있습니다.

Static Switch 노드에는 핀으로 노출(Expose as Pin) 옵션이 있습니다. 활성화하면 와이어로 스태틱 변수에 연결할 수 있습니다. 연결할 수 있는 스태틱 변수의 타입은 스태틱 스위치의 타입에 따라 다릅니다. 스태틱 부울, 스태틱 int32, 스태틱 열거형에서 와이어 연결 사용이 가능합니다.

image_86.png

이후 '선택(Selection)' 패널에서 스태틱 변수를 활성화하면 스태틱 스위치가 유저 인터페이스에서 옵션을 활성화합니다.

image_87.png

이미터 개요

다양한 시뮬레이션 스테이지로 인해 일부 나이아가라 시스템이 매우 복잡해졌기 때문에, 자주 조정할 세팅을 찾기가 어렵게 느껴질 수 있습니다. 이에 따라 이제 각 이미터 상단에 이미터 개요(Emitter Summary)라는 영역이 추가되었습니다. 자주 사용하는 세팅이 이미터 개요에 표시되도록 환경설정할 수 있습니다.

image_88.png

이미터 개요에 파라미터를 추가하려면 모듈에서 파라미터를 우클릭한 뒤 이미터 개요에 표시합니다(Show in Emitter Summary) 를 선택하면 됩니다.

image_89.png

GPU 스플라인

이전에 스플라인 컴포넌트 데이터 인터페이스는 CPU 시뮬레이션에서만 작동했습니다. 이제는 GPU에서도 작동합니다.

데이터 레지스트리

언리얼 엔진 5.0에서 데이터 레지스트리를 지원합니다. 데이터 레지스트리는 효율적인 데이터 구조용 글로벌 스토리지 공간으로, USTRUCT 매크로로 태그가 지정되어 있습니다. 데이터 레지스트리는 사용자 정의 캐싱 동작을 포함한 동기식 및 비동기식 데이터 액세스를 모두 지원하며 일반 읽기 전용 데이터와 함께 작동하도록 되어 있습니다.

  • 태스크 시스템

새 태스크 시스템(Task System) 작업 매니저는 종속 태스크의 방향성 비순환 그래프(Directed Acyclic Graph, DAG)를 빌드 및 실행하여 사용자 코드를 비동기적으로 실행하는 프레임워크를 제공합니다. 이 프레임워크에는 개발자가 멀티스레드 환경에서 태스크를 예약할 수 있는 새 일반 API와 시스템이 포함됩니다. 이 시스템을 사용하면 소규모 태스크를 최적의 스레드 수에 맞게 효율적으로 분배합니다. 새 API를 이용하면 멀티스레드 디자인을 훨씬 간단하게 표현하고, 코어 수에 상관없이 타깃에 효율적으로 실행할 수 있습니다. 또한 새 태스크 인사이트(Tasks Insights) 뷰를 사용하면 디버깅 및 최적화 프로세스를 개선할 수 있습니다.

태스크 인사이트는 언리얼 엔진의 작업 매니저인 태스크 그래프(TaskGraph)의 향상된 버전입니다. 태스크 시스템 및 태스크 그래프는 동일한 백엔드(스케쥴러 및 작업자 스레드)를 사용합니다.

언리얼 인사이트

언리얼 인사이트(Unreal Insights)는 프로젝트에서 최적화가 필요한 영역을 식별합니다. 독립형 프로파일링 시스템으로 통합되어 있는 툴로, 언리얼 엔진에서 발생한 데이터를 수집, 분석, 시각화합니다. 자체 프로파일링 데이터를 추가하여 프로세스를 단순화하고, 데이터를 원격으로 기록할 수 있게 하여 실행 중에 애플리케이션이 프로젝트에 미치는 영향을 최소화합니다.

타이밍 인사이트 창

타이밍 인사이트(Timing Insights) 창으로 여러 CPU 및 GPU 트랙의 프레임 퍼포먼스 데이터를 볼 수 있습니다. 타이밍 뷰에 새 툴바가 추가되어 트랙 드롭다운 메뉴가 여러 메뉴로 분할되었습니다.

image_90.png

빠른 찾기

빠른 찾기(Quick Find) 위젯은 타이밍 뷰에 표시되는 이벤트를 검색 및 필터링하는 데 사용됩니다.

위젯은 타이밍 뷰의 컨텍스트 메뉴에서 열거나, 타이밍 뷰를 선택한 상태에서 Ctrl + F를 누르면 실행됩니다.

image_91.png

빠른 찾기 위젯의 검색 로직은 그룹과 필터를 사용하여 정의됩니다. 그룹 노드는 자손 필터 노드를 포함하고, 자손의 결과에 적용될 로직을 정의합니다.

메모리 인사이트

메모리 인사이트(Memory Insights)는 프로젝트의 메모리 사용 및 콜 스택 트레이싱을 조사할 수 있도록 해 주는 새로운 컴포넌트입니다. 런타임 컴포넌트는 런타임에 발생하는 모든 할당, 재할당, 해제 이벤트마다 이벤트를 트레이스한 뒤, 분석 과정에서 해당 메모리 사용 패턴을 재구성합니다. 메모리 인사이트 타임라인은 북마크, 에셋 로딩, CPU/GPU 타이머 같은 추가 트랙의 오버레이를 지원합니다.

image_92.png

개발자는 메모리 인사이트를 사용하여 메모리 블록별로 연결된 LLM 태그, 콜스택 등 메모리 할당 및 할당 해제와 관련된 상세한 정보를 언제든지 볼 수 있습니다.

image_93.png

조사(Investigation) 패널은 할당과 관련된 다양한 쿼리 기능을 제공합니다. LLM 태그는 다양한 LLM 태그의 비저빌리티를 제어합니다.

개별 서버 트레이스 프로세스

언리얼 트레이스 서버는 백그라운드에서 단일 서버 인스턴스로 실행되며, 프로젝트의 여러 인스턴스 간에 공유할 수 있습니다. 퍼포먼스에 최소한의 영향만을 끼치는 가벼운 프로그램으로, 유저 인터페이스는 포함되어 있지 않습니다.

늦은 연결 향상

이전 버전의 언리얼 인사이트에서는 인사이트 프로그램과의 연결이 늦어지면 연결 성공 전의 전에 일회성 이벤트(중요 이벤트)를 놓치는 경우가 있었습니다. 이제는 중요 이벤트가 언리얼 엔진 클라이언트 측에 캐시되므로, 연결되는 동안 연결이 늦어진 머신에 전송됩니다.

태스크 그래프 인사이트

태스크 그래프 인사이트(Task Graph Insights)는 태스크 그래프 시스템에 대한 프로파일링을 제공합니다. 이 인사이트에는 태스크별로 관련 타이밍 이벤트를 보는 기능과 중첩 및 후속 태스크와 타이밍 이벤트와의 관련성을 표시하는 태스크 종속성이 포함됩니다.

image_94.png

컨텍스트 스위치

컨텍스트 스위치(Context Switch)는 CPU 코어 트랙 관련 정보를 표시하는 신규 트레이스 채널입니다. CPU 코어마다 기록된 트레이스의 디테일을 표시하는 트랙이 있습니다. 기록된 트레이스의 예로 각 CPU 스레드에서 실행되는 각 이벤트를 표시하는 타이밍 이벤트가 있습니다.

image_95.png

런타임 에셋 로딩을 위한 젠 로더

젠 로더(Zen Loader)는 언리얼 엔진 5.0의 디폴트 런타임 로더로, 컨테이너 파일에서 에셋을 로드합니다. 스테이징 페이즈 중에 오프라인으로 계산되는 오브젝트 종속성 그래프 및 최적화 패키지를 사용하여 CPU의 오버헤드 현상을 줄입니다. 컨테이너 파일은 파일 시스템 추상화를 방지하고, I/O 디스패처라는 새 I/O 추상화 레이어를 사용하여 최소한의 CPU 오버헤드로 데이터 청크를 찾아내는 로더를 제공합니다. I/O 디스패처는 플랫폼별로 지정된 백엔드를 사용하여 하드웨어의 성능 및 API를 활용합니다.

젠 로더는 이벤트 기반 로더(Event Driven Loader, EDL)를 기반으로 하며, 사용하려면 이름 테이블, 임포트/익스포트 맵, 프리로드 종속성 같은 쿠커의 동일한 출력 타입이 필요합니다. 레거시 EDL 런타임 로직은 오프라인으로 이전되었으며 스테이징 페이즈 도중 생성됩니다. pak 명령을 사용하여 스테이징을 진행할 때마다 EDL 대신 젠 로더를 사용합니다.

추가 변경 사항은 다음과 같습니다.

  • 패키지 요약, 블롭 익스포트, 벌크 데이터, 셰이더는 컨테이너 파일에 위치합니다.

  • 대부분의 중요한 패키지 메타데이터 및 모든 패키지 상호종속성을 패키지 ID별로 인덱스가 적용된 패키지 저장소에 수집합니다.

  • .uasset 패키지 헤더가 최적화된 패키지 요약으로 변환됐습니다.

  • 외부 체인이 있는 임포트 맵을 제거했습니다. 익스포트 오브젝트 해시에 의한 직접 참조로 대체합니다.

  • 이름 테이블에 최적화된 새 배치 포맷을 추가했습니다.

  • 종속성을 프리로드할 경우 패키지 단위의 익스포트 번들 노드로 플래튼되어, CreateExportSerializeExport 호출 시퀀스 및 종속성을 다른 익스포트 번들 노드에 지정합니다.

범용 UI 플러그인(베타)

언리얼 엔진 5.0에 여러 레이어, 팝업, 서브 메뉴 등 내비게이션이 복잡한 크로스 플랫폼 유저 인터페이스 개발을 지원하는 범용 UI(CommonUI) 플러그인이 도입되었습니다.

범용 UI는 플러그인(Plugins) 메뉴에서 활성화할 수 있습니다. 이 플러그인은 아직 UE 5.0에서 베타 단계이지만, 포트나이트를 포함한 에픽게임즈의 다양한 제품에서 테스트되었으며 널리 사용되고 있습니다. 다음은 범용 UI의 툴에 관한 요약입니다. 범용 UI의 사용법에 대한 포괄적인 정보는 범용 UI 문서를 참조하세요.

활성화 가능 위젯

일반 활성화 가능 위젯(Common Activatable Widget) 클래스는 위젯에 사용 가능한 신규 베이스 C++ 클래스입니다. 활성화 가능 위젯에서는 활성 및 비활성 상태를 토글할 수 있습니다. 비활성 상태에서는 계속 화면에 렌더링하지만 인터랙션이 불가능합니다. 이 클래스는 회색 표시된 메뉴 옵션처럼 메뉴의 내비게이션에서 비활성화하고 건너뛸 수 있는 요소를 나타내는 데 적합합니다. 활성화 가능 위젯은 기본적으로 비활성 상태라는 점에 유의하세요.

입력 라우팅

UI는 사용자가 상황에 맞지 않는 메뉴와 실수로 인터랙션하는 상황을 막아야 하므로, 다수의 레이어가 배치된 창 및 프롬프트로 이루어진 복잡한 메뉴를 만들 때 난관에 부딪힐 수 있습니다. 입력 라우팅(Input Routing) 은 게임의 뷰포트 클래스에서 입력을 캡처하여 해당 프로세스를 자동으로 처리한 후, 이를 자손뿐만 아니라 뷰포트에서 최상단에 표시된 위젯으로 전달합니다.

image_96.gif

예를 들어 2개의 메뉴가 겹쳐진 경우, 입력 라우팅 시스템에서 둘 중 상위 메뉴에 입력을 전달합니다. 이후 메뉴에서 해당 입력을 자손에게 라우팅합니다. 하위 레이어에 속한 메뉴는 입력을 전혀 받지 못하므로, 사용자는 상위 메뉴가 제거되거나 하위 메뉴가 상위 메뉴로 옮겨지기 전까진 자손 버튼과 인터랙션할 수 없습니다. 그리고 비활성 상태인 활성화 가능 위젯은 무시합니다. 입력 라우팅 사용 시 게임패드를 이용한 내비게이션을 더 만들기 쉽지만, 터치 입력 및 마우스와 키보드에도 사용할 수 있습니다.

입력 매핑 및 플랫폼 지원

image_97.gif

입력 디바이스의 버튼을 누르면 일반 액션 위젯에서 표시하는 아이콘이 자동으로 전환됩니다.

범용 UI는 다양한 플랫폼에 다음과 같은 쾌적한 UI 입력 매핑 툴을 제공합니다.

  • UI 입력 액션 매핑(UI Input Action Mapping) - 입력 액션 데이터 테이블을 생성해 특정 버튼에 대한 추상적 UI 액션을 매핑합니다.

  • 플랫폼별 액션 오버라이드(Per-Platform Action Overrides) - 특정 콘솔에서 확인 및 뒤로 버튼을 교체할 때처럼 특정 UI 액션에 대한 오버라이드를 생성합니다.

  • 컨트롤러 아이콘 관리(Controller Icon Management) - 컨트롤러 데이터 에셋(Controller Data Assets) 을 특정 컨트롤러의 아이콘 세트와 생성한 후 UI 입력 액션에 연결합니다. 일반 액션(Common Action) 위젯에서는 선택한 액션에 적합한 아이콘과 사용자가 애플리케이션을 제어하기 위해 사용하는 디바이스를 표시합니다.

참고로 입력 액션 데이터 테이블에 나열된 액션은 범용 UI 유저 인터페이스에서만 사용할 수 있으며, 레거시 입력 및 고급 입력 시스템의 인게임 액션에 사용되는 액션과는 관련이 없습니다.

범용 UI 위젯 및 UI 스타일링

image_98.gif

범용 UI는 UMG의 팔레트의 범용 UI 플러그인(Common UI Plugin) 섹션에 속한 신규 위젯 라이브러리를 추가합니다. 새 위젯 중 상당수는 수많은 게임 및 애플리케이션에서 흔히 제작하는 UI 기능의 일부입니다. 해당 위젯은 다음과 같습니다.

  • 날짜/시간숫자 값에 전용 텍스트 블록을 사용합니다.

  • 내비게이션 및 비저빌리티는 캐러셀 애니메이션 스위치 와 비슷한 역할을 수행합니다.

  • 플랫폼은 로딩 가드하드웨어 비저빌리티 보더 와 비슷한 역할을 수행합니다.

  • 위젯은 버튼 및 텍스트처럼 기본적인 기능을 제공하지만, 스타일링을 위해 스타일 데이터 에셋도 사용합니다.

범용 UI에 사용되는 스타일링 데이터 에셋은 표준 UMG 위젯에서 보통 발견할 수 있는 머티리얼, 텍스처, 폰트, 기타 스타일링 엘리먼트를 포함하는 블루프린트 클래스입니다. 범용 UI의 위젯은 위젯 자체의 스타일링 데이터를 유지하는 대신, 이러한 에셋의 레퍼런스를 사용합니다. UI 디자이너는 이러한 레퍼런스를 활용하여 다양한 메뉴와 HUD를 사용하면서도 손쉽게 스타일의 일관성을 유지할 수 있습니다.

뿐만 아니라 범용 UI 위젯의 새 인스턴스에 적용될 글로벌 디폴트 스타일을 제공할 수도 있습니다. 해당 옵션은 프로젝트 세팅(Project Settings) > 플러그인(Plugins) > 범용 UI 에디터(Common UI Editor) 메뉴의 템플릿 텍스트, 템플릿 버튼, 템플릿 보더에서 찾을 수 있습니다. 이러한 옵션에 스타일을 제공할 경우, 변경사항이 아직 다른 스타일을 보유하지 않은 모든 범용 UI 위젯으로 전파됩니다.

프로젝트 세팅(Project Settings) > 플러그인(Plugins) > 범용 UI 프레임워크(CommonUI Framework) 에서 더 분화된 엘리먼트용 에셋을 선택할 수도 있습니다. 이러한 에셋에는 로딩 가드에 사용하는 디폴드 쓰로버 머티리얼(Default Throbber Material) , UI에 언로드 된 엘리먼트용 플레이스홀더 이미지로 사용하는 디폴트 이미지 리소스 등이 있습니다.

슬레이트 및 UMG 퍼포먼스

언리얼 엔진 5.0에서는 슬레이트와 UMG의 퍼포먼스가 향상되었습니다. 주요 개선 사항은 글로벌 인밸리데이션(Global Invalidation)슬레이트 어트리뷰트(Slate Attributes) 사용으로, 프레임당 TAttribute를 여러 번 업데이트할 필요성이 줄어듭니다. 슬레이트 어트리뷰트의 자세한 정보는 Engine\Source\Runtime\SlateCore\Public\Types\SlateAttribute.h에서 찾을 수 있습니다. (4.24 버전에 도입된) 글로벌 인밸리데이션은 무효화된 위젯만 업데이트/페인트합니다.

이제 글로벌 인밸리데이션을 활성화하면 슬레이트 어트리뷰트가 적절하게 업데이트되므로, 프로젝트를 글로벌 인밸리데이션으로 쉽게 전환할 수 있습니다. 퍼포먼스의 이유로 게임 위젯에 슬레이트 어트리뷰트/어트리뷰트를 사용하지 않는 편이 좋습니다. 글로벌 인밸리데이션은 디폴트로 활성화되지 않으며, 일부 마이너 SWidget은 여전히 신규 시스템으로 변환해야 합니다.

SWidget 계층구조의 안정성을 테스트하기 위해 다수의 검증 함수를 추가했습니다. 해당 함수는 위젯 리플렉터 에서 활성화할 수 있습니다.

버추얼 프로덕션

image_99.png

디 아이: 칼란텍 Aaron Sims Creative 이미지 제공

언리얼 엔진 5.0은 버추얼 프로덕션 워크플로에 새로운 한 획을 그었습니다. UE 4.27에서 이룩한 안정성과 숙련도가 5.0에서 한층 더 발전됐습니다. 인카메라 VFX 툴에 4.27 버전의 모든 주요 워크플로를 포함하였으며, 스테이지 작업 및 콘텐츠 프로덕션을 추가로 지원하기 위해 UE 5.0에 새 기능을 추가했습니다.

나나이트는 버추얼 프로덕션 사용 사례에서 무비 렌더 큐 및 nDisplay 렌더링 파이프라인 양쪽에서 베타 기능으로 지원됩니다. GPULM 혹은 패스 트레이서와 함께 사용할 경우, 완전한 디테일의 표면 대신 나나이트 예비 메시를 사용합니다. USD의 지원 범위를 레벨에서 시퀀서로 확장하여, USD 파이프라인을 사용할 때 레이아웃 같은 프로덕션 워크플로로 언리얼 엔진을 활용할 수 있도록 했습니다.

루멘은 MRQ 렌더링 파이프라인에서 문서화된 제약이 있는 베타 기능으로 간주됩니다. 언뜻 보면 nDisplay와 함께 작동하는 것처럼 보이지만, 아직은 루멘을 인카메라 VFX 프로덕션이나 VR 및 nDisplay 렌더링 파이프라인을 사용하는 비슷한 워크플로에 사용할 수 없습니다. 사용자는 아티팩트나 퍼포먼스 관련 문제가 발생할 가능성을 염두에 두어야 합니다. 저희는 앞으로 루멘을 계속해서 개발하여 nDisplay 및 VR 워크플로 지원을 추가할 예정입니다.

인카메라 VFX에 나나이트, GPULM, 패스 트레이서 사용

영화 제작자들은 인카메라 VFX 프로덕션에서 언리얼 엔진 5.0의 새 렌더링 기능을 활용하여 퀄리티를 극대화하고 창작의 자유를 최대한 누릴 수 있습니다. 나나이트를 사용하면 포스트 프로덕션 도중에만 사용할 수 있었던 VFX 스타일 에셋을 실시간으로 사용하고 GPU 라이트매스로 라이트를 적용할 수 있습니다. nDisplay의 패스 트레이서 지원 덕분에 라이팅 워크플로를 개방하여 스테이지에서 변경한 내용을 실시간으로 미리 볼 수 있습니다. 버추얼 프로덕션 콘텐츠 제작 시 사용할 툴세트를 더욱 발전시키기 위해 이번 출시 버전에서 nDisplay에서 버추얼 텍스처를 완전히 지원합니다.

nDisplay 향상

내부 프러스텀에 대한 오버스캔 지원, 페일오버 지원, nDisplay 환경설정 에디터 내 뷰포트 회전을 추가하여 언리얼 엔진 5.0의 nDisplay 툴을 더욱 향상시켰습니다. 추가 변경 사항은 다음과 같습니다.

  • 프로젝션 정책으로 뷰포트별 통계 오버레이 지원

  • 블루프린트 API 향상

  • 프러스텀 시각화 및 내부 프러스텀 경계 시각화

  • 프로시저럴 메시 지원

내부 프러스텀에 대한 nDisplay 디렉셔널 오버스캔

이제 상하좌우 방향별로 내부 프러스텀 오버스캔을 지정할 수 있습니다. 인카메라 - VFX 시나리오의 경우 이 기능은 특정한 방향으로 내부 프러스텀을 확장하여 이동 카메라의 지연시간까지 포함하거나 세트에 의해 부분적으로 흐려진 프러스텀의 렌더링 크기를 줄이는 데 유용합니다. 오버스캔의 해상도는 선택적으로 자동 조정되며 동일한 비주얼 퀄리티를 유지합니다.

image_100.gif

내부 프러스텀에서 경계 시각화 및 오버스캔 기능을 보여주는 인카메라 VFX 셋업. 첫 번째는 내부 프러스텀에 오버스캔이 적용되지 않은 모습, 그다음은 오버스캔을 50% 적용하여 내부 프러스텀의 오른쪽 부분을 확장한 모습, 마지막은 전체 내부 프러스텀에 1.25 배수를 적용한 모습입니다.

출력 매핑 내 뷰포트 회전

이전에는 nDisplay 뷰포트에 트랜스폼 연산을 적용하려면 스태틱 메시 또는 커스텀 UV 매핑을 적용한 외부 .obj 파일을 제공해야 했습니다. 이제 nDisplay 환경설정 에디터의 출력 매핑 패널에서 회전 및 스케일과 같은 트랜스폼 연산을 뷰포트에 직접 적용할 수 있습니다.

image_101.gif

페일오버 지원

이제 nDisplay 클러스터에 대한 페일오버 정책을 활성화할 수 있습니다. 현재 사용 가능한 페일오버 정책은 실패 시 S 노드 드롭(Drop S-node on fail) 하나뿐이며, 클러스터에 대한 네트워크 재시도 세팅을 초과하면 클러스터에서 세컨더리 노드가 드롭됩니다. 실패한 노드가 드롭되면 클러스터는 실패한 노드 없이 계속 작동됩니다. 프라이머리 노드가 드롭되면 클러스터가 종료됩니다.

새로운 콘솔 변수 에디터 플러그인(베타)

콘솔 변수 에디터(Console Variables Editor) 는 프로젝트에 설정된 모든 콘솔 변수와 명령에 대한 정보를 표시하는 패널로, 모든 변수를 확인하고 수정할 수 있는 중심적인 위치를 제공합니다. 여러 프로젝트에 걸쳐 동일한 콘솔 변수 및 값을 사용하도록 프리셋을 생성할 수 있습니다. 콘솔 변수 에디터는 멀티 유저 세션에서 여러 컴퓨터의 콘솔 변수 및 명령 컨트롤도 지원합니다.

image_102.gif

새로운 OpenCV 플러그인(베타)

이전 버전에서는 OpenCV가 버추얼 프로덕션 툴세트에 포함되었습니다. 이번 출시에서 OpenCV는 독립형 플러그인이 되었습니다. 플러그인은 OpenCV 4.5.5 버전을 사용하며, ArUco 마커 트래킹이나 체커보드 트래킹과 같은 새 블루프린트 노드를 추가합니다.

리모트 컨트롤 향상

다음과 같이 추가된 몇 가지 방법을 통해 새로운 씬에서 리모트 컨트롤 프리셋과 웹 애플리케이션을 세팅하는 데 소요되는 시간을 줄일 수 있습니다.

  • 리바인딩: 이제 이전에 생성한 리모트 컨트롤 프리셋을 열고 새로운 씬의 액터에 리바인딩하여 컨트롤을 다시 링크할 수 있습니다.

  • 템플릿: 한 액터에 포함된 여러 개의 인스턴스를 비슷하게 컨트롤하고 싶다면, 이제 리모트 컨트롤 웹 애플리케이션에서 여러 개의 컨트롤을 묶어 액터의 템플릿으로 설정할 수 있습니다. 웹 애플리케이션에서 액터 인스턴스를 전환하여 해당 인스턴스에서 컨트롤을 사용합니다.

카메라 렌즈 보정 향상

이번 출시에서 렌즈 디스토션 및 노달 오프셋을 보정하는 새로운 두 가지 알고리즘이 프리뷰에 포함되었으며, 렌즈 보정 프로세스는 다음과 같이 향상되었습니다.

  • 렌즈를 보정한 뒤 이미지 중앙 수동 조정

  • 렌즈 파일 에셋 에디터의 뷰포트에 조준선과 같은 오버레이 추가

  • 렌즈의 광축과 입사동 위치를 찾는 새 알고리즘을 이용해 노달 오프셋 보정

  • 3D-2D 포인트 대응 세트를 수동 캡처할 수 있는 새 알고리즘으로 렌즈 디스토션 보정

  • 렌즈 정보를 렌즈 파일에 자동 저장

  • ulens 파일에 JSON 포맷으로 임포트/익스포트

DMX 향상

DMX 툴세트는 다음과 같은 부분이 향상되었습니다.

  • 테이크 레코더로 DMX 트랙의 저장 속도 대폭 향상

  • 출력 포트 딜레이 가능

  • 출력 포트에서 다수의 유니캐스트 어드레스 지원

  • 출력 포트에서 매초 미변경 데이터 재전송

  • 픽스처 타입에 매트릭스 할당 가능

  • GDTF 표준 지원 증가

image_103.gif

레벨 스냅샷 향상

레벨 스냅샷(Level Snapshots) 플러그인에 다음과 같은 기능 지원을 추가했습니다.

nDisplay용 레벨 스냅샷(Level Snapshots for nDisplay) 플러그인 제거 및 레벨 스냅샷(Level Snapshots) 플러그인에 nDisplay 지원 추가

  • 폴리지 지원 추가

  • 레벨 스냅샷에서 부모/자손 관계 및 컴포넌트 복원 가능

  • 레벨 스냅샷 저장 및 로딩 퍼포먼스 향상

스위치보드 향상

이번 출시에서는 스위치보드에 대한 사용자 경험에 초점을 맞춰 다음을 향상시켰습니다.

  • 메인 스위치보드 창과 세팅 창의 UX를 향상되었습니다.

  • 이제 메인 스위치보드 창 하단에서 멀티 유저 서버에 액세스할 수 있습니다. 멀티 유저 서버는 멀티 유저 세션 컨트롤용 액션을 추가합니다.

  • 노드 실행 시 언리얼 인사이트 컬렉션을 활성화할 수 있습니다.

  • 이제 스위치보드에서 zip 파일의 형태로 로그를 수집할 수 있습니다.

시퀀서 플레이리스트

새로운 시퀀서 플레이리스트(Sequencer Playlist) 기능으로 레벨 시퀀스를 즉석에서 준비, 큐 등록, 트리거할 수 있습니다. 플레이리스트는 에디터에서 재생하기 위해 모든 서브시퀀스의 시간을 미리 조절할 필요성을 제거해 주므로 버추얼 프로덕션, 브로드캐스트 및 라이브 이벤트 스테이지의 애니메이팅된 콘텐츠와 인터랙션할 때 유연성과 민첩성이 높아집니다.

시퀀서 플레이리스트에는 다음과 같은 기능이 포함됩니다.

  • 레벨 시퀀스를 개별로 또는 동시에 재생 및 중지합니다.

  • 재생 시 시퀀스에 트림, 루프, 시간 스케일을 적용합니다.

  • 필요 시 레벨 시퀀스를 비활성화(Mute)하여 특정 클립의 재생을 건너뜁니다.

  • 리허설 및 정렬을 위해 시퀀스의 첫 프레임을 무기한 보류합니다.

  • 라이브 재생을 포스트 작업용으로 캡처하기 위해 테이크 레코더로 플레이리스트가 트리거한 애니메이션을 녹화합니다.

image_104.png

향상된 USD

에픽게임즈는 유니버설 씬 디스크립션(Universal Scene Description, USD) 에 대한 지원을 늘리고 있습니다. 언리얼 엔진 5에서는 임포트/익스포트 프로세스 개선, 나나이트 및 시퀀서 등의 기능을 대상으로 USD 지원 확장에 초점을 맞추어 USD를 몇 가지 향상했습니다.

USD 스테이지의 나나이트 지원

언리얼 엔진 5에서 새로 도입되는 시각화 마이크로폴리곤 지오메트리 시스템인 나나이트를 USD 스테이지 액터에도 사용할 수 있습니다. 덕분에 수백만 폴리곤으로 구성된 필름 퀄리티의 소스 아트를 임포트하고, 3D 아티스트들이 에셋의 고해상도/저해상도 버전을 제작할 때 겪던 요구사항을 없애줍니다.

사용자는 나나이트 태그를 USD 파일의 에셋에 추가하여 나나이트를 USD 에셋에 활성화할 수 있습니다. 아니면 USD 스테이지를 세팅할 때 한계치를 제공해도 됩니다.

기타 USD 개선 사항

이번 출시 버전에서도 USD 임포트/익스포트 파이프라인에 다음과 같은 향상된 기능이 추가되었습니다.

  • 언리얼 엔진에서 USD SDK 버전 21.08 사용

  • 시퀀서에서 USD 파일 포맷으로 애니메이션 시퀀스 익스포트 가능

  • 콘텐츠 드로어에 있는 스태틱 메시 에셋을 USD로 익스포트 가능

  • 언리얼 엔진 레벨에 다수의 USD 스테이지 에셋 포함 가능

개발자 툴

라이브 코딩

언리얼 엔진에서 Live++ 통합을 사용하여 라이브 코딩(Live Coding) 을 지원합니다. 이 기능은 UE 4.22 버전에서 실험단계 기능으로 도입되었으며, 5.0의 모든 프로젝트에 디폴트로 활성화됩니다.

라이브 코딩을 사용하면 엔진 실행 중에 C++ 코드를 리컴파일하고 프로젝트의 바이너리를 패치할 수 있습니다. 에디터에서 플레이(Play In Editor, PIE)를 사용하는 도중에도 패치가 가능합니다. 라이브 코딩은 이전 버전의 핫 리로드 시스템에 비해 반복작업이 훨씬 빠르고 유연성이 뛰어나 기본적으로 활성화 상태입니다. 그러나 라이브 코딩을 비활성화하고 대신 핫 리로드를 사용할 수도 있습니다.

IDE에서 C++ 코드를 편집할 경우 라이브 코딩 콘솔(Live Coding Console) 이 자동으로 나타납니다.

image_105.png

라이브 코딩 콘솔은 컴파일 상태에 대한 출력 로그를 제공합니다. 이는 표준 출력 로그와는 별도이며, 라이브 코딩 빌드 정보만 표시합니다.

IDE나 언리얼 에디터에서 Ctrl + Alt + F11 을 누르면 언제든지 코드를 리빌드하고 게임의 바이너리를 패치할 수 있습니다. 빌드 상태를 표시하는 알림이 화면 우측 하단에 나타납니다. 빌드가 실행되는 동안 방해받지 않고 에디터에서 작업을 계속하거나 프로젝트를 테스트할 수 있습니다.

image_106.png

빌드에 성공하면 코드에 따른 변경 사항이 즉각적으로 적용되는 것을 볼 수 있습니다. 라이브 코딩은 언리얼 에디터가 열려 있을 때, PIE를 사용할 때, 네이티브 데스크톱 환경에서 패키지로 만든 빌드에 어태치할 때 작동합니다. 콘솔 및 모바일 디바이스 실행 시에는 작동하지 않습니다.

참고로 변수의 디폴트값을 변경할 경우, .cpp로 구현된 생성자에서 설정한 값은 오브젝트의 기존 인스턴스에 업데이트되지 않습니다. 그러나 .h 파일에서 변경하면 변경 사항이 적용됩니다.

라이브 코딩은 값 변경이나 함수 조정 등 작은 코드 조정을 매우 쉽게 처리합니다. 그러나 오브젝트 리인스턴싱(Object Reinstancing) 을 활성화하지 않은 상태로 구조적인 대규모 변경에 사용할 경우 예측할 수 없는 방식으로 동작하여 크래시가 일어날 수 있습니다. 자세한 내용은 아래 오브젝트 리인스턴싱의 노트 부분을 참조하세요.

오브젝트 리인스턴싱

오브젝트 리인스턴싱은 라이브 코딩이나 핫 리로드로 C++ 코드를 리빌드한 뒤 오브젝트 인스턴스를 재생성합니다. 다음 UE 타입과 연관된 오브젝트에 영향을 미칩니다.

  • UCLASS

  • UENUM

  • USTRUCT

  • UDELEGATE

  • UFUNCTION

여기에는 액터 및 UObject 인스턴스 자체, 연관된 변수에서 파생된 블루프린트 노드 인스턴스, 그리고 이러한 매크로를 사용할 때 언리얼 리플렉션 시스템으로 생성한 다른 오브젝트가 포함됩니다.

핫 리로드 및 라이브 코딩은 기본적으로 오브젝트 리인스턴싱을 사용합니다. 에디터 개인설정(Editor Preferences) > 일반(General) > 라이브 코딩(Live Coding) 에서 리인스턴싱 활성화(Enable Reinstancing) 옵션을 토글하여 오브젝트 리인스턴싱을 비활성화하고 라이브 코딩을 켤 수 있습니다.

image_107.png

활성화하면 대규모로 코드를 변경할 때 라이브 코딩의 안정성과 일관성이 크게 증가합니다. 그러나 코드가 리인스턴싱될 수 있는 오브젝트에 포인터를 유지하는 경우, ReloadReinstancingCompleteDelegate 및 ReloadCompleteDelegate를 사용하여 포인터를 업데이트하거나 나중에 다시 채울 수 있도록 캐시를 무효화해야 합니다. 핫 리로드는 리인스턴싱된 오브젝트가 적절하지 않은 방식으로 레퍼런스 해제되는 상황을 어느 정도 허용하지만, 라이브 코딩은 에디터가 리인스턴싱된 오브젝트의 소멸자와 상충하여 종료되면 크래시를 일으킵니다.

클랭 새니타이저 지원

이제 언리얼 엔진 5.0의 언리얼 빌드 툴에서 Linux, Android를 대상으로 클랭(Clang) 언어의 새니타이저(Sanitizers) 를 지원합니다. 새니타이저는 초기화되지 않은 메모리 액세스, 경쟁 조건, 메모리 누수 등 런타임 시 흔히 검출되는 특정 유형의 오류가 포함된 C++ 소스 코드를 빠르게 분석합니다. 새로 추가된 여러 UBT 아규먼트를 통해 다음 새니타이저를 사용할 수 있습니다.

새니타이저

UBT 명령

설명

어드레스 새니타이저(Address Sanitizer, ASan)

-EnableASan

외부 액세스 오류, 메모리 누수 등 다양한 메모리 액세스 관련 문제를 탐지합니다.

HWASan(Android 전용)

-EnableHWASan

ASan의 하드웨어 가속 버전으로 Android에 사용합니다. 메모리 사용량이 20~30% 감소합니다.

스레드 새니타이저(Thread Sanitizer, TSan) (Android 사용 불가)

-EnableTSan

경쟁 조건, ADA 문제 등 스레딩 이슈를 탐지합니다.

정의되지 않은 비헤이비어 새니타이저(Undefined Behavior Sanitizer, UBSan)

-EnableUBSan

out-of-bounds 오류, 정수 오버플로, 초기화되지 않은 메모리 등 C++에서 정의되지 않은 비헤이비어로 인식하는 모든 대상을 탐지합니다.

MinUBSan(Android 전용)

-EnableMinUBSan

Android에 사용하기 위해 UBSan을 최소화한 버전입니다.

메모리 새니타이저(Memory Sanitizer, MSan) (Linux 전용)

-EnableMSan

초기화되지 않은 메모리에 대한 읽기 시도를 탐지합니다.

새니타이저를 사용하려면 원하는 새니타이저에 UBT 명령을 사용하여 언리얼 빌드 툴을 실행합니다. 그러면 새니타이저가 최종 실행파일에 연결됩니다. 예를 들어 다음 명령을 사용하면 ASan 새니타이저가 프로젝트에 연결됩니다.

Build\BatchFiles\Build.bat MyGame Android Development -WaitMutex -FromMsBuild -EnableASan

이후 애플리케이션을 실행하면 로그에 새니타이저의 오류 탐지 출력이 표시됩니다. Visual Studio에서 새니타이저를 사용하려면 프로젝트의 프로퍼티(Properties) 를 열고, Nmake > 명령줄 빌드(Build Command Line) 에 아규먼트를 추가하세요. 참고로 새니타이저를 실행할 때마다 위치에 상관없이 검사하는 프로그램의 속도가 2~3x 감소합니다.

클랭의 새니타이저와 관련된 자세한 내용은 해당 툴의 정보가 자세히 수록된 클랭 문서를 참조하세요.

RAD 게임 툴

Bink 오디오

RAD Game Tools가 개발한 Bink 오디오 코덱이 언리얼 엔진 5에 내장되었습니다. Bink 오디오는 최적화 수준과 메모리 효율성이 높은 멀티플랫폼 범용 오디오 인코딩입니다. 사운드 웨이브 에셋에서 '포맷(Format)' 헤더 아래의 체크 박스를 눌러 간단하게 활성화할 수 있습니다.

턴키 플랫폼 자동화 시스템

턴키(Turnkey) 는 플랫폼 지원을 간소화하는 언리얼 자동화 툴(Unreal Automation Tool, UAT) 의 새로운 시스템으로, SDK 설치 및 디바이스에 빌드 디플로이 등이 포함됩니다. 턴키의 목적은 조직 내의 사용자 대부분이 이러한 일반적인 작업을 '원클릭' 프로세스로 간단히 사용하는 파이프라인을 제공하는 것입니다.

턴키의 옵션 대부분은 언리얼 에디터플랫폼(Platforms) 메뉴에서 찾을 수 있습니다.

image_108.png

여기서 설치된 SDK를 체크한 다음, 새 SDK를 설치하거나 기존 SDK를 업데이트합니다. 향후 이 메뉴는 언리얼 에디터의 모든 빌드 관리 옵션을 하나로 압축해 파일(File) > 패키지 프로젝트(Package Project) 옵션과 프로젝트 런처(Project Launcher) 를 모두 대체할 예정입니다. 디바이스 발견 및 클레임에는 아직 디바이스 매니저를 사용하지만, 빠른 실행 옵션을 사용하면 지정한 디바이스에 빌드를 빠르게 디플로이할 수 있습니다.

또한 RunUAT.bat 턴키를 실행하여 명령줄 인터페이스에서 턴키에 액세스할 수도 있습니다. 이렇게 명령줄 메뉴가 표시되는 동안, 턴키의 옵션을 .bat 파일로의 초기 콜 파라미터로 지정할 수 있습니다. 예를 들어 RunUAT Turnkey -command=ExecuteBuild -platform=Win64 는 Windows용 프로젝트를 빌드합니다. 플랫폼 메뉴의 옵션은 단순히 여러 플랫폼 및 환경설정용으로 사전 스크립팅된 명령입니다.

image_109.png

턴키를 빌드 및 디바이스 관리에 사용할 수도 있지만, 턴키의 가장 강력한 기능은 자동화된 SDK 설치입니다. 많은 플랫폼이 SDK를 자주 업데이트하지만, 언리얼 엔진의 모든 버전은 출시 시점의 특정 SDK 버전과만 호환됩니다. 따라서 개발자는 어떤 SDK를 사용해야 할지 결정하기가 어려울 수 있으며, 특히 각각 다른 버전의 언리얼 엔진으로 다수의 프로젝트를 제작 중일 때는 더욱 그렇습니다. 또한 업그레이드 시 조직 내 모든 구성원이 계속해서 최신 상태를 유지하는 것 역시 어려워집니다. 턴키는 현재 버전의 언리얼 엔진에 맞게 사용 가능한 최적의 SDK를 자동으로 가져와 설치함으로써 이 프로세스를 단순화합니다.

데스크톱 및 콘솔에서 이 기능을 사용하려면 조직이 액세스 가능한 위치에서 SDK 파일을 호스팅해야 합니다. 턴키는 Perforce나 Google Drive, 또는 이러한 SDK 파일을 호스팅하기 위한 로컬 파일 경로를 지원하며, 사용자는 턴키에서 확인해야 할 위치 관련 규칙과 조직에서 사용 가능한 SDK를 보유한 플랫폼을 설정할 수 있습니다.

턴키 설정 및 사용에 대한 전체 문서는 턴키 문서를 참조하세요. 모바일 플랫폼에서 사용하는 턴키 기능에 관한 정보는 모바일용 턴키 지원을 참조하세요.

모바일

개발 요구 사항 및 호환 가능한 하드웨어

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

iOS, iPad OS, tvOS

UE 5.0은 각 SDK 버전 14 이상을 지원하고 Apple A8 프로세서 이상을 사용하는 iOS, iPadOS, tvOS 디바이스를 지원합니다. 다음은 최소 호환 가능 디바이스 모델입니다.

  • iOS 14

    • iPhone 6S 이상

    • iPod Touch 7세대

  • iPadOS 14

    • iPad 5세대 이상

    • iPad Air 2 이상

    • iPad Mini 4 이상

    • iPad Pro(모든 모델)

  • tvOS 14

    • Apple TV HD

    • Apple TV 4K(1세대)

    • Apple TV 4K(2세대)

Android

UE 5.0는 다음 사양을 충족하는 Android 디바이스를 지원합니다.

  • Android 8 이상

  • 64비트 Arm 기반 CPU

  • 호환 가능한 GPU

    • Mali T8xx, G71, G72, G76, G77, G78, G710 시리즈

    • Adreno 5xx, 6xx, 7xx 시리즈

    • PowerVR GM9xxx

    • Xclipse 920

  • 호환 가능한 그래픽 API

    • OpenGL ES 3.2

    • Android 10 이상의 디바이스에서 호환 가능한 드라이버로 지원되는 Vulkan

모바일용 턴키 지원

턴키를 사용하여 Android SDK 를 구성하면, 턴키는 필요한 버전의 Android Studio 다운로드, 추가 셋업 단계 및 스크립트 실행 같은 대부분의 셋업 절차를 자동화합니다. 아직 수동으로 설치 마법사를 실행해야 하지만, 이 방식은 오류가 발생할 가능성이 매우 낮습니다. 수동 SDK 설치도 가능하지만 자동화 프로세스를 추천합니다.

현재 Android용 macOSX에서는 턴키를 사용할 수 없지만, 향후 출시에 추가할 예정입니다.

iOS, tvOS, iPadOS의 경우 프로비저닝을 엄격하게 제어하고 있기 때문에, 아직은 턴키에서 iOS 구성을 대상으로 프로비저닝 자동화를 지원하지 않습니다. 그래도 Xcode 구성 및 SDK 점검은 지원합니다.

Android 파일 서버 플러그인

UE 5.0에 Android 파일 서버(Android File Server, AFS) 플러그인을 도입합니다. 이 플러그인은 빌드를 생성할 때 파일 서버를 프로젝트에 임베딩합니다. 임베딩은 기본적으로 빌드를 출시할 때 비활성화됩니다. 디바이스의 AFS 인스턴스와 통신하여 다음 작업을 할 수 있습니다.

  • WiFi, USB로 파일을 푸시하거나 동시에 사용하여 설치 속도를 높일 수 있습니다.

  • 전체 빌드를 푸시하지 않고 명령줄 텍스트 파일을 변경할 수 있습니다.

  • 디바이스에 속한 모든 텍스트 파일의 콘텐츠를 표시할 수 있습니다.

  • ADB에서 사용 가능한 수많은 기타 연산을 수행할 수 있습니다.

AFS는 외부 스토리지 권한이나 지정된 스토리지가 없어도 파일 연산을 처리할 방법을 제시합니다. AFS는 디폴트로 활성화되지만, ADB를 대신 사용할 경우 프로젝트 세팅(Project Settings) > 플러그인(Plugins) > Android 파일 서버(AndroidFileServer) 에서 비활성화할 수 있습니다.

image_110.png

플러그인이 활성화되면 개발 및 디버그 빌드에서 AFS를 사용하여 파일을 Android 디바이스에 푸시합니다. USB 연결을 사용하거나, WiFi를 사용하여 로컬 영역 네트워크에 연결된 디바이스에 푸시할 수 있습니다. 디플로이 속도를 단축하기 위해 USB 및 네트워크 결합됨(USB and Network Combined) 을 사용하여 파일을 두 경로에 동시 푸시할 수 있습니다. 한쪽 연결이 파일이나 배치 파일의 전송 영역을 차지하면 다른 연결이 이어받습니다. 이 과정은 디플로이 프로세스의 일부로 통합됩니다.

또한 AFS는 자체적인 명령줄 툴을 보유하고 있는데, 이 툴은 Engine/Binaries/DotNET/Android/UnrealAndroidFileTool에 속한 엔진의 설치 디렉터리에서 찾을 수 있습니다. 해당 디렉터리에는 Linux, MacOS, Windows용 실행파일의 버전이 포함됩니다.

image_111.png

명령줄을 통해 이 실행파일을 실행할 경우, 파일의 실행가능 함수를 전부 포함한 메뉴가 표시됩니다.

image_112.png

파라미터가 설정된 일부 명령의 경우 뒤에 ‘-help' 명령을 추가하면 명령에 관련된 정보를 볼 수 있습니다.

마지막으로 블루프린트 라이브러리를 사용하면 언리얼 애플리케이션 내부에서 AFS를 시작 및 중단할 수 있습니다.

image_113.png

AFS에서 프로젝트를 위해 고유 보안 토큰을 생성하는 기초적인 보안 체계를 갖추고 있긴 하지만(프로젝트 세팅의 보안 토큰 파라미터 참조), 그래도 디폴트 브로드캐스트 서버를 사용하는 경우와 비교하여 AFS를 시작 및 중단하는 보다 안전한 수단을 생성하면 큰 도움이 됩니다.

Android 파일 서버를 사용하려면 Android SDK 26 이상 버전이 필요합니다.

Android 바이너리 크기 향상

UE 5.0에는 Android 애플리케이션의 바이너리 크기를 대폭 줄여 주는 많은 최적화를 도입했습니다. 이 최적화에는 불필요한 코드 제거, 동일한 코드 접기, 코드 블로트 클린업을 활성화하는 컴파일러와 링커 플래그가 포함됩니다. 이 최적화를 이용하여 포트나이트의 바이너리 크기를 약 50% 절감했습니다. 바이너리 크기를 줄일 뿐 아니라 코드도 조금 더 효율적으로 만들 수 있습니다.

또한 일부 고급 바이너리 최적화의 경우 직접 활성화해야 하며, Android SDK 버전이 23이상인 경우에만 사용할 수 있습니다.

*Engine.ini 파일에서 최소 SDK 버전을 변경할 수 있습니다.

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
MinSDKVersion=23

고급 최적화를 활성화하려면 다음 세팅을 추가합니다.

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
bEnableAdvancedBinaryCompression = true

최소 SDK 버전이 23 이상인 프로젝트는 기존 포맷 대신 새로운 GNU 해시 ELF 섹션을 사용하여 퍼포먼스를 개선하고 스타트업 시간을 단축합니다. 또한 진행 중인 프로젝트에서 Android 전용 압축 포맷인 APS 리로케이션 테이블 압축(APS Relocation Table Compression)을 활용할 수 있습니다. 일례로 에픽의 테스트에서 크기가 62MB인 리로케이션 테이블이 대략 8MB로 줄어들었습니다.

최소 SDK 버전이 28 이상인 프로젝트는 APS보다 효율성이 높은 RELR 리로케이션 테이블 압축(RELR Relocation Table Compression)을 활용할 수 있습니다. 일례로 에픽의 테스트에서는 62MB의 테이블이 약 600KB 혹은 두 자릿수 크기로 줄어들었습니다.

최소 SDK 버전을 23 이상으로 업그레이드하면 다른 장점이 있습니다. Android OS에서 개발자의 애플리케이션 APK에 있는 .so 바이너리를 직접 로드할 수 있어, 해당 바이너리를 디바이스에 따로 언팩하고 설치할 필요가 없어집니다.

Google Play Store에서 판매되는 프로젝트의 경우, 사용자가 앱을 다운로드할 때 스토어 자체의 즉석 APK 압축으로 인해 바이너리 크기가 더욱 줄어듭니다. 하지만 다른 App Store에서는 항상 같은 효과를 기대할 수 없습니다. 언리얼 엔진은 기본적으로 APK 압축을 강화합니다. 비활성화할 경우 다음 환경설정 변수를 추가하면 됩니다.

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
bExtractNativeLibs = false

DXC를 Vulkan 및 GLES 3.2의 기본 셰이더 컴파일러로 활용하기

UE5의 Vulkan 및 OpenGL ES3.2용 셰이더 컴파일러 툴 체인이 HLSLcc에서 Microsoft의 DirectX Shader Compiler(DXC) 로 바뀌었습니다. 이 컴파일러는 SPIR-V를 직접 생성하며, 퍼포먼스 개선을 위해 GLSL 하이레벨 소스를 생성할 필요가 없습니다. 또한 SPIRV-Tools 최적화 패스를 사용하여 효율적인 SPIR-V 코드를 생성합니다. DXC는 최신 HLSL 언어 기능에 대한 액세스도 제공합니다. 또 Microsoft, Google, AMD의 개발자들을 포함한 대규모 온라인 커뮤니티의 지원을 활용할 수 있습니다.

Vulkan의 경우, UE 5.0에서 사용할 수 있는 셰이더 컴파일러는 DXC가 유일합니다. HLSLcc 컴파일러는 Vulkan 백엔드에서 완전히 제거되었으므로 더 이상 사용할 수 없습니다.

OpenGL ES3.2의 경우 HLSLcc를 아직 예비로 사용할 수 있으며, 에뮬레이트된 유니폼 버퍼 비활성화 시 OpenGL ES를 지원하는 유일한 수단을 제공합니다.

모바일 렌더링 개선 사항

이제 다음 렌더링 기능을 UE 5.0의 모바일 렌더링 파이프라인에서 사용할 수 있습니다.

사전 통합된 서브서피스 스캐터링 셰이딩 모델(베타)

image_114.png

(왼쪽부터) SSS 없음, SSS 활성화(PC), SSS 활성화(모바일)

이제 모바일 포워드 렌더러가 서브서피스 프로파일(Subsurface Profile) 셰이딩 모델을 지원하므로 모바일 애플리케이션에서 스킨, 왁스, 플라스틱 등의 머티리얼을 한층 디테일하게, 정확한 라이팅으로 나타낼 수 있습니다. 효율성을 위해 디퓨전 프로파일이 룩업 테이블로 사전 통합되었으며, 이는 런타임에서 조정할 수 있습니다. 모바일 서브서피스 모델에는 커버처 맵이 필요하지만, 모바일이 아닌 서브서피스 모델은 데스크톱 및 콘솔의 서브서피스 프로파일에 사용되는 같은 파라미터와 모두 호환 가능합니다.

디스턴스 필드 섀도 지원(실험단계 기능)

image_115.png

UE 5.0에서 모바일 렌더러는 디스턴스 필드 섀도(Distance Field Shadows) 를 지원합니다. 다이내믹 라이팅을 사용하는 모바일 프로젝트에서 이 기능을 활성화하면 캐스케이드 섀도 맵과 함께 디스턴스 필드 섀도를 제공합니다. 캐스케이드 섀도 맵이 카메라에 근접한 오브젝트에 섀도를 제공하는 반면, 디스턴스 필드 섀도는 카메라에서 더 먼 거리에 있는 섀도를 채웁니다. 다이내믹 라이팅이 필요한 게임과 캐스케이드 섀도 맵의 허용 거리보다 더 멀리서 섀도를 렌더링해야 하는 게임에 유용합니다.

디스턴스 필드 섀도는 대다수의 모바일 하드웨어에서 실험단계 기능입니다. 사용하려면 Engine/Config/Android 또는 Engine/Config/IOS에서 ‘DataDrivenPlatform.ini'를 찾습니다. 이후 타깃 플랫폼의 해당되는 [ShaderPlatform ...] 섹션에서 bSupportsMobileDistanceField, bSupportsDistanceFields, bSupportsByteBufferComputeShaders를 true로, r.DistanceFieldShadowing을 1로 설정합니다. 설정한 뒤, 레벨 내 라이팅 소스에서 디스턴스 필드 섀도를 활성화하면 됩니다.

디스턴스 필드 섀도는 뎁스 프리패스가 필요하며, 이 경우 드로 콜 수가 약 2배로 늘어난다는 점에 유의하세요. 이는 모바일 게임에 심각한 영향을 미칠 수 있으므로 게임에 사용하기 전에 타깃 하드웨어에서 퍼포먼스 테스팅을 수행해야 합니다.

모바일 퍼포먼스 향상

UE 5.0의 모바일 렌더링 파이프라인에 패스 렌더링을 진행하는 동안 드로 콜과 연산 횟수를 줄일 수 있는 여러 최적화를 추가했습니다.

캐스케이드 섀도 맵 캐싱(실험단계 기능)

다이내믹 라이팅에 크게 의존하는 대규모 월드는 긴 드로 디스턴스에서 잠재적으로 수백 개의 스태틱 메시에 대한 다이내믹 섀도를 필요로 하므로, 렌더링 퍼포먼스 비용이 과도하게 높아질 수 있습니다. 특히 모바일 디바이스에서 상당한 제약이 있습니다. 언리얼 엔진 5.0은 이러한 환경에서 드로 콜을 절약하고 잠재적인 퍼포먼스를 개선하는 스태틱 메시용 캐스케이드 섀도 맵(Cascaded Shadow Maps, CSM) 캐싱 시스템을 제공합니다. 이 기능을 사용하려면 '프로젝트 세팅(Project Settings)' 메뉴에서 CSM 캐싱 활성화(Enable CSM Caching) 세팅을 활성화한 뒤 언리얼 에디터를 재시작합니다.

이 기능은 실험단계이며, 퍼포먼스 향상을 보장하지는 않습니다. CSM 캐싱이 드로 콜을 절약하는 것은 사실이지만, 섀도 맵 복사 패스를 추가하여 대역폭 비용이 늘어날 수도 있습니다. CSM 캐싱이 프로젝트에 도움이 될지 여부는 항상 타깃 하드웨어에서 비교해 보아야 합니다.

스킨캐시

이제 모바일 프로젝트에서 프레임 시작 시 스켈레탈 메시 스키닝을 한 번 사전 연산한 뒤 해당 연산을 동일 프레임 내 서로 다른 렌더링 패스에 재사용하는 스킨캐시(SkinCache) 가 지원됩니다. 이는 많은 수의 스켈레탈 메시를 사용하는 모바일 프로젝트에서 퍼포먼스를 비약적으로 개선합니다.

기본적으로 스킨캐시는 모든 플랫폼에서 비활성화 상태입니다. 활성화하려면 '프로젝트 세팅(Project Settings)'을 열고 스킨 캐시 계산 지원(Support Compute Skin Cache) 을 활성화합니다.

GPU 씬 인스턴싱 및 컬링

UE 5.0에서는 모바일의 다이내믹 인스턴싱 및 GPU 인스턴스 컬링이 향상되었습니다. GPU 씬 인스턴싱 및 컬링은 프로젝트의 드로 콜을 대폭 줄여 렌더링 퍼포먼스를 향상시킬 수 있습니다. 얻을 수 있는 효율은 프로젝트의 콘텐츠에 따라 다릅니다. 동일한 머티리얼을 포함한 메시를 많이 사용하는 프로젝트의 경우, 이 기능을 활용하여 가장 큰 이득을 볼 수 있습니다.

GPU 씬 인스턴싱 및 컬링을 활성화하려면 DefaultEngine.ini 파일을 열고 [/Script/Engine.RendererSettings] 카테고리를 찾거나 추가한 뒤 r.Mobile.SupportGPUScene=1을 추가합니다.

XR

가변 비율 셰이딩을 위한 Vulkan 지원

가변 비율 셰이딩(Variable Rate Shading, VRS)은 렌더 타깃의 픽셀 셰이딩 비율 조정하는 다양한 메서드를 제공하는 최신 GPU에서 지원하는 기능입니다.

언리얼 엔진 VRS 지원 대상이 추가되었습니다.

  • DirectX 12 및 VRS 티어 2를 지원하는 Windows 디바이스

  • Vulkan 및 VK_KHR_fragment_shading_rate 익스텐션을 지원하는 Windows 디바이스

  • Vulkan 및 VK_EXT_fragment_density_map 익스텐션을 지원하는 Oculus Quest

VR 템플릿 업데이트

이번 출시에서는 VR 템플릿의 기능이 다음과 같이 향상되었습니다.

  • VR 폰(VR Pawn)에 헤드 마운트 디스플레이 모델이 포함됩니다.

  • 그랩 시스템에서 컴포넌트 그랩 및 드롭을 지원합니다.

  • 게임패드로 VR 관람자(VRSpectator)를 제어할 수 있습니다.

데이터스미스

에디터 내 다이렉트 링크

언리얼 엔진 5에서 언리얼 에디터 내 데이터스미스 다이렉트 링크에 대한 지원을 추가했습니다. 다이렉트 링크를 사용하여 언리얼 에디터에서 외부 디자인 애플리케이션(Revit, Rhino, Archicad 외 다이렉트 링크로 데이터스미스를 지원하는 기타 디자인 애플리케이션)의 씬에 생긴 변경사항을 실시간으로 시각화할 수 있습니다.

해당 기능을 사용하면 워크플로를 간소화하고, 시간이 많이 걸리는 익스포트 및 리임포트 작업을 진행할 필요가 없습니다. 대신 그 에너지를 놀라운 아키텍처 시각화 작업에 집중할 수 있습니다.

다이렉트 링크는 데이터스미스 파일의 임포트 / 리임포트 워크플로와 동일하게 작동합니다.

  • *.udatasmith 파일과 동일한 에셋 타입(머티리얼, 스태틱 메시, 라이트, 카메라 등) 생성

  • 미사용 에셋이 디자인 애플리케이션에서 사라져도 제거하지 않음

  • 메타데이터 지원

  • 액터 및 에셋에 대한 데이터스미스 오버라이드 지원

데이터 포맷

에픽은 언리얼 엔진으로의 gITF 파일 임포트 지원을 지속적으로 개선하고 있습니다. 이번 출시에서는 gITF 임포터 플러그인에 다음 PBR 스키마 지원을 추가했습니다.

  • 클리어 코트

  • IOR

  • 광택

  • 스페큘러

데이터스미스 CAD 임포터에도 상당한 업데이트가 이루어졌습니다. 유저 인터페이스 및 워크플로는 비슷하지만, 임포트 결과는 언리얼 엔진의 기존 버전에 비해 많은 변화가 있었습니다.

이제 JT 파일 내부에서 파라메트릭 데이터와 메시 중 임포트할 대상을 지정할 수 있습니다. 덕분에 언리얼 엔진에 임포트할 데이터에 대한 제어 및 작업의 유연성이 증가했습니다.

이 옵션은 ds.CADTranslator.PreferJtFileEmbeddedTessellation 콘솔 변수에서 볼 수 있습니다.

ds.CADTranslator.SitchingTolerance 콘솔 변수를 사용하여 힐(Heal) & 소우(Sew) 봉합 기법에 대한 봉합 허용치를 수정할 수 있습니다. 해당 값은 언리얼 유닛에 속합니다.

Solidworks

데이터스미스를 이용해 Solidworks에서 언리얼 엔진으로 익스포트할 수 있는 기능의 범위를 확장했습니다. 이제 Solidworks 프로젝트를 *.udatasmith 파일에 더 높은 퀄리티로 익스포트할 수 있습니다.

언리얼 엔진 5를 출시하며 다음 Solidworks 기능에 대한 익스포트 지원을 추가했습니다.

  • SolidWorks에서 작성한 애니메이션을 레벨 시퀀스로서 임포트할 수 있습니다.

  • 환경설정을 레벨 베리언트 세트로서 임포트할 수 있습니다.

Revit

이번 출시에서는 Revit에서 *.udatasmith 파일로 익스포트하거나 다이렉트 링크를 통해 익스포트할 데이터에 대한 사용자 컨트롤을 향상했습니다. 덕분에 Revit 씬을 임포트/리임포트 한 뒤에 언리얼 프로젝트에서 수동으로 조정하고 불필요한 데이터 및 에셋을 제거할 필요성이 줄어듭니다.

이제 다음 추가 옵션의 환경설정할 수 있습니다.

  • 메타데이터 필터링: 익스포트할 메타데이터를 지정합니다.

  • 테셀레이션 레벨: Revit에서 메시를 생성할 때 사용할 테셀레이션의 레벨을 지정합니다. 정의 내용은 Revit API를 따릅니다.

신경망 추론

신경망 추론 플러그인(The Neural Network Inference plugin, NNI)은 언리얼 엔진에서 실시간으로 신경망을 평가하기 위해 사용하는 새 플러그인입니다. 이 플러그인은 ML 디포머 시스템 기반의 머신 러닝 같은 기능을 제공하며, ML 네트워크를 통해 아주 높은 고해상도 버텍스 오프셋 데이터를 압축하고 실시간으로 재생할 수 있습니다. 이 시스템은 애니메이션, ML 기반 AI, 카메라 트래킹 등 개발상 난제를 해결하기 위해 마련한 수많은 ML 기반 접근법의 기반 역할을 합니다.

NNI는 업계 표준 ONNX 모델 포맷을 지원하며, 표준 ML 훈련 프레임워크(PyTorch, TensorFlow, MXNet 등)에서 익스포트하는 모든 모델을 실행할 수 있습니다. 이를 이용하여 익스포트 된 ML 모델을 가져와 엔진에서 직접 실행할 수 있습니다. 팀에서는 Microsoft와 긴밀히 협력하여 ONNX 런타임 프로젝트를 NNI 플러그인의 추론 시스템 중 핵심으로 활용하고 있습니다.

플러그인의 초기 버전은 PC(Windows/Linux/Mac) 및 콘솔(PS5/Xbox Series X)에 대한 추론을 지원합니다. 아직 GPU 평가는 Windows DirectX 12에서만 지원합니다.

플랫폼 SDK 업그레이드

출시할 때마다 플랫폼 협력사의 최신 SDK 출시를 지원하도록 엔진을 업데이트합니다.

image_116.png

  • Windows

    • Visual Studio 2019 v16.11.5

    • Windows SDK 10.0.18362

    • .NET 4.6.2 타기팅 팩

    • .NET Core 3.1 Runtime

  • 빌드 팜 컴파일 대상 IDE 버전

    • Visual Studio - Visual Studio 2019 v16.11.5 toolchain(14.16.27023) 및 Windows 10 SDK(10.0.18362.0)

    • Xcode - Xcode 12.4

  • GDK

    • Windows SDK: 10.0.19041.0

    • GDK: 2021년 10월 업데이트 1

    • 펌웨어 버전: Recovery November 2021 10.0.22000.3055

    • 지원되는 IDE: Visual Studio 2019

  • Android

    • Android Studio 4.0

    • Android NDK r21e

    • Android SDK 23 이상

    • Android 파일 서버 사용 시 Android SDK 26(Android 8.0) 이상

  • ARCore

    • 1.22

  • ARKit

    • 4.0

  • Linux ‘SDK'(cross-toolchain)

    • v19 clang-11.0.1 기반(CentOS 7)

  • Oculus

    • 33.0

  • OpenXR

    • 1.0.22

  • Google Stadia

    • 1.71.0.24334

  • Steam

    • 1.47

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 13.3.0 + 선택 사항으로 NEX 4.6.6

    • 최소 펌웨어 버전: 13.2.1

    • Nintendo Dev Interface 2.5.4

    • 지원되는 IDE: Visual Studio 2019

  • PS4

    • Orbis SDK 9.008.001

    • 시스템 소프트웨어:

      • 9,030,001

      • 9,040,001

    • 지원되는 IDE: Visual Studio 2019

  • PS5

    • Prospero SDK 4.00.00.31

    • 시스템 소프트웨어:

      • 4.50.00.05

      • 4.51.00.01

    • 지원되는 IDE: Visual Studio 2019

  • macOS

    • 권장

      • macOS 최신 Monterey, 최신 Xcode 13

    • 지원

      • macOS Big Sur 11.6.4

    • 최소

      • macOS Catalina 10.15.7, Xcode 12.4

    • 머신 아키텍처 노트

      • macOS 타깃용 네이티브 Apple Silicon 예비 지원 추가*****

      • 일부 SDK에는 아직 ARM64 슬라이스가 포함되어 있지 않습니다(Steam, Vivox 등).

  • iOS / tvOS / iPadOS

    • 권장

      • 최신 Xcode 13

    • 최소

      • Xcode 12.4. iOS 15 디바이스의 로컬 테스트를 진행하려면 Xcode 13이 필요합니다.

    • 지원 타깃 SDK 버전: iOS 14 이상

업그레이드 노트

피직스

  • PhysX는 UE5에서 더 이상 지원되지 않는 피직스 백엔드입니다. 또한, UE5는 UE4 PhysXVehicles 및 ApexDestruction과 하위 호환되지 않는 새로운 비히클 및 디스트럭션 시스템을 제공합니다.

XR

  • Magic Leap 플러그인은 언리얼 엔진 5에서 제외됩니다. 언리얼 프로젝트에서 Magic Leap 디바이스를 타깃으로 설정한 경우 언리얼 엔진 4.27을 계속 사용해야 합니다.

  • HoloLens 플러그인과 모든 기능이 언리얼 엔진 5에 완전히 통합되었습니다. 따라서 HoloLens 플러그인이 더는 필요하지 않으며, 프로젝트에 추가할 수 없습니다. 기존 프로젝트에서 HoloLens 플러그인을 사용하고 있는 경우, UE5 업그레이드 후 처음으로 프로젝트를 열면 플러그인의 구성 데이터를 제거하라는 메시지가 나타납니다.

출시 노트

AI

Improvement:

  • Added the option to ignore actors that do not implement the IGameplayTagAssetInterface when performing an EQS query with EnvQueryTest_GameplayTags. These ignored actors will not be included in the filter or score operations.

  • Added an option to EnvQueryGenerator_PerceivedActors to control whether all actors known to the AIPerceptionComponent will be gathered or only the ones actively being perceived.

Bug Fix:

  • Fixed an issue where an EQS query instance was using an incorrect EQS query asset that had the same name as the intended asset. This resulted in the query using an asset with an incorrect location.

  • Added an additional check to the Environment Query Manager to check for a valid Blackboard component if the dynamic parameter is configured to read from a blackboard.

  • Fixed an issue where running an EQS query that resulted in all items being filtered out was sometimes flagged as successful.

  • Fixed an issue where EQS contexts created in Blueprints could sometimes retrieve null actors or invalid locations via the ProvideContext call.

Behavior Tree

New:

  • When using the Behavior Tree interface to create a new Task / Behavior / Service asset, the user can now choose the location and filename of the new asset, instead of having to rename the auto-generated one after creation.

  • Added a new parameter to the Run EQS Query task called "Update BB on Fail."

    • If enabled, this parameter will clear out the indicated blackboard entry if the EQS query fails.

    • This setting is enabled by default and can be changed via Project Settings > AI System > Clear BBEntry On BTEQSFail.

Debugging Tools

New:

  • Added filter volume support to the Visual Logger.

  • Added a log category that shows when a dirty area is affecting one or more Navmesh tiles. This shows you how many tiles on a navigation mesh are being dirtied and who are the biggest offenders.

  • Added a way to change the font size used by the Gameplay Debugger via the console variable, gdt.fontsize. The value specified will get stored in the user's .ini files.

New:

  • Added an optional feature to the Navmesh Data called "Use Virtual Geometry Filtering And Dirtying."

    • This feature uses virtual methods to check if an actor needs to be added to the navmesh (providing the ability to create custom logic on extended navmesh classes)

    • This change also prevents dirtying navigation areas that have been requested by an actor that is not on the navigation mesh.

  • FRecastTileGenerator::ApplyVoxelFilter is now a virtual function.

  • Switched NavMesh to use Oodle compression (bias for size in editor, bias for speed in standalone).

Improvement:

  • Reduced the memory footprint of the Navigation Mesh by using smaller data types when possible, fixing struct alignment to reduce padding, and factoring out settings that were unnecessarily included in each dtMeshHeader.

  • Added support for Large World Coordinates (LWC) to Navigation Modifiers.

  • Added support for Large World Coordinates (LWC) to Recast and Detour Crowd Manager.

  • Added support for Large World Coordinates (LWC) to navigation mesh serialization as either floats or doubles. This is achieved by serializing as doubles in either case.

Bug Fix:

  • Fixed an issue where the navigation mesh was not generating correctly when the NavMeshBoundsVolume was placed perfectly flat on the floor surface.

  • Added a safety check when loading a navigation mesh to check if code referencing an older version of the navigation mesh attempts to load a newer version of the navigation mesh.

  • Fixed an issue where the navigation mesh was being unnecessarily rebuilt based on the number of bits required to store maxTiles.

  • Fixed an issue where the Navigation System would rebuild the navigation mesh during OnWorldInitDone for DynamicModifiersOnly navigation if the AutoGenerateNavigationData was disabled.

  • Fixed incorrect uncompressed buffer size passed by DetourTileCacheBuilder to calculate maximum compressed size.

Animation

New:

  • Added UAnimDistanceMatchingLibrary, which exposes Anim Node functions for driving animations based on distance.

  • Added UAnimCharacterMovementLibrary, which exposes functions for predicting where a character will stop or pivot. This is used as input to the distance matching functions.

  • Added UDistanceCurveModifier, which is an Animation Modifier that generates curves used for distance matching library functions. The modifier generates the distance curve based on root motion information from the animation.

  • Added SyncMarkerAnimModifier, which is a Blueprint Animation Modifier included with the Animation Locomotion Library. It provides an example of how to generate Animation Sync Markers automatically.

  • Added a Python Command Log tool in Control Rig for printing of equivalent Python commands when performing actions in the Control Rig Editor.

  • Added Control Rig Spline plugin, which enables the creation of Spline-based controls in Control Rig.

  • Added example Control Rig Context Menu commands written in Python: Add Null Above Selected, Add Controls For Selected, and Alignment tool.

  • Added Copy Python Script button in Control Rig Class Settings which copies the entire Control Rig to Python in order to replicate a Control Rig.

  • Using the Shift + Delete shortcut retains node connectivity in Control Rig to be consistent with the Blueprint functionality.

  • You can now toggle the effector transform on the FABRIK node in Control Rig. This addition aligns with how the FABRIK AnimGraph node works.

  • Motion Warping is a new experimental plugin which allows you to dynamically adjust root motion to align to targets.

  • SkeletalMerging is a new plugin which exposes Skeletal Mesh merging to Blueprints, and adds SkeletonMerging functionality which allows for merging of Skeletons.

  • Added support for importing Animation Transform Attributes from FBX by name(-matching) nodes within the FBX scene.

  • Project specific scriptability UFunctions were ported to the Engine.

    • SetPreviewSkeletalMesh was exposed to Blueprint and Python for Animation Blueprints and AnimationAsset derived classes.

    • Added (script exposed) functionality to retrieve UAnimationGraphs and UAnimationGraphNodes of a specific class from UAnimBlueprint and UAnimationGraph respectively.

    • Added (script exposed) functionality for populating and updating a PoseDrive node and PoseAsset.

  • Added a normalization trait/concept for animation attributes, allowing for user-defined normalization functionality after accumulation/blending operations. Normalization for the Transform animation attribute was implemented.

  • Added non-blendable versions of TransformAnimationAttribute, FloatAnimationAttribute, and IntegerAnimationAttribute.

  • Added a Get with validity checking for Animation Curves.

  • An asset registry tag "SkinWeightProfiles" was added to the SkeletalMesh asset to make it discoverable and searchable in the Editor.

  • Multiple UV channels are now supported when CPU skinning a Skeletal Mesh.

  • Added project settings that allow for defining a default set of AnimModifiers to be added to any imported AnimSequence. A new flag was added to state whether or not modifiers should be automatically applied during (re)import.

  • Added GUID to PoseAsset to track it against the Source Animation, and prompt the user if it has become out-of-date, which happens when the Animation Sequence is changed or reimported. The UX was improved for PoseAsset in the details panel.

  • Added USkinnedMeshComponent::GetRefPoseTransform.

  • GetBlendProfile is now exposed to Blueprints. This can be accessed with MontagePlay/Stop_WithBlendSettings.

  • Control Rig was promoted from beta and is now production ready.

Improvement:

  • You can now copy and paste Control Rig shape properties.

  • Moved animation asset browser context menu to UToolsMenu API.

  • Replaced Animation Recording sampling rate with FFrameRate to improve UX and integrate better with AnimDataModel.

  • Various improvements were made to Animation Attribute bone index mapping.

    • Introduced FMeshAttributeContainer which stores the attributes according to FMeshPoseIndex.

    • Added FinalizeAttributeEvaluationResults to SkeletalMeshComponent. This remaps the evaluated compact-pose indexed attributes to mesh-indices.

    • Added CopyFrom template to AttributeContainer for different bone index types.

    • Ensured that attributes are only inserted during evaluation if its bone index is present in the required bones

    • Added engine-level testing for remapping between LODs with removed bones, and remapping between Skeletal meshes with different skeleton hierarchies.

Crash Fix:

  • Fixed a crash that occurred when opening Mirror Data Tables.

  • Fixed a crash that occurred while applying multiple Anim Modifiers.

  • Fixed a crash that occurred when selecting 'Frame from this animation' as the Base Pose Type for an animation sequence containing animation attributes.

Bug Fix:

  • Fixed interp alpha value calculation in AnimationBudgetAllocator so it is 1 instead of 0.5 when the tick rate is 1.

  • Fixed bug that caused sync markers generated by UAnimationBlueprintLibrary::AddAnimationSyncMarker to have an invalid GUID, which would cause all sync markers to be deleted when one was deleted.

  • Expanded the list of regular expressions used to match mirrored bones to ensure the UE5 Mannequin mirrors correctly.

  • Fixed an issue with sync mirroring on blend spaces.

  • Skeletal Mesh errors now print out the path name of the component rather than just the name. This fix means you can see what Actor instance, and class, owns the component rather than the generic name StaticMesh0.

  • Fixed an issue with the mirror node that could result in incorrect behavior when the node was evaluated with identical bone counts but different bone indices.

  • Undoing a remove row operation in the Mirror Data Table now restores the location of the row.

  • You can now use WasAnimNotify functions with Linked Anim Layers.

  • Added a cache of active skeletal mesh thumbnails scenes (similar to class/blueprint thumbnail rendering) to prevent out-of-memory crashes.

  • Removed GetResourceSizeEx from UMorphTarget and FMorphTargetLODModel, as this functionality has been superseded by counting memory through UMorphTarget::Serialize.

  • Fixed a typo in SkeletalMeshComponent.h.

  • Fixed incorrect results generated when evaluating compressed Animation Curves containing user-weighted tangent data.

  • Implemented changes to ensure that the CPU access flag is correctly inherited when generating a SkinWeight buffer for alternative skin weight profile(s).

  • Fixed a bug in which CTRL+Z and CTRL+Y would not undo/redo modifications to Additional Meshes.

  • Fixed an issue with the behavior of the DoesBoneName function from AnimationBlueprintLibrary.

  • Anim runtime methods were re-exposed to the Engine API.

  • Made changes to ensure that users cannot generate Blend Profile names with invalid characters, as this name is used to generate a UObject.

  • Switched FAnimNode_TransitionPoseEvaluator to use heap-based Animation Attribute container rather than stack-based.

  • Fixed a bug where deleting one generated sync marker would cause all of the sync markers to be deleted.

Deprecated:

  • Deprecated the Verlet Control Rig node in favor of the Spring Interpolate node.

  • Removed the Copy to SoundWave menu option.

Removed:

  • Removed the recording state from the Play button in transport controls for the Animation Editor(s). This fixed an issue with the play button being shown as a pause button while recording animation in Control Rig.

Animation Assets

New:

  • Added virtual bone support to blend profiles and blend masks.

  • Added alpha lerping to the Modify Curve Animation Blueprint node when setting Apply Mode to a non-blend value.

  • Added Maximum Duration Seconds and Sample Frame Rate options when recording animations in the Animation Sequence Editor.

  • Multiple montages can now be synchronized in Animation Blueprints using the Montage SyncFollow and Montage Sync Stop Following nodes.

  • Added 'Selected and Children' and 'Selected and Parents and Children' Bone drawing modes in the Animation Editor viewport menu.

  • Added a Blend Profile mode selection to the Blend profile picker.

  • Added an option to the Blend profile picker for blend mask creation.

  • Added a blend mask mode to the layered blend per bone node. Blend masks can be used to specify per-bone weights in a skeleton hierarchy.

Improvement:

  • Pose Search Databases now support root motion extrapolation so animation sequences can be used from start to finish without the need to add lead-in or follow-up sequences. The system will extrapolate the root motion velocity to generate an estimate of the root motion beyond the limits of the main sequence.

  • Added Extrapolation parameters to PoseSearchDatabase.

  • Changed the sorting in the skeleton tree so that it is alphabetical, while still maintaining the hierarchy.

  • Optimized USkeletalMeshComponent::ComputeRequiredBones().

  • Selecting Meshes and Bones is now better handled in the Animation Editor Viewport. Now when selecting, it will take into account bone visibility and cursor position to properly select either bones or meshes.

  • Section Selection toolbar button is now removed as it is now no longer needed due to selection improvements.

Crash Fix:

  • Fixed a crash when a Skeletal Mesh was referencing a deleted skeleton.

Bug Fix:

  • Fixed Show All Sections not correctly restoring all sections after filtering cloth views in the Animation Editor viewport

  • Fixed virtual bone skeleton tree item not also selecting when a virtual bone is selected in the viewport.

  • Fixed font not found warning spam when a virtual bone skeleton tree item is selected.

  • Fixed virtual bone name not showing when selected in viewport.

  • Fixed parity of virtual bone name text shadows.

  • Fixed skeleton tree undo and redo and sync when editing sockets.

  • Creating an Anim Curve on an animation sequence timeline that shares the same name as an already created curve will now reference that same curve, instead of doing nothing.

  • 'Reset Columns' now correctly works in the Animation Editor asset browser.

  • Fix for animation recorder manager not correctly stopping when reaching the Maximum Duration limit.

  • You can now drag and drop multiple Sequences onto a Montage timeline.

  • Fixed an issue with the Blend profile picker sometimes showing in a non-standalone mode outside of the skeleton editor.

  • Fixed a bug with reset to default with blend profiles.

Animation Blueprints

New:

  • Generated node array properties are now marked as Blueprint visible so they can be exposed through generic FOptionalPinManager-driven nodes. Now arrays are not needlessly exposed and can be handled with struct member get-by-ref calls rather than struct member sets.

  • Added State Machine common helper Functions for use in the AnimGraph: Convert to Animation State and Is State Blending In / Out.

  • Added the Pose Watch Manager to track active pose watches in Animation Blueprints

  • Debug visualization can now be displayed simultaneously for all selected nodes in the Animation Graph Editor viewport.

  • Added the ability to tag and reference by tag any anim graph node using the new Tag property.

  • Anim graph nodes will now display their tags in the bottom-right corner.

  • UAnimGraphNode_BlendListBase is now exposed to exported API.

  • New functions have been added for evaluating timecode attributes on the root bone in an anim sequence.

  • "TCHour", "TCMinute", "TCSecond", "TCFrame", "TCSubframe", and "TCRate" can now be used as bone attributes on the root bone to pass timecode information through an animation sequence.

  • Added the EvaluateRootBoneTimecodeAttributesAtTime() function, which can be used to evaluate root bone timecode attributes at a particular time.

  • Added support for parsing the timecode rate as a string into the FFrameRate it represents, and accounts for the use of drop frame timecode rates (with either "29.97df" for NTSC_30 or "59.94df" for NTSC_60 frame rates).

  • Added function library support for member reference customizations and anim node functions

  • Exposed CreateNodeFunctionsWidget on anim graph node widget so that non-derived types can use it.

  • Added node function specific library for skeletal controls.

  • Added pure conversion functions for Animation Blueprint node references.

  • Added an indicator of whether node properties are dynamic in the property access binding menu.

  • You can now use the transform manipulator in the Animation Blueprint Viewport when manipulating skeletal control nodes values

  • The Animation Blueprint now shows an empty mirror node on the right-click menu when a compatible Mirror Data Table does not exist.

  • Anim Composites now appear in the Anim Blueprint context menu.

  • Added Anim Node library functions for sequence players and evaluators.

  • You can enable Anim Blueprints to show pin inspection tooltips.

Improvement:

  • Doubling clicking a pose watch in the pose watch manager will now frame the node in Animation Blueprints.

  • The Gravity Override parameter in the Anim Dynamics node can now be defined in world space.

  • Conduits in State Machines can now be used as entry states.

  • The compiler will now produce a warning when using experimental AnimGraph nodes.

  • Animation Blueprints now support debugging of post-process blueprints.

  • State machines now have updated iconography.

  • Child anim blueprints can now be used as the default instance class in Linked Anim Layers.

  • Improved appearance of node-specific visuals for certain anim graph nodes.

  • Improved debugging and error reporting of node-specific visuals for certain anim graph nodes.

  • Improved pin sorting for Anim Nodes.

  • Improved the Linked Anim Graph with node customizations such as node color, tooltip, and title, and allowing property access bindings.

  • There's now a warning when an incompatible Post Process Anim Blueprint is applied to a Skeletal Mesh.

  • Improved performance of Animation Blueprints when displaying large graphs.

  • Optimized building reference and identity poses by avoiding excessive inner branching when setting a compact pose to a reference pose, and avoiding setting scale twice when resetting a transform to additive identity.

  • Optimized property access runtime by caching the return value property, and no longer using a mem stack allocator but instead an inline-allocated array of bytes and manually aligning the base pointer.

  • Previously a large shared pointer destruction chain occurred when resetting tick records each frame. To reduce tick record context data overheads, individual shared pointers to context data were switched to unique pointers, while allowing shared ownership and holding a shared pointer to the entire array.

Crash Fix:

  • Fixed crash when editing Call Sites on Property Access nodes used in the Animation Blueprint Event Graph.

  • Fixed crash when compiling an Animation Blueprint with all bones hidden.

  • Fixed crash with out of bounds skeleton bone indices.

  • Fixed crash when dragging a sequence player into a Template Animation Blueprint.

  • Fixed crash when compiling on load anim graphs that contained null nodes.

  • Fixed SVisibilityWidget crashing on Linux when opening the Pose Watch Manager.

  • Fixed crash when using details panel to edit multiple blend weights on a single node.

  • Fixed crash when copy, pasting, and compiling various animation nodes.

  • Fixed crash when cooking child Animation Blueprints.

  • Fixed crash when right-clicking a child asset of a template animation blueprint that has no skeleton.

  • Previously older Anim Blueprint generated classes, on first load, could contain out-of-date node type layout tables, and were unusable unless they were patched up with compile-on-load. Now non-compile-on-load paths successfully load these Anim Blueprints, although they cannot be used.

  • Fixed the crash that occurs when compiling an Anim Blueprint with an empty state machine.

  • Fixed the post-compilation crash that occurs when using the Call Function Anim Nodes.

  • Fixed an occasional crash that occurs when performing an undo while the Slot Names Editor is open.

  • Child Anim Blueprints that use Blendspace Graphs no longer reference null blendspaces.

  • Fixed a crash that occurs when selecting a Linked Anim Layer class.

  • Fixed a crash that occurs while compiling child Anim Blueprints that weren't properly initialized.

  • Fixed a crash that occurs when selecting property access chains involving structs with native break functions.

  • Opening a collapsed area in the Create Animation Blueprint dialog no longer causes a crash.

  • Calling Anim Node functions when running standalone nodes no longer crashes.

  • Fixed a crash that occurred when selecting a slot node in a template Animation Blueprint.

Bug Fix:

  • Pose watching now correctly works for Blend Space and State Machine nodes.

  • Copy and paste now works for Blend Space AnimGraph samples.

  • Fixed being unable to make permanent pose watches created when enabling ‘Automatically create pose watch on selection'.

  • Added 'Initial Update' animation node function callback.

  • Pose watches now correctly delete when deleting a graph that contains them.

  • Fixed error when using a non-thread-safe function on an anim node.

  • Fixed metadata preventing new node bindings from being created.

  • Fixed a load ordering dependency with parent and child Animation Blueprints when child classes were PostLoaded() after their parents.

  • Fixed window focus loss when searching for parent blueprint classes while creating Animation Blueprints.

  • The schema type will now be checked before creating animation-specific graph pin widgets in order to resolve issues with execution pin connections.

  • Fixed animation node functions not being called correctly.

  • Fixed function library support for member reference customization and animation node functions.

  • Fixed non-deterministic cooking issue with child Animation Blueprints.

  • Single frame blendspaces now correctly sample root motion.

  • Property access generated properties are flagged as compiler-generated now, so CopyPropertiesForUnrelatedObjects will skip them.

  • Fixed issue where undo and redo weren't working correctly on property access nodes.

  • You can now spawn variable setters in Anim Graphs.

  • Modify bone and other edit modes now propagate to debugged objects during PIE and in Editor worlds.

  • The default values for Anim Node's bool pin no longer show up when pins are connected.

  • The Property Access node now has a move cursor when you hover over the node.

  • Previously, pose handlers were incorrectly calling a CacheBones pass on the graph during initialization. In the base class this was not a problem, but in derived classes, such as those with input poses, this could cause CacheBones to be called before Initialize.

  • Improved error handling for Anim Node references, especially when tagged nodes are disconnected.

  • Fix crash redo-ing and compiling an initial update anim node function binding

  • For child Anim Blueprint overrides, the Anim Node data is now linked to the class that matches the CDO being patched.

  • Sequence evaluators now show they can output a root motion delta.

  • ExtensionContent now works for a FDetailWidgetRow created from IDetailPropertyRow::CustomWidget().

  • Cooked Anim Blueprint Assets now animate when placed.

  • Optimized linking of Anim Layers with reduced calls to FindFProperty by caching generated parameter properties in FAnimBlueprintFunction and only iterating on them when linking.

  • Fixed Linked Anim Layer Node pins not being properly regenerated.

  • Fixed Linked Anim Layer pins not being available for bindings when using a self layer.

  • Corrects some mirror node bone index usage, and skips unnecessary intermediate array allocation.

  • Deprecated direct access to internal mapping arrays in FBoneContainer.

  • Fixed some bone index types, including type conversion occuring when using IInterpolationIndexProvider.

  • Fixed issue where keyboard input closed the color picker for Anim Notifies.

  • Template Anim Blueprints can no longer be retargeted.

  • We now correctly override the thread safety of return-value properties for property access when a function is marked thread-safe.

  • You can now disable notify instances and native notify types from being called in Animation Editors.

  • Undo and redo actions now work on property access call sites.

  • When starting in a different tick group for Skeletal Mesh Components allow a parallel animation eval.

  • Fixed edge case where graphs Linked Anim Layer Nodes were initialized without an interface.

  • Property access now works correctly with Blueprint refactoring tools, such as find references, renaming, and deleting.

  • Linked Anim Layers no longer show up multiple times in the context menu.

  • Fixed the issue where array child properties of an Anim Graph Node were still being shown when arrays were bound to pins.

  • Anim getters now use Linked Anim Layers.

  • Alpha blending options no longer keep bindings hidden when the alpha method is switched.

  • Linked Anim instances that have a mix of interface and non-interface layers now only unlink interface layers when unlinking.

  • There are now Anim Node data flags to reduce the overhead introduced by Anim Node functions. The data no longer has to be fetched out of folded constants to determine that it is invalid.

  • The node lookup in the Anim Blueprint compiler is used now instead of relying on the reverse DebugObjectToPropertyMap. This fixes debug weights occasionally breaking in Anim Graphs.

  • Anim Blueprints are no longer part of unneeded dependency compilations.

  • Fixed the issue in Animation Blueprints where exposed pins that were not exposed by default were not updating their values.

  • There is now a looping tooltip for transport controls.

  • Blend lists now only reinitialize children when their weight is zero.

  • There are now error reports for dynamic values that are not exposed on pins.

  • Custom pins are now created on Anim Graph Node creation and not just on reconstruction.

  • You can now debug post-process Blueprints in the Animation Blueprints Editor.

  • Fixed assert occurring when compiling an Animation Blueprint with an Anim Node function node in the Anim Graph.

  • Sparse class data is no longer derived from an incorrect base when used with a native base class.

  • You can now create a child Anim Blueprint with another compatible skeleton.

  • You can now place cooked Anim Blueprints in Level Viewports.

  • Fixed "Unable to push default value for pin" warning when linked anim graph node pins are connected.

  • You can now override Aim Offset Assets.

  • Property access thread safe logic now correctly enforces function metadata overrides.

  • Fix asserts with child Animation Blueprints by ensuring that cleaned-up sparse class data structs are moved out of the package they are in.

  • You can now open newly-spawned empty Blend Space Graphs.

  • Nested property validity filters, such as checking to see if an entry in the menu has compatible submenus, are now performed for functions.

  • You can no longer bind UObject types to unrelated types in the menu.

  • The display name now appears for script properties and functions, and ScriptName for native ones if available.

  • You can now double-click an aim offset with exposed pins.

  • GetLinkedAnimLayerInstanceByGroup now works correctly in packaged builds.

  • Property access nodes can now be correctly searched for in the AnimGraph context menu.

  • Fixed an ensure when opening some linked Animation Blueprints. Linked Animation Blueprints can be debugged, but previously the logic to set up a debugged object based on a Skeletal Mesh made the assumption that only the main animation instance would be the class being set. The check was expanded for that fallback logic application to cast a wider net than just the preview instance.

  • Extra Anim Node child properties no longer appear incorrectly on unbound structs, and bindings no longer appear on un-bindable properties.

  • Skeleton Assets now generate a thumbnail in the Create Animation Blueprint dialog.

  • Fixed an issue where a single step in the Animation Blueprint had no effect. It now steps at a fixed framerate.

  • Property Access nodes are easier to move around now.

  • Fixed an issue where nested structs that were bound to Anim Node pins were not showing their child values.

  • Fixed spurious compiler thread-safety errors when batch compiling.

  • Fixed issues with child Animation Blueprint compilation ordering. Also improved cleaned-up sparse class data structs.

  • Fixed issues with Sequence Player node Blueprint exposure.

  • Fixed a crash when opening a child Anim Blueprint of a template Anim Blueprint.

  • Fixed warnings caused by tagged-property-serialization with generated sparse class data structures in Animation Blueprints.

  • Rewrote the tooltip for sequence player's SetStartPosition to better explain its functionality.

Deprecated:

  • Deprecated UAnimClassData, as it is no longer required by the Blueprint nativization feature, which has also been fully deprecated.

Removed:

  • Removed duplicates of the Component and Actor transforms in FAnimInstanceProxy.

Animation Tools

New:

  • Added "Spherical Pose Reader" Control Rig node, which provides easier setup of secondary deformations by defining custom regions of influence around bone rotations.

  • Added suite of new Python functions for getting and setting Control Rig Values and Keyframes in Sequencer.

  • Added options for previewing root motion in the animation editor viewport.

  • The "Duplicate and Retarget" batch process for Animation Blueprints now uses the new IK Retargeter asset.

  • Added Control Rig editor profiling for heat-map style runtime cost profiling.

  • Added support for map controls as inputs on the Control Rig Animation Blueprint node.

  • Added nodes in Control Rig to interact with Arrays such as Add, Num, GetAt, and SetAt.

  • Added the option to automatically link new mutable nodes in the Control Rig Settings.

  • Control Rig: Functionality for the ControlRigComponent to perform lazy evaluation.

  • Added the following nodes to Control Rig: New Item Equals, Item Not Equals, Item Type Equals, and Item Type Not Equals.

  • There is now a new user workflow to promote pins to a variable in Control Rig.

  • There are new nodes to allow Nulls and Control to reparent and space switch in Control Rig.

  • Skeleton Editor has a new transform widget for editing and viewing bone transforms.

  • You can now inspect live values running through a Control Rig in the Details panel's Live Values section.

  • You can now frame the selection and the complete graph in Control Rig using the F hotkey.

  • There are new Control Rig nodes so you can interact with arrays of transforms to perform accumulation, project from local to global space, and draw arrays of transforms directly.

  • There's a new option in Control Rig to show the Controls' colors on the icon in the Rig Hierarchy widget.

  • Fixed an issue where the Viewport appeared blank for additive animation. We now always retrieve a valid skeletal mesh for previewing.

  • The Viewport has been updated to use AdvancedPreviewScene similar to the Animation Editor viewport(s).

  • Added the ability to update a PoseAsset pose-entry with the current in-viewport pose.

  • Added the option Show Mesh Edges in the Animation Viewport Show Options menu.

  • Exposed TargetSkeleton and PreviewSkeletalMesh for BlendSpace factory as BlueprintReadWrite. You can use this to create blendspaces from Blueprints and Python.

  • Added the option to only apply out-of-date animation modifiers to an animation sequence. This option appears in the contextual menu of an Asset, and through the Details view of AnimationModifier classes.

  • Added option to visualize Animation Transform Attributes in the Animation Editor. You can access this option from the Show Flag menu.

  • Added a new option to DebugSkelMesh to track the LOD of an attached instance in the Level Viewport.

  • Added new default gizmo libraries with shapes that have uniform scale to Control Rig. Assets from previous versions will maintain their original gizmo library.

Improvement:

  • Enabled full support for user defined struct usage in Control Rig.

  • The Control Rig runtime VM has been upgraded to a more compact and flexible memory backend.

  • Reduced the memory footprint and runtime of Control Rig by using inline allocators to avoid allocations for minimum size cases, and batch allocating elements.

Bug Fix:

  • Control tracks in Sequencer now correctly update their name when a Control is renamed in the Control Rig editor.

  • Fixed Bone selection behavior in Control Rig viewport.

  • Fixed an issue where any pending Apply Preview Mesh pop-up toasts were not faded out when consecutively changing the Preview Mesh.

  • Reduced the number of editor transactions created when dragging BlendSpace sample points. We now create a single transaction for interactive changes.

  • Fixed a scaling issue with the scrollbar in the Animation Editor Timeline.

  • Fixed an issue with Additional Meshes where their post-process Animation Blueprints were not being evaluated correctly in Animation Editor(s).

  • Fixed not being able to select a PreviewMesh using the arrow keys.

  • Fixed an issue with Animation Recorder generating gaps or missing curve-key values by ensuring that WriteIndex is used to populate curve-key data.

Deprecated:

  • Deprecated the Transform Constraint Control Rig node. It is replaced with new Parent/Position/Rotation/Scale Constraint nodes.

Import/Export

New:

  • Added support for importing enum FBX properties as string-typed custom attributes. Enum-typed properties in the FBX are converted to string-typed custom attributes using the string value that corresponds to the enum index.

  • Added dedicated settings for timecode custom attribute names, which can be customized for a pipeline using BoneTimecodeCustomAttributeNameSettings.

  • Sequencer will now check for timecode properties to use as TimecodeSource when importing FBX to Control Rig.

  • Skeletal Meshes imported from FBX now stores mesh names, number of vertices, and the start vertex offset.

  • You can choose to store the vertex numbers from your DCC for a Geometry Cache imported from Alembic files, by enabling Import Vertex Numbers.

  • The Alembic Importer and Geometry Cache plugins are now no longer experimental, and are instead production ready.

Bug Fix:

  • Fixed precision issues that could result in Anim Sequences from FBX importing at the wrong frame rate, and improved animation sampling precision on animations with larger durations.

  • Streaming a geometry cache from Alembic with constant topologies now supports frame interpolation, This is needed for subframe sampling and motion blur.

  • Alembic import settings created from a script can now be used and displayed in the Import dialog.

Deprecated:

  • Removed support for HDF5-format Alembic. Instead, use or convert your Alembics to Ogawa format before importing in Unreal Engine.

Skeletal Mesh

New:

  • Moved Bake Out Materials to the Skeletal Mesh Editor toolbar.

Crash Fix:

  • Fixed crash when calling Set Skeletal Mesh function in Blueprints.

Bug Fix:

  • Fixed editable skeleton transactions sometimes not being saved.

  • Fixed a crash when serializing morph targets on an editor platform that didn't support morph targets.

Deprecated:

  • Removed skinning pre- and post-offset. This was added temporarily in 4.26, specifically for the MLDeformer prototype. The public functions were always marked as deprecated.

Audio

New:

  • Added Bandsplitter MetaSound nodes that split audio into discrete frequency bands, with the option to phase correct so that they can sum back together with minimal artifacts.

  • Added a Dynamic Filter node to MetaSounds. This node is a filter with bell and shelf modes that filters based on the strength of the signal at the affected frequency range. This node can be sidechained with a secondary audio source.

  • Added a new UInterface that allows Actors to automatically fill out and pass an array of AudioParameters to any owned sounds from said Actor.

  • Added a Diffuser node to MetaSounds. This node diffuses incoming audio like a reverb, but without adding a long tail.

  • Added the ability for an Audio Component to be associated with multiple active sounds.

  • Added variables to the MetaSound graphs.

  • Parameter setter calls on an AudioComponent are now cached in separate "InstanceParameters" arrays and supersede changes to the "DefaultParameters" array (redirected from the original InstanceParameters array).

  • Parameters now have a fallback structure set by Blueprints / runtime "InstanceParameters", instead of those provided by ActorParamInterface. These parameters are set as defaults on the AudioComponent.

  • Added Unreal Insights markup to the Quartz Audio system. Various Quartz mechanisms and performance considerations can now be visualized in the Unreal Insights tool.

  • Enabled Google Resonance Audio as a default engine plugin.

  • Added audio slider and knob widgets. These widgets can be used as standalone widgets and within the MetaSound editor.

  • Added Editor Preferences options for various MetaSound and Sound asset types for easy access when creating new assets.

  • Added an Editor Preferences option to automatically solo audio for the first PIE client.

  • Added an Additive Synth MetaSound node.

  • Added support for Metasounds in Sequencer via the transmission interface.

  • Added the ability to modulate Output Volume, Wet Level, and Dry Level on submixes with the Audio Modulation plugin. This replaces the old properties, which are now deprecated. The old volume properties will transfer to the base values of the new Modulation Destinations automatically, and will work the same even if the Audio Modulation plugin is disabled.

Improvement:

  • Added more trace events to the audio device and to Metasound rendering to get more useful performance information when viewing Unreal Insights sessions.

  • The dynamics process and MetaSound Compressor node can now apply upwards compression in addition to downwards compression. Upwards compression can apply up to a maximum of 36 dB of gain to a signal below its threshold.

  • Improved the MetaSound OnPlay CPU performance.

  • Improved the clarity of the default values in Audio Platform Settings UX.

  • Changed the log verbosity in the Steam Audio spatialization plugin to reduce the number of messages.

  • Added the ability to compile out huge symbols out of libSamplerate to save on memory.

  • Optimized MetaSound node searching.

  • Improved the tool tips for Audio Stream Caching statics.

  • Cleaned up XAudio2Windows and separated it into smaller, more manageable pieces.

  • Enabled the MetaSound AutoConverter nodes between enums and int32, and updated the conversion nodes style.

  • Updated Wavewriter to support multiple channels.

  • Added optimizations to Recycle threads for Null Renderer devices.

  • Added optimizations to the DeviceInfo Cache.

  • Added optimizations for Windows to the Threaded device swap.

  • Did an incremental refactor to XAudio2 and moved the stringify error codes into StringHelper.

  • Changed the Mute / Solo option for Sound Classes to only apply while in PIE.

  • Reduced the number of log messages produced when using procedural SoundWaves on Sequencer's audio track.

Bug Fix:

  • Fixed an issue where the MetaSound block-rate AD Envelope node was not allowing attack rates smaller than one block size (eg 0). If set to under a block length, it will now skip its attack phase.

  • Fixed the MetaSound Compressor node failing to update some of its inputs while running.

  • Fixed Metasound type conversion nodes outputting default values on the first render block.

  • Fixed an issue where ActiveSounds and AudioComponents spawned via GameplayStatics functions wouldn't have an Owner actor assigned to them.

  • Fixed an issue with Focus Interpolation where it would always interpolate up from 0, instead of initializing to the current Focus value.

  • Fixed an issue where it was possible to divide by zero on the MetaSound AD Envelope.

  • Fixed a bug where the initial value of the Metasound math operator nodes was not being set.

  • Fixed an issue that would result in the lack of clamping when recording output.

  • Fixed an issue where binaural audio was not working correctly on some plugins.

  • Fixed an issue where the audio settings were not being saved to .ini files on some platforms.

  • Fixed an issue where the MetaSound InterpTo nodes and Conversion nodes were not propagating their initial output values at the point of construction.

  • Fixed an issue where sending a normal submix to a soundfield submix could result in an incorrect init order or a crash.

  • Fixed an issue where Soundfield Submixes would not properly re-initialize when the encoding format changed in the editor.

  • Fixed an issue where the Audio Capture Component would crash if OpenCaptureStream() hadn't been called.

  • Fixed an issue where sounds were cutting off if they started playing within the binaural radius, and the listener left that radius.

  • Added protection against a potential null pointer deref in SubmixUtils::AreSubmixFormatsCompatible().

  • Fixed an ensure when binaural sound was sent directly to a soundfield submix.

  • Fixed an issue where the Modulation EnvelopeFollower was not reinitializing when the AudioBus was initially unset.

  • Added a Multithreaded Patching (MTP) Remainder check in the calculation to now ignore (and properly clean-up) inactive outputs.

  • Fixed an issue where FQuantizedPlayCommand::CancelCustom() was letting pending play commands play un-quantized instead of stopping the sound.

  • Fixed an issue where audio buses were mixing in incorrect data when the sound started playing in a "paused" state.

  • Added a fix to prevent an Audio Component from accessing an uninitialized Quartz Clock.

  • Fixed an issue where the Audio Streaming Cache would crash if the configuration caused the cache to have zero elements.

  • Fixed an issue where swapping an in-flight threaded audio device would cause a shutdown crash.

  • Fixed an issue where the AudioMixer XAudio2 would not recover after failing to initialize. This allows for device swapping after an open failure.

  • Removed the DLL fallback code that was causing issues with initialization recovery.

  • Fixed several issues with the audio channel that would result from device swaps.

  • Removed the PhysicalSpeaker property from being monitored for swapping and improved logging around channels changing.

  • Fixed an issue that would result in memory corruption in USoundNode.

  • Fixed an issue where the MMNotification client would experience a deadlock.

  • Fixed an issue that would cause incorrect fading of a SubmixEffect.

  • Fixed an issue with a race condition in the Windows Session Notification client Unregister / Register.

  • Fixed an issue where the MetaSoundSource of a Metasound asset would get corrupted when setting the Playback position to be non-zero.

  • Fixed an issue where the Bhaskara and Pure Math variations of the Sine MetaSound Generator Node were not correctly handling negative frequencies.

  • Fixed an issue where copy / paste was not working correctly in the Audio Mixer thread priority.

  • Fixed an issue where adjusting nullptr check in the AudioDevice would result in a crash.

  • Fixed an issue where stereo sounds with binaural spatialization were not panning correctly.

  • Fixed an issue where switching back from a NULL renderer device would result in the user's PC hanging.

  • Fixed an issue in AudioMixer that would result in a nullptr on partial initialization teardown.

  • Fixed an issue in the Audio Streaming Cache that would result in a crash.

  • Fixed an issue where the WaveWriter node was creating files even when it was not connected in the MetaSounds graph.

  • Fixed several issues with the Metasound Oscillator Generator node, including DC offset for square wave, triangle wave phase offset, and fade in for unipolar generators

Deprecated:

  • Deprecated the MetaSound Send and Receive nodes.

  • Removed the Sound Visualization plugin in favor of the more comprehensive functionality in the Audio Synesthesia plugin and other parts of the audio engine.

  • Removed the stat audio console commands in favor of the au.Debug family of console commands.

  • Deprecated the SpokenText field in SoundWave.

  • Removed the au.debug.ListSounds command.

Console

All Xbox

New:

  • Always include the "requires xbox live" flag in the manifest, as per the guidance from Microsoft, even if it is false.

  • Adding support for Simplified User Model.

  • Added support for detecting and reducing register spillage in the Xbox shader compiler. It will do multiple iterations with decreasing target occupancy to prevent it.

    • The maximum retry count is specified with UE_XBOX_SHADER_COMPILER_AVOID_SCRATCH_USAGE_MAX_RETRIES, and this defaults to 3. The final target occupancy will always be 1, and this reduces in powers of two with each iteration.

  • Gauntlet now removes previous staged build before deploying new build.

Bug Fix:

  • Fix for PIX profiling settings to retain control of instrumented D3D12 on Xbox over ProfileGPU.

  • Lazy initialization of audio resources in FMediaFoundationMovieStreamer and proper handling of PLM suspend/resume events.

Playstation 4

New:

  • Enable OnlineSubsystemPS4 plugin by default

Bug Fix:

  • Replace pthread functions with SCEpthread functions for Sony events. The SCE version uses relative time for timeouts which handles potential errors when changing the system time.

  • Fixed copies of cubemap texture mips.

  • Fixed net address failures when the port is negative.

Playstation 5

New:

  • Implement package discovery, installation and deployment for Playstation 5 automation.

  • Integrated MemPro for Playstation 5.

  • Added support for PS5 shader compiler stats to be available in the editor.

Bug Fix:

  • Fixed the creation of update packages based on a previous release. The build system no longer considers MasterVersion to determine if a package is a previous release, but the highest MasterVersion is preferred when selecting from the available base packages.

  • Fixed issue where GPU readbacks would sometimes return stale data.

Quail

Bug Fix:

  • Fix Stadia's keyboard handling under AZERTY and other country-specific layouts.

  • Fix stadia failing to package in installed builds.

Switch

New:

  • Add setting for enableSingleMode option in Switch Controller Support Applet. If enabled, it specifies whether to start controller support in single-player mode. Players are prompted to prepare controllers, including attached controllers, for one person. See nn::hid::ControllerSupportArg::enableSingleMode in the Switch documentation for more info.

  • Added two new features for SwitchInputSender:

    • Added a checkbox to reset the required version automatically when launching the requested app. This removes the need to reset the required version manually with DevMenu.

    • Added the --no-wait command when launching an application to allow the call to RunOnTarget.exe to return immediately instead of waiting until the title exits. This frees SwitchInputSender to do other tasks while the title is running.

  • The Switch RHI will remove unnecessary geometry shader management functionality at compile time if tesselation and geometry shaders are not used. This results in a small performance improvement.

  • Added a return code to the program RegTarget to indicate whether the requested operation was successful or not.

  • Allowing static shader platforms on Switch. This reduces runtime memory usage by around 9MB. To take advantage of these savings, choose a shader platform for the project. Then add defines for "USE_STATIC_SHADER_PLATFORM_ENUMS=1" and either "UE_STATIC_SHADER_PLATFORM_GLSL_SWITCH_MOBILE" or "UE_STATIC_SHADER_PLATFORM_GLSL_SWITCH" in the project's _Target.cs file.

  • Optimized compiler and linker flags to reduce memory footprint and binary size.

  • Optimized NVN CPU allocator by reconfiguring CPU memory growable allocators to reduce waste.

  • Optimize the chunk search in GrowableAllocator, so it's no longer O(n^2) in most cases. The chunk search time is now 20x faster, and overall allocator overhead is reduced by 40%.

Crash Fix:

  • Previously, when taking a Low-Level Memory tracker (LLM) capture, the application would crash on exit. This crash has been resolved.

  • Previously, if the Switch's profiler system was active, the app would crash on exit after tearing down the profiler system. The crash has been resolved by waiting on the render threads to drain before tearing down the profiler system.

  • Previously, SwitchInputSender would crash on exit if it was closed while still running tasks when it was closed. It will now exit normally.

Bug Fix:

  • Previously, if FSwitchPlatformFile::OpenWrite() was called, and bAppend was true, it would overwrite the existing data with any new data. Now FSwitchPlatformFile::OpenWrite() will seek to the end of the file, and it will write new data at the end of the file.

  • Previously, custom stencil lookups would not return the correct result due to the lookup referencing the incorrect texture channel. The lookups will now return the correct data.

  • Previously, if too many file handles were opened, FSwitchFileHandleBase::Read() would assert before attempting to reopen the file. Now the assert will only fire if the reopen attempt fails.

  • Previously, an assert would be triggered in the SwitchMediaDecoder during Cook On The Fly (COTF) when it attempted to read a file from staged data. This was resolved by changing the check() into an error message as staged data is unavailable during COTF.

  • Previously, the Boost setting would not be set correctly when SwitchInputSender requested a change. The setting will now be set as requested.

  • Previously, an error would occur if the user lifted a finger from the Switch touchscreen and a new finger started touching the screen in the same frame. This error has been resolved by sending all TouchEnd events first, preventing a new TouchStart event from occurring before the corresponding TouchEnd has been sent.

  • Previously, SwitchInputSender would fail to update a kit's firmware if the Switch console had a custom name. Now SwitchInputSender can correctly update the firmware of a Switch console which has a custom name.

  • Previously, the error "Issue 11-801 - Uses development APIs appears" would appear when packaging an application in the Shipping configuration. The functions causing this are now no longer referenced in the Shipping configuration, and the error no longer occurs during packaging.

  • Updated the SwitchInputSender export process to include missing assets when exporting and updated the ExportSwitchInputSender.bat file. Previously the exported version of SwitchInputSender would fail because of missing assets. Now those assets are included.

  • Previously, SwitchInputSender would terminate the running application when connecting to a Switch console. Now SwitchInputSender will connect without the need to terminate the running application.

  • Previously, when setting a new memory value for the Switch console, SwitchInputSender would not reboot the console, and the setting would not take effect until the console was manually rebooted. SwitchInputSender will now reboot the console when necessary, aligning with the other options that also require a reboot.

  • Set NumBuffers=1 when ResourceArray is provided.

Deprecated:

  • Sparse Texture support (bUseSparseTextures) has been deprecated due to the lack of performance when enabled and the code complexity incurred to support them. Disable Sparse Texture support for improved performance.

XBox One GDK

Bug Fix:

  • Fixed a virtual address leak when an ESRAM allocation fails.

Core

New:

  • Added an active timer count threshold at which we assume something is wrong and dump all timers to the log. The intention is to provide information in cases where projects have thousands of active timers at once, which can degrade performance.

  • Added an exec command called "DisplayCVarList" that supports a comma-separated list of CVar names to draw to the screen. This command also supports name completion; for example, you could enter "r.nanite" to see all CVars related to Nanite.

  • Added FMemoryWriter64 for serializing to a TArray64.

  • Added IntCastChecked and IntFitsIn utility functions.

  • Added UTF8CHAR string overloads for FCrc::Strihash_DEPRECATED.

  • Added TSharedFromThis::AsWeak() to complement TSharedFromThis::AsShared().

  • Added an FUtf8StringView overload for FSoftObjectPtr::SetPath().

  • Added UTF8 constructors to FBlake3Hash and FIoHash.

  • Extended FResourceSizeEx to keep track of name for each memory size added. This allows for verbose reporting of resource sizes. This results in output which will dump each tracked named size.

  • Added additional `AddSharedSystemMemoryBytes function which accepts a named tag.

  • Modified the FStaticMeshLODResources class method GetResourceSizeEx to use the new interface.

  • Modified FSkeletalMeshLODRenderData::GetResourceSizeEx() to use the new interface.

  • Added optional alignment awareness to the allocator model, and added support for that to TArray and FScriptArray.

  • Added: FArchive::SerializeCompressedNew can use arbitrary compressors, not hard-coded to ZLib like FArchive::SerializeCompressed.

  • Added the ability to use TArrayView with Append in TSet.

  • The Chunk Downloader now has a GetNumDownloadRequests() function.

  • CurveTable now has RemoveRow functionality to match DataTable.

  • The editor now has a new user interface for the CSVToSVG command line tool.

  • The editor can now create data tables from a raw data array.

  • Added a new WIDETEXT macro for WIDECHAR literals.

  • Users can now disable all or specific notifications from the DDC system.

  • TMemoryImagePtr, FWeakObjectPtr, TOptional, TInlineValue and FObjectPtr debugger visualization now support visualization of dereferencing expressions.

  • Added missing constexpr and UE_NODISCARD to eligible functions in UnrealMathUtility.

  • Created FTSTicker, a thread-safe version of FTicker. FTSTicker can add and remove tick delegates concurrently. Removing a delegate can block until its execution is finishing in parallel.

  • Added a new constexpr FPlatformString::IsCharEncodingSimplyConvertibleTo() function which tests if one encoding can be assignment-per-character converted to another.

  • Added a placeholder for HashCombineFast(), which is intended to serve as a placeholder for an in-memory fast hash combining algorithm, unlike HashCombine() where the results may be persisted.

  • HAL/HideTCHAR.h and HAL/AllowTCHAR.h for including around third-party headers in UTF-8 mode which use their own implementation of TCHAR (for example, Windows headers).

  • FSpinLock and generic TScopeLock. These are classic spin-locking behaviors, so use them with caution.

  • TIsCharType now has specializations for UTF32CHAR and wchar_t when PLATFORM_TCHAR_IS_CHAR16 is set. Added a new PLATFORM_UCS2CHAR_IS_UTF16CHAR macro.

  • Created the Game Thread CPU Timing platform API for more accurate CPU Percentage and CPU saturation detection. Also added a platform API for free (on Unix) process performance stats (Page Faults, IO, and Context Switches). Game Thread CPU Timing is guarded with the CVar: Platform.TrackGameThreadCPUUsage

  • TInlineValue has a new EInPlace constructor.

  • Enabled DisplayAll commands in TEST config builds.

  • Added TEXTVIEW, ANSITEXTVIEW, WIDETEXTVIEW and UTF8TEXTVIEW macros for creating string views to replace the TEXT macro with "_SV" added to the end of the quoted string literal.

  • Remove unused names from package headers, reducing the amount of data and number of names that have to be serialized. We now:

    • Strip names that are not used when cooking for UnversionedPropertySerialization.

    • Strip names that are not used by the loader when staging for IoStore.

  • The third-party Imath library (version 3.1.3) is now included for use in the engine.

  • FString::AppendChars, CompactBinary, and FName construction now support UTF-8. FUtf8StringView is now constructible from both ANSICHAR and UTF8CHAR strings.

  • Removed the unused InstallVisualizers.bat file because Visual Studio versions above 2015 do not use it. Added a .natstepfilter for common Unreal parameter constructor functions to avoid stepping into the parameter construction when trying to step into a function that takes the parameter.

  • Added a Custom Config directory feature that can be used to support multiple packaging targets per platform.

    • Setting CustomConfig=Directory in a Target.cs file will cause it to overlay config files from Project/Config/Custom/Directory on top of the other config files, enabling easy override of things like OSS settings to support multiple stores.

    • In development, -CustomConfig=Directory can be specified in both C++ and C# to enable the same functionality, which can be used to select between different stage/deploy configurations in a build script.

  • Added PackageName.DumpMointPoints, PackageName.RegisterMountPoint and PackageName.UnregisterMountPoint console commands to manage UnrealFileSystemMountPoints in non-shipping builds.

  • Added GetValid(Object) global function. GetValid can be used in places where pointer validation with IsValid(Object) triggers static analysis warnings.

  • Added the ability to specify referencer name provider type for TStrongObjectPtr.

  • Made the verbosity of the uninitialized reflected property check configurable through either project or engine modules. Projects use DefaultEngine.ini, while engine defaults are in BaseEngine.ini. Issues with UObject* properties are upgraded from Warning to Error. Other types remain the same for both engine and project modules (Display), but engine will soon change to Error as well. For example:

    • [CoreUObject.UninitializedScriptStructMembersCheck] EngineModuleReflectedUninitializedPropertyVerbosity=Error ProjectModuleReflectedUninitializedPropertyVerbosity=Warning

  • Added OodleDataCompression.h interface for direct access to Oodle compression. Oodle compression is now built into Unreal Engine Core and is available on all platforms for general purpose compression needs. This is separate from the configurable pak/iostore compressor.

  • Optimized IsValid(Object) performance: 19.8ms -> 9.2ms (based on internal GarbageCollector tests)

  • Add UE_CALL_ONCE to help call void functions once

  • In OutputDeviceFile, the async writer can now set its thread name to either the file name or a sequential number. Define OUTPUTDEVICE_DEFAULT_ASYNC_WRITER_THREAD_NAME to change the default behavior, which is to use the file name.

  • Added support for disabling Pending Kill functionality in the engine. Pending Kill will be disabled by default for any new projects created with the next Engine release.

  • FGCObjects without GetReferencerName overrides will now be reported during Garbage Collection verification tests.

  • Changed the CsvProfiler worker thread to be created on demand, rather than unconditionally. The CSV_PROFILER macro is now defined in Shipping on the Dedicated Server only if checks are defined as well.

  • Added support for disabling CsvProfiler categories through configuration by using the CsvProfiler/DisabledCategories array.

  • The UCLASS specifier now takes a Hidden flag. This maps directly to the ClassFlags Enum CLASS_Hidden flag. Adding this flag will hide the given class from any class browser in the editor.

  • Introduced Garbage Collector History. Garbage Collector can now store information about its previous runs which can then be used to track down UObject memory leaks.

  • The ReferenceChainSearch class will no longer store raw pointers to UObjects when constructing reference chains and instead will only preserve basic information about UObjects separate from UObjects themselves.

  • Downgraded level leak asserts to errors when PendingKill is disabled.

  • Updated to Oodle 2.9.5 SDK. Oodle 2.9.5 provides significantly faster rate-distortion optimized texture encoding.

  • Added a UnrealTraceServer.exe to the binary build. UnrealTraceServer is the tool that records traces for profiling purposes.

  • Added functionality to Allow Cast to gracefully handle an interface instance that's not a UObject.

  • ISPC support has been added for double versions of core types.

  • Traced a timing event for each task's start-end interval.

  • Added a template VariantStructure as an alternative to the template BaseStructure that provides access to script structs for f and d LWC variant types.

  • In the PathPermissionList class a const FName reference is now used instead of FName in iterators whenever it is possible.

  • Added support for values larger than 2 GB in the Derived Data Cache.

  • Added compression to the Derived Data Cache, reducing its size by 65-75%.

  • Added the ability to configure Task priorities from config files.

  • Made the scrollableFormatting and reverseSortRows properties of the SummaryTable able to be set in XML.

  • Added listSummaryTables option to list the available summary tables in the current ReportXML, then Output the report XML filename and report graphs filename to the log.

  • TPromise can now use non default constructible types.

  • Added support for more than two sticky columns in collated summary tables. New format info for columns have been created to replace the "lowIsBad" list. This provides specifying auto colorization rules and numerical formatting.

  • Added support for multiple section boundaries, and minor (dashed line) section boundaries Section boundaries no longer require startToken or endToken. Section boundaries now can be specific to collated or full tables

  • Added a minFrameCount param which filters out rows from the summary table based on frame count. This allows us to filter out bad CSVs. This works after the cache reads, so bad PRCs will also be filtered out.

  • Added maxFileAgeDays argument. CSV or PRC files older than the specified parameter will be ignored. This is faster than querying timestamp metadata, especially when reading from network drives.

  • Added input format detection for csvConvert. If not specified, input format and compression will be used for output.

  • Added setMetadata key/value argument for overwriting metadata, and ensured the command line metadata is written at the end when writing in .csv format.

  • PerfReportTool - hitchSummary - add summary table metrics for hitches of thresholds up to 1000ms at 100ms intervals. The new metrics are named Hitches>Xms.

Improvement:

  • Improved debugger visualization of TStaticArray.

  • Moved the FResourceSizeEx into its own cpp file so modifying the header isn't a full recompile.

  • Upgraded the engine's version of the third-party OpenEXR libraries to 3.1.1.

  • Moved GChaosMode state onto the heap to save on the static memory footprint.

  • Made FrameRate, Timecode, and TimeManagement work better with NTSC and/or drop frame timecode and frame rates.

  • Added quotation marks around strings from failed comparisons during automation tests to aid readability.

  • Added more heterogeneous string encoding overloads of FGenericPlatformStricmp::Strnicmp.

  • Reimplemented TSharedPtr reference counting using std::atomic and more optimal memory ordering in ESPMode::ThreadSafe mode.

  • Standardized the null smart pointer .natvis to say "nullptr" instead of "Null".

  • Improved performance, reduced code bloat, and simplified searching for non-constexpr constants by adding appropriate use of constexpr through core engine code.

  • Implemented scratch buffers for encoder scratch as well as decoder to improve OodleDataCompression performance.

  • Marked all FPlatformProcess::SleepInfinite implementations as [[noreturn]]

  • We now support passing a default value to FVector::GetSafeNormal. This value will be returned if the original vector is zero.

  • Loading of plugin-specific config files has been modified to be more consistent and reliable. BasePluginName.ini should always be used for engine plugins and DefaultPluginName.ini for game plugins.

  • FArchiveReplaceObjectRef (and subclasses) now pass parameters through flag enums rather than long lists of bools. FArchiveReplaceObjectRefBase no longer tracks replaced references by default.

  • Unified and improved output when reporting Garbage Collection World leaks and in 'obj refs' command output.

  • Added OodleTextureSdkVersion field to Texture assets so that textures remember the version of Oodle they were encoded with. Legacy assets load with this field blank. Different versions of Oodle Texture can be used based on this field to prevent unnecessary patch generation.

  • Disabled CsvProfiler RenderTargetPool category on the server side by default.

  • Prevented useless FString allocations in FindOrCreateStatSeries when checks are compiled. Enabled TLS memory caches for the CSV processing thread

  • PerfReportTool: Split classes into separate files.

  • PerfReportTool: Made Summary types self-register so they're self-contained and more easily extendable.

  • PerfReportTool: Removed redundant XmlHelper class, by converting existing usage of this to use the GetSafeAttribute method.

  • improved summary table formatting by adding support for 3 levels of section barrier in summary tables.

Crash Fix:

  • Fixed a crash when calling TPolygon2<>::Contains on an empty polygon.

  • Fixed a crash due to a missing type in the FAutomationTestAttemptToFindUninitializedScriptStructMembers test when running the automation tests from within Unreal HeaderTool.

  • Fixed a Linux crash when connecting to an incorrect trace host address.

  • A crash has been fixed that occured when running a reference gathering while incremental garbage collection running.

Bug Fix:

  • Fixed FastDecimalFormat not handling inf.

  • Fixed compile error in TRobinHoodHashMap::Remove() and data loss warning in TRobinHoodHashMap::Num().

  • Fixed FStringView::Mid to work the same as FString::Mid. Added Left, Right, and other slicing functions to TArrayView to match the behavior of FString.

  • Tidied up TSharedPtr's FReferenceControllerOps using if constexpr.

  • Fixed TTuple's per-element constructor to be conditionally explicit, allowing tuples to be initialized with a braced list of initializers.

  • Fixed some usages of FBox::ExpandBy, and clarified FBox comments.

  • Made TVariant::IsType issue a compile error when T isn't in the variant.

  • Fixed Expose_TFormatSpecifier in UTF-8 mode.

  • Fixed a dereferencing null pointer static analysis warning in AppendCharacters in String.cpp.

  • Caused a compile error when a class hierarchy inherits multiple instances of TSharedFromThis or when using TSharedFromThis when T doesn't inherit TSharedFromThis.

  • Supported the # alternative representation modifier in FGenericWidePlatformString::GetVarArgs.

  • Improved DisplayString visualization for TMemoryImagePtr.

  • Fixed the "% 123d" explicit space-padding formatting syntax in FGenericWidePlatformString::GetVarArgs.

  • Fixed FMath::Wrap for zero-sized ranges.

  • Fixed a compile error in TArray::operator<< when an element type is bulk serializable but not regularly serializable.

  • Made TUniquePtr's debugger visualizer's expanded view more consistent with other smart pointers.

  • Fixed the optimized map and set property serialization path when there are no defaults and the container is non-empty.

  • Fixed FGenericWidePlatformString to be usable under Windows by setting PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION.

  • Removed UTF8CHAR as an alias for char8_t in C++20, as it causes ABI conflicts when linking modules built with a mix of C++17 and C++20.

  • Fixed a crash when trying to convert an array of a serialized struct type to an array of a non-struct type.

  • The W component is now properly preserved in vectorized TTransform::TransformFVector4 and TTransform::TransformFVector4NoScale.

  • Fixed up FCString in UTF-8 mode.

  • Loaded packages are no longer incorrectly marked as missing, which prevents incorrect skipping of imports after requesting load of an invalid export in a valid package.

  • Added support for padded widths in FImageWrapper classes, which fixes a bug where a Remote Session's image buffer could include garbage pixels on the right side due to the underlying GPU's pixel alignment requirements.

  • Added Define log categories for NO_LOGGING configurations.

  • The entire hash map will now lock instead of individual hash buckets when iterating UObject maps to prevent memory stomps when creating, renaming, or destroying objects mid-iteration.

  • Duplicating components now correctly duplicate instanced subobjects owned by that component.

  • Fixed redirected or unqualified enum values.

  • Fixed the GetMinimalName method from the MappedName class to be aware of case sensitive FNames.

  • Fixed the MemoryWriter from failing to write an index size greater than 2GB.

  • Slightly reduced framepro send buffer size so it fits under the small alloc max size amount of some allocators.

  • Fixed potential memory stomps during localization data gathering.

  • The method FStructUtils::TheSameLayout no longer returns false when passing in null structs to compare.

  • Prevented the Plugin Utillity method AddToPluginSearchPathIfNeeded from adding mod or enterprise plugin directories to the plugin search path.

  • UMG list view will now track its Actor references and remove them when they're about to be destroyed to ensure they don't prevent levels from being Garbage Collected.

  • InputComponent will now clear its reference to the PlayerInput to ensure it doesn't prevent levels from being Garbage Collected.

  • Cleared a reference to PathFollowingComponent on the MovementComponent when the PathFollowingComponent changes its MovementComponent to make sure it does not prevent levels from being Garbage Collected.

  • FPlatformMemory::OnOutOfMemory: Fixed thread-safety issue when concurrent calls return from the function.

  • Released references to other objects when the PlayerCameraManager gets destroyed to make sure they don't prevent levels from being Garbage Collected.

  • CheatManager will now empty its extensions list when its outer PlayerController is about to be destroyed to prevent issues with Garbage Collecting leaking references.

  • Fixed use iostore and make binary config settings from not being saved to the launcher profile.

  • Cleared the thread buffer for CPU tracing to avoid scopes ending up after thread end and cleared the thread buffer pointer.

  • Fixed a mismatching Malloc / delete in the DistanceFieldStreaming implementation .

  • Fixed a few issues where adding or changing a default subobject class in a class constructor would overwrite the previously set values in Blueprints and other instances of that class.

  • The CameraModifier's CameraOwner reference will now be nulled when it gets destroyed to ensure it does not prevent levels from being Garbage Collected.

  • PlayerState's Pawn reference will now be tracked and released when no longer required to make sure it doesn't prevent levels from being Garbage Collected

  • The AbilitySystemComponent's references to other Actors will now be released when the Actors are about to be destroyed to make sure they don't prevent levels from being Garbage Collected.

  • The AudioComponent will now clear references to other objects when its EndPlay is called to ensure it does not prevent levels from being Garbage Collected.

  • Fixed trace timestamps for Unix to match the double type.

  • Fixed usage of StringCast API in various source files.

  • Fixed usage of TCHAR_TO_ANSI and TCHAR_TO_UTF8 macros in various source files.

  • Fixed invalid arguments from being passed to CSV_EVENT and TRACE_BOOKMARK.

  • Fixed several Printf string calls that contained incorrect var arguments.

  • Fixed single-property config updates from failing to remove entries that were no longer needed as they matched the CDO.

  • Fixed Stats macros from causing extra evaluations of their Value expressions.

  • Fixed CrashReportClient from writing a buggy compressed header at the start of the compressed report and the valid one at the end of the report.

  • Fixed the FArchiveFileReaderGeneric to respect the FILEREAD_Silent flag.

  • Fixed a pointer to an unexpected type being passed to the CaptureStackBackTrace method.

  • Fixed a race condition causing log lines to merge together when writing to stdout.

  • Fixed many math types like FVector, and FIntPoint from violating strict aliasing rules.

  • Fixed Pakfile creation when the uncompressed buffer size exceeds the int32 capacity and introduced the TInlineAllocator64.

  • Added an ensure to avoid a synchronization bug involving DDC memory backend and value-locking that can occur when disabling the memory backend.

  • Fixed a bug where the filter order is ignored for columns in the rowSort list in collated summary tables. Columns you are collating by will still appear first, but their relative order is preserved.

  • Fixed peak summary from not emitting SummaryTableData when detailed reports are disabled.

  • Fixed an issue where Async Loading Handles could stall on Switch.

  • Fix to Async Loading Handles to stall on Switch, which was caused by an issue with the initial pak list.

  • Prevented the EditorPackageLoader method NotifyConstructedDuringAsyncLoading from asserting if an object is created during async loading.

Deprecated:

  • Deprecated the FPlatformString::TIsFixedWidthEncoding trait and replaced it with a constexpr FPlatformString::IsFixedWidthEncoding function.

  • Added a deprecation warning to typed allocators which fires when the allocator won't return appropriately-aligned memory - explicitly aligned versions of the allocators or alignment-aware allocators should be used instead.

  • Changed FPlatformString::CanConvertChar to FPlatformString::CanConvertCodepoint, with improved checks and documented assumptions.

  • The macros WANTS_COMMANDLINE_WHITELIST and OVERRIDE_COMMANDLINE_WHITELIST have been renamed to UE_COMMAND_LINE_USES_ALLOW_LIST and UE_OVERRIDE_COMMAND_LINE_ALLOW_LIST.

  • Deprecated the IsInitialized function and variable from ThreadingManager. The variable's access was causing TSan warnings.

  • Deprecated most public properties of UPackage and created accessors for them to be used instead.

  • Deprecated StringBuilder::Append(Char) in favor of StringBuilder::AppendChar(Char).

  • Deprecated StringBuilder's class AppendAnsi method in favor of the Append method.

  • Deprecated the TStringView SizeType method in favor of int32.

Removed:

  • the "Shared" version of the memory tracking functions. These are not used at all across the engine. This simplifies the code and makes the output of the obj list more readable.

  • Removed FPlatformMisc::SetEpicAccountAPI.

  • Removed the unused and inconsistently-applied BogusChar option from FPlatformString string conversion functions.

  • Removed deprecated FPlatformMisc::GetEnvironmentVariable overload.

  • Removed THasGetTypeHash.

Cooker

New:

  • Added Virtual Assets Dialogue to Derived Data Widget.

  • Added Analytics Support for Virtual Assets / Virtualization Module.

  • API support added to DerivedDataBackendInterface to help filter and tidy-up the Cooker's user interface:

    • IsRemote: Is this back end local or remote?

    • IsWrapper: Is this back end a wrapper?

    • GetTypeName: Returns a relatable back end type, such as Memory, S3, Http, Zen, or Fixed.

  • Reformatted the Cache Statistics user interface to show meaning full type name and display details.

  • Reformatted the user interface to add bold type for Titles and Totals

  • Disabled the InEditorCooking by default for all projects. Cooks launched from the editor by QuickLaunch will instead launch the cook commandlet in a separate process. Future cook architecture will move away from InEditorCooking, and the current default map type - WorldPartition - does not yet support it. A project should enable InEditorCooking only if necessary for backwards compatibility and only if it does not use WorldPartition.

  • Added ICookInfo and FInstigator to the cook to provide the AssetManager with the reason why a package was requested by the cook. This information is used automatically by the AssetManager, but can also be used to diagnose errors during cooking.

  • Added the commands -dpccvars=cook.displaymode=4: is used when packages are cooked, they will display the instigator that caused them to be cooked.

  • CookShowInstigator=: is used when the given package is cooked, it will display a message about the chain of instigators that caused it to be cooked.

Bug Fix:

  • Fixed ZenCache Statistics appearing when Zen is not the DDC backend.

  • Fixed pulsing of the cooker's Upload/Download arrows.

  • Fixed an AssetRegistry bug that caused the importer's new asset to never be found again until the editor is restarted.

  • Fixed the RemovePath method from the AssetRegistryImpl class to return true if the path already does not exist.

  • Changed the SetDefaultsForCookedEditor to always define the ASSETREGISTRY_ENABLE_PREMADE_REGISTRY_IN_EDITOR macro.

  • Made changes to the PackageNameCache definitions. The DoesPackageExist method will now use the TryConvertLongPackageNameToFilename method instead of the LongPackageNameToFilename method, so that it doesn't assert if the package name can't be resolved to filename.

  • The CookOnTheFlyServer class method GetAllPackageFilenamesFromAssetRegistry will now skip package names that don't have a valid mount point, such as packages in plugins that haven't been mounted yet.

Deprecated:

  • LegacyBulkDataOffsets is no longer supported in UE5.

Memory Profiler

Bug Fix:

  • Fixed the maxcount calculation to no longer integer overflow before capacity integer overflows. This expands the number of allocations we can fit into 32-bit LLM tracking, which is needed for some large projects that still want to use 32-bit LLM tracking.

Network Profiler

Crash Fix:

  • Fixed a crash that occurred when the nettrace is enabled and NetDriver is removed mid-frame.

UnrealFrontend

Bug Fix:

  • Fixed Exclusive time computation for old Profiler.

UnrealPak

New:

  • Implemented support for commands -Info, -List, -Diff and -Extract for IoStore containers.

Bug Fix:

  • Added a warning that will be printed when a pak file is loaded with a mount point that is not mounted to any root directory.

Datasmith

New:

  • DatasmithContent - Improved water shader (caustics, reflections, depth).

  • glTF Importer: Added support for PBR-Next Materials.

  • Navisworks: Added a warning dialog when trying to export an empty (initial) state.

  • Revit: You can now specify which metadata is exported with the Datasmith file.

  • Datasmith glTF: Added support for transmission extension.

  • DatasmithContent - Added water material and 2 instances for pools.

  • Changed the default, fallback Refraction value for Materials generated from USD Stages from 1.5 to 1.0.

  • It is now possible to set a threshold number of triangles, after which static meshes generated when opening or importing USD stages would get Nanite enabled. Additionally, it is now possible to add the "unrealNanite" token attribute to a Mesh prim, and use the "enable" or "disable" values to override the Nanite threshold and always enable or disable Nanite for static meshes generated from that prim.

  • Added a new export option when exporting levels to USD that allows controlling whether foliage is exported to the foliage Actor's layer or the place Component's layer. This is especially useful when the Place in Current Level option is enabled on the foliage tool.

  • You can now pick which AUsdStageActor is bound to the USD Stage editor via the combo box at the top-right of the window.

  • Prim attributes on the USD Stage editor are now sorted alphabetically by their attribute names.

  • You can now control the exported LOD range when exporting Static and Skeletal Meshes to USD.

  • Implemented custom 'unreal' USD render context for Unreal Materials. Now, existing, persistent Unreal Material Assets will only be used when opening a stage when the 'unreal' render context is selected. Additionally, in most scenarios, exporting Materials and Components that use Materials (with Material baking disabled) will generate USD Material prims with custom Unreal Shader prims, analogous to how MDL Materials are handled in USD.

  • There is now a new button (Reset State) on the File menu of the USD Stage editor. Use this button to reset the state / session of the opened stage without reloading it from disk.

  • Animated light and camera attributes, as well as skeletal animation, will now be read from USD and automatically added to the generated LevelSequence as regular tracks. Manipulation of these tracks will write the data back out to USD.

  • When writing out animation tracks to the stage while a USD Stage is opened, the exporter will now only bake every frame of the animation if absolutely necessary.

  • You can now control the location of the Asset folder when exporting Assets and Levels to USD.

  • You can now track the assignment of Material overrides on geometry cache Components generated when parsing the USD Stage. These assignments are now serialized to USD.

  • When exporting a Level to USD, if a USkyLightComponent is encountered that uses a TextureCube Asset with no existing HDR file on disk, the export process will now generate a brand new .hdr file from the source Asset and reference it in the exported USD scene.

  • Datasmith Solidworks: You can now export animations from Solidworks.

Bug Fix:

  • DatasmithContent - Fixed default rotation value for triplanar projection.

DevTools

Automation

New:

  • Improved the test exclusion list mechanic. This consists of the following changes:

    • Renamed blacklist to excludelist.

    • Support section exclusion rule can now exclude entire sections of tests.

    • Mark excluded tests as skipped in the report instead of entirely removed for the test list. This checks for exclusion just before running the test.

    • Removed NotEnoughParticipant state in favor of Skipped.

    • Add support for exclusion management from the Test Automation window.

    • Exposed device information to UE test report.

    • For platforms, the mechanic to edit their exclusion config file must be done manually through the target platform config file. This will be improved in a future release.

  • Added support for on-demand virtual devices in Gauntlet.

  • When test passes stop because of critical failures, AutomationTool now resumes UE test passes using a JSON report as tracking support.

  • Add support for comparing images other than PNGs.

  • Exposed arbitrary image comparison with test reference to python and blueprint.

  • Implemented OnTestStart and OnTestEnd events for the AutomationTestFramework. Included TestSamples plugin as an example.

Bug Fix:

  • Properly initiate FImageComparisonResult::CreationTime member.

AutomationTool

Bug Fix:

  • Fixed the initial map setting of the project launcher being ignored when also specifying maps to cook.

  • Fixed the -SeparateDebugInfo command for BuildCookRun failing to place debug files in a separate directory with the manifests.

  • AutomationTool will guard against the target platform's cooked data folder not existing during staging. This can happen when making builds that re-use previously generated pak files.

  • Pass -unattended to unrealpak from the staging code so that it doesn't pop up interactive dialogs.

BuildGraph

New:

  • Added support for nested expansion of Build Graph Properties. For example: $(Outer$(Inner)).

UnrealBuildTool

New:

  • Added support for Visual Studio 2022 as a source code accessor and compiler.

  • Added experimental support for Intel OneAPI compiler.

  • Added Linux and Mac support to GenerateClangDatabase in UBT.

  • UBT can create an "Internal" include directory. This directory is only added to a module if the referenced module has the same scope.

  • Uses /sourceDependencies to generate dependency list instead of cl-filter if the msvc compiler version is at least 14.27

  • Replaced uses of whitelist and blacklist with AllowList and DenyList in .uplugin and .uproject module descriptors. For example, WhitelistPlatforms is now called PlatformAllowList. If the new names are not found, the parser will fall back to the old names for one or two releases, but support will be removed entirely in a future version.

  • Added a -Rebuild command line option that will clean a target before attempting to build it.

  • Added support for passing /experimental:deterministic to the MSVC compiler (WindowsPlatform.bDeterministic). This is disabled by default.

  • Added support for log file rotation to UnrealBuildTool.

  • Added a TraceConsole function to EpicGames.Core.Log.

  • Added support for Clang's static analyzer to the Unreal Build Tool. You can enable this by adding -StaticAnalyzer=Clang to the invocation line. By default, Clang will print out the output from the analyzer to stdout. However, if you add -StaticAnalyzerOutputType=Html, a directory will be written in the same location that object files are produced, with a navigable HTML file containing the result of the static analysis.

Crash Fix:

  • Fixed a crash in UnrealBuildTool when a platform SDK is only partially installed.

Bug Fix:

  • Added sourceFileMap to the generated VSCode launch.json file for installed builds, so the debugger can load source files correctly when debugging the editor.

  • Fixed not being able to generate VS2022 project.

  • Updated compiler version to 143 in VS Project Generator.

  • UnrealBuildTool will provide a warning if a module is referenced with an incorrect text case.

Deprecated:

  • Removed support for deprecated Intel compiler.

  • Removed support for Visual Studio 2017.

  • Set minimum Visual Studio version to 2019 v16.11.5, toolchain 14.29.31033 Set minimum Windows Clang version to 10.0.0

UnrealHeaderTool

New:

  • UnrealHeaderTool can parse UFUNCTION defaults from default constructed structs.

    • Example: void MyFunc(FMyType MyArg = FMyType());

Editor

New:

  • Texture encoding now supports two encoding settings, so that you can enable slower, high quality encoding features for cooked builds while retaining fast encoding in editor. These settings are in Project Settings -> Texture Encoding. There is also a user override in Editor Preferences -> Texture Encoding.

  • Migrated the Alembic third party AlembicLib module to Engine/Source/ThirdParty.

  • Upgraded engine version of the third-party Alembic libraries to version 1.8.2.

  • Added Default World Partition Settings. These can be found in AWorldSettings, can be saved from the WorldSettings panel in the World - Advanced section. These set a default loading state for a World Partition map, including loaded cells and data layers, to avoid an empty world when loading a map for the first time.

  • Added support for property categories to be prioritized via a new 'PrioritizeCategories' metadata.

  • Added support in the Content Browser for Delete/Copy/Rename operations on World Partition worlds.

  • Upgraded the engine version of the third-party USD libraries to version v21.08.

  • Added a project setting to the World Partition settings for the Foliage Grid Size. This setting gets assigned to the WorldSettings actor when the WorldPartition gets created.

  • Property tooltips now also contain the raw name of the property, so you can identify the property if the name is too long to be displayed in full.

  • Feature packs can now have multiple categories specified for them in the "Category" field of the manifest.json file

  • Added the ability to break the Details view into sections, such as "Rendering" or "Physics". Sections can be defined anywhere with access to FPropertyEditorModule, using the FindOrCreateSection function. See FDetailCustomizationsModule::RegisterSectionMappings for an example of current section mappings.

  • Refactored the existing Derived Data Cache (DDC) Toolbar Widget:

    • Moved all the code to a plugin module.

    • Removed superfluous icons from the toolbar.

    • Added combo-box dropdown menu options.

    • Added dockable window support.

    • Added icons to the UE5 style.

    • Numerous adjustments made to UI layout.

  • Upgraded the engine version of the third-party OpenSubdiv libraries to version 3.4.4.

  • We now use per-platform Python site-packages directories for USD Python modules. This leverages recent changes to the PythonScriptPlugin that recognize per-platform site-packages directories. Arranging the modules this way allows the Python modules generated by building USD to be dropped directly into the appropriate platform directory and avoids the need to patch the init.py files to look for Mac .so files in a different location.

  • Advanced dropdowns in Details views are now styled like a normal group rather than as an expander.

  • Made adjustments to the Spline component, so that Alt-Drag and Add Key To Segment now copy the spline point type (curve/linear/constant) of the adjacent spline point.

  • Added detail customization for vector curves, so that you can create curve editors for vectors that are similar to the editor available for float curves.

  • Spline components are now colored with a gradient effect to more easily tell when they are selected, and they have more distinct colors.

  • Added support for cm/s as a speed unit for ForceUnits/Units property metadata.

  • Updated spline box and frustum selection to always add rather than toggle points in the selection area, or append to selection when shift is pressed.

  • P4 Client SDK has been updated to 2021.2 for the Mac target platform.

  • AssetRegistry now adds writable files to the Reconcile cache in the Source Control window.

  • There is now an UncontrolledChangelistValidator, which reconciles writable assets and warns the user if new uncontrolled changes are found during changelist validation

  • Added a Validate Changelist contextual action to the Source Control Changelists window.

  • Added Usecases to Editor Validators, so validators can specify which Usecase should be executed by overrides.

  • There is now a FValidateAssetsResult struct which holds detailed information about validated assets and results.

  • You can now open Unreal Insights from the Editor menu.

  • Added virtual shadow map debugging and profiling visualizations to the Editor Viewport dropdown.

  • You can no longer undo the deletion of sublevels.

  • Added new settings to the Geometry Cache plugin settings to control the memory usage of streaming geometry caches from Alembic and USD.

  • Streaming geometry caches stats are available through the console command stat GeometryCache.

  • Uncontrolled Changelists now support files marked for delete in Source Control.

  • You can now disable hardware occlusion queries on a per-scene basis in the Editor.

  • The Texture Editor now has a new tab that shows various properties about the encoded texture, including whether the texture was encoded with Fast or Final quality. This tab lets you experiment with various Oodle properties like encode quality settings on the texture, and also can show you the deployed size benefits of RDO encoding.

  • The P4 Client SDK has been updated to 2021.2 for the Win64 target platform.

  • When you launch Unreal Insights from the Editor, if Unreal Insights is not found it will now be built.

  • When importing a static mesh from an Alembic file, you can now enable Propagate Matrix Transformations without enabling Merge Meshes.

  • There is now a DirtyFilesChangelistValidator to verify there are no unsaved modifications when submitting a changelist in Source Control.

  • The FPropertyAndParent struct now contains the array indices of the changed property and all its parents, so you can determine which property value changed.

  • Added the option Delete New Files on Revert to the Source Control window.

  • Removed Python 2.7 support from the Engine.

  • Added a delegate for mode toolkits to do any UI shutdown that depends on the mode UI layer.

  • Exposed a Python setting to let users select if the embedded Python interpreter should run in isolation mode or not. By default, the engine interpreter runs in isolation mode to minimize risk of having incompatible Python software crashing the engine.

  • Reskinned the Message Log.

  • Added a shaded preview for Volumes.

  • Changed the column names in the Outliner to support localized strings.

  • Added the UFUNCTION UBlueprintEditorLibrary::GeneratedClass(UBlueprint*) as a script method for Python users. For example, bp = unreal.EditorAssetLibrary.load_asset("/Game/Blueprints/BP_AdjustButSpawn") print(bp.generated_class())

  • Reskinned the Restore Packages panel.

  • Added Bridge menu item back to the workspace menu, as well as updated the icon.

  • Added a 'Preview Profiles' combo box to asset editor viewport toolbars to quickly change preview profiles. The profile combo is only visible when the user has more than one profile. This was added to the Material Editor, the Static Mesh Editor, and the Niagara Editor.

  • FAssetEditorModeUILayer now serves as a layer between a given asset editor and the mode toolkits, so that the mode toolkits can request UI panels and the asset editor determines where they are located in the asset editor layout. The first implementation is in the Level Editor, and all default mode UI has been moved to FModeToolkit.

  • Added the ability to show or hide individual columns in the Outliner by right-clicking on the header.

  • Separated out the FActorInfoColumn that showed modes such as Type / Level / Layer into separate columns that can be hidden or shown.

  • Added support to recursively search Editor menus.

  • Added the combo chevron to the Status Bar button.

  • Reskinned the Create Blueprint From Selection Panel button.

  • Added colors to all major editor tab icons. Renamed the World Outliner to Outliner.

  • Reskinned the Plugin Manager.

  • Reskinned the Project Launcher window.

  • Added support for multiple modes in mode UI layers. There is now a paired AssetEditorUISubsystem that does the tab registration so the modes don't have to be registered before the asset editor opens.

  • Viewports can now focus on anything implementing a typed element world interface, not just Actors and Components.

  • Reduced the default length of Spline Component tangents to make them more manageable.

  • Reskinned the Level Editor Toolbar.

    • Moved the Editor Modes into a single dropdown.

    • Combined the Content and Create Menus into one menu.

  • Updated the placement and style of Play and Debug buttons in toolbars.

  • All menus, those created by menu builders and UToolMenu, now have a default height of 1000.

  • Add and Filter menus in the Content Browser are now searchable.

  • UToolMenus are searchable by default.

  • Added a warning icon in the Auto Save Restore UI beside a package to restore, if the auto-saved package modification time is older than the file it is supposed to restore.

  • Hiding a Level deselects everything in it now, not just Actors and Components.

  • The Open Asset Dialog (Ctrl + P) now opens as a Tab instead of a floating window.

  • Updated the embedded Python interpreter from 3.7.7 to 3.9.7.

  • Added the ability to copy property display names using the right-click context menu.

  • The visibility of columns in the Outliner is now saved across editor sessions.

  • In the USD Stage Editor, dirty layers will now show a star (*) after their names.

  • Removed the Alt+P shortcut for opening the Place Actors Panel.

  • Added support to USD for the IOR attribute on UsdPreviewSurface materials.

  • Added the SSimpleButton widget to the ToolWidgets API. This can be used to create buttons in the UE5 Style.

  • Added SSimpleTimeSlider to the ToolWidgets API. This can be used to create a Time Slider in the UE5 Style.

  • Add the SSearchableComboBox widget to the ToolWidgets API. This can be used to create a searchable combo box in the UE5 Style.

  • Added SCheckBoxList to the ToolWidgets API. This can be used inside a Custom Dialog to display a list of checkboxes.

  • Added support to USD for virtual textures on the UsdPreviewSurface master materials.

  • Added SWarningOrErrorBox to the ToolWidgets API. This can be used to display a warning or error in the UE5 Style.

  • Added SSimpleComboButton to the ToolWidgets API. This can be used to create a combo button in the UE5 Style.

  • Added SPositiveActionButton to the ToolWidgets API. This uses the UE5 Style and can be used for actions such as "Add".

  • Added SNegativeActionButton to the ToolWidgets API. This uses the UE5 Style and can be used for actions such as "Delete".

  • Added a script to build the USD SDK for UE on Windows.

  • Imported jpeg textures will now be stored in their original jpeg format in the package file, and will only be converted to compressed PNG format when the texture pixel data is modified inside the Editor.

  • Reskinned and Updated Interfaces:

    • World Details

    • Levels Browser

    • HighResScreenshotTool

    • Path Picker

    • Asset Picker

    • Find In Blueprints

    • Message Dialogs

    • Scene Outliner

    • Icons

  • Created Styling option for Parent Rows in Tree Views.

Improvement:

  • Added a Source Control Asset Data cache to prevent Source Control Changelist Window from rebuilding the Asset Data from scratch when the UI refreshes.

  • Modified the Source Control beautification to be an async process, preventing crowded changelists from blocking the workflow. The filenames are now beautified when available.

  • Parallelized Asset Data information retrieval from Source Control.

Crash Fix:

  • Fixed a crash when an invalid TitleProperty was used for a Details property.

  • You can no longer dock tabs into docking areas that are contained inside the tab itself, because this would cause an infinite loop and eventually crash.

Bug Fix:

  • The MakeTransform function now takes a default value for Scale from the FTransform struct. This fixed Python to initialize the unreal.Transform method with the expected default values.

  • Fixed mouse wrapping prematurely over RDP when clicking 10% away from screen edge.

  • Fixed an issue where Advanced Copy was not copying packages that weren't loaded into memory.

  • Fixed an issue where the camera would snap back after using SetLevelViewportCameraInfo and orbiting.

  • Opening the Save Layouts dialog no longer immediately renames the current layout to "Copy of ", leading to an ever-increasingly long name suggestion in the Save Layout dialog.

  • Fixed a crash due to unhandled cases in SGameFeatureStateWidget::GetDisplayNameOfState(...).

  • Fixed a crash when pasting an empty string, or a string with only newline separators, into a bulk property editor cell.

  • Booleans in EditCondition are now case insensitive.

  • Fixed improper filtering of object path names in AssetUtil::ExtractAssetDataFromDrag.

  • Fixed a bug that prevented the use of the Gamemode Override when calling GEditor > RequestPlaySession. The URL needs to contain the Unreal path for the game mode to be found.

  • Fixed a typo that prevented the bShowHiddenPropertiesWhilePlaying from being changed in the UI.

  • Fixed spline component to correctly compute zero bounds when the spline contains no points.

  • Selecting a spline point in one viewport now updates the other viewports in a multi-viewport layout.

  • Fixed an issue where a mouse click on "Pin Actor" in Scene Outliner entered FSlateThrottleManager's Responsive mode without ever leaving it. This is similar to SSceneOutlinerTreeRow::OnMouseButtonDown.

  • Addressed an issue where the camera velocity was reset when focusing on the camera editor. This fix prevents rubber banding.

  • Custom copy/paste actions now pulse the details row to indicate they were run.

  • Fixed an issue where StaticMesh Foliage would not appear in the Foliage Palette in a World Partition level.

  • Fixed an issue where StaticMesh Foliage Actors would not persist between saves on a World Partition level.

  • StaticMesh Foliage Type is now required to be an asset when working in a World Partition Level.

  • Fixed an issue where launching the Editor with -game would lead to a crash on levels using One File Per Actor.

  • Addressed an issue where Mesh Paint was not allowing vertex painting across all segments of a spline mesh component.

  • Fixed spline Alt-Drag to work correctly with large snapping values.

  • Fixed an issue with FBX Static Mesh reimport, so it now correctly recomputes the spline mesh component collision.

  • Added information to what failed when an edit condition cannot be parsed, indicating whether it was an issue with the type or the value.

  • Fixed an issue with spline Snap to Nearest to snap to the current spline as well as nearby splines and to only snap to valid and visible nearby splines.

  • Fixed vertex painting on Blueprint spline mesh component instances so the vertex data is no longer lost when the construction script is rerun.

  • Fixed an issue where an Ensure message could display in studio analytics during long slow task dialogs.

  • Added a LinearDeltaSensitivity metadata property tag to make it possible for Detail panel sliders without upper and lower bounds to not scrub exponentially.

  • The source control item in the Edit menu now dynamically changes between Connect to Source Control and Change Source Control Settings, depending on the current state of the connection to source control.

  • Fixed the regression where PIE sessions would have Lumen Visualization enabled by default.

  • When converting to FName in Python, there's a guard to verify the name will fit within NAME_SIZE.

  • Fixed the issue where the HighResShot console command would overwrite the file specified in the filename argument from a previous call because it didn't reset the reference when no parameter was given on a subsequent call.

  • Subcategory nodes now hide themselves if no children are visible.

  • Added a new function AddPendingLateJoinClient to fix an assert, if the experimental Late Join feature was bound to a key and the key pressed while in PIE.

  • Alembic import now stores all the import settings used at import so it can use them again on reimport.

  • Fixed the issue where shelved files from another branch were preventing FPerforceGetPendingChangelistsWorker from completing, causing the Changelist Window to refresh.

  • When you search in the Details panel, the Advanced subcategory will now be filtered out if there are no children to display.

  • Basic Python wrapped types now have the representation function repr, which was missing before.

  • Clicking a suggestion in the Engine Console auto-complete list now moves the caret to the end of the selected text, matching the behavior of pressing Tab to select the value.

  • RemoveLevelsFromWorld now checks if the GEditor->Trans pointer is valid before accessing.

  • Fixed the issue where the file history was truncated for moved files in Source Control.

  • Fixed an issue where SRichTextHyperlink was not triggering or navigating when clicked.

  • Fixed an issue where SRichTextHyperlink was not displaying correctly when clicking on the link, moving the mouse away from the link, and releasing the mouse. The link now appears underlined.

  • Fixed the Python plugin to allow resolving USTRUCT Make and Break functions specified with 'HasNativeMake' and 'HasNativeBreak' later. This supports cases where the Make or Break functions are implemented in a C++ module that is loaded after the module declaring the USTRUCT. The implementation postpones resolving missing functions until FCoreDelegates::OnPostEngineInit is invoked. If one or more functions are still missing, the corresponding error(s) are logged.

  • Fixed an issue where the current LOD would not display on static meshes in the Static Mesh Editor.

  • Fixed a crash in EditConditionParser when using an invalid enum or value.

  • Changed how lambda captures the Asset Editor toolkit name for conditional additions to the Asset menu.

  • We now refresh cached menus when the editor selection changes.

  • Fixed an issue where main frame notifications couldn't be dismissed if they were also set to time out, because the pointer would reset.

  • Removed code from the Python build scripts trying to detect if a user-specified SDK is 32-bit or 64-bit. Parsing the Python interpreter output could make the build fail.

  • Fixed source code navigation on Windows not working if "On Demand Symbols Loading" is enabled.

  • Fixed the Editor Python Executor to parse and escape quotes for -ExecutePythonScript command line parameters to allow quoting python arguments containing spaces.

  • Fixed an issue that prevented some options from functioning in an Asset Picker when it is embedded in a menu.

  • Prevented adding non-existing directories to Python 'sys.path'.

  • Fixed an issue causing duplicate buttons to show up for some properties in the Details Panel, such as the Row Struct property in the Data Table Details.

  • Fixed the Editor toolbar dropdown not closing when the user clicked in a non-client area, such as the one between the Help menu and the label showing the project and branch.

  • Fixed a memory leak each time we drag something in the Editor Viewport.

  • Fixed an issue where Preview Rendering Level change was not being applied to either editor-viewport or separate-window in-process PIE.

  • Added FSourceControlFilesDeletedDelegate. We now broadcast that revert or markfordelete operations could require cleanups, for example when packages, assets, or refs are deleted.

  • Fixed an issue where reverting Mark For Add on an asset was preventing you from recreating an asset with the same name in the same editor session. The asset was still present in AssetRegistry.

  • Fixed an issue with preview rendering levels where you couldn't change to a platform that had the same Feature Level as the running Editor.

  • Moved FocusAllViewportsToSelection to FEditorViewportCommands so that it doesn't trigger during PIE sessions.

  • Fixed a potential crash when AddObjectPropertyData was called during a customization.

  • Deprecated functions in the EditorScriptingUtilities plugin now correctly show the deprecation message in the Editor, which contains the location of the replacement functions.

  • Fixed a crash in the updated CurveTableEditor when adding curves.

  • Fixed an issue where Actors spawned with bHideFromSceneOutliner were still visible in the Scene Outliner.

  • Fixed the hit proxy gathering on asset editors that have no world.

  • Fixed saving high resolution Editor screenshots so they are saved as .png.

Content Browser

New:

  • Added support to the Content Browser for migrating selected assets and their dependencies that are inter-referential across content roots. Assets spread across content roots are migrated into the corresponding content root in the destination, if it exists. If any don't exist, we migrate the selection and dependencies to temporary packages into a folder that is migrated to the destination.

  • Updated class folders to use names friendly to plugins.

  • The Content Browser can now sync to levels and maps, making working with these assets a bit easier.

  • Float, Vector, and LinearColor Curve assets can now be imported from and exported to JSON. They also support the following hotfix syntax to hotfix the entire asset:

    • +CurveFloat=;CurveUpdate;""

    • +CurveVector=;CurveUpdate;""

    • +CurveLinearColor=;CurveUpdate;""

  • Asset names are now sorted in a way that handles all trailing numbers, including fully numeric names.

  • Made a slight increase to the Sources panel splitter size and Hit Detection handle in the Content Browser.

Material Editor

Bug Fix:

  • Fixed a typo in the RemapValueRange node for the Material Editor.

Media Framework

Bug Fix:

  • Fixed an issue when ExrImgMediaReaderGpu (ImageMedia) was falling back to default reader when the frame read was canceled, but still successful.

  • Fixed an issue with MediaTexture. There was no interpolation between mip levels for textures with mips generated externally to Media Framework, which created a hard aliased edge. Now there is filtering between mip levels when mip levels are provided from outside.

Scripting

New:

  • Added Get/SetNaniteSettings functions to StaticMeshEditorSubsystem.

  • Adding Get/SetLODGroup functions to StaticMeshEditorSubsystem.

  • Changed FMeshNaniteSettings to BlueprintType, and its members are now BlueprintReadWrite.

  • Plugins can now add third-party Python scripts within their Content/Python/Lib/site-packages and Content/Python/Lib/{Platform}/site-packages folders, and these will be automatically available for import within Unreal.

  • PythonScriptCommandlet now returns a non-zero value when the script execution fails.

  • Added the Python Foundation Packages Experimental Plugin. Python packages such as NumPy 1.20.3 and PyTorch 1.9.0 will be available in the Python environment when the plugin is enabled.

Static Mesh Editor

New:

  • Improvements were made to the Static Mesh Editor. The quality of 16 bit UV quantization is now rounded instead of truncated when converted from F32. In rare cases, this causes problems with old content, particularly when previous UVs were exported for baking textures. To allow toggling back to the old UV quantization, a new option was added in FMeshBuildSettings called bUseBackwardsCompatibleF16TruncUVs. In the Editor, this option is called "Lower-Quality UVs (UE4 Compatibility Mode)". This is set automatically from the mesh version, so seldom needs to be set manually.

  • The Static Mesh Editor now has the default ModeUILayer tab appear along with the existing docked extension tabs.

Bug Fix:

  • Fixed a crash in the Static Mesh Editor when setting a custom complex collision mesh and trying to select it.

Gameplay Framework

New:

  • Overhauled the Blueprint Debugger by adding rich tooltips to pins when stopping at a breakpoint, and expanded functionality in the Blueprint Debugger tab.

  • Exposed a method to set the Character's CrouchedHalfHeight variable to Blueprints.

  • Added a new Blueprint editor workflow setting to provide the user the choice on how to restore breakpoints when the Blueprint asset is reloaded.

  • Changed the default behavior of the CheatManager so it is completely disabled in Shipping builds. Test builds will now work like the Development build where it can be enabled in multiplayer with the EnableCheats command.

  • Added a PinSelectorFilter to provide users the capability to customize Blueprint pin filtering.

  • Added support for input bindings in components. You can now place Input Action and Input Axis mapping event nodes in components.

  • Implemented a Key parameter for PrintString and PrintText nodes.

  • Added new delegates to the GameViewportClient that allow overriding key and axis input before it is routed to the player controller. This can be used for things like console "Press Start" screens.

  • Increased the default value for the NetPackedMovementMaxBits variable from 2048 to 4096.

  • Implemented Kismet Library utilities for reading an entire Render Target at once.

  • Blueprints can now be associated with a namespace identifier(MyProject.MySubArea). When set, this will exclude it from being loaded in the next editor session by another Blueprint editor context that does not share or otherwise import the same namespace. This feature is experimental.

  • Added a note to Enhanced Input event nodes when an exec pin is connected to an action that will not fire. InputTriggers can override this method to provide their own bitmask of supported types.

  • Support for doubles and int64 types in the Format Text node have been added.

  • Exposed the AffectedByTimeDilation boolean in the InputTriggerTimedBase class to the Input Action editor.

  • Added a ToString method for Input Action Values.

  • Full Parent Names will now display in the Class Settings panel in the Blueprint Editor.

  • Exposed the bForceRebuildImmediately variable to both the AddMappingContext and RemoveMappingContext. This provides users a method to force a rebuild of the control mappings within the same frame of changing their context.

  • Improved the tooltip on the Execution pins of the Enhanced Input action event nodes to give more detail about when to use which pin.

  • Game feature plugins can now modify the gameplay cue paths on the GameplayCueManager.

  • All subobject editor icons are now white. The previous icon colors of green and blue have been removed.

  • Added FindRelativeLookAtRotation function to Kismet Math Library.

  • Added setters for default classes in the InputSettings.

  • Implemented the ability to double click an input action node and have it open the corresponding input action asset.

  • Support to replicate loose gameplay tags and an ability's Activation Owned Tags has been added in the Gameplay Ability System.

  • Games can now specify which Blueprint classes can be edited while playing in the editor. BaseClassesToAllowRecompilingDuringPlayInEditor is an option in both the Blueprint Project Settings for project wide allowances, and Blueprint Editor Preferences for local changes.

  • Blueprint interfaces now use Blueprintable/NotBlueprintable to determine if they can be implemented in Blueprints to match how classes work. CannotImplementInterfaceInBlueprint will still work and is treated like NotBlueprintable.

  • Gameplay Abilities: Exposed a helper method GetGameplayEffectUIData to get the UIData from a gameplay effect class.

  • Exposed GetBuildVersion and GetBuildConfiguration to Blueprints.

  • Added an explicit context to game feature activate/deactivate that allows restricting to a specific world instance. This means that game feature actions can be used correctly by game-specific systems while in Play in Editor.

  • Fixed data loss with Data Registry Ids that point to invalid registries. They will now keep their data but display a warning in the editor.

  • Added support for Niagara camera lens effects to gameplay cue notifies.

  • Re-ordered the message log tokens in Blueprint runtime errors so the most relevant token(node) is displayed first instead of last.

  • Changed the Async Load Primary Asset Blueprint nodes to return all requested and loaded assets instead of only newly loaded ones.

  • Added a PreCreatePIEInstances as a PIE lifecycle event on the editor engine.

  • Added the End Ability Locally function to gameplay ability, this is needed for predicted abilities with animations where you don't want the server ability to end early and miss a callback.

  • Added a display of expected units (cm/s or cm) to various properties in the CharacterMovementComponent class,

  • Added a new version of the PreLoadMap delegate called PreLoadMapWithContext that provides the associated world context for the load map request. This allows registrants to disambiguate which game instance is involved in multiplayer Play In Editor.

  • The target Actor for Add Component game feature actions can now be an abstract class.

  • Added a game feature plugin template that contains a runtime C++ module.

  • The controls for switching Game Feature states now have tooltips about the nature of each state.

  • Changed the LastMovementServerBase pointer on the Character Movement Component to a weak object pointer in case the component gets deleted.

  • Return value pins on async task nodes now attempt to pull tooltips from the underlying delegate declaration providing better user-facing information to be surfaced.

  • Get Subsystem nodes now pull the tooltip from the class declaration of the underlying subsystem.

  • Changed Blueprint functions to behave like the GetPlayerController function, to use a stable index where 0 is always the first local player controller. This stays consistent during map transfers.

  • Most core types (FVector/FMatrix/FQuat, and so on) now support both float and double variants, but will default to double. This enables enhanced precision for Actor placement/orientation, as well as increased world sizes.

  • Added an OnPawnChanged event to PlayerState class.

  • Added an OpenCV helper Blueprint Function Library which adds convenience nodes for ArUco marker tracking and camera calibration chessboard detection.

  • Added the following macros PRAGMA_FORCE_UNSAFE_TYPECAST_WARNINGS, PRAGMA_DISABLE_UNSAFE_TYPECAST_WARNING, PRAGMA_RESTORE_UNSAFE_TYPECAST_WARNINGS to permit control of truncation and narrowing warning state within code blocks that assist with identifying potential Large World precision issues.

  • Made Conversion casts between float and double core type variants explicit.

  • Input Delegate Support inside of Widget Blueprints. This provides users capability to place the normal "Input Action" and "Input Axis" event nodes in a widget and they will behave as they would in an Actor as long as there is an owning Player controller.

  • Improved the state tracking of which keys are Triggered in enhanced input.

  • Added an EnableLargeWorlds boolean variable to the World Settings class for wrapping disabling bounds checks, octree visibility, and octree shadow culling. This can be used for preliminary Large Worlds testing.

Improvement:

  • Reflected references are automatically updated when instances are replaced. UMG widgets with existing instances do not work by default, however games can hook a delegate to recreate their user interface in order to enable support.

  • Improved the error message about duplicate world settings by printing the full path of the Actor and persistent level that has the issue.

  • Better support has been added for different world modes in the Add Components action for creating both client and server components in standalone.

Crash Fix:

  • Fixed a reference replacement oversight during object consolidation to a duplicated Blueprint asset that could lead to an editor crash in some situations.

  • Fixed a crash after choosing to find and replace all node references to a member variable in the Blueprint editor.

  • Fixed a crash when adding an input context that contained a null action mapping.

  • Fixed a crash when pasting a local variable get node in the event graph of a child blueprint.

  • Fixed a crash when pasting a local variable get node from the parent Blueprint into the child Blueprint's event graph.

  • Fixed a crash when activating a non-instanced ability that attempts to call instanced-only functions.

  • Guarded a potential crash in the GetAbilityLevel method from the Gameplay Ability class if the Ability System Component pointed to an Actor whose info has been destroyed.

  • Prevented a crash on shutdown that occurred if the UObject system had already been removed by the time the game features editor shut down.

Bug Fix:

  • Added the AbilitySystemGameFeatureActions plugin, and moved the GameFeatureAction_AddAttributeDefaults class into it from the GameFeatures plugin.

  • Added a space between arguments when parsing multi-axis console commands to correctly parse when initializing from a string in the EnhancedInput class.

  • Fixed propagation to instances when modifying the query in a parent object of a GameplayTagQuery.

  • Fixed the GetClassDefaults Node discarding ShowPins settings during compilation if connected to a reroute node.

  • Added a fix to account for indirect dependencies from a macro graph expansion which could otherwise lead to a script VM crash during PIE.

  • Refreshed user-defined structure editor data on save/compile to ensure default object reference values stay in sync with default structure instance data.

  • Fixed issue where looping gameplay cue notifies were incorrectly flagged as having active effects.

  • Fixed a few destructor typos that attempted to unregister handlers from the wrong delegate interface on editor shutdown.

  • Fixed a regression that incorrectly restricted the Outer input pin on ConstructObjectFromClass nodes to self class subtypes.

  • Fixed an issue resulting in an invalid graph when Promoting a Collapsed Node to Function/Macro is undone.

  • The const Blueprint function attribute is now kept in sync on function overrides when inherited from a parent class.

  • Fixed an uninitialized variable leading to a broken toggle UI on Mac/Linux editor targets.

  • Marked macros being pasted into Macro Libraries as public.

  • Fixed a bug where Blueprint nodes with gameplay attribute pins would not respect redirectors.

  • Fixed an invalid Blueprint compiler warning for generated Blueprint assets that were not otherwise loaded.

  • Marked the enhanced input console commands as ECVF_Cheat to prevent them from being added to any shipping builds.

  • Improved Blueprint thread safety checks.

  • Variable categories in the My Blueprint tab are now properly sorted.

  • Added function metadata that provides users capability to exclude functions from type promotion.

  • Fixed a minor bit packing issue in the generated Blueprint class structure.

  • The real time delta seconds of the world will now be tracked to use as a backup if Time Dilation on the player controller is set to 0. This ensures that timed triggers are still calculated correctly even with time dilation at 0.

  • Fixed an issue where repeated ability-driven montages could fail to be fully replicated on simulated proxies.

  • Prevented memory corruption when appending an array.

  • Added a flag to ignore EnhancedActionKeyMapping's if the Key was down during a rebuild of the Player Control Mappings.

  • Added Check if an ActorComponent is replicated to show an icon in Blueprint.

  • Check if AttachParent is valid when receiving AttachSocketName before updating the attachment.

  • Fixed several issues with Play In Editor with multiplayer games, it now correctly handles URL options like a listen server does across map transitions and the world net mode will be accurate to the current condition instead of the initially launched mode.

  • Fixed several issues with using interface types in blueprints for casting or constructing objects.

  • Prevented a spurious log error when editing CanReferenceTheseDomains in Asset Referencing Policy settings.

  • Fixed the GetDebugDisplayName method from the World class to work properly outside of the scope of 'play in editor' ticking.

  • Improved logging quality in the RawInput class and fixed expected behaviors such as disconnected devices or query results to be logs instead of warnings

  • Changed the user facing display name for GameFeaturesManagerClassName to "Game Feature Project Policy Class".

  • Fixed an issue that prevented certain state transitions in the Game Features editor from working.

  • GetAssetUserDataArray is now implemented for the WorldSettings class.

  • The PlayerController class will now never return a null view target.

  • Editor Only child Actors are no longer implicitly transient.

  • Added an assert to make errors when replicating an attribute set on an improperly set up ability system component more explicit instead of causing an access violation.

  • Prevented self-assignment of Child Actor Components in Blueprint classes.

  • Added detection and repair process for maps that became corrupted with multiple Level Script Actors.

  • Fixed an incorrect doc-comment for the AddFunctionGraph function.

  • Fixed an issue where the Blueprint class default values were not initially propagating to the child classes if created by promotion to a variable.

  • Fixed a bug where additive root motion's influence would be cut in half if applied while falling.

  • Fixed a mouse wheel scroll up and down by manually setting the value of boolean keys that are pressed and released within the same frame.

  • Blueprint-added component archetypes will no longer fail to load when the underlying class type has a non-default ClassWithin value.

  • Fixed an editor access violation crash caused by a reference to a stale property wrapper object.

  • Fixed a failure to regenerate function signatures referenced by call sites after renaming input/output pins on function graph entry/result nodes.

  • Fixed missing import warning on next editor load after renaming a macro in a Blueprint macro library.

  • Ensure that Blueprint graph nodes are always fixed on load as part of the precompile phase, including for fast paths (data-only Blueprints).

  • Blueprints can no longer bind to gesture keys if it is not enabled in the settings. To change this enable the gesture setting in the project settings or delete the problematic node.

Deprecated:

  • Deprecated old input scales on the player controller (InputYawScale, InputPitchScale, and InputRollScale).

  • Deprecated the UDynamicClass API and removed all special-case code paths for dynamic types.

  • Deprecated the Always host global Blueprint searches originating from the Blueprint editor's "Find Results" tab in a global tab window.

  • UHT no longer generates the PPO_ accessors that previously used to allow nativized Blueprints to bypass C++ protection levels as Blueprints have different semantics for private and protected.

  • KismetMathLibrary Deprecated MinimumAreaRectangle function, which effectively returns the average of all input points as the rectangle center, and introduced MinAreaRectangle function that returns the proper minimum area rectangle around the input points.

Removed:

  • Removed the creation of transient TRASHSTRUCT objects as they are no longer required by user-defined struct precompilation in the editor context.

  • Removed underlying framework and support for the Blueprint nativization feature and all related code modules from the engine.

Geometry

New:

  • Updated the Path Extrude tool to let users choose how to set poly groups on the offset top mesh.

  • The Path Extrude tool can now enable Ramp extrude modes for closed paths.

  • Users of the Path Extrude tool can now enable snap to grid (distance) during width specification.

  • Updated the Path Extrude tool to enable optional rounded corners. This replaces polygon corners with circular arcs. Users can set the desired uniform arc radius.

  • Added a Convex Hull mesh generator option to the AutoLOD tool.

  • Added the ability to add an overlay widget to the viewport.

  • Added a ModeUILayer member to handle mode toolkit hosting StaticMeshEditorModeling.

  • Created a mode and toolkit with AutoLOD and LODManager tools.

  • Added a button to the StaticMeshEditor's toolbar to toggle UMeshLODPluginEditMode.

  • Updated tools to use UnsetTriangle instead of SetTriangle if we know an overlay triangle is invalid. Avoids a checkSlow in SetTriangle.

  • Added the ability to draw unset UV triangles in the Mesh Inspector tool.

  • The Lattice tool no longer allows constrained lattice vertices to be moved, even when not in Soft Deformation mode.

  • When adding a new attribute, or undoing the deletion of an attribute, sets the selected attribute in the UI to the name of the new attribute in the Attribute Editor tool.

  • Added support for open curves in PolygonEdgeMeshGenerator to the Path Extrude tool.

  • Added temporary AActor members to contain UDynamicMeshComponents used as preview meshes in some tools.

  • Updated the Path Revolve tool so when the next click would finish the path, highlights the path in yellow to let the user know.

  • Added output type properties to Boundary Revolve tool.

  • Users can now optionally create new polygroups for refined output faces in the Subdivide tool.

  • Modeling Tools no longer snap the transform gizmo on mouse-down. Now waits for the drag event.

  • Added support for Custom Primitive Data to ProceduralMeshComponents.

  • Added support for Custom Primitive Data to DynamicMeshComponents

  • Updated the Subdivide tool to interpolate Material IDs from input mesh to subdivided mesh.

  • Added Mesh Inspector tool to Static Mesh Editor's modeling tools.

  • Warns the user that new assets might be created when AutoLOD is launched from the Static Mesh Editor.

Improvement:

  • Added AutoLOD tools to the Static Mesh Editor.

  • Shared ownership of StaticMeshViewportClient's ModeTools via the EditorModeManager member.

  • Set up the EditorModeManager's preview scene and selected components when it's copied.

  • Add a set of FStaticMeshEditorToolbarExtender delegates to the module (similar to FSkeletalMeshEditorToolbarExtender).

  • Refactored the Path Extrude tool. Moved FPolygonEdgeMeshGenerator to its own file with other mesh generators.

  • Refactored the Path Extrude tool and replaced planar UVs in the Polygon Edge Mesh generator with a UV strip that follows the input polygon edges.

  • Refactored the Path Extrude tool and removed hacky UV generation for closed-loop ramp case.

  • Refactored the Path Extrude tool and merged two extrude functions into one.

  • Refactored the Path Extrude tool and removed a function of all dead code.

Bug Fix:

  • Fixed a crash when adding a new key/value pair and were using sparse map type in FOptionallySparseIndexMap.

  • Fixed gizmo not appearing in the Lattice tool after lattice vertices are selected.

  • Fixed an ensure when a polygon self-intersection passes exactly through a vertex with the PolyExtrude tool.

  • Fixed the width mode always snapping to world grid, even when grid snapping is turned off in the PolyExtrude tool.

  • When using the Mirror tool, closing a dialog that asks the user if they want to delete a mesh component does the same thing as hitting No.

  • enabled SubdividePoly to handle input mesh with no UV attribute in MeshModeling.

  • Fixed a crash when undoing and then redoing the creation of multiple Brush actors.

  • Enabled snapping to world grid when laying out the path in Path Extrude.

  • When using the Lattice tool, clear any existing deformer constraints when the lattice resolution changes.

  • Allowed for an overlay element to not be incident on any overlay triangles but still have a reference count of one.

  • Maintain UV islands when subdividing with the Subdivision tool.

  • Update the visible attribute lists when undoing/redoing adding and deleting attributes with the Mesh Attribute Editor.

  • If a ToolTarget's MeshComponent has no MeshDescription, return an empty but valid one. Harden various tools to not crash on empty meshes.

  • The Path Extrude Tool now supports a single-segment path.

  • Fixed calling OnRemoveTriangle when it should have been OnRemoveVertex.

  • If a UDynamicMeshComponent's Mesh has no attributes, have GetAutoCalculatedTangents just return nullptr. Otherwise it will return whatever stale data is in AutoCalculatedTangents.

  • Prevents a dragged gizmo from detaching from lattice points when snapping is enabled in the Lattice tool. Control points were not being transformed if the gizmo returned to its exact (pre-drag) starting position. This became apparent with snapping when the gizmo did not smoothly return to its starting position.

  • When trying to modify a built-in editor asset, pop up a notification window rather than display in the viewport

  • Fixed gizmos not being selectable after placing a new mesh in the level.

  • Fixed an ensure in the Dynamic Sculpt tool by allowing the initialize remesher async tasks to finish at the end of each tick.

  • Fixed Volumes not updating player collision model when brush shape is modified or when undoing/redoing brush shape modifications.

  • Set a max lattice resolution for each dimension in the Lattice Deformer.

  • Fixed issue with Enter key not closing the polygon in the BSP Pen Tool.

  • Fixed FPoly::OptimizeIntoConvexPolys creating polygons that fail coplanar check in FPoly::IsCoplanar

Learning Resources

Content Examples

Bug Fix:

  • Fixed a bug in the POM (Parallax Occlusion Mapping) content examples where the POM material function was not casting self shadows.

Documentation

New:

  • Updated documentation links/parsing to include versioning.

Localization

New:

  • Added support for custom FText::AsDateTime formatting patterns

  • FText shared display strings are no longer required to be unique. Deprecated their public access.

    • Added FTextInspector::GetSharedDataId for when you want an opaque key for a unique text instance.

    • Deprecated FTextInspector::GetSharedDisplayString and changed it to return FTextDisplayStringPtr.

    • Deprecated the FStringTableRegistry::FindTableIdAndKey overload that takes an FText, in favor of using FTextInspector::GetTableIdAndKey.

    • Removed the FStringTableRegistry::FindTableIdAndKey overload that took a FTextDisplayStringRef.

    • Removed the DisplayStringsToKeys LUT from FStringTable. The FStringTable::FindKey overload that takes an FStringTableEntryConstRef is now non-accelerated, but also not called from anywhere.

    • Removed the FStringTable::FindKey overload that took a FTextDisplayStringRef.

    • Renamed GetLocalRevisionForDisplayString and DirtyLocalRevisionForDisplayString to GetLocalRevisionForTextId and DirtyLocalRevisionForTextId in FTextLocalizationManager, and updated LocalTextRevisions to key against FTextId rather than FTextDisplayStringRef.

    • Fixed some const-correctness in FTextLocalizationManager.

  • FText is no longer required to have (or be able to have) a shared display string.

    • Removed FTextHistory::SerializeForDisplayString. This data is now handled directly by FTextHistory::Serialize, with FTextHistory::UpdateDisplayString resolving the display string when needed.

    • Added FTextHistory_Generated to provide the common functionality for generated text histories that need to re-build a local display string.

    • Added FTextSnapshot::LocalizedStringPtr to detect if the localized string changed within a history.

    • Updated FStringTable to use FTextKey rather than FString for text namespace and keys.

  • FTextLocalizationManager::FindDisplayString and FTextLocalizationManager::GetDisplayString now return immutable shared display strings.

  • FTextLocalizationManager can now preserve the de-duplicated display string data loaded from a LocRes.

    • Made FDisplayStringEntry::DisplayString const, as shared display strings cannot be mutated.

    • Updated FTextLocalizationResource to preserve its de-duplicated display string data, to be applied within FTextLocalizationManager.

    • Leetification (for debug) now makes unique display string instances (as it cannot modify the shared display string).

    • Removed FDisplayStringEntry::bIsLocalized as it was inconsistently set, and ultimately not significantly used.

Bug Fix:

  • Text localization manager no longer returns explicitly excluded cultures from list of available cultures.

  • Consider all properties within an editor-only class to be editor-only when gathering localization

Mobile

New:

  • Mobile builds now exclude engine post-process calibration materials and textures.

Bug Fix:

  • Group read/write on created files on Android are now allowed.

  • Fixed handling comments after the section name in .ini files for UnrealPluginLanguage.

Removed:

  • Removed scene software occlusion. UE5's minimum specs require a device with hardware occlusion queries, which are more efficient than software occlusion.

Android

New:

  • Added the FGenericPlatformMisc::ShowConsoleWindow function as a way to toggle the console on the Android mobile platform.

  • Enabled cached OS page allocator on Android when using MallocBinned2. This reduces the overall amount of Virtual Memory Areas used by the process as they are limited to 65536, and games that use a lot of memory can go over that limit.

  • Added experimental support for NDK 22+.

  • Option to select build-tools version in Android project settings.

Improvement:

  • Increased stability of stack walking code during crashes on Android.

Bug Fix:

  • Android EGL now binds newly created shared surface on game thread after resume.

  • Added protection against null on failure response from Google Play IAP.

  • Fixed OptimizeForSize compile environment option for Android targets. Previously it was always overridden with -O3.

  • Fixed DeviceProfile fragment cvar lookups.

  • Removed patching of cpu-features.c now that ARMv7 is no longer supported.

  • Properly filter out all 32-bit Android includes and libraries.

  • Fixed a check for fallback location SetupAndroid.bat.

  • Fixed issue which caused resizableActivity not to appear in manifest.

  • Changed display of OpenGL 3.1 support to 3.2 for Android project settings.

  • Fixed hlslcc depth fetch support on Android devices not supporting GL_ARM_shader_framebuffer_fetch_depth_stencil.

  • Added a fix for uploading Android 12 shipping builds.

  • Fixed Android x86_64 linking for BinkAudioDecoder.

  • Fixed issues preventing Android ASan builds from working correctly.

  • Does not select unsupported build-tools versions installed. Now checks against min and max version numbers.

  • Fixed incorrect Adreno version checks in Android media players and camera plugin.

  • Added fallbacks for missing commands on older Android, did timing adjustments for StartServer.

  • Added missing OpenXR xml file to binary builds.

  • Fall back to netstat if ss utility is present but not showing connections during StartServer for Android File Server.

  • Added server failure reasons to logging and increased the number of retries on StartServer for AndroidFileServer.

  • Fixed issue with losing Android force feedback due to OpenXR and OculusVR plugins.

  • Fixed handling of AndroidFileServer startup checks where the receiver may not be ready immediately after install.

iOS

New:

  • Refactored iOS Icons to create the asset catalog according to the present file.

  • Set a new default shader for Apple platforms and IOS 15 support.

  • Added ios 15 / tvos 15 target and Metal 2.4 flag.

  • iOS icons will auto-generate from the Marketing Icon.

  • tvOS asset catalog support has been added in Unreal Editor.

  • Display the trust popup on iOS and tvOS when using an untrusted device.

  • Added support for the Device Output Window log and console command sending on iOS using libimobiledevice.

  • Made the iOS dSYM generation checkbox descriptions clearer

  • Added four iPhone 13 models and twelve iPad models to device profiles.

  • Fixed deprecation warning in iOS location services.

  • Updated IOS and tvOS assets to UE5 logo and font.

  • Removed perspective-correct shadow depth shader permutation when it is not required on mobile platforms.

CL: 17921199

  • Remove NoLightMap shader permutation for materials that are not using it on mobile platforms.

CL: 17591802

  • Added a project option to disable support for per-pixel material shading models on mobile platforms (r.Mobile.AllowPerPixelShadingModels=0).

CL: 17403931

  • Set FXAA quality to 0 on mobile platforms by default.

CL: 17348846

  • Reflection capture now accounts for reflection capture influence radius when finding closest capture for an object. Fallback to skylight reflection when there are no influencing reflection captures on mobile platforms.

CL: 17093848

  • Added an efficient mobile-specific implementation for auto-instancing and GPU instance culling. Supported on iOS and Android devices. To enable add r.Mobile.SupportGPUScene=1 into DefaultEngine.ini.

CL: 16921709

Improvement:

  • Both OpenGL ES and Vulkan are now enabled by default when packaging Android, and Vulkan will be used on the following devices:

    • Adreno 6xx and 7xx-based devices running Android 9 or later

    • Mali-G72 devices running Android 10 or later, or any Mali-G76, G77, G78 or G710-based device.

    • PowerVR GM9xx-based devices

    • Xclipse 920-based devices

CL: 19089743

Crash Fix:

  • Fixed a crash when disconnecting / reconnecting a bluetooth controller outside of the app.

  • Fixed crash on mobile while rendering custom depth primitives that require scene texture access.

Platforms - iOS

CL: 18581533

Bug Fix:

  • Fixed idevicefs pull call in iPhone Packager.

  • Release the viewcontroller holding the splashcreen storyboard when it's no longer displayed.

  • Removed default brightness and reset brightness on iOS.

  • Fixed iOS Location Usage Description.

  • Fixed enum warning in ios settings.

  • Fixed linker error for IOS Shipping builds when there are spaces in the project path

  • The Windows remote iOS toolchain now removes the old SSH key directory before generating a new SSH key, to fix up any incorrect directory permissions

  • Fixed r.MobileContentScaleFactor being ignored and always defaulting to 1 on iOS.

  • When packaging an iOS app on BigSur/Catalina, it is unable to be installed on an iOS15 device. This fix now sets the "--generate-entitlement-der" flag for 'codesign'.

  • Removed iOS 13 from plist to enforce minimum supported version of iOS 14.

Rendering - Mobile Rendering

CL: 19110691

  • Fixed rendering artifacts on some Qualcomm devices with Android 12.

CL: 18689185

  • PerlinNoise3D texture now correctly initializes on mobile platforms.

CL: 18104390

  • Fixed issues with texture mip generation at runtime on Android devices running Vulkan

CL: 17961893

  • Added access to CustomDepth and CustomStencil textures in a decal materials for mobile platforms.

CL: 17113348

  • Previously, FPlatformMemoryStats.AvailableVirtual was always zero on iOS. This has been resolved by setting it to the same value as AvailablePhysical.

Platform - Mobile - iOS

CL: 19153534

  • Fixed iPhone device names with apostrophes appearing as ???? in Unreal Editor on the Mac.

CL: 19092069

  • Fixed issue where fatal iOS errors were not being written to the log file.

CL: 19237934

  • Fixed problems with iPhonePackager downloading log files from devices with Unicode-character device names.

Platform - Mobile - tvOS

CL: 19284387

  • On tvOS log files are created in /Library/Caches, as /Documents is not avaialble on this platform.

Rendering - Mobile Rendering

CL: 19243809

  • Previously, CSM shadows were broken when Support Static Lighting is enabled but a level's World Settings have Force No Precomputed Lighting checked. This issue has been resolved, and CSM shadows will function normally with these settings.

Deprecated:

  • Removed instruments when launching iPhone apps. Instead, the launcher will use idevicedebug.

Removed:

  • Deleted iOS devices that don't support iOS 14+ from iOS device profiles.

Networking

New:

  • Added an option to let connections force all properties to be dirty on initial replication.

  • Added notification paths to other active net drivers of important Actor replication changes.

  • Added Actor flags to make PreReplication and PreReplicationForReplay functions optional.

  • Removed net.UseAdaptiveNetUpdateFrequency=0 from ConsoleVariables.ini file.

  • Added a compare/assign and mark dirty macro (COMPARE_ASSIGN_AND_MARK_PROPERTY_DIRTY) to the push model. This is defined in the #else so it will compile on the client.

  • Support for NetSerialization of a FInterfaceProperty.

  • Added additional CSV file stats/scopes for replication.

  • Added the number of active game driver clients to the engine crash context data.

  • Changed the SetReplicates method in the Actor class to avoid redundant work.

  • Added push model support to the base conversation component.

  • Increased the IPv4 private address space to include 172.16.x.x - 172.31.x.x.

  • Added support for push model dirty tracking to fast arrays.

  • Renamed command line options -DisableHttpWhitelist and -EnableHttpWhitelist to -DisableHttpDomainRestrictions and -EnableHttpDomainRestrictions.

  • Added a Switch Has Authority macro node for Blueprints derived from Actor component.

  • Renamed APlayerState::Ping and associated functions to CompressedPing, and introduced a new getter GetPingInMilliseconds that returns the accurate ping if it is available, or the decompressed replicated ping if not.

  • Added Net Fault Recovery to NetConnection to recover from non-fatal connection faults, and provide detailed analytics/logging for serverside and clientside connection errors.

Crash Fix:

  • Fixed a shutdown crash in the default voice engine implementation.

  • Fixed a crash when forcing a network update during shutdown.

  • Fixed a crash by resetting the NetPushId of an object when the object has no net driver state.

  • Fixed possible crashes from message construction using operator new by using FMessageEndpoint::MakeMessage() instead

  • Fixed a crash initializing object replicator state when the archetype is missing.

  • Fixed misleading unhandled socket error and subsequent crash by calling GetLastError before calling any other function that can clobber the error code that GetLastError returns.

Bug Fix:

  • Added net.ResetAckStatePostSeamlessTravel CVar to reset the package map's AckState on the server after seamless travel. Enabling this may prevent problems with Actors not replicating after travel due to clients missing entries in the NetGUID cache.

  • Fixed instances of missing push model dirty calls in scene components.

  • Moved the call to FlushNetDormancy earlier when removing active gameplay effects. This prevents issues where changes to ActiveGameplayEffects aren't tracked properly on dormant actors.

  • Fixed Fast Array bug where changing values after they are replicated in a single frame can cause them never to send.

  • Fixed an issue where replicated objects with only fastarrays or custom delta replicated properties would be tagged as having no replicated members and thus never replicate

Deprecated:

  • Deprecated InstancePreReplication on Blueprint-generated classes since it was not being used.

  • Deprecated FRepChangedParent in favor of a smaller bit array.

Replays

New:

  • Changed tracking of deleted startup Actors to avoid unnecessary uniqueness checks.

  • Added a new engine net version to support old replays. Fixed for net serialization compatibility issue.

  • Added the ability to set per object external data through the replay subsystem.

  • Allow replays to record unicast RPCs on Actors with the appropriate net driver name.

  • Added Blueprint accessibility to several replay subsystem functions.

  • Added a delegate for overriding the replay compatibility version check..

  • Added support for checkpoint-deleted Actor serialization to be split over multiple frames.

  • Added a way to request a checkpoint to be recorded immediately.

Bug Fix:

  • Fixed multiple compatibility issues that prevented Actor channels from being cleaned up during playback.

  • Fixed a crash that could occur when remapping playback channels.

  • Fixed a replay playback compatibility issue when an actor component class is missing.

  • Fixed a case where duplicate child actors would be spawned on replay scrub.

  • Fixed a rare scrubbing crash with delta checkpoints enabled.

  • Fixed non-replicated child actors not being cleaned up by their parents.

  • Fixed an issue with respawned startup actors having the wrong role during BeginPlay.

  • Fixed a case where dynamic actors flagged as replay rewindable might not be cleaned up properly after scrubbing.

Replication Graph

New:

  • Added CVar Net.RepGraph.GridSpatialization2DDestroyDormantDynamicActorsDefault to allow Grid2D Replication Graph nodes to specify the default value of the DestroyDormantDynamicActor boolean.

Bug Fix:

  • Fixed dynamically spawned, initially dormant actors not replicating after the first dormancy flush.

  • Added a check to prevent connections from other drivers from being added to the graph.

  • Fixed a case where the graph could open duplicate channels for actors that persisted through a seamless travel.

  • Fixed multiple issues with dormant destruction info processing.

  • Added ensures in ReplicationGraph to detect when a PlayerController will open a channel to a non-owner connection.

  • Fixed GridSpatialization2D nodes in ReplicationGraph not clearing pending actors list on graph reset/level load.

Deprecated:

  • Deprecated the PrevDormantActorList as it doesn't support multiple grids, The logic no longer processes dormant Actors for one grid on another grid when you have multiple grids for a connection. To upgrade you'll need to call ConnectionManager::GetPrevDormantActorListForNode to get your PrevDormantActorList and then modify the reference.

Socket Subsystem

New:

  • Replace/remove uses of whitelist/blacklist in WebSockets.

Niagara

New:

  • Added a new experimental renderer type called Geometry Cache Renderer.

  • Added a new static switch constant for interpolated spawning.

  • Added a new data interface plugin called Example Custom DataInterface. This data interface contains C++ example content that shows how to write your own custom data interface for Niagara. This plugin can be found in Engine/Plugins/FX/ExampleCustomDataInterface

  • There is now a default mode for all new parameters, which is set to "Fail if Unset".

    • See related CL: 17637669: Severity of messages for parameters with default mode "Fail if Unset" can be set via new CVar "Fx.Niagara.FailIfNotSetSeverity".

  • Added a cvar fx.Niagara.DeletePythonFilesOnError to prevent intermediate python scripts from being deleted in case of a version upgrade error.

  • Cascade was updated to support Large World Coordinates. CPU simulations are run with full double precision vectors. GPU simulations use a tile offset to translate world space emitter positions to float precision vectors.

  • Added function scripts to convert between RGB and HSV colors.

  • Added support for dynamic inputs to auto-convert types when dragging parameters in the stack.

  • Added a flag to the audio data interface to turn off audio when not in PIE.

  • Prevent Niagara compilations from accumulating, so there can be at most one pending compile request.

  • Changed derived data requests for compilation to be asynchronous. Also fixed a bug where FNiagaraEditorModule::OnPreExit would crash when trying to complete the compilation.

  • Added support for systems with a fixed tick delta.

  • Added HLSL syntax highlighting for custom HLSL nodes and the generated code view. Also added tab support to custom HLSL nodes.

  • Removed the Highlights feature from the System Overview. It was adding visual noise without having the intended benefit.

  • Groups can now be collapsed in the System Overview.

  • Scratch Pad modules now have a scratch pad icon in the System Overview.

  • The expansion state of the stack in the System Overview is now persistent.

  • Selected parameters can now be configured to show up in module rows in the System Overview. Parameters will show up either as a text-based button or an image-based button. This is configured in scripts via property metadata. Clicking one of the inline parameters will immediately highlight the represented parameter in the stack.

  • Added Category functionality to Niagara systems, to be able to filter the parameters in emitters.

  • Added copy paste for parameter metadata in Niagara scripts. A notification widget will inform the user if there is a duplicate parameter in the destination graph, and will skip copying the metadata. If the source and the destination graph are the same, the metadata paste will be skipped completely.

  • Removed CPU access warning for camera data interfaces as they are no longer valid.

  • Niagara viewport settings are now persistent. "Particles count" is now turned off by default.

  • Niagara's Mesh Renderer now adds its mesh batches to GPU Scene. These instances can be frustum and occlusion culled by the GPU Scene instance culling system. GPU Scene can also use this data to render the meshes in Virtual Shadow Map passes.

  • All GPU stages are now simulation stages. The intrinsic particle stage is now just another simulation stage that can be enabled or not. Iteration count is now dynamic and can be bound to a user variable. Simulation stages can be enabled or disabled dynamically by a user variable.

    • A random seed parameter has been added to system instances. This creates the potential for randomness in System scripts.

  • Created a new data interface for reading properties from UObjects. This allows parameters to be automatically pulled from objects, instead of using Blueprints to pull data manually per frame. A source actor, or an explicit object user parameter binding can be read into the data interface. If the object is an actor, the data interface will look at the root component, or for an component of type 'source actor component class' to bind properties to.

    • Added the ability to iterate over a subset of particles in a simulation stage.

  • Added a setting to allow sprites to maintain a one pixel coverage while applying a coverage 'fade'. The renderer can opt into this automatically, or manually. Currently, the setting only covers translucent and additive when set to automatic. The project can also set whether to opt in or out of this feature when in automatic mode.

  • Changed the system determinism default to false, which matches the default for emitters. Fixed CalculateRandomRange not using system seed information.

  • Added SceneCapture as an option to pull data from the baker. Set the default to use a scene capture in HDR mode, since this will be the most common path. Added a checkerboard display toggle, and an alpha blend toggle. Fixed an issue where StartSeconds was used from generated data to preview, rather than settings to generate data from. Inverted the alpha channel when capturing from HDR + A, so it can be used directly. Allowed alpha to be visualized in the baker.

  • Optimized the Ribbon Renderer FNiagaraRendererRibbons::AppendToIndexBuffer, resulting in 2 - 12x increase in performance.

  • Added an instance and particle transform space. You can use this space to transform in or out of mesh particle and instanced static meshes. Particle mesh space is now hidden, and will be removed later, since this new space covers that functionality.

  • Added support for setting system or emitter fixed bounds per instance.

  • GPU profiler is now hidden, and only required information is exposed outside the plugin. Extended the GPU profiler to capture the stage execution cost. It now passes the data to the particle performance statistics in the debug HUD.

  • Added a new data interface called ActorComponent, to access actors or actor component transforms. This can be set via the ActorSource parameter on the data interface, or via a user parameter.

  • Disabled the creation of render targets if the data interface is not used with an active GPU emitter.

  • We now allow data interfaces to opt out of running beyond PostActorTick. This is important for the collision data interface, since it relies on the async traces being issued this frame.

  • Split indirect argument generation into pre-opaque and post-opaque. This allows Mesh Renderers, sorting, and culling to all fully function on the low latency translucent path.

  • Added an option to sample RVT base color.

  • Added a menu option to show all data interface functions, and allow the HLSL code to be copied to the clipboard.

  • Added support for shared static float buffers that data interfaces can push data into.

  • Added support for getting the parent index of a bone. Added a warning if filtered bones are not required by all LODs, since this could mean that the effect may not play correctly if a lower LOD is used.

  • Added support for the MacroUV node in the Sprite Renderer.

  • Added support for pulling vertex or triangle data from a bind pose.

  • Improved debug element count forcing. Added an optional warning when we allocate GPU buffers beyond a certain threshold.

  • Added options for Niagara auto mip generation

  • We now allow arrays to be an iteration source. Updated the GPU copy when we dirty the data on the CPU, so that we can skip SetElement.

  • We now allow data interfaces to specify how they wish to dispatch, 1d, 2d, or 3d. Cleaned up the shader code generation between particle and iteration interfaces to improve performance.

  • Fixed force solo to not kill the component. When setting custom time dilation, Niagara will change into solo mode, and back out when it is set to 1.0.

  • Cleaned up multi-GPU Niagara code. Added cross-GPU transfer support to Niagara and Cascade. Added a method to Compute Dispatch Interface to allow data interfaces to send resources for transfer. Fixed missing persistent ID buffer transfers with alternate frame rendering (AFR). Fixed PostRenderOpaque transfer location to ensure we capture count updates.

  • Added per mesh rotation to the Mesh Renderer.

  • Add NiagaraID array data interface.

  • We now allow allocations from the count manager outside of the general compute dispatch.

  • Moved Simple Counter to Private, and extended functionality to support more operations and GPU.

  • When adding a module script, we now automatically choose a location in the stack that satisfies all dependencies.

  • Fixed "Set Parameter" menus not having transient parameters.

  • Added support to Cascade To Niagara Converter API to specify a script version when creating Niagara Scripts. UNiagaraEmitterConversionContext::FindOrAddModuleScript(), UNiagaraEmitterConversionContext::FindOrAddModuleEventScript(), and UFXConverterUtilitiesLibrary::CreateScriptContext() now take FCreateScriptContextArgs as an argument; existing python scripts using these methods will need to be refactored to pass their arguments in this format.

  • Added CVar Fx.NiagaraFailIfNotSetSeverity which makes it possible to select the severity of errors emitted when parameters are uninitialized.

Improvement:

  • Improved the colors of Niagara pin types.

  • Improved resolution numeric inputs and outputs. Made type checking stricter for Op nodes.

    • Dynamically enabled bindings for renderers.

  • Improved Dynamic Material parameter name resolution in the Niagara stack.

  • Improved detection for uninitialized parameters may raise compilation errors for existing content.

Bug Fix:

  • Prevent active Niagara compilations from starving all other background tasks. Prevent transient systems from starting compilations.

  • Fix for "ParameterOffsets.Num() should be 0 is 1" warning during cook.

  • Implemented refresh helpers for Convert nodes. Convert nodes will now fix up the paths in their connections to reflect changes made to Blueprint structs. Also fixing an issue when swizzle inputs didn't have a typedef, so the wiring was not shown on the nodes. Niagara bools and ints are now assignable.

  • Fixed a bug where large emitter nodes in the System Overview would vanish randomly.

  • Fixed a bug where UNiagaraFunctionLibrary::SpawnSystemAttached() did not handle EAttachLocation::SnapToTarget correctly.

  • Fixed a bug where changing to a system mid-compile could lead to a crash.

  • Added a module in Cascade to Niagara Converter Plugin to better replicate Cascade's light behavior.

  • Fixed a bug where the "fail if not previously set" default mode would not correctly pick up previous writes.

  • Fixed a bug where the Niagara translator could compile unused parts of the graph, resulting in errors when unset variables were being read.

  • Prevented users from entering a dot (.) character in the name for a static switch parameter.

  • Fixed a bug where inputs with a changed type didn't refresh after versioning up.

    • Ensured we tick instance parameters before building data interfaces, otherwise the GPU tick would have a reference to the wrong data interface.

  • Fixed a few bugs with the search bar in the Generated Code view.

  • Fixed a bug where setting an engine parameter in the stack that had a default binding in a parameter definition caused a compile error.

  • Resolved an issue that prevented playing audio from Niagara in cooked builds.

  • Fixed a bug where several threads would race and cause a crash in NiagaraComponentRendererProperties::UpdateSetterFunctions.

  • The Cascade to Niagara Converter now adds a Solve Forces and Velocity module when converting acceleration modules.

  • Fix memory stomp when loading UNiagaraGraph.

  • Fixed cases in which a Niagara User Parameter binding would either: not work when selected, or entries wouldn't show up at all.

  • "Make" actions are now supported when dragging off an output pin in a Niagara script.

  • The Cascade to Niagara Converter relied on hardcoded type names for converting types. This led to issues when type names changed. The converter now assigns type names directly from their Niagara Type Definition.

  • Updated preview widgets of Niagara Mesh Renderer properties to display meshes instead of their materials.

  • Closing and reopening the stack will no longer cause previous search results to be applied.

  • The Select node can no longer use parameter maps as a type.

  • Niagara Script parameter metadata now gets correctly hidden and shown based on the type of the parameter.

  • Fixed a bug where Mesh Renderers wouldn't show up for mesh renderer bindings.

  • Updated the Niagara Stack Style to correctly show selection.

  • Prevented the type registry from being modified while we are iterating over the array.

  • Fixed a bug in Dynamic Material Parameters, when enabling dynamic parameter 1 also stomped over dynamic parameter 0.

  • Fixed Niagara Depth Sample for Mobile. It now correctly samples SceneDepthAux or SceneDepthTexture.

  • Fixed the count buffer growth while the editor is out of focus.

  • Removed hard-coded ribbon tessellation disable from code. Replaced this with a console variable that can be data-driven.

  • Fixed issue when the socket attachments component is already registered.

  • Ensured we don't use aligned loads on some compilers for VectorLoad with VectorRegister4Float and VectorRegister4Double.

  • Fixed incorrect mip calculation. This also fixed a crash when enabling Generate Mips on a 1x1 render target.

  • We now include layout and uniform buffer changes as part of hash generation.

  • Forced DXC for NiagaraDataInterface shaders for platforms that support DXC.

  • Fixed GPU export count not being correct when going over the limit.

  • Added a missing swizzle on Color Sample.

  • Fixed incorrect bindings for Spline Rotation. Also fixed rotation extraction for Spline Rotation.

  • Fixed various issues with dependency checking for uninitialized parameters when compiling Niagara Systems.

Online

New:

  • Added rules-based ordering of QOS subregions into subspaces, biasing datacenter selection away from subspaces whose performance is not a sufficient improvement over their related subregion. The tolerances to control this can be set in the [Qos.QosRegionManager] section in the engine config on a per RegionDefinition basis, and also enabled/disabled per region. The rules-based comparison may be enabled or disabled overall in the engine config, or overridden with the -qossubspacebias=true|false command-line argument.

Crash Fix:

  • Fixed a hotfix crash when patching a soft object pointer.

Bug Fix:

  • Patchcheck INI configs now refresh with every patch check attempt, instead of only at object construction.

HTTP

New:

  • There is a new configuration option to limit the amount of concurrent threaded HTTP requests being processed. It can be defined as follows:

[HTTP.HttpThread] RunningThreadedRequestLimit=11

  • New configuration options have been added to HTTP to increase control of Flush time limits. They work within the following categories:

    • Default = when Flush is called with no overriding context

    • Background = when Flush is called because the app is backgrounding. This may not be called on backgrounding on all platforms.

    • Shutdown = when Flush is called because the app is being shut down. Some use cases may want an infinite wait. This may not be called on shutdown on all platforms.

    • FullFlush = explicit request to wait infinitely for all HTTP requests to complete. Some use cases may want to disable infinite waits. Typically not used in game code but may be used by applications or commandlets.

Each one of these categories has soft and hard limits to be defined as follows:

    • Soft Limit = how long to wait in seconds before cancelling active requests. -1 = never cancel. 0 = cancel immediately. Must be < Hard Limit to work. Typically after calling Cancel the HTTP request needs a tick to process the cancel, so it should not be == Hard Limit.

  • Hard Limit = how long to wait in seconds before stopping waiting altogether.

When used in a configuration file, it would look like this:

[HTTP]

FlushSoftTimeLimitDefault=2.0

FlushHardTimeLimitDefault=4.0

FlushSoftTimeLimitBackground=2.0

FlushHardTimeLimitBackground=4.0

FlushSoftTimeLimitShutdown=2.0

FlushHardTimeLimitShutdown=4.0

FlushSoftTimeLimitFullFlush=-1.0

FlushHardTimeLimitFullFlush=-1.0

Online Subsystem

New:

  • The SetSubsystemId function now logs an error when a proper SubsystemId isn't generated.

  • Added an analytics context helper to SocialUser Interaction menus, which are driven from static classes and built with macros. This addition makes it possible to attribute interactions to their respective places in the user interface.

  • Added config options to OnlineIdentityNull which enable emulating different types of platform setups. Changed default behavior to enable logins with no credentials, to match most other platforms.

  • Cached auth codes in online identity interface automatically expire after a set time interval on platforms that implement auth code caching (currently, Playstation 4 and Playstation 5). The default is ten minutes, and may be adjusted in the engine ini file using the AuthCodeTimeToLiveSecs config field.

  • Added IOnlineIdentity::ClearCachedAuthTokenAPI for clearing cached auth tokens in online identity interface, where applicable (currently, Playstation 4 and Playstation 5). On the command line, you can use -CachePsnAuthCode=true or -CachePsnAuthCode=true to override the value in the engine's .ini file.

  • OnlineSubsytemEOS now supports GetLinkedAccountAuthToken.

  • Starting the app from a platform invite or join is now supported when using EOSPlus.

  • Some of the options in the EOS Plus editor settings have been relocated or renamed:

    • "CrossPlay Settings" to "EOSPlus Login Settings"

      • "Use Epic Account Services" to "Use Epic Account for EOS login (requires account linking)"

      • "Use Crossplatform User IDs" to "Use Crossplatform User IDs for EOS Login (doesn't use Epic Account)"

  • Online Subsystem GDK will now use SETTING_SESSION_TEMPLATE_NAME when searching sessions by search handle. It will need to be set in both session creation and session search settings. If none is defined, "GameSession" will be used as a default.

  • The Gamertag Component type in the Online Subsystem GDK implementation used to be set to Modern and could not be changed. A new configuration option has been added to do so, with the following format:

[OnlineSubsystemGDK] GamertagComponentOverride=Classic

Overrides can be: Classic, Modern, ModernSuffix, or UniqueModern. If no override is specified, the system will use Modern.

  • Online Subsystem EOS Plus has a new implementation for the Title File Interface, transmitting all method calls to the base platform interface without EOS mirroring.

Improvement:

  • Moved Online session FNames to a new module called OnlineBase to be shared between OnlineSubsystem and OnlineServices.

Bug Fix:

  • Users are no longer shown as Muted when isListening is set to false in a second channel.

  • Fixed the Epic Online Services Online Subsystem encountering an SDK error when querying the presence of a player's friends.

  • Several fixes to Epic Online Services Online Subsystem (EOS OSS):

    • EOS OSS now batches a player's friends' net ids when querying their external account mappings to improve performance.

    • EOS OSS no longer modifies the net ID of a player's friend after executing the OnFriendsChange delegate with that friend's incomplete net ID.

    • Fixed the EOS OSS always firing the FOnQueryExternalIdMappingsComplete delegate with bWasSuccessful as false even when the operation succeeded.

  • Fixed the Epic Online Services Online Subsystem not registering players that were present in a session at the time the local player joined the session.

  • Moved Hotfix module's dependency on OnlineSubsystem from private to public.

  • Duplicate PIE login credentials are now accepted if the credential's type is Developer.

  • Fixed a connection issue when using Epic Online Services peer to peer with more than 3 peers.

  • An EOS lobby search with no results in the Online Subsystem EOS Session Interface will no longer return as a failure state. Instead, it will return as a success with 0 results.

  • Hosting and joining sessions is now functional for Play-In-Editor game instances when using EOS.

  • EOS Connect Login is now functional for platforms that require the UserLoginInfo field.

Deprecated:

  • Functions that used FUniqueNetId or shared pointers directly have been deprecated. We have added function overloads to UOnlineEngineInterface to take FUniqueNetIdWrapper.

Pixel Streaming

New:

  • Updated PixelStreamingAudioComponent in UE5 to support sending audio data from the browser to the engine. This is currently experimental, as audio data arrives after a significant delay; we plan to improve this in future releases.

  • Added experimental support for VP8 and VP9 software encoding. You can select an encoder codec with "-PixelStreamingEncoderCodec". Supported values are "H264", "VP8", and "VP9". The default encoder remains hardware accelerated H264. This is experimental as these software VPX encoders are much slower than the hardware accelerated H264. Specifically, VP8 encodes at roughly 30 frames per second, and VP9 encodes at roughly 15 frames per second.

  • A whole new set of internal WebRTC stats are now exposed to Pixel Streaming for programmatic use and visual inspection through the built-in optional stats HUD. The stats HUD can be viewed by passing "-PixelStreamingHudStats". The stats can also be queried programmatically using the appropriate stat changed delegate in UPixelStreamingDelegates.

Additionally, a number of the settings available in the player.html and app.js have been removed and trimmed down to a subset of settings we believe are genuinely helpful to configure through the web frontend - the rest are now only settable as console variables and launch arguments to your Pixel Streaming application. Following this decision, we have also changed the "Test Latency" button to be a "Get Report" button that reports a subset of stats using the newly exposed WebRTC stats in Pixel Streaming.

  • Added a "Kick Player" Blueprint node that takes a Player ID as input. This replaces the functionality of the "Kick All" button from the Pixel Streaming front end, which has been removed.

  • Introduced a new design within Pixel Streaming to specify video sources, which take texture sources. For example, we now have a FVideoSourceP2P which takes a FTextureSourceBackBuffer. With this new design, users can add more types of texture sources in the future, such as render targets or scene capture textures. This change is transparent to most current users, but should increase flexibility for users who extend Pixel Streaming in C++.

  • Added default simulcast settings to Pixel Streaming to control the resolution and bitrate of simulcast streams. You can pass your own simulcast stream settings on the command line using -SimulcastParameters. The format of simulcast parameters is comma separated triples of: stream scale denominator, minimum bitrate, maximum bitrate. For example, the default is one full resolution video stream and one half resolution video stream, which would be specified as: -SimulcastParameters="1.0,5000000,20000000,2.0,1000000,5000000"

  • Added Pixel Streaming support for Vulkan on Windows.

  • Start-up scripts have been added for Linux. These enable running of SFU server locally, and SFU and CoTURN in docker containers. The containers can be built on demand. Start and stop controls are provided for convenience on top of the docker command line layer.

  • Extended Pixel Streaming and the JavaScript front end to support either the browser being the WebRTC offerer or the Pixel Streaming instance being the WebRTC offerer. By default the Pixel Streaming instance is now the WebRTC offerer, which is the reverse of the case in previous versions. However, Pixel Streaming still remains compatible with the browser being the offeror as it was in previous versions.

  • Updated the GamePlayMediaEncoder.

  • Added Vulkan and Linux support to GameplayMediaEncoder.

  • Support for a Selective Forwarding Unit (SFU) has been added to Pixel Streaming which allows multiple clients to connect with different bitrate requirements.

  • Renamed PixelStreamerInputComponent to PixelStreamingInput to align with our new naming conventions in UE5.

Improvement:

  • Pixel Streaming has been refactored to be more modular and configurable.

  • NVENC encoder plugin has been made more stable.

Crash Fix:

  • Fixed a crash in CUDA module when NVIDIA drivers are present but RHI is running on a non-NVIDIA GPU.

  • Fixed Pixel Streaming bug causing crash for some hardware when using Vulkan.

  • Fixed a crash in Pixel Streaming related to malformed peerConnectionOptions.

  • WebRTC binaries have been rebuilt. Protobuf symbols have been stripped to avoid collisions with other Plugins when building monolithic binaries (ie with UEGame target). This fixes a crash when using WebRTC statistics while building any Debug config.

  • Fixes to GameplayMediaEncoder crash when no encoders are registered to AVEncoder.

Bug Fix:

  • Fix for keyframes being lower quality than the rest of the stream. This was particularly problematic as keyframes are now sent a regular interval by default thus causing the stream to become momentarily pixelated every keyframe.

  • Firefox and TURN on AWS was broken due to the WebRTC cross browser shim, adapter-latest.js being unable to detect Firefox correctly. This was fixed by patching this script in player.html.

  • Tidied and formatted console logging for the Pixel Streaming JavaScript to make it more readable and less redundant, particularly in the case of ICE candidates.

  • Added url parameter ?ForceTURN that discards any ICE candidates that aren't using relay. This is particularly helpful when testing TURN servers with Chromium based browsers.

  • Fixed an issue where the WebRTC data channel would abruptly close when attempting to send large amounts of data over the channel.

  • CUDA failure to initialize will now result in an error message rather than a fatal error. Note that having RenderDocsPlugin enabled when trying to use CUDA will result in CUDA failing to initialize, so that Pixel Streaming will not function correctly while the plugin is enabled.

  • Fixed an issue with incorrect hardware encoders loading when the target GPU is not present.

    • Vulkan/AMF encoding is currently unsupported and has been disabled.

    • Removed a fatal error when trying to use AMF with Vulkan.

  • Fixed installation scripts for Windows and Linux to ensure they occur before starting CoTURN.

Removed:

  • Removed the following unused console variables from Pixel Streaming:

    • PixelStreamingUseBackBufferCaptureSize

    • PixelStreamingCaptureSize

    • PixelStreamingWebRTCDisableResolutionChange

    • PixelStreamingMaxNumBackBuffers

  • AMF support with DX11 has been disabled. AMF with DX12 is unaffected.

WebSockets

New:

  • Websockets protocols are now configurable in BaseEngine.ini.

Physics

New:

  • Added scaling functionality to the buoyancy data so we can scale the pontoon element over time.

  • The following Buoyancy Types were added:

    • FSphericalPontoon::ScaleTimeFrequency (float): Defines how frequently the pontoon scale radius ticks.

    • FSphericalPontoon::ScaleRadiusPerTick (float): Defines how fast the pontoon radius reduces per tick.

    • FSphericalPontoon::MinRadiusToSink (float): Defines the radius required to sink the vehicle.

    • FSphericalPontoon::ScaledTime (float): Defines the tracked scale time as we're scaling.

    • FSphericalPontoon::BaseRadiusBeforeScale (float): Defines the base radius before scaling.

  • Added functionality to Chaos Debugging to draw collision for a single actor instead of all the actors in the scene.

  • The following CVars were added to the ChaosDebugDrawComponent:

    • p.Chaos.DebugDraw.SingleActor - If set to true, draws collision for the actor the camera is facing.

    • p.Chaos.DebugDraw.SingleActorTraceLength - Sets the trace length from the camera that selects the single actor that will be used to draw collision.

    • p.Chaos.DebugDraw.SingleActorMaxRadius - Set the max radius to draw around the single actor.

  • Added the ability to query the attached body names from a physics constraint in Blueprints.

Bug Fix:

  • The GetAngularDriveParams function for Physics Constraints now correctly returns the parameters by reference.

Deprecated:

  • The GeometryCollection debug draw classes have been deprecated. The Chaos debug draw console commands should be used going forward.

  • The asset factory for UChaosPhysicalMaterial has been removed.

Clothing

New:

  • Added the console command p.ChaosClothEditor.DebugDraw to enable / disable the cloth editor visualization mode.

  • Added multiple LOD deformer mapping data to Chaos Cloth. This allows the engine to use raytracing on cloth at a different LOD level than the LOD level used for rendering and simulation.

    • Added the ClothLODBiasMode property to the Skeletal Mesh to define the storage strategy depending on whether multiple LODs deformer mapping data are required or not.

  • Added a new SetBackstop Blueprint function to the Chaos Clothing Interactor to enable / disable the Backstop collisions at runtime.

  • Enabled convex collision for Chaos Cloth on mobile platforms.

  • Ran the Long Range Attachment tether constraints as a pre-iteration step instead as a per iteration step to improve simulation performance.

  • Added global point damping to offer a faster alternative to the current local damping formulation.

Improvement:

  • Improved the way the Cloth wrap deformer deforms the high quality render mesh based on the simulation mesh. It now uses each face connected to a vertex to compute the average normal at that vertex. This average is then used to deform the render mesh, making the deformation more consistent.

  • Improved the binding accuracy between the simulation mesh and the render mesh, which results in higher-quality render mesh deformation.

  • Significantly reduced the initialization time of Chaos Cloth at runtime. This change prevents the initialization hitch by caching the Long Range Attachment tether calculations inside the cloth asset at authoring time.

Bug Fix:

  • Fixed an issue with Chaos Cloth where the MaxDistance and Backstop constraints were not scaling correctly when the skeletal mesh component scale was changed.

  • Fixed an issue where changing LODs while cloth simulation was suspended would result in the cloth and render LODs to become out of sync and cause a crash.

  • Fixed an issue where the cloth simulation data and bounds output was incorrect if the simulation was suspended while the component was moving.

  • Fixed an issue where rendering with an invalid simulation LOD would cause a crash.

  • Fixed an issue with Chaos Cloth visualization where multiple cloth bounds were using incorrect transforms.

  • Fixed an issue where the cloth wrap deformer vertex contributions (which triangles are rendered kinematic or dynamic) were incorrectly updated when using multiple influences and editing the MaxDistance mask.

  • Fixed an issue where the simulation data transform was incorrect when rendering the cloth mesh started after the component's transform had been updated.

  • Fixed an issue where migrating an asset from Nvcloth to Chaos Cloth would result in a stiffness multiplier being included.

  • Fixed an issue where Chaos Cloth would experience hitches in game caused by a smoothing of the time step that was incorrectly applied to the kinematic particles' velocity calculations.

  • Fixed an issue where importing a clothing asset without a matching LOD section would cause a crash.

  • Fixed the suspended simulation positions and bounds by reverting part of changes made in CL18170330 and fixing the local space bounds calculation.

  • Fixed an ensure that would always fire in ClothingAsset.

Physics Asset Editor

New:

  • Added a way to edit the mouse interaction distance inside the Physics Asset Editor. The default distance value has been increased.

  • Added the ability to copy and paste bodies and constraints to the clipboard in a text-based format. This provides a way to copy bodies and constraints between different physics assets.

Bug Fix:

  • Fixed an issue where the preview animation of an asset would be lost after simulating in Physics Asset Editor.

  • Fixed an issue in Physics Asset Editor where the Detail panel would remain empty when selecting all the bodies in the skeleton tree.

    • Fixed an issue where copying a body setup to another one with a different primitive would cause a crash if the user used the Details view.

    • Fixed an issue where the selection was not being properly refreshed after the copy operation.

  • Fixed an issue where the preview animation of an asset would stop when simulation started or stopped.

Rigid Bodies

New:

  • Added the p.RigidBodyNode.UseDeferredTask CVar. Set this to 1 to defer the simulation results of RigidBody AnimNodes by one frame, improving performance by enabling the simulation more time to complete in the background.

Bug Fix:

  • Fixed an issue in RBAN where mesh component initialization may pass through a zero delta time when the node is set to inherit bone velocities. This resulted in an incorrect value being used in the velocity calculation.

Platforms

New:

  • The device profile editor can now properly add or check out platform-specific .ini files. It will also only save changed values for inherited device profiles. The device profile editor can now create production-ready .ini files that do not need manual fixes.

  • Made it possible to distinguish between controller types when using WinDualshock.

  • Added RunUAT CreatePlatformExtension command to auto-generate plugin and module platform extension files.

    • Examples for using CreatePlatformExtension:

      • RunUAT CreatePlatformExtension -P4 -platform=MyPlatform -source=MyProject/Source/MyProject.target.cs -project=MyProject/MyProject.uproject

      • RunUAT CreatePlatformExtension -P4 -platform=MyPlatform -source=Engine/Plugins/Path/To/MyPlugin.uplugin

      • RunUAT CreatePlatformExtension -P4 -platform=MyPlatform -source=Engine/Source/Path/To/MyModule.build.cs

  • Implement waitfordebugger / waitforattach for console platforms. These command line options allow a game to pause until a debugger is attached.

All GDK

New:

  • Added ability to query the Parter Center to automatically populate the title settings using the in-editor Project Settings dialog.

  • Added support for custom/modified GDK editions in AutoSDK, signified with an additional suffix. For example: "210603-01" vs "210603"

  • Adding support for launching a title by URI, for example: ms-xbl-[TitleId]://<custom string>. See the GDK documentation for details. The URI is available via FPlatformMisc.

  • Added support for -package -deploy to install GDK packages with UAT automatically.

  • The 480x480 packaging image is no longer considered optional. Previously the dashboard would silently scale up the 150x150 image as a fall-back.

Linux

New:

  • Increased Unix Cycles64 resolution to 100ns

  • Fixed Unix crash messages printing a truncated memory address.

  • Added support for asynchronous logging on forked instances

  • SkeletalMeshComponents will now run multithreadable tasks on the taskgraph on forked multithreaded servers

  • Moved FForkProcessHelper code in Fork.cpp.

  • Added FForkProcessHelper::IsForkRequested function. This returns true when the process is set to fork child processes or simulate forking by itself.

  • Implemented FUnixPlatformMisc::GetCPUVendor and GetCPUBrand() for non x64 Linux platforms to read and parse the /proc/cpuinfo file. Added tables for 64-bit arm cpu implementers and part numbers. This table may have further updates in the future.

  • FUnixPlatformProcess::CreateProc no longer requires you to pass an absolute path to an executable. If passed an argument containing a program name but no path separators, it now searches directories specified in the $PATH environment variable in the same manner as the shell would. The underlying API has changed from posix_spawn to posix_spawnp, and failures are no longer treated as fatal.

  • Add Linux -crashhandlerstacksize command line option to set crash handler stack size.

  • Moved stack to mapped memory instead of allocating in the heap. This can set and reduce the size of the 200k stack significantly through the command line.

  • Add DumpGPU viewer script for Linux and Mac. To use this, run the DumpGPU command in the console. This will open a folder to the DumpGPU HTML files and data, plus OpenGPUDumpViewer.sh. If you open OpenGPUDumpViewer.sh, the GPU Viewer will open in your web browser.

  • Updated Linux SDL to 2.0.20.

Bug Fix:

  • Unix's GetCPUTime refreshes the total cpu usage of the process every 250ms (same as other platforms) instead of the incorrect 25ms.

  • Replaced the single ensure crash reporting process handle with a pool of process handles.

  • Made UnixCrashContext for ensures thread-safe.

    • Stopped adding/removing FTicker delegates outside the game-thread.

    • Made the concurrently uploading processes thread-safe using atomic state machine.

    • Added option to limit the number of processes on dedicated game servers .

    • Fixed ensures not getting sent on dedicated game servers.

  • Use reliable messages for local swarm Mac/Linux messages Udp window size is ~64, so when sending large batches of "task completed" messages quickly, several would get silently dropped.

  • Change default optimization level for Shipping from O2 to O3.

Mac

New:

  • Added an Import Xcode GPU Debugger Plugin for Mac. This plugin works similarly to the RenderDoc plugin for Windows. Enable the plugin in your project settings, then press Shift+E to trigger a GPU frame capture of the primary viewport. It will automatically open in Xcode once the capture is complete, at which point you can replay the capture, step through it, and perform other operations.

  • Removed MetalShaderCompiler depenencies on DerivedDataCache.

Bug Fix:

  • Fixed incorrect format string in MacToolChain.

  • Fixed XCode GPU programmatic captures missing a file name.

VR

New:

  • Renamed EColorSpace to EOculusColorSpace to prevent confusion with the new engine definitions.

Bug Fix:

  • Fixed an issue where the editor would throttle whenever a VR headset was attached.

  • Fixed UE5 binary failing to package BP projects for HoloLens due to Missing Game Binary. UBT is required to run for all HoloLens packaging because this step generates the final target file used to generate the package.

    • This means you need to have Visual Studio set up to package for HoloLens even for a Blueprint-only project.

  • Fixed a bug which caused the Editor to throttle whenever a VR headset was attached.

  • Fixed an issue where the editor viewport would slow down when a Virtual Reality headset was being used.

Windows

New:

  • Display progress of splash screen on the Windows taskbar icon

Crash Fix:

  • Prevent a crash if the web browser component fails to load.

Bug Fix:

  • Force the webbrowser plugin to load when creating the bridge plugin.

WinGDK

New:

  • Added support for emulating "Default User Required" on Windows when the Simplified User Model is enabled, as it is not currently implemented in the GDK. When opting-in to emulating Simplified User Model & Default User Required, the game will block and display a user login prompt on startup. If the user cancels sign-in, the game will terminate. If the user signs out, the game will terminate.

  • Package install batch files are created alongside WinGDK packages.

XR

Bug Fix:

  • Correctly handle MultiView and Variable Rate Shading attachments in the PSO caching system.

Rendering

New:

  • Added a new Nanite Tools editor plugin, which includes an audit flow to find Nanite meshes with errors, and non-Nanite meshes that could be converted safely to Nanite. The tool performs a Material check to properly categorize error and optimization suggestions. This is the initial implementation and will be improved upon in future releases.

  • Implemented Nanite support for view visibility flags DrawInGame, DrawInEditor, VisibleInReflectionCaptures, VisibleInSceneCaptureOnly, HiddenInSceneCapture, ForceHidden, and others. Also partially implemented a GPUScene version of FPrimitiveProxy::IsShown().

  • Added an initial implementation of per-view primitive filtering in Nanite (such as GPUScene version of IsPrimitiveHidden from the SceneVisibility.cpp). This enables Nanite to support Show Only or Hidden Primitives lists for Scene Captures and other workflows.

  • Added a new debug mode to render only non-Nanite fallback meshes that incorrectly reference coarse static mesh assets. This mode is off by default, and enabled in non-shipping builds with r.Nanite.IsolateInvalidCoarseMesh 1.

  • Lights can now enable ray-traced shadows independently of the standalone Ray Tracing Shadows project setting. There are three options to select from: Disabled, Use Project Settings, or Enabled. For older scenes, lights that had Cast Ray Tracing Shadows enabled are mapped to the new Use Project Settings value.

  • Added a new define ("DXR_ALLOW_EMULATED_RAYTRACING") that automatically compiles out the r.D3D12.DXR.AllowEmulatedRayTracing by default.

  • Enabled Vulkan Wave Operations and use Vulkan 1.1 environment for shader compilation on desktop platforms.

  • Added wireframe viewmode support for Nanite using postfx barycentric coordinates.

  • To improve color management, there is a new Color Space property in the Texture Editor to specify the color space of the source textures.

  • Added compliant 64-bit image atomics in Vulkan, which fixes all validation issues with 64-bit atomics and allows the use of RADV driver (AMD + Linux) for Nanite and Lumen.

    • This change will use STORAGE_IMAGE to read from R64 formats when sampling isn't supported.

    • It leaves high level code and HLSL untouched. Render Dependency Graph will continue to consider them read-only access.

    • Creates a code path for HZB that uses UlongType.

    • Updates shader GUID for Vulkan to force a rebuild.

  • Added scoped CPU markers for CPU profiling for the most expensive parts of "GlobalBeginCompileShader" and "FShaderCompilingManager::SubmitJobs", which includes "FShaderType::AddReferenceUniformBufferIncludes" and "GetInputHash."

  • In the Environmental Light Mixer, Volumetric Fog toggle has been added to the minimal view for Exponential Height Fog.

  • Added a way to handle CopySrc/Dest transitions for depth-stencil targets in Vulkan, which allows the use of AddCopyTexturePass on depth-stencils of the same format.

  • Added Large World Coordinates support for cloth simulation in GPUSkinnedVertexFactory and SkinCache shaders.

  • Added descriptions for the various "stat *" EngineStat commands. Using "stat help" will list all available commands.

  • Added support for Morph Targets to the Motion Blur visualization when Skin Cache is disabled.

  • Modified DumpMaterialShaderTypes commandlet to add FMaterialShader types to the final shader type histogram.

  • Added additional options for linearizing (advanced) source encodings on texture import.

  • Enabled EmitDrawEvents by default when ProfileGPU is enabled, otherwise provide options to enable except in a shipping build to avoid oversights with release builds. Also removed EmitDrawEventsOnlyOnCommandList as it is unused.

  • Enabled cloth rendering on mobile and Windows ES3.1 platforms by default with per-project control. Use the console variable r.Mobile.EnableCloth to set it.

  • Added the ability to set shader defines for global shaders from configuration (*.ini) files.

  • Added new features and improvements to GPU Scene dynamic primitives:

    • Updates to GPU Scene and the GPUSceneCollector to support handling the upload of multiple instances and instance payload data for dynamic primitives.

    • Updates to Virtual Shadow Map caching to support the invalidation of cache pages upon removal of dynamic primitives.

    • Added the ability to provide a delegate to support initializing or modifying dynamic primitives' instance scene data and instance payload data from the GPU.

  • Added uniform buffer names to D3D12 shaders and added validation logging to uniform buffer binding.

  • Implemented Intel extensions for 64-bit atomics.

  • Fixed shader cooker stats showing the wrong shader format names.

  • Added GRHISupportsMapWriteNoOverwrite to check at runtime if RLM_WriteOnly_NoOverwrite is supported.

  • Allowed D3D12 global constant buffer updates to be more dynamic, which removes the shadow data overhead from stages that aren't used in a context. It also allows for global constant buffers larger than 4 kilo-bytes in size.

  • Refactored Vulkan renderpass initialization to allow for either vkRenderPassCreateInfo or vkRenderPassCreateInfo2 paths depending on platform support for the extension.

  • Added an optional MaxLODSize_VT option to Texture LOD Group to clamp cooked Virtual Texture sizes per group.

  • Added support for attaching to PIX on startup. You can either pass "-attachPIX" on the command line or set r.D3D12.AutoAttachPIX=1 in ConsoleVariables.ini. You will still need to manually hit "attach" inside PIX.

  • Added support for vkCreateRenderPass2 and vkCmdBeginRenderPass2 to Vulkan RHI.

  • Added an on-screen notification when Runtime Virtual Texture streaming mips are invalid and therefore likely to be causing a performance regression.

  • Added console variable r.VT.RenderCaptureNextPagesDraws to trigger render captures when Runtime Virtual Textures renders new pages.

  • The Virtual Texture System only updates during Draw Tile Mesh when the Material being rendered actually samples from a virtual texture. Previously, this was introducing lags in processing VT feedback, particularly evident when rendering the water brush which uses lots of Draw Tile Mesh internally.

  • Added single-callback version of CreateStructuredBuffer to automatically infer element size, total size, element count and data pointer (for example, CreateStructuredBuffer(GraphBuilder, TEXT("MyBuffer"), & -> auto& { return BufferSource; });, where BufferSource is a TArray)

  • Added support for uint2 shader parameters.

  • Added ForceTracking flag to ERDGBufferFlags/ERDGTextureFlags : force the RDG to track a resource even if it can be considered as read-only (no UAV, no RTV, etc.) This allows the graph to copy from and to external textures, and handling of the corresponding transitions, for example.

  • Added default pixel format capabilities for platforms that might not be able to poll for support at runtime.

  • Added RHIIsTypedUAVStoreSupported for texture format changes for D3D format queries that need to use the different UAV/Resource formats that are implemented on D3D11 and D3D12. Also, added checks for TypedUAVLoad support on D3D12.

  • Made changes to Landscape Grass type for "ShouldCacheLandscapeGrassShaders" to use "EShaderPermutationFlags::HasEditorOnlyData".

  • Vulkan 1.2 API now supports ray tracing when enabled (on by default) and adds support for ray query extension. Vulkan ray tracing can be set by the console variable r.Vulkan.ExperimentalRayTracing.

  • Added RHIUniformBufferLayoutInitializer and now RHIUniformBufferLayout is a proper FRHIResource. This brings proper RHI lifetime support to RHIUniformBufferLayout so we don't delete the layouts while RHI commands that use them are still in flight. This should fully address UniformBufferLayout and UniformBuffer crashes that randomly happen during shader compilation in the Editor.

  • Added separate RHI capability properties for full ray tracing shaders and inline ray tracing. While most RHIs may support both features, some may only support one.

  • Enable inline ray tracing support for Vulkan on PC via DDPI. Feature remains disabled by default using the console variable r.Vulkan.RayTracing. The minimal set of required ray tracing utility shaders is now always cooked for Windows Vulkan targets, and the "-noraytracing" command line argument can be used to disable ray tracing, which is useful when testing a game that was packaged with "r.Vulkan.RayTracing=1".

  • Added Dynamic Resource heap flags to Root Signatures, and moved static Root Signature text generation to a public file.

  • Added support for GPU asserts in ray generation shaders.

  • Extended Agility SDK support to all Windows family platforms.

  • Added an "Auto" setting to GenerateMips that detects format support before blindly using the compute version. A helper was also added to GenerateMips to tell if you need to add UAV support to a texture based on its texture format.

  • Added ray tracing feature support property to platform settings editor UI.

  • Added an option to disable high-end ray tracing reflection support per-platform. This avoids expensive, time consuming shader compilation for effects that will never be needed in practice.

  • Adding missing RHIValidation overloads for RHIBackBufferWaitTrackingBeginFrame and RHIFlushTextureCacheBOP.

  • Implemented Vulkan top level acceleration structure SRV management and binding. This allows acceleration structures to be used in shaders that perform inline ray tracing on Vulkan platforms.

  • Reduced ray tracing sampler heap allocation's high water mark through better sampler descriptor table duplication. Samplers were previously duplicated using per-thread hash tables, which results in some cross-thread duplicates. This change adds an exhaustive brute force search through the entire global sampler table if per-thread cache did not find a match.

    • This change was tested running a replay which previously reached 1400+ samplers (out of hard limit of 2048). With this change, the maximum sampler allocations are reduced to 400. The performance impact is minimal.

    • Control the duplication scheme with r.D3D12.RayTracing.DuplicateSamplers. By default it's enabled, but can store old behavior by setting it to 0.

  • Added support for compressed textures larger than 2 GiB.

  • Brought DXProgrammableCapture.h into ThirdParty and modified it to not require a NTDDI_VERSION. Cleaned up PixWinPlugin to use the correct header guards, correct types, and correct windows version check.

  • Implemented RHIGetNativeCommandBuffer in D3D11RHI, which returns the immediate context.

  • Updated WinPixEventRuntime to version 1.0.210818001.

  • Added quicker utility for getting a shader type's name. ValidateBoundShader and ValidateBoundUniformBuffer were rewritten to be templates instead of defines to make them easier to investigate.

  • Updated the Agility SDK to version 1.600.10.

  • Removed excessive calls to IsRHIDeviceIntel() to prepare for Gen12+ platforms.

  • The console variable r.Shaders.Optimize can now be set on a per-platform basis.

  • Extended GPU page fault information is now logged in Aftermath crash handler.

  • Resource dimensions and type are now reported when logging live and recently released resources after a GPU crash. This makes it easier to correlate resources reported by Aftermath with the live and recently released allocations in the engine.

  • Added an explicit SPIR-V target environment option to CrossCompiler::FShaderConductorOptions and use Vulkan 1.2 environment when compiling ray tracing shaders and shaders with CFLAG_InlineRayTracing.

  • Added support for accessing triangle indices and vertex positions in Vulkan inline ray tracing shaders. Use FRHIRayTracingScene::GetMetadataBufferSRV to access RHI-specific data associated with the ray tracing scene. This can be used to access vertex and index buffer binding information for inline ray tracing shaders.

  • Added ERayTracingPipelineCompatibilityFlags used by ShouldRenderRayTracingEffect to check if a particular effect can run on the current machine. Some effects may support inline or full pipeline ray tracing and some RHIs may support one or both features.

  • Making more RHISupports functions use FStaticShaderPlatform to take advantage of optimizations on certain platforms.

  • When Forward Shading is enabled, the Shadow Map Method is now grayed out to indicate it has no effect.

  • Implemented multi-platform DumpGPU command line tool for debugging common rendering artifacts. See the DumpGPU Tool documentation for more usage details.

  • Exposed per-project platform setting to control offline BVHs build mode (disabled, Maximize Performance, and Minimize Memory) since offline BVHs generally result in better performance and/or reduce memory usage. In its current state, Maximize Performance versus Minimize Memory controls whether triangle splits are used or not.

  • Added estimated compressed size metrics for Static Meshes in the Static Mesh Editor UI and in Asset Audit.

  • Added support getting transforms from GPUScene when building RayTracing Instance Buffer.

  • Improved the screen space subsurface scattering performance when it only occupies a small region.

  • Added functionality to wrap 1D dispatches into 2D or 3D to avoid API limits, and shader function to get the linear index.

Improvement:

  • Refactored Nanite hardware rasterizer to run as Material shaders, allowing for future Material graph evaluation of features like world position offset, pixel depth offset, and masked Materials.

  • Refactored Nanite Material audit checks into modular utilities, and added auditing support to Nanite Audit Tool.

  • Renamed FNaniteShader to FNaniteGlobalShader to make the base class more obvious.

  • Modified "DumpMaterialShaderTypes" commandlet to support listing Material Shader types, not just Mesh Material Types / Vertex Factories with a layout. Since this currently contributes a lot of unnecessary shader types / permutations, this change also temporarily disables Nanite raster shaders, except for the default Material.

  • Optimized the Nanite Material classify pass, using MaterialResolve to obtain MaterialSlotID directly, instead of obtaining SlotID through VisBuffer and ClusterPageData, and so on, to reduce bandwidth overhead and improve performance. Since MaterialResolve is 16-bit wide and VisBuffer is 64-bit, it can save at least 3/4 of bandwidth. After testing, the performance is improved by 40% on RTX 2070s. This optimization is enabled by default, and toggled with r.Nanite.ClassifyWithResolve.

  • Improved Instance Static Mesh and World Position Offset rendering by adding the console variable r.RayTracing.Geometry.InstancedStaticMeshes.SimullationClusterRadius to buck and sort ISM and WPO simulated instances based on distance to view. Also refactored the console variable code to fix/enable r.RayTracing.Geometry.StaticMeshes.WPO = 2, and fixed issues with current ISM and WPO if the local transform uses a non-identity matrix or if the simulated instance transform is non-identity.

  • Cleaned up shadow passes in order to remove unnecessary command list and feature level arguments.

  • Moved more hardcoded shader platform checks to DataDrivenShaderPlatformInfo.

  • While troubleshooting long compile times, enabled sorting by worker compile time to show the bigger offenders first. Removed instruction count from this display, as it is not a relevant stat in this context.

Crash Fix:

  • Fixed a crash in Procedural Mesh component with ray tracing enabled.

  • Fixed a crash when isolating Material Slots in editor.

  • Fixed a crash in Nanite mesh when reloading the global shader map.

  • Fixed a crash in GPU lightmass when baking an empty level.

  • Fixed a crash in ray tracing with invalid Static Mesh Proxies.

  • Fixed a crash that would usually happen when a Dynamic Material Instance created in a construction script could be unloaded with its owner, even when still referenced by primitives in the world.

  • Fixed a crash when clicking the RenderDoc viewport button, and implemented additional RenderDoc editor improvements.

  • Fixed a crash when using Try Get Shaders on a Material where there's no shader map available. For example, an invalid Material.

  • Fixed a crash that occurred when GPU ightmass was run with "Allow Static Lighting" disabled in the project settings. Now GPU Lightmass only runs when that option is enabled.

  • Fixed a GPU crash that could happen with Ray Tracing Global Illumination's final gather reprojection pixel index calculation and added an explicit bounds clamp.

  • Fixed a crash with landscapes when using the command line argument -rhivalidation that ensures the RHIBuffer is held for the life of the frame because not all RHI backends will have the SRV maintain a hard reference to the source buffer.

Bug Fix:

  • Fixed an issue that caused motion blur to become increasingly blurry when single stepping in PIE.

  • Fixed an issue with Nanite hit proxy selection for Instanced Static meshes that do not have "Has Per Instance Hit Proxies" enabled. Such as, Blueprint Construction Scripts spawning the ISMs rather than a content creator explicitly mutating the instances array.

  • Fixed an issue where ray tracing is not enabled by default in cooked games with r.raytracing set to 1.

  • Fixed an issue that would cause flickering in the Cable Component due to a race condition.

  • Fixed Per-Instance Custom Data and random ID for Nanite Materials and meshes.

  • Fixed an issue in Vulkan RHI when using Hair Strands debug mode 6 in Editor.

  • Fixed an issue when Realtime is turned off in the editor to make sure the RHI resources are flushed even when nothing is rendered to prevent leak in RHI (D3D12/Vulkan).

  • Applied fixes for broken and shuffled Nanite Materials when commands like "FUpdateStaticMeshesForMaterials" call "FPrimitiveSceneInfo::UpdateStaticMeshes", which will re-cache Nanite mesh draw commands (and deriving new Material table indices), but no other change will cause GPU Scene to perform a per-primitive upload, which would also update the global Material tables. This change modifies "FPrimitiveSceneInfo::UpdateStaticMeshes" to trigger a GPU Scene update so the MDCs and the global Material table stay synchronized. Normally, adding a primitive to the scene will mark GPU Scene dirty, but some cases of construction scripts adding to the scene, flushing the upload, but then changing just the Static Meshes or Material assignments wouldn't flush an update before.

  • Fixed an issue in Vulkan RHI to handle mixed sub-resource layouts when moving surfaces (defrag).

  • Resolved an issue where Raytracing Scene captures were using the Reflection Capture's visibility flag instead of the Scene Capture's visibility flag.

  • Fixed an issue with broken Morph Targets CPU update path.

  • Fixed an issue in Vulkan RHI for RHIReachSurfaceData. The bls8bpp use was inverted, Rect param was only partially taken into account, and added more supported formats.

  • In Vulkan RHI, added a barrier in Buffer Unlock to meet the expectation of higher level code that data is ready to read.

  • In Vulkan RHI, fixed FVulkanUnorderedAccessView for FVulkanTextureCube giving the validation error "requires an image view of type VK_IMAGE_VIEW_TYPE_2D_ARRAY but got VK_IMAGE_VIEW_TYPE_CUBE".

  • Vulkan RHI was missing CS lock in Vulkan Memory for when Render Thread (texture creation) overlaps with RHIThread (RHIEndFrame) and both can access the ActivePages.

  • In Vulkan RHI, fixed the Shader Complexity viewmode by adding approximate SPIRV instruction counts during shader compilation.

  • Fixed various issues in the Vulkan RHI with Async Compute. Added a new function to query stage bits supported by a queue that filters stages for barriers sent to async queue. And, avoid unnecessary semaphores when DstPipelines is ERHIPipeline::All.

  • Fixed accidental usage of the Stencil StoreOp for Depth in Vulkan RHI.

  • Fixed an issue in Vulkan RHI where transition batches containing only a single execution barrier were not submitted.

  • In Vulkan RHI, added RenderArea as a criteria for Framebuffer matching when reusing, which fixes some passes that were reusing the same set of targets but different areas.

  • In Vulkan RHI, fixed an issue with hashing in FDeviceMemoryBlockKey.

  • Protect extra GPU Scene instance data arrays from out of bounds access if data flags are incorrectly set.

  • Fixed an issue found in D3D12 sampler BorderColor copy.

  • Fixed issue where child Skeletal Mesh component LOD can be detached from its parent Skeletal Mesh component.

  • Fixed an issue when "LOD to Frame Skip Map" is set to a positive number of frames on Skeletal Mesh that would cause animation to become fuzzy from motion blur.

  • Fixed an issue with hair rendering with AddHairVisiblityCommonPass function using the wrong ViewRect for AddSimpleMeshPass function. This caused hair to not render at all in the right eye in XR and potentially in other situations that use multiple views.

  • Fixed Instanced Static Mesh (ISM) per-instance selection rendering where it used to draw every instance as selected, rather than only the instances that were selected.

  • Fixed CPU morphing broken on cooked mobile builds because its morph data was being stripped during the cook.

  • Restored the old FLightPrimitiveInteraction code. The new code can leak memory and it is no longer needed due to the removal of async LPI creation

  • Fixed hash generation for PC DirectX Shader Compiler (DXC) shaders to use the hash provided by DXC.

  • Fixed an issue where Adaptive Virtual Texture did not process the first allocation request each frame.

  • Fixed a dangling reference in Render Dependency Graph (RDG) blackboard implementation when blackboard struct is not first created.

  • Replaced overzealous check by ensuring when Hierarchical Instance Static Mesh (HISM) component transform or view projection matrix is invalid.

  • Fixed an issue where pooled buffers were not being renamed on reuse in external profilers.

  • Removed validation skipping from the SM6.6 code path as it's a fully supported feature in our version of DirectX Compiler (DXC).

  • Fixed an issue where bUseDiagnosticBuffer would be overwritten by the last used stage.

  • Fixed an issue with query waiting stats which prevented job thread wait times from being added to GRenderThreadIdle.

  • Fixed a bug that caused skeletal mesh rendering to break in forward shading mode when switching from another anti-aliasing mode to Multi-Sample AA (MSAA).

  • Fixed a race condition where multiple threads access a shared FD3D12RayTracingShaderTable::TransientCBVs array. This was solved by giving each worker thread its own version of this array, similar to TransitionSRVs and other such members of the FD3D12RayTracingShaderTable.

  • Fixed an issue where Adaptive Virtual Textures weren't correctly invalidated for regions marked as dirty.

  • Reserve worker threads are taken into account when creating contexts for Windows D3D12 to prevent running out of contexts during heavy loads.

  • Fixed a bug that caused the skeletal mesh LOD to change unexpectedly in the Editor viewport with Realtime viewport update turned on. This bug occurred when 1) hovering the mouse over the level thumbnail in the Content Browser (with bAllowWorldThumbnails enabled in DefaultEditor.ini) and 2) when dragging a rotation axis in the Details panel.

  • Fixed asserts on D3D12 platforms that don't support mesh shaders by excluding mesh/amplification from EShaderVisibility on those platforms.

  • Changed creation of FSceneViewState to require the correct current ERHIFeatureLevel.

  • Added SM6 into RHI LexToString, and fixed a typo in SceneView's LexToString.

  • Resolved an issue where elements of the geometry cache index buffer in FGeomCacheIndexBuffer::Update were not always initialized. This prevents out-of-bounds access of Geometry Cache index and vertex buffers on GPU during ray tracing acceleration structure build (which causes a GPU crash). This change also clamps FRayTracingGeometrySegment.NumPrimitives to ensure that the index buffer itself is not accessed out of bounds. Note that this change does not address the deeper underlying problem that causes a mismatch between FGeometryCacheMeshBatchInfo.NumTriangles and index buffer contents, it only treats the down-stream errors.

  • RDGBuffer objects need to be destroyed with their TFunction members, which fixes a slow leak when using Buffer creation callbacks.

  • Fixed an issue with bilinear sampling of light shaft texture in exponential fog draw step sampling outside the valid region due to dynamic resolution.

  • Fixed velocities on static objects being moved by editor widgets, which in turn fixes Lumen Global Illumination and Temporal Anti-Aliasing.

  • UDIM blocks are sorted by X/Y location This is important when using composite textures, as they require the composite texture's UDIM layout to match the source layout. Previously, block order was partially non-deterministic/related to how the texture was imported, so composite textures didn't always work with UDIMs.

  • Planar reflection now has smooth specular transition. It will start to fade off at roughness= 0.2, and finish at roughness = 0.3 as expected.

  • Fixed incorrect height field data in Global Distance Field. Now, the height field is only included once the texture is done streaming/compiling.

  • Lumen reflection is now working on Mac.

  • Fixed Distance Field Ambient Occlusion ghosting happening in the mesh preview window.

  • Don't include objects with "Cast Shadow" disabled in Distance Field Shadows.

  • Fixed issues related to when "r.AOGlobalDistanceFieldCacheMostlyStaticSeparately" is disabled.

  • Fixed non-Nanite Static Meshes not rendering in ray tracing in some situations (for example, when FarField ReferencePos is changed).

  • Fixed Global Distance Field corruption when the scene only contains height fields.

  • Fixed incorrect Distance Field Shadows caused by invalid Signed Distance Field bricks.

  • Fixed broken HZB culling result readback.

  • Fixed incorrect indexing when building mesh Signed Distance Field culled tile data, which caused flickering and incorrect results in Distance Field Ambient Occlusion.

  • Fixed Nanite meshes not respecting "Cast Shadow" toggle when using ray-traced shadows.

Deprecated:

  • Deprecate project settings for Virtual Texture Compression. All virtual texture compression is now handled by Oodle. Only one remaining use case for crunch compression in Runtime Virtual Textures exists, but will be migrated to use Oodle RDO in the future to remove any old compression code.

  • Deprecated RHIGetResourceInfo in favor of FRHIResource::GetResourceInfo.

Removed:

  • Removed r.SkinCache.ForceRecomputeTangents. It can be achieved equivalently with r.SkinCache.CompileShaders=1 & r.SkinCache.Mode=1 & r.SkinCache.RecomputeTangents=1.

  • Removed r.SkinCache.Mode=2.

  • Permanently enabled r.DoInitViewsLightingAfterPrepass and removed its console variable.

  • Removed usage of "DataDrivenShaderPlatformInfo" from "ValidateShaderParameterTypes".

  • Removed deprecated Distance Field Global Illumination and Heightfield Global Illumination features.

  • Removed editor toggle to manually control Ray Tracing Far Field assignment. HLODBuilder internally sets the flag when necessary.

FX

New:

  • Wrapped FVectorVMContext in Niagara Data Interface Function Context for external functions to facilitate running an experimental VM in parallel. External functions should no longer access FVectorVMContext directly, and instead use the helper member functions in the Niagara Data Interface Function Context class. This should have zero effect without NIAGARA_EXP_VM defined. If it is defined, then it'll use the experimental VM functions.

  • Shader symbol generation and "debug info" generation was split into two different console variables. This allows shader symbol generation post-packaging without generating different shader variants. As a result, you can always generate symbols and still have the final unduplicated shader sizes.

  • NotifyShaderCooked was replaced with NotifyShaderCompiled to prep for upcoming non-cook symbol writing.

  • PC DXC shader compiles only generate debug info when requested, not all the time. PC FXC shader compiles only generate debug info when requested, not just when the console variable r.Shaders.Optimize is 0.

  • Added support for filtering categories by section in modules in the selection stack view.

  • Made some minor improvements to Niagara Debug Hud: system colors are now customizable and applied a fix for colored background tile width.

  • Niagara Components can now have their scalability disabled by Sequencer, which should allow for better reuse of game FX in events/cinematics without having sequencer and scalability fight each other.

  • Niagara components can now optionally check for some relationship with a local player pawn to disable scalability culling. This can help prevent overzealous scalability culling for important player FX.

  • Refactored Debug Hud to allow easier extension. Adding a mode setting for the overview. Now includes the following modes:

    • Overview for existing overview data.

    • Scalability for detailed scalability culling info.

    • Performance for global and per-system performance info. This info can optionally be viewed in table or graph form.

Crash Fix:

  • The editor no longer crashes when you undo changes to a Niagara System after closing the Niagara Editor.

  • Fixed a crash occurring in the Niagara Camera Data Interface when transitioning between levels on a listen server.

  • Fixed for crash when priming Niagara Pools for Systems that needed to be recompiled.

  • Fixed several crashes with undo/redo of edits that cause the system to recompile.

  • Fixed an issue where making a user parameter from a Data Interface input would sometimes cause a crash.

Bug Fix:

  • Fixed an issue where Simulation Stage data interfaces wouldn't update the simulation until a full recompile.

  • Fixed an issue where renamed Static Switches on NiagaraScripts would not preserve the value correctly in existing content.

  • Fixed an issue where an emitter would incorrectly fail to compile if it had the same name as one of the modules it contained.

  • Niagara emitter parent to child merging will now display any issues encountered during the merge in a message on the emitter. Also, it more correctly handles Static Switch inputs.

  • Fixed an issue in Sequencer when using the Niagara System Lifecycle Track where the system would sometimes be missing from the first frame of the Sequence.

  • Applied a fixed for the forward renderer incorrectly premultiplying transparent surfaces by alpha.

  • Fixed an issue with emitter parent to child merging where a renderer would show that it had local changes in the child even though no changes were made.

  • Added a bias to SubUV calculations to avoid errors when 1/ImageCount loses numerical precision (most significantly when it's half precision on mobile platforms).

  • Fixed issue where spawning empty Niagara Systems would cause a memory leak.

  • Fixed an issue where the color picker would immediately close when making an edit to a Color Override parameter on a Niagara Component.

  • Fixed an issue where new user parameters wouldn't be visible in Niagara Components in the world in cases where the system was able to get the compilation data from the DDC.

  • Fixed issue with Niagara Debugger Loop Mode that prevented it working with burst systems correctly.

  • Fixed an issue where initial expanded state set in Details Customizations was ignored when an object was displayed in the Niagara selection stack. Also updated the initial collapsed state to more closely match the Details panel behavior.

  • Event writes from event handler scripts now throws a compile error instead of crashing. Also removing Niagara's own Event Generator modules from the menus for event handlers.

Lighting

New:

  • Implemented Absorption support for refractive Translucent Materials in the Path Tracer. The absorption color for solid glass Materials can now be configured with a "Absorption Medium Material Output" node in the Material graph. It defines the color change after traveling through 100 units (1 meter) of the Material.

  • Added a "Path Tracing Quality Switch" node that allows customizing a shader's behavior for path tracing without compromising or needing to set up separate Materials for the standard raster path and path tracing.

  • Fixed unnecessary invalidation of Virtual Shadow Maps for dynamic primitives that are culled in the shadow pass. Most relevant case is in editor with the "arrow" gizmos causing invalidations even though they do not cast shadows.

  • Adding Landscape support for Lumen Software Tracing and Voxel Tracing. The console variable r.LumenScene.Heightfield.Tracing (default=1) enables software heightfield tracing for Lumen detail traces.

  • Enabled Distance Field Ambient Occlusion on the Medium scalability level as a fallback from Lumen Global Illumination for games using fully dynamic lighting.

  • Lumen now supports Material Ambient Occlusion. When the variable r.GBufferDiffuseSampleOcclusion is disabled (default), Material Ambient Occlusion is passed through GBuffer.GBufferAO directly and applied to Lumen Global Illumination. When the project has r.GBufferDiffuseSampleOcclusion enabled, ambient occlusion is encoded into the DiffuseIndirectSampleOcclusion, which is the only path that supports Material Bent Normal.

  • Reflection captures are now supported in projects that have Allow Static Lighting disabled for the project. This allows them to be used on Medium scalability when Lumen Global Illumination is disabled. ReflectionEnvironmentAndSky is now run on Reflection Captures to apply Movable Skylight. Movable meshes and lights are now rendered into Reflection Captures.

  • Controllable Lumen settings have been added to the following:

    • Project Settings:

      • Ray Lighting Mode to set project-wide control for ray lighting quality.

    • Post Process Volume:

      • Lumen Scene Lighting to drive Radiosity gather quality.

      • Lumen Scene Detail that drives Lumen culling aggressiveness.

      • Lumen Scene View Distance to control the distance from the camera that Lumen Scene will be maintained.

      • Lumen Scene Lighting Update Speed that drives Radiosity gather convergence speed.

      • Final Gather Lighting Update Speed that drives Final Gather temporal accumulation speed.

      • Max Trace Distance that sets the distance that Lumen features will trace through the scene.

      • Ray Lighting Mode for local control for ray lighting quality.

    • Primitive Component

      • Emissive Light Source to provide a hint to Lumen that the mesh has an important lighting contribution and should not be culled.

  • Added Lumen scalability options to the existing Global Illumination and Reflections engine scalability options. Lumen GI and Reflections works on Epic and High settings only.

  • Lumen foliage over-occlusion was reduced by adding a Coverage channel to the Global Distance Field.

  • Lumen now supports the Two Sided Foliage shading model. Two Sided Foliage is treated like Subsurface, meaning there is no separate lighting gather on backfaces, and Subsurface Color is added to Diffuse Color. The Editor viewport shows a Scalability warning for anything other than Epic, whereas previously it was shown only for levels lower than Epic since Cinematic runs at a lower framerate.

Improvement:

  • Improved performance of the Path Tracer by implementing path compaction to keep GPU lanes more fully occupied as rays bounce around the scene. The idea here is to break up the bounce loop in the path tracer into independent launches so that active paths can be grouped together. This is done with wave ops plus atomics. This implementation renders scene with the path tracer up to two times faster in most scenes.

  • Improved shadow terminator of bump/normal mapped surfaces in the Path Tracer.

  • Improved path tracing denoising results behind sharp reflections and refractions.

  • Improved several self-intersection behaviors in the Path Tracer.

  • Reduced the likelihood of timeout detection and recovery (TDR) occurrences for the Path Tracer on Windows.

  • Raised the quality of Lumen Final Gather when in the Cinematic scalability level.

  • Improved Lumen Radiosity gather with spatial and temporal reuse.

Bug Fix:

  • Fix incorrect geometric normals on path-traced geometry with World Position Offset (WPO) Materials.

  • Fixed an issue where Material Instance changes were not causing path tracer to restart accumulation.

  • Fixed Foliage instances appearing single sided in ray tracing even when the Material is two sided.

  • IES Profiles light complexity now works correctly for lights.

  • Fixed Virtual Shadow Map invalidation issue with boxes parallel to light's near plane. This is most often encountered with Point Lights and axis-aligned boxes in the scene.

  • Fixed a bug to avoid constant path tracer invalidations when PostProcess or UI Materials are being changed as they cannot have an impact on the lighting calculations.

  • Fixed a bug that made the path tracer unable to be toggled through the show command in game viewports.

  • Fixed several virtual shadow map issues when using Large World Coordinates and scenes far from the origin.

  • Fixed a bug where light components fail to propagate certain property changes from Sequencer.

  • Path tracer updates now work over nDisplay and in the editor's picture-in-picture camera previews.

  • Using two sided subsurface Materials with opacity equal to 1 has a somewhat ambiguous physical meaning, so this ensures this is desired versus a lower opacity value. We normal opacity by clamping between classic and virtual shadow map paths. Opacity is clamped to a value slightly less than 1 which causes back faces of two side geometry to not be shadowed now consistently between the two paths.

  • Fixed issues relating to Volumetric Fog results in Reflection Captures not appearing correctly. Added a new console variable 'r.ReflectionCapture.EnableLightFunctions' that enables/disables light functions from appearing in reflection/sky light captures. Disabled by default.

  • Fixed missing light attenuation decoding on forward/mobile code paths, which resulted in incorrect shadows.

Removed:

  • Changed the name of the Lumen Max Trace Distance console variable from r.Lumen.MaxTraceDistance to r.Lumen.MaxTraceDistanceScale.

  • Removed tiled deferred rendering path as it was superseded by the more general clustered deferred path. This change is prompted because features are increasingly being added to the clustered shading path, such as support for single pass evaluation of multiple lights with Virtual Shadow Maps. In the future the clustered shading path may be enabled by default (r.UseClusteredDeferredShading 1).

  • Removed Geometry Shader path for Point Light shadow rendering that disables Point Light shadows if Vertex Shader Layer is not supported (at runtime).

Materials

New:

  • Implemented BxDF energy conservation for the Path Tracer.

  • Added UI for Custom Primitive Data on primitive components that shows each CPD's parameter name as defined in the Material, a color picker (if a vector parameter), warnings for mismatched parameter names, soft warning for undeclared parameters, and a hyperlink that takes user to the owning node in the Material Editor when the parameter name is clicked.

  • Added Blueprint methods for setting scalar and vector values by parameter name on Custom Primitive Data (CPD) and "get index for scalar/vector parameter name" methods. Will prioritize CPD index based on first parameter name found on assigned Material. This makes it conceptually easier for developers to assign CPD values to components like they would a normal Material parameter, but with all of the benefits of CPDs.

  • When the On-Demand Shader Compilation (ODSC) system is processing shader compile results on target, the render state for primitives needs to be recreated to ensure it updates draw commands, which are caching uniform buffers. It also needs to ensure systems which cache data regenerate their results (for example, Lumen). This negatively impacts performance when processing results, but it is necessary work.

  • Added Blueprint-callable functions to Material Parameter Collections to get Scalar and Vector parameter names, get and set default values, and convenience methods to Material Parameter Collection to get parameter indexes by Name.

  • The console variable r.vt.FeedbackFactor that is used to control the size of the VT feedback buffer can now be changed at runtime, no longer requiring restart or shader recompile to happen.

  • Text Render Components now allow use of Decal Materials.

  • Added a Runtime Virtual Texture Sample mip mode that ignores the World Position input in a Material. It calculates the mip based on derivatives of actual world position instead, and gives the same result as 'Default' when no World Position input is used. The use case for this mip mode is when a constant value is being piped into WorldPostion, that happens for things like picking a constant color from an RVT for grass. Without the new mip mode, the engine always computes a mip value of 0 which can be very heavy on the physical texture pool.

  • Added support for setting Runtime Virtual Texture parameters from Blueprint for both Dynamic Material Instances at runtime and Material Instances in editor Blueprint.

  • Static terrain layer weights are no longer treated as Material parameters. They are automatically assigned from The Landscape Component's "Get Combination Material" function, but after that there's no reason for any kind of Material parameter tracking/processing on them. This removes a bunch of code and simplifies/speeds up some logic.

  • The way Material Layer parameters are processed was updated:

    • Previously, parent Material Instances would attempt to remap layer indices, and cache the updated parameters in the derived-material instance's cached data. This worked to some degree but did not cover all cases. Now Material instance overrides are never cached and instead each instance maintains a table to remap layer indices for its parent. This remapping occurs on parameter lookup.

    • Previously, enabling Material Layers sent runtime parameter queries down a slow path, since the default parameter values stored on the shader map were not reliable. This issue has been resolved. When compiling a Material, the default value from the Material Expression is not automatically used any longer. Instead, the current Material Function (which may be a Blend Instance, Layer Instance, or regular Function Instance) is given the chance to override the parameter value. This way, the "correct" default value is now baked into the compiled output. Special code for checking default parameters is no longer required at runtime, which should remove the previous performance tax from using Material Layers.

  • Extended Material Parameter Metadata with Group, SortPriority, and Description. Cache this data inside FMaterialCachedData. UMaterialInterface methods to query this data become non-virtual, instead it's just returned along with other Metadata when accessing the parameter value. The parameter group caching mechanism inside PreviewMaterial.cpp has been removed, it is no longer needed since group lookup now comes "for free" along with other relevant parameter data.

  • Material layer "stacks" (FMaterialLayersFunctions) are no longer considered static Material parameters. APIs/data is changed to reflect the fact that a given UMaterial(Instance) can only have a single layer stack (or no layer stack). This removes some usage of slow/legacy APIs, which should help speed up editor/cooker performance (some additional changes/refactors are likely needed to fully take advantage of this). Lastly, layer stacks as parameters is legacy technical debt from an early iteration of the Material Layer system that did support multiple stacks.

  • Refactored and cleaned up Material Parameters with the primary goal being to reduce the amount of code duplicated across different parameter types, and reduce the amount of boilerplate required to add new parameters. There are new types FMaterialParameterValue, and FMaterialParameterMetadata (both in MaterialTypes.h).

    • FMaterialParameterValue contains a value, along with various editor-only fields that describe how that value is being used. Using this new type, many places that previously included separate APIs for each parameter type collapse to a single API that operates on FMaterialParamterValue/FMaterialParameterMetadata.

    • Code that previously had a black copy/pasted for each parameter type can be replaced with a loop that iterates over all parameter types.

    • This change also includes some API cleanup that should improve editor performance. Previously, the APIs had GetAllScalarParameters, GetALLVectorParameters, and similar others which would return a list of FMaterialParameterInfos for each one of the given type. Code would often query all parameters, then loop over the results and look up each parameter value. Now, with the new API, GetAllParametersOfType returns a list of all FMaterialParameterMetadata of a given type and collects the values at the time the list of parameters is being built. This saves the work of looking up each value individually.

Improvement:

  • Move Material Layer names to FMaterialExpressionCacheData which optimizes accessing layer names (remove previous ad hoc caching scheme), and should allow layer names to be properly stored for Material Layers as well.

Bug Fix:

  • Fixed an issue where landscape and water meshes would not update after forcing an update to them. With on demand shader compilation enabled, there are some scenarios where you do not want to rely on rendering to inform you of what shaders need to be compiled. Specifically scenarios where Materials are used to generate content, such as landscape brushes, thumbnails, scene captures and so on. In these situations, the engine should explicitly compile all shaders and call SubmitCompileJobs which is a straightforward way of compiling missing shaders from a map. Note that FMaterial::CacheShaders does not support this behavior and is too risky to change. Also, SubmiteCompileJobs supports being called multiple times and will not re-compile more shaders.

  • MipLevel sample mode now works when sampling an Adaptive Virtual Texture.

  • Fixed Virtual Height Field Mesh disappearing when used with a Material using Translucent or SingleLayerWater.

  • Fixed interaction between Material Layers and Material Quality Level Switches.

  • Material Instances with layers don't generate their own shaders, unless their layers are different from the parent Material.

  • Resolved an issue where Material Dot expressions allow mixing inputs with different numbers of components.

  • Resolved an issue preventing Material Function Instances from correctly handling parameter overrides when the Material Function INstance has another function instance for a parent.

  • Material autogen derivative code matches coercion logic of legacy code for min/max operations.

  • Fixed "Get All Parameters of Type" so that less-derived instances don't override parameter values in more-derived instances.

  • Ensure Material curve parameters caches the correct value (index of the curve in the atlas), which may not be correctly reflected in the expression's Default Value.

  • Removed a check function for input type to Material CrossProduct (Cross), allowing casting any input type to float3, so that it matches legacy behavior.

  • Resolved an issue where Material Instance parameter overrides are supposed to be ignored for nullptr textures.

  • Material Power expressions result type is driven by left-hand-side input only.

  • The Material transform expression is supposed to accept a scalar input value when input is tangent space. This was changed to accept both MCT_Float and MCT_Float1, rather than just MCT_Float1. Most places that generate scalar values use the MCT_Float type.

Removed:

  • Removed the dipole parameterization for Separable SSS in Subsurface Profile. All separable SSS parameters are automatically upgraded to Burley. Add Tint to Burley's profile (the same to the original Subsurface Color). It introduces the capability to add non-physically-based rendering into an SSS profile. You can stay within the bounds of physically based rendering by using the default value (white).

Mobile Rendering

New:

  • The mobile deferred and forward lighting calculations are now unified.

  • Added an option to use high quality BRDF on mobile, same as with PC.

  • If a light shading model is not supported on mobile, it will now fall back to the default light shading model.

  • Use EnvBrdf for mobile deferring lighting pass.

  • Mobile now supports the Subsurface and PreIntegrated Skin shading models. Subsurface Profile shading on mobile uses preintegral burley diffusion on ring, just like the PreIntegrated Skin but could be generated at runtime based on Burley inputs.

  • Vulkan now uses G8 format for mobile Ground Truth Ambient Occlusion (GTAO). Enabled mobile AO and PPR on high-end mobile devices.

  • Added support for Mobile Deferred Rendering mode on Android OpenGL ES.

  • Integrated Signed Distance Fields to Mobile Deferred Renderer.

  • Added GL_MAX_TEXTURE_BUFFER_SIZE to OpenGLES.h to not depend on the extension GL_MAX_TEXTURE_BUFFER_SIZE_EXT.

  • The variable r.MobileNumDynamicPointLights is now read from the platform .ini file instead of from the project console variable. The console variable r.MobileNumDynamicPointLights was added to the shader keystring.

  • Disabled Parallel RDG for Mobile Platforms from the RenderGraph.

  • Hair Materials now directly use the Hair Shading Model instead of doing so with a FeatureLevelSwitchExpression, improving hair Shading Model support on mobile.

  • Added support for a Skin Cache on mobile platforms.

  • Set Fast Approximate Anti-Aliasing (FXAA) quality to 0 on mobile platforms by default.

  • Added an option for projects to disable support for per-pixel Material shading models on mobile platforms. Use the console variable r.Mobile.AllowPerPixelShadingModels=0.

  • Account for Reflection Capture influence radius when finding closest capture for an object. Fallback to skylight reflection when there are no influencing Reflection Captures on mobile platforms.

  • Removed perspective correct shadow depth shader permutation when its not required on mobile platforms

Improvement:

  • Removed NoLightMap shader permutation for Materials that are not using it on mobile platforms.

Crash Fix:

  • Fixed a crash on mobile while rendering custom depth primitives that require scene texture access.

Bug Fix:

  • Fixed an issue where the brightness of the Reflection Captures couldn't be changed at runtime on mobile.

  • Fixed the specular artifacts that would occur on Snapdragon 845 devices.

  • Disabled mobile MSAA if DepthFullPrepass is enabled.

  • Fixed an issue where depth was not stored with fullprepass enabled.

  • Fixed an issue with incorrect depth stencil access flag in mobile multi-view rendering.

  • Integrated mobile Static Lighting when Distance Fields are enabled.

  • Enqueue FrameSyncEvent ReleaseResource on the Render Thread when in the RHI thread in OpenGLViewport.

  • Resolved a Depth issue with Editor Primitives in Mobile Preview.

  • Implemented a Binary Cache fix for the Compute shader and fixed calculation of ShaderLib Processing time.

  • Fixed a bug that caused Editor to stall in the Material Editor while in Mobile Preview.

  • Fixed Custom Stencil and Depth on mobile by making them not always memoryless. This changes the logic back to the way it was implemented in SceneRenderTargets.

  • Resolve issues with texture mip generation at runtime on Android devices running Vulkan.

  • Resolved an issue preventing PerlinNoise3D texture from correctly initializing on mobile platforms.

  • Allow access to CustomDepth and CustomStencil textures in Decal Materials for mobile platforms.

Removed:

  • Removed IsMobileDistanceFieldShadowingEnabled.

  • Removed the shader define MOBILE_PROPAGATE_ALPHA, and temporarily removed premultiply alpha. FXAA luminance calculation was moved from the tonemapper to FXAA when MobilePropagateAlpha is enabled.

  • Removed the OpacitySceneCapturePass from MobileSceneCapture since Depth is now stored in a different Render target. Moved everything to the shared SceneCaptureRendering file and removed MobileSceneCapture.usf.

Nanite

New:

  • Moved all Nanite defines shared between C++ and shaders into a common header file, removing all the "keep this define in sync with this file" cases all over the code. This makes the code a lot more maintainable. Common definitions now have a NANITE_ prefix to disambiguate global symbols.

  • Changed the name of the Nanite Proxy mesh to Nanite Fallback mesh. Fallback settings are now largely error based with a new property FallbackRelativeError. Nanite builder now provides the LOD fallbacks for all auto-generated LOD levels, which is far faster than generating them from scratch.

  • Added KeepTrianglePercent and TrimRelativeError properties to the Nanite static mesh settings. These properties trim detail from the Nanite data that is stored to disk, and can be used to optimize disk size after import. This is useful toward the end of production.

Improvement:

  • Optimized Nanite by streaming directly from DDC when running in editor, which eliminates the need for memory copy.

  • Optimized Nanite with several minor changes that result in 10-20% faster Nanite rasterization and culling.

Crash Fix:

  • Fixed a crash when importing a Nanite mesh with texture coordinates that are unreasonably large or contain floating point specials.

  • Fixed a crash that would happen when importing flat Nanite meshes.

Bug Fix:

  • Fixed an issue where Materials with pixel depth offset would cause severe visual artifacts when applied to Nanite meshes.

  • Fixed a bug where Nanite streaming would sometimes fail to settle on nDisplay setups.

  • Fixed edge artifacts when using lightmaps, shadow mask, or ambient occlusion with Nanite meshes.

Optimizations

New:

  • BlueNoise texture is loaded on demand, which saves around 2.6MB when not running with Lumen Reflection or Lumen GI.

  • Moved InstanceUpdateCmdBuffer from UPrimitiveComponent to UInstancedStaticMeshComponent. It is only used by the derived class so this code is safe. It saves 48-bytes (40-bytes from the removed member and 8-bytes of padding).

  • On Demand Shader Compilation (ODSC) - Only compile shaders that are used to draw instead of compiling every shader in each Material's shader map on PostLoad. This is an experimental feature that is still being developed. This change ensures the editor only compiles shaders it needs to render, resulting in approximately 60% less shaders being compiled and faster start-up times for the editor when opening maps.

    • This feature is disabled by default. Enable it with r.ShaderCompiler/JobCacheDDC 1.

  • Added a new transient allocator implementation supporting PC and consoles with Render Dependency Graph (RDG) integration.

  • Added parallel recording of Render Dependency Graph (RDG) pass execution onto command lists.

  • Enabled Vulkan fragment shading rate functionality when supported.

  • Added an option to render Distance Field Shadows using async compute. This also fixes an issue where a ray traced distance field Projected Shadow Info is rendered for all views instead of just its dependent view.

  • Added a NoRef Streaming LOD Bias setting for Static and Skeletal Meshes, which is a LOD bias that is only applied when a mesh doesn't have any component reference. The default value is -1, which means it uses the value of "r.Streaming.DefaultNoRefLODBias." When the console variable is greater than or equal to 0, then the specified value is used. The setting is implemented as a per-quality level variable so that users can specify different values for different quality levels. Quality levels can be selected by using the console variable "r.Streaming.NoRefLODBiasQualityLevel" under the ViewSitanceQuality sections in platform scalability configuration (*.ini) files.

  • Added attachment variable rate shading (VRS) for Vulkan. It goes through all required stage flags, access masks, layouts, renderpass attachments, and so on for the VK_KHR_fragment_shading_rate extension. The logic used to gather VRS properties (tile size, data type/format) have been fixed up. Also, a templated version of VkFragmentShadingRateAttachmentInfo is attached to renderpasses where supported and when attachment is provided.

  • Added the ability for UAVs to be mergeable between AsyncCompute and Graphics pipelines to allow compute shader overlap between them.

Improvement:

  • All DebugViewMode shaders have moved into a single shader, DebugViewModePixelShader.usf, and are dynamically picked based on a uniform. If you've added your own debug shaders or have modified one of the existing debug viewmode shaders, you will need to make similar changes to the DebugViewModePixelShader.usf file.

    • Removes FComplexityAccumulatePS, FLODColorationPS, FRequiredTextureResolutionPS, FMeshTexCoordSizeAccuracyPS, FPrimitiveDistanceAccuracyPS, FMaterialTexCoordScalePS

    • All shader code is now contained in DebugViewmodePixelShader.usf. Individual visualizations are contained within separate functions.

    • All the C++ interface code has now been folded into a single implementation.

    • Previously each implementation kept track of its name, and whether it needed local VF, if it needed Material properties and needed instruction count. Since every implementation is in the same shader we need all those features. To simplify the code all this has been removed.

    • We only keep track of a single FDebugViewModeInterface singleton to use for all debug modes.

  • Implemented D3D12 Shader improvements.

    • Duplicate D3D12 shader data and runtime code was consolidated to help with maintenance.

    • Platform specific code and data was reorganized to reduce overhead on platforms that didn't need it.

    • Moved FShaderCodeFeatures booleans into the bit flags EShaderCodeFeatures and added more D3D12 feature flags.

Bug Fix:

  • Fixed D3D11 hitches caused by unpaged memory returned from the Map. This was solved by having UnifiedBuffer create brand new resources instead of updating existing ones.

  • Fixed longstanding excessive stalls on RenderThread where the RHI thread would not yield fast enough on Windows.

Deprecated:

  • Added a new console variable r.VelocityOutputPass to replace r.BasePassOutputsVelocity. If you were using r.BasePassOutputsVelocity=0, the equivalent setting is r.VelocityOutputPass=1. In both cases, it is recommended to use a r.VelocityOutputPass=0 and only revert to the old behavior if you encounter issues.

Removed:

  • Removed deprecated "Set Shading Rate Image" functions that were marked as deprecated in Unreal Engine 4.27.

Postprocessing

New:

  • Improvements to eye adaptation (auto exposure) readback that cause it to always readback the most recent available exposure value and use a variable number of readback resources to prevent overwriting inflight requests.

Bug Fix:

  • Fixed an issue with the post processing sequence of the after-pass system to allow chaining multiple passes in the same location.

  • HighlightsMin values greater than 1.0 are now allowed by the Editor. A new parameter was added called HighlightsMax, which helps define the transition region from Midtones to Highlights in a way that allows high brightness pixels (>1) to be considered Highlights.

  • Fixed an issue causing the Auto Exposure toggle in Project Settings not to work.

UnrealLightmass

Crash Fix:

  • GPU Lightmass no longer crashes when debug mode is enabled.

Sequencer

New:

  • Added different clock sources when recording with Take Recorder, including specifying the default Recording Clock Source in the Project Settings.

  • Added command to snap sections within the Sequencer timeline according to their TimecodeSource property.

  • TimecodeSource will now be set when creating new skeletal animation sections in Sequencer with custom timecode bone attributes.

  • Clicking or dragging MMB in the Sequencer timeline will move the Playhead to that time but not evaluate Sequencer, allowing you to key the current state at that new time.

  • Added command when right-clicking on Control Rig sections for collapsing/baking all sections to a base section.

  • Added command when right-clicking on on additive Control Rig sections where you can set Zero or One keys or weights.

  • Subsequences and skeletal animation tracks now use the desired frame display format and zero padding from the sequencer settings.

  • Basic setting classes can now be created in Blueprints by inheriting from MoviePipelineSetting_BlueprintBase. This allows for creating custom properties that will be visible in the job configuration and can be fetched in a custom burn in.

  • UMovieSceneSequencePlayer::PlayTo API now supports inclusive or exclusive time to be specified.

  • MoviePipeline: Added DWAA and DWAB compression methods for multi-layer-enabled EXR's.

  • Added Remove Root Option to Take Recorder settings so that you can specify whether to include root motion in the sequence when recording.

  • Added support for {project_dir} as a Movie Render Queue format string so that export paths can be made relative to the project instead of the engine.

  • Added an experimental panoramic capture Render Pass to Movie Render Queue which should support temporal sub-sampling. This is enabled from the Movie Render Queue Additional Passes plugin.

Improvement:

  • TimecodeSource in Take Recorder is now better handled to prevent inconsistent Timecode values when recording and processing different Takes.

  • Moved TimecodeSource property from UMovieScene to now be stored on UMovieSceneSections.

  • The FMovieSceneTimecodeSource struct is now defined in MovieSceneSection.h instead of MovieScene.h.

  • Movie Render Queue now produces a warning when the Override Frames setting is used to create a zero length range, such as [0, 0].

  • Matinee actors upgraded to Level Sequences will have their sections set to 'Keep State' to more closely match original Matinee playback.

Bug Fix:

  • Fixed an issue with Sync Sections using Source Timecode so that trimming and other edits are now accounted for.

  • Restore State now correctly works for Control Rig sections and tracks.

  • Fixed a scenario where Movie Render Queue would fail to detect shots when a Subsequence had a start offset that pushed the evaluation range completely outside of the original playback bounds.

  • Fixed an issue in UMovieSceneSequencePlayer::PlayTo which caused events and other setup from frames after the current time to be triggered during low framerate situations.

  • Fixed Movie Render Queue's png output from having a speckled alpha channel caused by image quantization.

  • Updated Movie Render Queue example python scripts to use UMoviePipelineQueueSubsystem so that Sequencer's 'Auto-bind to PIE' setting does not cause duplicate objects while rendering.

  • Fixed several instances where auto tangents were not being set correctly in the Curve Editor.

  • Fixed FIntermediateColor not converting correctly from FColor.

  • Movie Render Queue's Job Author field can now be left blank and it will default at runtime to the local user name. This fixes an issue where loading a queue saved by another user would use the previous user name as author, and not the user who was actually running the job.

  • Fixed {shot_name} or {camera_name} format strings resolving into an incorrect folder name when clicking the hyperlink in the Output column.

Removed:

  • The Motion Trail plugin has been replaced by the new Motion Trail Control Rig plugin.

Tools

New:

  • Added support for UObject scopes to be reported to Unreal Insights when namedevents are enabled.

  • Added a CsvCategory command in the engine that provides the capability to change the active CSV categories. The syntax to use it is CsvCategory <CategoryName> [Enable/Disable] (toggles if the second argument is omitted).

  • Created new WorldPartitionRenameDuplicateBuilder class that provides capability to Rename or Duplicate a WorldPartition map without loading it all at once.

  • Created a new WorldPartition: Foliage builder class that provides the capability to change grid size.

  • Replace References can now consolidate different subclasses of a UPhysicalMaterial together.

  • Added a "minimum" formula to summary stats, to use for shared memory.

  • Introduced Screen Reader and Slate Screen Reader plugins to Win64, Mac, Linux, IOS, Android, PS4, PS5, XboxOne, XboxSeriesX, WinGDK and Switch platforms.

  • These plugins provide developers with C++ and Blueprint tools to provide blind end-users an accessible means of navigating around UI elements. These plugins can be used to comply with CVAA requirements. This feature is still experimental.

  • Added DeveloperSettingsBackedByCVars as a base class for developer settings which contain one or more variables with ConsoleVariable metadata.

  • Output log category improvements. You can now choose to color-code entire log lines by category, or just by the category itself (located in the CategoryColorizationMode in the editor appearance settings). You can choose to highlight all messages for a particular category by right-clicking on a line.

Improvement:

  • Updated the Server CSV ReportTypes with improved categories and colorization.

UnrealVS

New:

  • Updated VSIX for 1.62.

  • Implemented a RunningDocumentTable and created an onSave callback to cover all edit/save operations.

  • Updated new version 1.62 of assembly info.

  • Added a new annotate command.

  • Enabled warnings as errors.

  • Added further hooks for operations that require a checkout before being saved.

  • Added a UBT menu add CompileSingleFile and PreprocessSingleFile.

  • Converted the ReconcileExtensions function to use local paths.

  • Added option to allow async checkout.

  • Added UpdateInstructions command for future engineers.

  • Added library to respond to C# feedback.

  • Added functionality to the PreprocessOnly to publish the output file path to the log used by unrealVS.

Improvement:

  • Improved coding guidelines and fixed Diff titles.

Optimization:

  • Moved CompileSingleFile back into the stub menu allowing UnrealVS.CompileSingleFile. Added all other commands into the same stub which provides a simple commandline/binding mechanism.

Bug Fix:

  • Resolved a bug that occurred when running many commands at once.

  • Resolved issue where Checkout on Edit was not honoring the user option.

UI

New:

  • SlateInsights now shows SWidget::Paint events.

  • Added the LayerId to the WidgetReflector.

  • Added a context menu in Slate Insights to search for the selected widget. This provides information about the lifetime of the widget.

  • Added a menu in the WidgetReflector to display the different runtime validation test.

  • Added a menu with timing for each SWidget update to SlateInsights.

Bug Fix:

  • Added null check for Game Viewport in FCommonAnalogCursor::HideCursor.

  • Removed an ensure in MarkPartyMemberAsDirty as it is valid to have a nullptr SocialUser in the event that the local user is logged out. When logging out of an account, the SocialToolkit clears the 'UsersBySubsystemIds' map which is used to find users with FUniqueNetIdRepl.

  • Fixed the settings of SColorPicker.

Slate

New:

  • Add test to see if widgets have a valid LayerId. You can enable this with Slate.VerifyWidgetLayerId.

  • Added a W component to SVectorInputBox.

  • Upgraded some SWidgets to use TSlateAttribute (SExpanderArrow).

  • Upgraded some SWidgets to use TSlateAttribute (SExpandableButton, SFxWidget, SRadialBox, SSafeZone, SSplitter, SUniformGridPanel, SUniformWrapPanel).

  • Added the 'Source' name to the tooltip in the Widget Inspector, as the tooltip often covers up the source name.

Crash Fix:

  • Fixed a crash related to text glyphs accessing invalid memory.

Bug Fix:

  • Fixed unused SLATE_ATTRIBUTE arguments:

    • STextEntryPopup

    • SSuggestionTextBox

  • Previously, right-clicking outside of the current selection in editable text boxes would fail to update visuals, so menu options would appear broken or disabled. This issue is resolved by deselecting the text box and moving the cursor to the right-click location. This matches the behavior of text boxes in other environments.

  • Fixed a division by 0 error in UniformWrapPanel layout code.

  • Previously log colors such as Log Highlight, Log Text, and Log Command would not be available to programs other than the Editor. These are now available.

  • Fixed the Overlay ZOrder and ConstraintCanvas ZOrder in invalidation. The child widgets' order needs to match the order they are painted in for the Global Invalidation to work.

  • Fixed SWidgets that were not incrementing their LayerId correctly.

  • Fixed all mouse inputs being offset when fullscreen at resolutions that were not the same ratio as the native screen resolution.

  • Removed unnecessary error warning firing when dragging in widget archetypes derived from C++ UserWidgets. Warning no longer relevant with changes to widget template generation.

  • Fixed issues with scrollbox padding not applying if padding was less than width of scrollbox.

  • Added additional glyph logging. Speculative fix skip glyph if invalid or not visible.

  • Fixed 5.0 regression where transparent buttons got UI borders where they were not present before.

  • Fixed SSugestionBox failing to update with newly entered text properly.

  • Fix SSuggestionTextBox not closing the suggestion list when the user clicks outside it.

  • Fixed an issue where tall menus would jitter at certain applications' scales.

  • Fixed an issue where menus would flash white briefly at certain resolutions / applications scales.

UMG

New:

  • Added a function to change keyboard type: UEditableText::SetKeyboardType.

  • Added bCurrentlySwitching variable and const getter to UCommonAnimatedSwitcher.

  • Added DisableNativeTick metadata to UCommonActivatableWidget.

  • Exposed the Slate overflow policy to UMG RichTextBlock

  • Enabled Widget Library by default. Fix widget library locking up when scrolling edge is just before a new asset view.

  • Added CommonUI functionality to better support blueprint-only workflows.

  • Added functions to bind visibility to widget activation. This exposes GetFocusTarget on activatable widgets to Blueprint.

  • *Bug Fix:** Fixed warning when using default back actions. Since we no longer use CommonActivatablePanel.

  • Added Animation drawer to UMG editor. This can be opened from the hotkey Ctrl+Shift+SpaceBar.

  • Implemented GetOptions restrictions for gamepads.

  • Added ability to select CommonUI gamepads via dropdown.

  • Added limited support for gamepad type autodetection based on any active FInputDeviceScope

  • Allow Selection of base class for Widget Blueprint.

  • Fixed Common button group disabling buttons unnecessarily.

  • Removed CommonUI widget samples in favor of content examples.

  • Added GetChecked and HasVisibilityTag helpers to UCommonUIVisibilitySubsystem.

UMG

  • Added URichTextBlock::RefreshTextLayout method to support refreshing text layout on demand.

  • When creating a new WidgetBlueprint, it will no longer add a Canvas Widget at the root of the Hierarchy and let the user choose to add one instead.

Common UI

  • Added limited support for gamepad type auto-detection based on any active FInputDeviceScope. You can define the detection criteria in gamepad assets. This is limited because XInput can't distinguish between different controller types (other plugin sources will still work), so to preserve the ability to set a preference in Project Settings, the logic prefers to stick with an existing match rather than switching to something else. Otherwise it will prefer the first match found in the controller asset list.

UMG

  • Added a Wrap Widget operation in the Hierarchy to support wrapping multiple widgets at the same time. When selecting widgets that are not all in the same branch of the tree, each group of widgets in a specific branch will be wrapped in a different wrapper Widget.

  • You can now use keyboard arrow keys to move Widgets that are in a Widget Panel, such as Horizontal Boxes, Vertical Boxes, and Grids. For example a user can select an element in a Grid and move it to another cell in the specified direction in the Grid.

Common UI

  • Reworked and re-named hardware features into platform traits. This consists of the following changes:

    • Changed various references from Hardware Featureto Platform Traits. This includes the tag namespace, which is now "Platform.Trait."

    • Added the ability for games to enable or suppress tags debug globally using SetDebugVisibilityConditions.

    • The PlatformHardwareFeatures setting is now called PlatformTraits. It is an array of tags instead of a tag container to allow for .ini inheritance to work, which doesn't work correctly in the current config hierarchy editor. This will be improved in a future release.

UMG

  • Added UAssetActionUtility to Picker Common Classes.

Crash Fix:

  • Fixed 5.0 regression where drag drops in the UMG hierarchy would result in a crash.

  • Fixed a crash that can happen when an Editor Utility Widget asset is deleted while it is in use.

Bug Fix:

  • Implemented a fail-safe check in DynamicEntryBoxBas::AddEntryChild.

  • Fixed missing add keyframe button that was missing in the UMG editor.

  • Fixed widget spinboxes font foreground color.

Common UI

  • When you re-name a widget in UMG Designer, you can now change from a generated name back to its original name.

  • Previously, UMG could make all widgets in a Widget blueprint invalid when using undo on a Replace Child operation. This issue has been fixed.

  • You can now select Abstract Classes as a base for a UserWidget.

  • Fixed an issue in EditorUtilityWidgetBlueprint that prevented the World from being marked dirty when opening or changing a property on the EditorUtilityWidget object.

  • Fixed crash when calling Add Item on a List View in PreConstruct of an Editor Utility Widget. UListView doesn't support duplicate or null items, and adding either causes a crash. We now report a warning and stop the erroneous input from crashing.

  • Fixed regression that caused animations to be re-evaluated for widgets that were not ticked.

  • Fixed issue where editor utility widget style changes would not save correctly.

Virtual Production

New:

  • Added a Tools menu to Switchboard which has shortcuts to launch Unreal Insights and a local Switchboard Listener.

  • Created the CVAR nDisplay.render.show.visualizationcomponents for toggling the visibility of visualization components in nDisplay renders.

  • Provided a CVAR Preset for CVARs used commonly on Virtual Production stages by stage operators.

  • OpenColorIO in Unreal Engine now has in-editor support for Mac and Linux.

  • When capturing traces, Switchboard automatically enables vblank monitoring, which adds vblank bookmarks to traces for nDisplay. You can also enable this functionality for traces with bookmarks captured outside of Switchboard with the CVAR nDisplay.sync.diag.VBlankMonitoring.

  • Updated the OpenColorIO library to version 2.1.

  • Added an option in Switchboard to disable handling ensures in nDisplay. Ensures are non-fatal but when they happen it can cause hitches and issues during a shoot. We are now disabling them by default, but you can choose to enable them for debugging purposes.

  • You can override the render sync policy of an nDisplay cluster in Switchboard now. There is also an option to use the sync policy specified in the nDisplay config file, so you can use custom sync policies.

  • Added option to rebind all properties exposed to Remote Control Preset for an Actor.

  • Added option to rebind a property exposed to Remote Control Preset on a different Component.

  • Stage Monitor now has an activity filter for max age.

  • Stage Monitor settings, such as filters, are now saved.

  • Made Text3D more accessible to Blueprints by allowing access to underlying kerning and mesh components and removing the final keyword from public headers.

  • Moved OpenCV library and helper module into its own plugin.

  • Added Provider Role filtering to Stage Monitor activities.

  • Updated OpenCV library to version 4.5.5.

  • Added option to export a ULensFile Asset to a .ulens file so you can use your created ULensFiles in other projects.

  • The OpenCV library now supports Linux.

  • Added Live Link transaction filter for improved Multi-User setup workflow.

  • You can now optionally set the image dimensions for a LensData Asset. Note that these are not essential for current virtual production workflows.

  • Live Link VCAM iOS app now supports multitouch. Users can operate multiple elements on the Remote Session at the same time.

  • The Level Snapshots plugin content now includes default Level Snapshot Blueprint Filters.

  • UDP and TCP messaging now support hostnames in addition to IP addresses.

  • Main Switchboard UI now has start and stop controls for the Multi-User Server.

  • You can now transact the metadata for Takes over Multi-User.

  • Added a quick access setting to Switchboard so you can configure Unreal Insights and enable captures.

  • You can now quickly increment the Multi-User Session Name from the Switchboard UI.

  • Level Snapshots now support subobjects.

  • Switchboard Listener now has Unreal Insights tracing.

  • You can now override the Switchboard Listener inactive timeout value, which defaults to five seconds.

  • Added hitch detection and logging to both Switchboard and Switchboard Listener.

  • Switchboard Listener now integrates with Unreal's standard crash logging and reporting facilities.

  • Incremented Switchboard Listener version to 2.0.0 for Unreal Engine 5.

  • Switchboard now includes a cross-platform setup script, sb_setup.py. This unifies the Switchboard installation process for different host operating systems, and includes functionality for detecting and repairing a corrupt Switchboard Python virtual environment.

  • Switchboard now works on Linux.

  • Switchboard now uses a higher port number that does not require root privileges for its internal rsync server by default.

  • Rebroadcast Subject is set to true by default for Live Link XR Subjects.

  • The Subject Representation for LiveLinkComponentController now has a Blueprint getter and setter.

  • The Subject Representation for LiveLinkComponentController now emits a Blueprint event when the component's controller map changes.

  • You can now sort by the provider column in Stage Monitor.

  • Added vertical bars to the buffer visualization in Timed Data Monitor to show the location of each frame in a subject's frame buffer.

  • Removed the Save Lens Information button from the Lens Info step of the Lens File Editor. Any changes to Lens Info are saved automatically now.

  • Updated MessageBus protocol and CBor serialization backend to support communication between Large World Coordinates (LWC) and non-LWC endpoints. Previous protocol versions in Unreal Engine 4 are assumed to be non-LWC.

  • Created the CVAR LiveLink.Component.EnableLiveLinkEvaluation to specify whether all Live Link Components should evaluate their Subject.

Improvement:

  • Remote Control Presets detect changes to exposed properties modified by Blueprint calls, and can now include changes to the root component.

  • Asset searches from the Remote Control Web API now use Blueprint native class filters.

  • Machine names are now used for sorting after the source names are sorted to create a stable Live Link source list.

  • Exposing something to the Remote Control Preset is now logged.

  • You can now control Reflect Editor Level Visibility in Game from Switchboard and the Unreal Editor.

  • Improved first-time setup of the Switchboard dependencies, as well as creation of desktop and start menu shortcuts for both Switchboard and Switchboard Listener.

  • Improved smooth evaluation with Engine Time for Live Link Sources by adding a timing offset to avoid jitter-related buffer overflows.

  • Fixed the squishing of UI elements in the LensFile Editor by adding scroll boxes to multiple panels.

Crash Fix:

  • The Editor no longer crashes when you change the map while the Remote Control Web Application is connected.

  • Fixed a crash that occurs while resolving binding when a world can't be found.

  • Fixed a crash that occurs when changing editor layout while a Remote Control Preset is open.

  • VPFullScreenWidget in the VirtualProductionUtilities plugin no longer crashes when loading a new level.

  • Fixed a crash that could occur if garbage collection started while recording a Cine Camera with a Live Link Camera Controller in TakeRecorder.

Bug Fix:

  • Fixed stale OpenColorIO color space and preset selection after the underlying configuration changes.

  • The Stage Monitor role constraint is now only verified for auto starting the monitor. If your Unreal Editor doesn't have an allowed role, you can still start monitoring manually from the UI.

  • Assets no longer have to be loaded in the Unreal Editor before you can use them in the Remote Control Web Application.

  • Previously, timecode and timespan conversions were rounding the framerate in a non-drop timecode format. There's no need to make a distinction so the framerate is now used as is.

  • The selected group in the Remote Control Preset is now correctly highlighted.

  • Fixed reset to default not working on properties that didn't exist on a Class Default Object.

  • Remote Control works on Mac now because the WebSocket receive buffer size is reduced if the platform is not Windows.

  • Disabled Live Link Component from ticking in Editor Previews, such as in the Blueprint Editor, by default to avoid breaking the root component.

  • The Live Link Remove All Subjects option is now added back to the Virtual Subject context menu.

  • The default Live Link Preset will now be applied on launch.

  • Fixed inconsistencies with Remote Control rebinding where the incorrect Actor was associated with the properties being rebound.

  • Fixed Remote Control bindings getting invalidated when changing sublevels.

  • Live Link rebroadcaster is now removed when there are no more Live Link Subjects.

  • Fixed unresponsive touch controls for the Animation Preview in the VCam UI.

  • You can now filter assets by the Img Media Source type in the Content Browser.

  • Transactions over Multi-User are now delayed until after you finish editing a text field.

  • When creating sublevels for a persistent level during a Multi-User Session, the sublevels are now correctly named and referenced in the Levels window. This fixes the cases where the levels wouldn't save their content properly.

  • Fixed a logic error in Switchboard's ListenerClient class that would lead to keepalives being sent at more than 10 Hz rather than the intended 1 Hz.

  • Switchboard Listener handles non null-terminated buffers better while attempting UTF8_TO_TCHAR conversion and logging them.

  • The Recipient field for Switchboard Listener's PresentMon process is now initialized, which prevents log warnings of the form "Trying to send message to disconnected client 205.205.205.205:52685" (endpoint = 0xCDCDCDCD)".

  • Fixed a race condition related to launching short-lived processes through Switchboard Listener.

  • In Switchboard, fixed outdated references to the UE4Editor.

  • Updated the path to UnrealBuildTool in Switchboard.

  • When running the Unreal Editor with Vulkan, nodal offset calibration no longer produces NANs for the camera pose.

  • Switchboard now queries device host platform when initiating build actions, rather than assuming all devices are Win64.

  • Switchboard now uses the correct path to the engine's Python executable on non-Windows platforms.

Deprecated:

  • The Lens Distortion plugin is now deprecated. Update your project to use the features of the Camera Calibration plugin instead.

  • The Timecode Synchronizer plugin is now deprecated. Update your project to use the features of the Timed Data Monitor plugin instead.

Removed:

  • The nDisplay for Level Snapshots plugin functionality was added to the Level Snapshots plugin, so the nDisplay for Level Snapshots plugin was removed from the ICVFX plugin.

Worldbuilding

New:

  • Avoided resetting loaders while renaming duplicated actors for a runtime level cell as it flushes async loading.

  • When converting a World Composition map to World Partition, all Actors now go in a single runtime grid. Removed the creation of 1 spatial hash runtime grid per world composition layer.

  • Prevent rotation of water bodies in X,Y and scale on Z as they are not supported transformations for water bodies.

  • Added support for iOS and Android platforms to GeoReferencing plugin.

  • Added support for Level Instances to have a folder hierarchy in the World Outliner. Actor Folders can now have a root object which serves as a context for folder hierarchy.

  • Exposed SingleLayerWaterRefractionFullPrecision show flag to scene captures.

  • Exposed GetCollisionComponents on the WaterBodyComponent.

  • Add support for runtime/in-editor visibility flags for water bodies.

  • Added a collision height offset property to water bodies to allow extending the height of the collision box above the surface of the water.

  • High precision Cartesian Coordinates are now based on the new engine Large World Coordinates Vectors.

  • Added Methods to convert from Engine to Geographic Coordinates.

  • Added a Round-Planet Pawn to allow for Ellipsoidal movement around the Planet, avoiding Roll.

  • Added a sample for a Latitude/Longitude/Altitude placed Actor.

Bug Fix:

  • Fixed ActorPlacementUtils::IsLevelValidForActorPlacement to always return true for a partitioned world as checks don't apply. (bPromptWhenAddingToLevelBeforeCheckout / bPromptWhenAddingToLevelOutsideBounds).

  • Fixed broken Undo/Redo of create/delete Layer in ULayersSubsystem.

  • Fixed WaterMesh override boolean not being exposed to the UI.

  • Fixed mesh override on river water bodies.

  • Fixed custom water body materials that could be transparent.

  • Fixed r.water.WaterMesh.EnableRendering to allow/disallow all water meshes to be displayed, in-game or not.

  • Fixed memory corruption induced by invalid water materials.

  • Fixed undo behavior for water component.

  • Fixed Waves not appearing in the Wave category and some missing Wave parameters.

  • Fixed Word Partitioned Actors not being properly registered to the water brush.

  • Fixed custom water bodies being invisible when dynamically spawned.

Deprecated:

  • Changed GetWaterBodyType to no longer be virtual. Instead, users should prefer setting the value of the WaterBodyType property in water body constructors.

  • All Water body functions and data have migrated from the actor itself to a dedicated component. Any place where a function was called or data was modified on a Water Body Actor now needs to first access the respective component.

  • The Water Mesh Actor class has been renamed to Water Zone.

Data Layers

New:

  • Added Data Layer Hierarchy support.

  • Removed per-view editor Data Layer visibility show flags.

  • Added functionality to Data Layer Outliner (now very similar to world outliner).

  • Added show filters (hide Editor/Runtime Data Layers, hide actors/unloaded actors).

  • Added mechanism to lock editing of Runtime Data Layers.

  • Added Data Layer picker that reuses FDataLayerMode (shows hierarchy).

  • Added wp.Runtime.SetDataLayerRuntimeState to set any of the 3 Data Layer runtime states.

  • Modified wp.DumpDataLayers to also dump the whole Data Layer hierarchy with initial/target/effective state.

  • Added option to choose representing world in Data Layer Outliner.

  • Moved the "Allow Runtime Data Layer Editing" flag from the EditorPerProjectUserSettings to the AWorrldDataLayers actor so that the state persists for all users.

  • Added buttons to quickly add/remove selected actors to/from Data Layers.

  • Added the option to allow setting Data Layer runtime state recursively from parent to children.

  • Split contextual menu option "Create New Data Layer" into 2 options to allow creating Data Layers under a selected Data Layer or directly at root.

  • Fixed Data Layer details view not refreshing properly when toggling its "Is Runtime" flag.

  • Added column Initial Runtime State in Data Layer Outliner.

  • Fixed World Partition CheckForErrors not properly resolving invalid Data Layers.

  • Data Layer is considered not visible when it's marked as unloaded in the editor.

  • Fixed missing case in FDataLayerHierarchy::CreateParentItem.

  • Added Data Layer highlighting based on editor selection.

  • Added Data Layer / Actor filtering based on editor selection.

  • Fixed bug in Data Layer outliner where newly created actors, once saved, were showing a second unloaded version of the same actor.

  • Replaced old Data Layer placeholder icons with official ones.

  • Removed Editor Data Layers at cook and for game worlds.

  • Added ID Name column in Data Layer Outliner.

  • Fixed bad lambda captures in Data Layer Outliner context menu.

  • Reset Data Layer User Settings are now in the Advanced menu and always apply to all Data Layers.

  • Prevent pasting/importing/moving AWorldDataLayers actor.

  • Fixed detection of dirty actors newly assigned to a Data Layer that is about to be unloaded in the editor.

Bug Fix:

  • Fixed undo of Data Layer transactions when user cancels saving of dirty actors before unloading editor cells.

  • Fixed Data Layer Label tooltip.

Landscape

New:

  • Added debug name to Landscape component Edit Layers data, so that we can display a more readable name when a component is referencing an invalid edit layer.

  • Changed Landscape map check warnings to info messages, since the system is able to automatically cope with the problem.

  • Added Landscape Material to Edit asset context menus.

  • Changed grass height/weight data storage. Now uses a single continuous array to minimize slack waste.

  • Put the thumbnails on the left side of the paint layer names to prevent misalignment when importing a Landscape.

  • Added button to Landscape Details panel to create RVT volumes for all set RVT assets.

  • The context menu when right-clicking on the Heightmap layer in the Landscape Sculpt mode now points to the Manage -> Import tool instead for Landscape Heightmap import and export.

Bug Fix:

  • Clear selected Landscape components in the Details panel when clearing the selection.

  • Prevent Landscape Material Instances validation/recompilation if not in the editor or a commandlet (we cannot re-build material instance constants otherwise).

  • Fixed incorrect landscape normals computation.

  • Fixed crash in landscape resampling method. Regions in ResampleData are specified in quads, not vertices.

  • Fixed missing ShowForTools in Landscape Import/Export tool.

  • Refresh layer list from target when in Landscape Import tool

  • Fixed padding on property detail in Landscape Import/Export tool.

  • Added detection of discrepancies between the Landscape Material Instance's TerrainLayerWeightParameters and the Landscape component's weightmap allocations.

  • Renamed visibility layer name to "LANDSCAPE_VISIBILITY" to centralize/simplify the handling of that special layer's name.

  • Added resource streaming tracking system to Landscape in order to ensure RVT pages affected by a given heightmap/weightmap get invalidated each time it gets fully streamed in in the editor.

  • Fixed crash when going in Landscape mode after it was marked for pending deletion.

  • Fixed various copy/paste issues with Landscape and Textures.

  • Fixed grass maps not being able to detect that the grass map Material is finished compiling.

  • Fixed missing row of vertices when using the rendered WPO code path for landscape static lighting.

  • Fixed Landscape Edit Layers preventing Landscape to properly be carried over when converting a map to World Partition.

  • Fixed black landscape material thumbnails.

  • Fixed crash when converting old Landscape to Edit Layers or when deleting invalid paint layers in the Landscape panel and re-abilitating them after.

  • Fixed crash when creating new Landscape with no Material.

  • Added all of the current Ray Tracing Shader variations to the list of excluded Shader types for Landscape thumbnails.

  • Made TUniformGrid::Cell safe from internal precision errors. TUniformGrid::CellUnsafe was added and matches the old behavior of TUniformGrid::Cell.

  • Fixed Landscape waiting indefinitely on Landscape Brush Shaders on recompile.

  • Fixed assert that occurred randomly when undoing Landscape operations.

  • Added check to make sure Weight Blend Layers are never normalized.

  • Fixed race condition in FLandscapeEditLayerReadback when the GPU fence of 2 of its internal readback tasks get written in between their respective Tick.

  • Fixed warning "Leaking Landscape Edit Layer read back tasks." Won't process readback tasks when the Landscape is prevented from updating.

  • Fixed grass map being re-read over and over again.

  • Fixed bug where Runtime Virtual Texture settings made on a Landscape Actor did not propagate to the proxies.

  • Retopologize Tool was breaking navmesh generation.

  • Prevented continuous nav mesh updates when moving the mouse if the Flatten tool is active.

  • LandscapeGizmoActor is not shown anymore in the Scene Outline.

  • Fix VT update to happen with rest of Landscape painting tools (Smooth, Flatten, Noise).

  • Fix Landscape GetXYOffsetData to take mip level into account.

  • Get static parameter values prior to updating static permutation for Material Instance in Landscape components.

  • Fixed assert when updating heightmaps of different sizes when merging Landscape Edit Layers.

  • Fixed crash when deleting Landscape components.

  • Properly delete Landscape Edit Layers heightmaps and weightmaps when deleting Landscape components.

  • Fixed assert when cooking Landscape components on mobile and creating Materials.

One File Per Actor

New:

  • Call IsPackageExternal instead of manually testing for RF_HasExternalPackage.

Bug Fix:

  • Deleted empty/invalid external actor packages on OpenWorld template map.

World Partition

New:

  • Disabled building of static lighting in World Partition maps, It will be properly supported in a future release.

  • Fixed invalid bounds computed for ActorClusterInstance when cluster mode is set to Embedded.

  • Resaved OpenWorld with reduced actor packaging scheme and enabled actor folder objects.

  • Actor Folders Objects. When enabled, folders are actual objects and modifying a folder won't affect Actors (more compliant with OFPA).

  • Actor Folders Objects enabled by default for World Partition and Level Instances.

  • Can be enabled on regular levels through the experimental feature 'Use Actor Folder Objects'.

  • If Level uses OFPA, Actor Folders Objects are saved in their own package (but will use ExternalObjects root folder).

  • Generalized saving object in an external package (different from its outer package).

  • World outliner support for old folders and Actor Folder Objects.

  • Levels using the Actor Folder Objects will show a root Level node (like Level Instances).

  • WorldPartition now sorts level streaming using Level Streaming's priority so that UWorld::UpdateLevelStreaming processes making visible levels and call AddToWorld in the right order. This results in a more efficient usage of the AddToWorld time limit.

  • Moved World Partition Editor and Data Layer Outliner under same Level Editor Category.

  • WorldPartition now has its own max world size (value is currently equal to UE_OLD_WORLD_MAX).

  • Actor Folder Objects feature is no longer active while cooking or while running with -game.

  • For PIE partitioned worlds, propagate PersistentLevel's used Actor Folder Objects in each generated runtime level. This allows it to remove fallback to persistent level in ULevel::GetActorFolder.

  • Modified actors in partitioned worlds are now in the correct folders in PIE.

Bug Fix:

  • Removed next preferred level to process in AddToWorld and replaced by filter function that will skip non critical streaming levels when streaming performance is poor.

  • Fixes UWorld::BlockTillLevelStreamingCompleted not always waiting for all streaming levels that were making visible to become visible.

  • Fixed optimization using s.LevelStreamingAddPrimitiveGranularity : Support cases where AActor::PostRegisterAllComponents triggers code that either unregisters or re-registers components pushed in FRegisterComponentContext.

  • Fixed UWorld::BlockTillLevelStreamingCompleted to make it call Begin/End StreamingPauseDelegate only once .

  • Fixed bad management of unsaved level instances in world partition PIE. This was causing Level instance content to be added twice in the PIE world and caused a crash when exiting PIE.

XR

New:

  • Created the OpenXR function GetControllerTransformForTime to query velocity and acceleration of the controller at a specified time.

  • Added a mechanism to use OpenXR chain structs in OpenXR extension plugins.

  • You can now define a swapchain and renderbridge in an OpenXR extension plugin.

  • Added infrastructure to OpenXR for playing haptics on a VR HMD.

  • XR HMD plugins can now override Android device profile names.

Bug Fix:

  • Fixed issues related to OpenXR runtimes not supplying tracking data of various types. If data isn't being provided, it should not be copied out because it might be incorrect, and it is better to preserve the last cached position than overwrite with zero or identity values.

  • Runtime data is now per controller and the constant bulk data is shared by all controllers in the OpenXR APIs. This fixes the issue where you couldn't apply the same haptic effect on two devices simultaneously and have them behave correctly.

  • Fixed an issue where the VR Console Command window aligned off the player's view on several VR platforms. Now the debug canvas is drawn to an internal texture, and so no longer applies DPIScale from the viewport.

  • ShadowProjection passes no longer check for reused LoadBalancers if Instanced Stereo Rendering is enabled.

  • Changed the filename of the retrieved Android manifests by adding the prefix "Retrieved_" so they don't override the already generated manifests.

  • ETextureCreateFlags for resolve and target are now unified in OpenXR because only one texture is ever allocated. There is still the issue of IStereoRenderTargetManager exposing both sets of texture flags, and the concrete classes that utilize RHICreateTargetableShaderResource* still require the flags separated.

  • Deferred culling contexts are no longer used when Instanced Stereo Rendering views come in.

  • OpenXR HMDs now use custom OpenXR XrReferenceSpaceType from OpenXR extension plugins.

  • Fixed startup error in the Unreal Editor if the Windows Mixed Reality plugin is enabled and the Windows build is later than 2004. This is an interim fix, since the WMR plugin is tagged as deprecated in 5.0 and will be removed in a future version.

Deprecated:

  • The Windows Mixed Reality plugin is deprecated in Unreal Engine 5. Update your projects targeting Windows Mixed Reality and HoloLens devices to use OpenXR.

AR

Bug Fix:

  • The Windows Mixed Reality RHI now uses a non-null display adapter when creating D3D11 devices.

  • Set the macro PLATFORM_USE_GENERIC_STRING_IMPLEMENTATION to 0 on HoloLens to prevent failures.

VR

New:

  • The Oculus VR plugin was updated to v33.

Bug Fix:

  • Fixed the issue where SceneCapture was enabling stereo when it shouldn't because it doesn't own a viewport. Since SceneCapture shouldn't be enabling stereo, CreateSceneRendererForSceneCapture explicitly disables stereo.

Upgrade Notes

AI

Upgrade Notes:

  • Code that accesses recast / detour code directly or through deprecated functions. In the latter case, compiling code may create double to float conversion or deprecation warnings. Unless you are making use of large world coordinates (LWC) directly, the warnings can be ignored. To be fully compliant with LWC, conversion to FReal for UE / Game code, or dtReal / rcReal / duReal for recast library code, will be required.

Animation

Animation Tools

Upgrade Notes:

  • In Control Rig, Gizmo was renamed to Shape. All API calls which previously included the term "gizmo" have been renamed to "shape". Python scripts can be upgraded by using a simple text search and replace.

Audio

Upgrade Notes:

  • Refactored Audio::TScopedComPtr to TComPtr.

Core

Upgrade Notes:

  • Moved the FResourceSizeEx into its own cpp file so modifying the header isn't a full recompile. Wherever possible convert the usage of FResourceSizeEx to use the tracking functions which accept a named tag such as:

    • AddDedicatedSystemMemoryBytes(const FName& Tag, const SIZE_T InMemoryBytes);

    • AddDedicatedVideoMemoryBytes(const FName& Tag, const SIZE_T InMemoryBytes);

    • AddUnknownMemoryBytes(const FName& Tag, const SIZE_T InMemoryBytes); The "Shared" version of these functions have been removed and should be replaced with one of the options listed above.

  • Projects which have engine modifications using raw pointers will need to update those modifications to use TObjectPtr instead of T*. Note that this only applies to engine changes; plugins and projects are not affected.

Cooker

Upgrade Notes:

  • AlphaCoverage scaling was on by default for all textures, but now it defaults to off. It should only be used for punch-through transparency. Texture has a new bool, bDoScaleMipsForAlphaCoverage, to control this. The new config option "EnableLegacyAlphaCoverageThresholdScaling" can be set to true to keep the legacy behavior. Textures with AlphaCoverageThresholds at the default value of (0,0,0,1) now have AlphaCoverage scaling off by default.

Datasmith

Upgrade Notes:

  • The deprecated USDImporter module is now fully deleted from the USDImporter plugin, along with old, unsupported Python scripts. Users should update their code to use the USDStageImporter module instead.

Editor

API Change:

  • IContentSource::GetCategory() has been renamed to GetCategories() and returns an array of category names instead of only one.

Upgrade Notes:

  • Upgraded engine version of the third-party Alembic libraries to version 1.8.2, we are dropping support for HDF5.

  • The bForceRDOOff setting in the [TextureFormatOodle] Engine.ini section has been deprecated. Projects with RDO enabled (i.e. bForceRDOOff=false) will need to enable RDO in Project Settings -> Texture Encoding.

  • Users may need to resave Blueprint assets using MakeTransform with the default values. The default values saved as string with the asset changed from "1,1,1" to "1.000000,1.000000,1.000000", and this generates a Blueprint Compiler warning.

New:

  • The CVAR r.Editor.OpaqueGizmo has been replaced by ShowFlag.OpaqueCompositeEditorPrimitives to be scene-specific. This means the Editor Gizmo dithering can be controlled per-scene now.

Mobile

Android

Upgrade Notes:

  • FAndroidPermissionDelegate is now a multi-cast delegate, to allow multiple callbacks to be bound. Any callbacks bound to FAndroidPermissionDelegate with a Bind function will error; replace these with calls to Add functions instead.

Networking

Upgrade Notes:

  • The various Vector_NetQuantize types no longer clamp the scaled vector components to a specific number of bits. The only values that are considered invalid are non-finite ones which are still replaced with a zero vector during serialization. Precision has also been improved by not scaling values unless it's certain that the precision can be improved by doing so. If clamping of values in Vector_NetQuantize types is desired, make sure to clamp them before replicating. This also makes sure the server and clients have the same perception of what the values actually are.

Online

API Change:

  • A ChannelName parameter has been added to the IVoiceChat's FOnVoiceChatBeforeRecvAudioRenderedDelegate callback to disambiguate which voice channel the audio is from. Existing callbacks bound to FOnVoiceChatBeforeRecvAudioRenderedDelegate will break due to the signature change. To resolve this, you will need to add the new parameter to the signature of your callback functions.

Online Subsystem

API Change:

  • MAX_LOCAL_PLAYERS has moved from the OnlineSubsystem plugin to CoreOnline.

  • Removed the duplicate ToString function for ESocialRelationship type. If code fails to find ToString, use LexToString instead.

  • Removed ESocialFriendRequestMethod because it's the same as SubsystemType RequestMethod.

Upgrade Notes:

  • EOS Stat name inconsistencies are now fixed by converting to upper case before calling API methods. As a result, stat names that you define in the EOS Dev Portal should be all upper case.

Pixel Streaming

API Change:

  • Class names in private sections of the Pixel Streaming plugin have been moved into a "PixelStreaming" namespace.

Upgrade Notes:

  • Renamed a number of classes to use the phrase "PixelStreaming" instead of "PixelStreamer", specifically, PixelStreamerInputComponent to PixelStreamingInputComponent. Any projects directly accessing Pixel Streaming C++ will need to be updated to use the new naming conventions.

  • The HardwareEncoders Plugin needs to be enabled whenever using AVEncoder (GameplayMediaEncoder) otherwise there will be no encoders registered to AVEncoder.

  • Renamed PixelStreamerInputComponent to PixelStreamingInput to align with our new naming conventions in UE5. This change may break blueprints using the old PixelStreamerInputComponent. While we have put in active redirectors into the Pixel Streaming plugin in some cases these Blueprints will not upgrade, in such cases the old PixelStreamerInputComponent will have to be deleted and the new PixelStreamingInput component can replace it.

Platforms

Upgrade Notes:

  • Platform input customization cvars have been unified to use an "Input." prefix. For example: "Input.EnableMouse" instead of "[PlatformName].EnableMouse". Check your project's .ini files and migrate these as necessary.

VR

Upgrade Notes:

  • HoloLens packaging support modules have been moved from the "HoloLens"/"HoloLensAR" plugin into the engine to align with other platform implementations. The now empty "HoloLens"/"HoloLensAR" plugin was deleted. Existing projects that enabled the plugin will trigger a "HoloLensAR plugin missing. Continue/Cancel" dialog. Select continue and the deleted plugin reference will be removed from the uproject file. Any references to the deleted plugin should be removed, but most code references modules rather than plugins and should continue to work as expected.

Rendering

Upgrade Notes:

  • Cleaned up render target pool system by deprecating legacy MSAA split-texture creation and removing the old event viewer. Projects should use RDG when allocating MSAA render targets which require resolves.

Lighting

Upgrade Notes:

  • RayTracingAO is now disabled by default, affecting existing projects. Projects that actually intended to use RayTracingAO will need to re-enable it in the Post Process Volume settings.

Virtual Production

Upgrade Notes:

  • Moved common parameters from FOpenCVLensDistortionParameters from the Lens Distortion plugin to the OpenCV plugin so other plugins can easily use them.

  • Live Link's animation-related classes were moved to their own runtime module to better isolate from the Unreal Editor.

  • Live Link functions GetSubjectRole and DoesSubjectSupportRole have been deprecated and replaced by new thread-safe Live Link functions GetSubjectRole_AnyThread and DoesSubjectSupportRole_AnyThread.

  • Moved generic OpenCV convenience functions into OpenCVHelper so they're not scattered across multiple Virtual Production classes.

Worldbuilding

Upgrade Notes:

  • The double precision structure Cartesian Coordinates is now deprecated and has to be replaced by Engine Vectors

XR

Upgrade Notes:

  • The OpenXR HMD functions DrawHiddenAreaMesh_RenderThread and DrawVisibleAreaMesh_RenderThread no longer check the render thread and have been renamed to DrawHiddenAreaMesh and DrawVisibleAreaMesh. The relevant platform runtime functions were also updated with this change.

  • MRMesh (Mixed Reality Mesh) now uses Chaos physics for runtime async collision cooking. This is used by AR devices to represent the real world geometry scanning features in Unreal.

  • World meshing from the HoloLens using the Windows Mixed Reality plugin now writes floats instead of doubles to work with the new Large World Coordinates feature.

  • Moved the functionality for Oculus plugin-specific haptic data resampling into the Oculus plugin.

VR

Upgrade Notes:

  • Common stereo-enabled logic was moved to FSceneViewExtensionContext.

알려진 이슈

언리얼 엔진 5.0에 영향을 미치는 모든 알려진 이슈 목록은 언리얼 엔진 퍼블릭 이슈 트래커를 참조하세요.