언리얼 엔진 4.23 릴리즈 노트

언리얼 엔진 4.23 릴리즈 노트입니다.

Windows
MacOS
Linux

새 소식

언리얼 엔진의 차세대 버추얼 프로덕션 툴과 향상된 리얼타임 레이 트레이싱 덕분에 영화 및 TV 제작이 변화되고 있습니다. 이제 nDisplay 가 탑재된 LED 벽으로 실제 배우와 소품을 UE4 환경에 배치할 뿐만 아니라, 라이팅과 리플렉션(베타)을 통해 또한 VR 스카우팅 툴(베타), 라이브 링크 실시간 데이터 스트리밍 강화, iPad 또는 기타 디바이스에서 UE4 를 원격으로 제어할 수 있는 기능(베타)이 추가되었습니다. 레이 트레이싱은 안정성과 퍼포먼스를 향상시키고 랜드스케이프 지오메트리, 인스턴스드 스태틱 메시, 프로시저럴 메시 및 나이아가라 스프라이트 파티클을 포함한 추가 머티리얼과 지오메트리 유형을 지원하기 위해 여러가지 기능을 향상 시켰습니다.

언리얼 엔진으로 무한히 사실적인 세계를 만들 수 있습니다. 새로운 카오스 피직스 및 디스트럭션 시스템을 사용하면, 조각 내고, 부수고, 파괴하는 압도적 스케일의 장면에서도 전례 없는 수준의 예술적인 제어가 가능합니다. 폴리지 툴을 사용한 인터랙티브 액터 배치, 랜드스케이프 변경 유지 편집, 런타임 버추얼 텍스처링을 통해 놀라운 경관을 만들 수 있습니다.

시스템 최적화, 새롭게 추가된 툴과 기능을 통해 적은 노력으로 많은 일을 할 수 있습니다. 버추얼 텍스처링은 라이트맵 및 아티스트가 제작한 디테일 텍스처에 드는 메모리 오버헤드를 줄이고, 각각 프로시저럴 또는 레이어 방식 머티리얼의 렌더링 퍼포먼스를 향상시킵니다. 애니메이션 스트리밍은 현재 사용 중인 애니메이션에만 런타임 메모리를 제한하여 보다 많은 애니메이션을 사용할 수 있습니다. 언리얼 인사이트를 사용해 UE4 비헤이비어에 대한 데이터를 수집, 분석 및 시각화하여 프로파일링하면, 라이브 또는 사전 녹화된 세션에서 엔진 퍼포먼스에 대한 이해도를 높일 수 있습니다.

이번 버전에는 GitHub 의 놀라운 언리얼 엔진 개발자들이 제출한 192개의 개선 사항이 포함되어 있습니다! 언리얼 엔진 4.23 에 기여해 주신 모든 분들께 감사드립니다:

Doug Richardson "drichardson", Morva Kristóf "KristofMorva", Reece Dunham "RDIL", "projectgheist", Jorgen P. Tjerno "jorgenpt", Ondrej Hrusovsky "Skylonxe", Miguel Fernandez "muit", Geordie Hall "geordiemhall", Artem Umerov "umerov1999", Marat Radchenko "slonopotamus", "AgentOttsel", Eric Spevacek "Mouthlessbobcat", Danny de Bruijne “danskidb”, Sertaç Ogan “SertacOgan”, Trond Abusdal “trond”, Joe Best-Rotheray “cajoebestrotheray”, Nick Edwards “NEdwards-SumoDigital”, Marcel “Zaratusa”, Mark Whitty “Mosel3y”, “YuchenMei”, Branislav Grujic “grujicbr”, “Rei-halycon”, Michael Hills “MichaelHills”, Nick Pearson “Nick-Pearson”, “mastercoms”, Zhi Kang Shao “ZKShao”, Nick “eezstreet”, “temporalflux”, Vladislav Dmitrievich Turbanov “vladipus”, Daniel Marshall “SuperWig”, Brian Marshall “TurtleSimos”, Sergey Vikhirev “Bormor”, Robert Rouhani “Robmaister”, Maxime Griot “”yamashi”, Igor Karatayev “yatagarasu25”, “Zeblote”, Hesham Wahba “druidsbane”, Joe Best-Rotheray “cajoebestrotheray”, MoRunChang “MoRunChang2015”, Sébastien Rombauts “SRombauts”, JinWook Kim “zelon”, Riley Labrecque “rlabrecque”, Дмитрий “Yakim3396”, “DanMilwardSumo”, Wesley Barlow “Wesxdz”, Franco Pulido “Franco Pulido”, Kimmo Hernborg “KimmoHernborg”, John Dunbar “Volbard”, Michał Siejak “Nadrin”, kalle Hämäläinen “kallehamalainen”, “KaosSpectrum”, Evan Hart “ehartNV”, Skyler Clark “sclark39”, Thomas Miller “tmiv”, Stephen A. Imhoff “Clockwork-Muse”, David Payne “davidpayne-cv”, “CyberKatana”, “roidanton”, Milan Šťastný “aknarts”, Alex P-B chozabu, Marco Antonio Alvarez “surakin”, Taikatou, Doğa Can Yanıkoğlu “dyanikoglu”, “Kalmalyzer”, “phi16”, Mikhail Zakharov “zz77”, Paul Hampson "TBBle", “NextTurn”, “Punlord”, kalle Hämäläinen “kallehamalainen”, Robert Pröpper “rproepp”, Yohann Martel “”ymartel06”, Francis J. Sun “francisjsun”, Eric Wasylishen “ericwa”, Phillip Baxter “PhilBax”, Alan Liu “PicaroonX”,Mathias Hübscher “user37337”,Daisuke Ban “exceed-alae”, Brandon Wilson “Brandon-Wilson”, Marcin Gorzel “mgorzel”, “prolenorm”

주요 기능

신규: 카오스 - 디스트럭션 (베타)

GDC 2019 데모에서 공개된 Chaos (카오스)는 언리얼 엔진이 새로 선보이는 고성능 피직스 및 디스트럭션 시스템으로, 4.23 버전부터 베타로 미리 만나볼 수 있습니다. 카오스를 사용하면 실시간으로 시네마틱 퀄리티의 대규모 파괴 씬을 만들 수 있으며, 콘텐츠 제작에도 전례 없는 수준의 예술적인 제어가 가능합니다.

언리얼 엔진 4.23 에서 카오스 기능은 소스 빌드를 사용해서 활성화하고 컴파일해야 합니다. 활성화 방법 안내는 이 가이드 페이지를 참고하세요.

Chaos Destruction (카오스 디스트럭션) 관련 자세한 정보는 Chaos Destruction (영문) 문서를 참고하세요. 런처의 학습 탭에 추가된 카오스 디스트럭션 데모 샘플에서 다양한 유형의 시뮬레이션과 이펙트 구성 방법을 확인할 수 있습니다.

지오메트리 컬렉션

언리얼에 파괴 가능한 오브젝트 애셋 유형이 새로 생겼습니다. 하나 이상의 스태틱 메시로 만들 수 있으며, 블루프린트 또는 심지어 중첩 블루프린트에서 조립한 것도 포함됩니다. 이 Geometry Collections (지오메트리 컬렉션)으로 아티스트는 시뮬레이션 대상 선택은 물론, 파괴되는 모습을 더욱 유연하게 만들고 구성할 수 있습니다.

image alt text

왼쪽 - 벽 섹션 1개 - 지오메트리 컬렉션 31개, 오른쪽 - 스태틱 메시 분해도

프랙처

지오메트리 컬렉션이 있다면 Fracturing (균열, 프랙처) 툴로 분해할 수 있습니다. 각 조각마다 별도로 균열을 만들거나, 여러 조각에 한 패턴을 적용할 수도 있습니다. 일반적인 보로노이 균열 외에도 방사형 균열, 클러스터 보로노이 균열, 절단된 평면에 노이즈를 사용하여 더욱 자연스러운 결과를 낼 수 있습니다.

image alt text

왼쪽 - 원래 지오메트리 컬렉션, 중간 - 메시 전체에 균열 적용, 오른쪽 - 큰 조각만 세부 균열

클러스터

최적화를 고려해서 Sub-fracture (세부 균열)을 사용하면 복잡도를 더할 부분을 제어할 수 있습니다. 세부 균열을 사용할 때마다 지오메트리 컬렉션에 레벨이 추가됩니다. 카오스 시스템은 이후 각 레벨을 트랙하며 해당 정보를 사용자가 제어할 수 있는 Cluster (클러스터)에 저장합니다. 다음은 각 균열 레벨이 자체 클러스터 세트로 합쳐진 메시의 예시입니다.

image alt text

왼쪽 - 레벨 1: 오브젝트 6개, 중간 - 레벨 3: 오브젝트 50개, 중간 - 레벨 5: 오브젝트 513개

연결 그래프

파괴 시뮬레이션과 패러다임이 약간 다른 경량 연결 맵입니다. 아래 이미지에서 앵커로 고정된 몇몇 정적인 조각과 다이내믹이 될 수 있는 모든 나머지 요소를 확인할 수 있습니다.

image alt text

파란색 - 카오스 가능, 노란색 - 앵커 고정 노드

키네마틱을 다이내믹으로 교체하는 대신, 카오스 시스템은 압력(strain)을 적용해서 연결부가 끊기면 카오스 파괴를 진행합니다. 활성화된 리지드 바디의 수를 제어하면서 상호작용을 최대화하기에 좋습니다.

필드

필드(Field)를 사용하면 시뮬레이션을 직접 제어 및 상호작용할 수 있습니다. 지오메트리 컬렉션 어느 부분 어느 특성을 제어할 때도 사용할 수 있습니다. 예를 들어 인스턴스의 질량 변경, 또는 특정 부분만 파괴되지 않도록 만들기, 가운데보다 구석을 더 잘 부서지게 만들기, 힘 가하기 등 이 모든 것을 장으로 제어할 수 있습니다.

시뮬레이션 캐시

캐시 기능을 사용하면 현실적인 시뮬레이션을 미리 캐시에 저장한 뒤 실시간으로 재생해 키네마틱 지오메트리 컬렉션을 만들 수 있습니다. 즉 플레이어와 환경의 상호작용이 유지되는 대규모 파괴 이벤트를 만들 수 있다는 뜻입니다.

나이아가라 통합

카오스 시스템은 언리얼 엔진 4의 주요 기능으로, 나이아가라를 비롯한 월드를 시뮬레이션하는 기타 모든 시스템과 공존합니다. 시뮬레이션에 시각 효과를 더하면 월드에 깊이와 현실성을 더할 수 있습니다. 예를 들어, 건물이 부서질 때는 대량의 먼지와 연기가 생기게 됩니다. 파괴와 시각 효과를 통합하려면 오브젝트가 충돌 및 파괴됐을 때 피직스 시스템의 데이터를 나이아가라로 보낸 다음 해당 데이터를 바탕으로 흥미로운 부가 이펙트를 만들 수 있습니다.

신규: 실시간 레이 트레이싱 개선 (베타)

레이 트레이싱 기능이 다수 최적화되고 안정성이 개선되었으며 중요한 신기능도 몇 가지 추가되었습니다.

image alt text

퍼포먼스 및 안정성

이번 버전에서는 언리얼 엔진 레이 트레이스 기능의 안정성, 퍼포먼스, 퀄리티 향상에 중점을 두었습니다. 즉:

  • 전체적으로 DirectX 12 지원을 강화했습니다.

  • 레이 트레이스 기능에 대한 디노이저(Denoiser) 퀄리티를 향상했습니다.

  • 레이 트레이스 글로벌 일루미네이션 (RTGI) 퀄리티가 증가되었습니다.

추가 지오메트리 및 머티리얼 지원

이제 다음과 같은 추가 지오메트리 및 머티리얼 형식을 지원합니다.

  • 랜드스케이프 지형 (KiteDemo에서 2080Ti로 측정한 퍼포먼스: 지오메트리 업데이트 시간 ~2ms, 비디오 메모리 ~500MB)

  • 계층형 인스턴스드 스태틱 메시 (HISM) 및 인스턴스드 스태틱 메시 (ISM)

  • 프로시저럴 메시

  • 서브서피스 머티리얼을 사용한 투과

  • 랜드스케이프 및 스켈레탈 메시 지오메트리에 월드 포지션 오프셋 (WPO) 지원

다중 반사 리플렉션 보완

다중 반사(bounce) 레이 트레이스 리플렉션 (RTR) 지원을 개선하여, 필요한 경우 리플렉션 캡처를 사용하도록 했습니다. 내부 리플렉션(리플렉션 안의 리플렉션)이나 최대 리플렉션 거리로 설정한 곳에서 검게 나오던 것을 래스터 기법을 통해 보완하도록 한다는 뜻입니다.

이제 여러 번의 레이 트레이스 반사 없이도 리플렉션 퀄리티가 미묘하게 향상되며, 퍼포먼스도 크게 향상됩니다.

image alt text

1 - RTR 반사 1회; 2 - RTR 반사 2회; 3 - RTR 반사 1회에 마지막 반사는 리플렉션 캡처로 보완

신규: 버추얼 텍스처링 (베타)

이번 버전에 추가된 버추얼 텍스처링 베타 지원을 사용하면, 큰 텍스처를 만들어 사용해도 런타임 메모리 사용량은 더 적게 고정됩니다.

스트리밍 버추얼 텍스처링

Streaming Virtual Texturing (스트리밍 버추얼 텍스처링)은 버추얼 텍스처 애셋을 사용해 기존의 밉 기반 스트리밍 대신 디스크에서 텍스처를 스트리밍하는 대안을 제공합니다. 기존 밉 기반 텍스처 스트리밍 작동 방식은 머티리얼 UV 사용을 오프라인 분석한 후, 런타임에 오브젝트 가시성 및 카메라 거리에 따라 로드할 텍스처의 밉 레벨을 결정합니다. 버추얼 텍스처에 대해서는, 모든 밉 레벨을 작은 고정 크기 타일로 나눠 두어 GPU 가 화면에 보이는 모든 픽셀에 필요한 버추얼 텍스처 타일을 결정할 수 있습니다.

버추얼 텍스처링 스트리밍은 텍스처 메모리 오버헤드를 줄이고 (라이트맵 및 UDIM 텍스처를 포함한) 아주 큰 텍스처를 사용할 때의 퍼포먼스를 향상시킵니다. 그러나 버추얼 텍스처 샘플링은 일반 텍스처를 샘플링할 때보다 비용이 많이 듭니다.

자세한 정보는 Streaming Virtual Texturing (영문) 문서를 참고하세요.

런타임 버추얼 텍스처링

Runtime Virtual Texturing (런타임 버추얼 텍스처링)은 런타임 버추얼 텍스처 애셋과 레벨에 배치된 볼륨을 사용합니다. 동작 방식은 기존 텍스처 매핑과 비슷하지만 런타임에 GPU를 사용해 요청 즉시 렌더되는 점이 다릅니다. 런타임 버추얼 텍스처는 넓은 영역에 걸친 셰이딩 데이터를 캐시에 저장해서 랜드스케이프 셰이딩에 적합합니다.

자세한 정보는 Runtime Virtual Texturing (영문) 문서를 참고하세요.

신규: 언리얼 인사이트 (베타)

(현재 베타인) Unreal Insights (언리얼 인사이트)를 이용하면 개발자가 일정한 방식으로 언리얼 엔진의 비헤이비어를 수집, 분석할 수 있습니다. 이 시스템은 크게 두 부분으로 이루어집니다.

  • Trace System API (트레이스 시스템 API)는 일정한 형식으로 런타임 시스템에서 정보를 수집하고 나중에 처리할 수 있도록 저장합니다. 여러 라이브 세션에서 데이터를 동시에 받을 수 있습니다.

  • Unreal Insights Tool (언리얼 인사이트 툴)은 분석 API로 처리한 데이터의 상호작용형 시각화를 제공하여, 개발자는 통합 인터페이스로 애플리케이션의 통계, 로그, 지표를 확인할 수 있습니다.

동시에 여러 개의 라이브 세션에 연결하거나 언리얼 인사이트 탭의 Trace Sessions (트레이스 세션) 창에서 라이브나 이전에 기록된 세션 데이터를 선택해서 확인할 수 있습니다.

확인할 세션 데이터를 선택한 후에는 Timing Insights (타이밍 인사이트) 및 Asset Loading Insights (애셋 로딩 인사이트) 탭에서 살펴볼 수 있습니다.

신규: HoloLens 2 네이티브 지원 (베타)

이제 HoloLens 2 개발을 시작할 수 있습니다. 플랫폼 고유 기능에 대한 API 에 액세스할 수 있으므로, 스트리밍 및 네이티브 디플로이, 손가락 트래킹, 제스처 인식, 메싱, 음성 입력, 공간 앵커 핀 설정 등이 가능합니다. AR 게임이든 엔터프라이즈 애플리케이션이든 만들어 보세요. 탄탄한 에뮬레이터 지원으로 디바이스가 이미 있든 배송을 기다리는 중이든 상관 없습니다. UE4 만 있으면 HoloLens 2 개발을 바로 시작할 수 있습니다.

image alt text

image alt text

자세한 정보는 Microsoft HoloLens 2 Development (영문) 페이지를 참고하세요.

신규: 버추얼 프로덕션 파이프라인 개선

언리얼 엔진은 계속해서 버추얼 프로덕션 파이프라인이 나아갈 길을 이끌고 있습니다. 가상으로 환경을 스카우팅하고 장면을 합성하며, 가상 세계를 사용해 현실 세계에 빛을 밝히고, 생방송 요소와 디지털 표현을 결합시켜 매끄러운 체험을 만드는, 그 모든 작업을 사용자가 직접 만든 인터페이스로 제어할 수 있습니다.

인 카메라 VFX (베타)

개선된 인 카메라 VFX 로, LED 벽에 언리얼 엔진 씬을 표시하거나 UE4 에서 실시간 합성을 위한 디지털 그린스크린으로 사용해서, 언리얼 엔진 환경 배경과 실제 배우, 소품을 합친 최종 장면을 라이브로 얻을 수 있습니다.

카메라 프러스텀 기반 렌더링으로 실제 배우, 소품이 CG 환경의 라이팅과 리플렉션을 받도록 하면, 경우에 따라 포스트 프로덕션 워크플로가 없어져 프로덕션 전체가 크게 빨라집니다. 무대에 직접 그린스크린을 설치하지 않고도 버튼 하나로 빠르게 LED 벽에 디지털 방식으로 그린스크린을 배치해 시간을 절약할 수 있습니다. nDisplay 멀티 디스플레이 기술 덕분에 LED 벽의 크기나 구성과 상관 없이 전체 솔루션 스케일을 맞출 수 있습니다.

영화 제작자용 VR 스카우팅 (베타)

새로운 VR Scouting (스카우팅) 툴은 버추얼 프로덕션 환경의 영화 제작자들이 새로운 방식으로 VR로 버추얼 월드를 탐색하고 상호작용할 수 있게 해주며, 덕분에 더 나은 창의적 결정을 내릴 수 있습니다.

image alt text

감독과 촬영 감독은 손쉽게 장소를 찾아 장면을 합성하고 씬 블로킹을 구성하며 촬영 장소를 정확하게 살펴볼 수 있는 반면, 아티스트와 세트 디자이너는 VR로 촬영 장소를 직접 경험하며 세트를 만들고, 측정 및 상호작용 툴을 사용해 거리를 확인하며 월드를 수정할 수 있습니다. 가상 세계에서 이미지를 캡처하면, 프로덕션 팀 전체가 VR 세션 도중 내린 의사 결정을 추적하는 데 도움이 됩니다. C++에서 엔진을 리빌드할 필요 없이 블루프린트에서 컨트롤러와 세팅을 커스터마이징할 수 있습니다.

자세한 내용은 %Engine/Editor/VR/VirtualScouting:title% (영문) 문서를 참고하세요.

라이브 링크 데이터 유형 및 UX 개선

라이브 링크 플러그인이 처리하는 정보의 종류가 많아졌으며 언리얼에서 동기화된 데이터를 씬 엘리먼트에 적용하기도 쉬워졌습니다! 이제 프로덕션 파이프라인의 다른 애플리케이션과 데이터 소스로 캐릭터 애니메이션, 카메라, 라이트, 기본적인 3D 트랜스폼을 동적 구동할 수 있습니다.

각 씬 엘리먼트에 role (역할)을 정하면, 라이브 링크가 해당 엘리먼트에 대해 동기화하는 정보를 결정합니다. 라이브 링크 플러그인에는 캐릭터 애니메이션, 카메라, 라이트, 기본 3D 트랜스폼에 대해 내장된 역할이 있습니다. 액터를 새로운 라이브 링크 컨트롤러 컴포넌트에 할당하면 어떤 라이브 링크 소스로도 더욱 쉽게 언리얼 엔진 레벨의 액터를 구동할 수 있습니다.

기타 개선:

  • 라이브 링크를 통해 들어오는 데이터를 (예를 들면 축 변환 적용을 위해) 전처리한 뒤 씬에 적용하고, 한 역할에서 다른 역할로 소스를 매핑할 때 데이터 변환 방식을 제어합니다. 자체 커스텀 전처리기와 변환기 클래스를 생성해 할당할 수도 있습니다.

  • 여러 소스를 버추얼 서브젝트로 결합해, 여러 라이브 링크 소스에서 받은 정보를 바탕으로 언리얼의 씬 엘리먼트 하나를 구동합니다.

  • 자주 반환할 라이브 링크 구성 프리셋을 저장 및 로드합니다.

  • 상태 표시에 현재 언리얼 엔진으로 데이터를 보내고 있는 라이브 링크 소스가 한눈에 표시됩니다.

  • 라이브 링크를 통한 ART 트래킹이 지원되므로, VR, AR, 모션 캡처와 같은 애플리케이션에서 다양한 트래킹 용도로 ART 기술을 활용할 수 있습니다.

자세한 정보는 라이브 링크 플러그인 문서를 참고하세요.

HTTP를 통한 원격 제어 (베타)

이제 HTTP를 통해 원격으로 언리얼 엔진과 언리얼 에디터에 명령을 보낼 수 있습니다!

덕분에 프로젝트 콘텐츠의 변경을 유발하는 자체 커스텀 웹 유저 인터페이스를 만들 수 있습니다. 어떤 브라우저나 현대 웹 표준을 지원하는 커스텀 앱에서도 언리얼 엔진을 제어할 수 있으며, 이 자체 컨트롤을 다른 커스텀 패널에 통합시켜 환경 내 다른 애플리케이션을 제어할 수도 있습니다.

원격 제어 인터페이스에 제공된 다양한 엔드포인트를 호출하면, 액터와 애셋의 프로퍼티를 설정하고 얻어오며 블루프린트와 Python에 노출된 함수를 호출할 수 있습니다.

자세한 내용은 Web Remote Control (영문) 문서를 참고하세요.

신규: 곡면 nDisplay 워프 및 블렌드

이제 nDisplay를 사용해 언리얼 엔진 콘텐츠를 더욱 다양한 실제 장비로 투영할 수 있으며, 곡면과 구형 스크린은 물론 투영이 겹치는 곳에 복잡한 블렌딩이 필요한 상황도 포함됩니다.

image alt text

nDisplay는 여러 프로젝트의 2D 이미지를 휘고 굽은 표면에 투영하고 블렌드하는 방법을 두 가지 내장하고 있습니다.

게다가 이제 서드파티 개발자도 렌더링 인터페이스의 확장 세트를 구현해 nDisplay가 UE4 콘텐츠를 렌더하는 방법을 커스터마이징할 수 있습니다.

nDisplay 관련 자세한 정보는 nDisplay, 멀티 디스플레이 렌더링 문서를 참고하세요.

신규: 나이아가라 개선 (베타)

카오스 피직스와 통합

이제 카오스의 피직스 시뮬레이션으로 나이아가라 파티클 시스템을 생성할 수 있습니다! 오브젝트에 균열이 발생할 때마다 연기와 먼지는 물론 작은 균열 조각을 생성하여 피직스 시뮬레이션의 비주얼을 향상시킬 수 있습니다. 새로 생긴 카오스 디스트럭션 리스너는 이벤트를 관련 파티클 시스템에 전송하고 파괴(break), 충돌, 흔적 등 카오스 상호작용 이벤트에 관한 정보를 제공합니다. Chaos Destruction Content Example hallway 예제를 참고하세요.

GPU 시뮬레이션 개선

GPU 시뮬레이션 퍼포먼스가 크게 향상되어 유휴 시간이 단축되었습니다. 데이터 관리를 개선하고 컴퓨트 작업 간 명시적인 프리미티브 동기화를 높이는 이 방식 덕에 GPU 작업을 상당량 중첩시킬 수 있어, 처리량이 크게 늘어나고 컴퓨트 셰이더를 다른 연산 작업과 병렬 실행할 수 있는 기회도 많아집니다.

스태틱 및 스켈레탈 메시 샘플링 GPU 지원

이제 GPU 시뮬레이션에서 메시의 표면을 샘플링하고, UV 좌표를 얻어, 텍스처에서 샘플링한 뒤, 이를 통해 복잡한 시뮬레이션 로직을 구동시키는 방식으로, CPU와 GPU에서 할 수 있는 작업의 차이를 좁히고 GDC 트롤 데모에서 선보인 요정처럼 초당 60만 개 이상의 파티클을 스폰하는 이펙트를 만들 수 있습니다.

나이아가라 스프라이트 이미터 레이 트레이싱 지원

이제 나이아가라 시뮬레이션이 레이트레이싱 중 리플렉션과 섀도에 쓰이는 지오메트리를 생성할 수 있으며, 이는 GDC 트롤 데모에서 요정이 물 위를 날아갈 때 수면에 빛이 반사되는 장면에 쓰였습니다.

현재는 스프라이트 이미터 파티클만 지원합니다.

이미터 상속

이제 나이아가라에서 이미터를 생성할 때 프로젝트의 기존 이미터를 상속해서 생성할 수 있습니다. 이제 목적이 비슷한 이미터에 대해 기능 상속 트리를 생성할 수 있어 콘텐츠 재사용이 쉬워집니다.

예를 들어 무기 이펙트에 쓰이는 기초적인 총구 화염 이미터가 존재할 때, 그 강약 베리에이션을 만들고 싶을 수 있습니다. 이때 상속을 통해 강약 베리에이션 이미터를 새로 만들면서, 둘 다 원본 총구 화염과 동일한 기반 기능과 렌더러를 상속할 수 있습니다.

컴파일 및 쿠킹 개선

이제 새로 추가된 콘솔 명령어 2개를 사용해 로드 및 쿠킹 작업 중 나이아가라 애셋의 오래된 데이터를 지우고 불필요한 리컴파일을 방지할 수 있습니다.

  • fx.PreventSystemRecompile 단일 시스템과 종속된 모든 이미터에 대한 데이터를 비웁니다(flush).

  • fx.PreventAllSystemRecompiles 프로젝트에서 모든 나이아가라 시스템을 찾아 이 시스템과 종속된 이미터를 비웁니다.

영향받은 애셋을 비운 뒤 다시 저장하고 나면 로드와 굽기 프로세스 속도가 빨라지고 오래된 데이터로 발생하는 실패를 없앨 수 있습니다.

오류 보고 개선

나이아가라 스크립트 및 이미터/시스템 에디터에 추가된 메시지 로그에 최근 컴파일에서 발생한 메시지, 경고, 오류가 표시되며 스크립트 그래프에서 경고나 오류가 발생한 노드나 핀으로 이동할 수 있습니다.

이는 나이아가라 스크립트로 새로운 함수 기능이나 비헤이비어를 작성하는 테크니컬 아티스트와 VFX 아티스트 또는 나이아가라 스크립트를 시스템으로 합쳐 스크립트 에디터 반복처리 능력을 높이려는 사람에게 특히 유용합니다. 게다가 메시지는 오류 소스로 가는 하이퍼링크 역할을 하기에 스크립트 또는 시스템의 문제를 빠르게 찾고 해결할 수 있습니다.

스태틱 스위치

이제 나이아가라에 지원되는 Static Switch (스태틱 스위치) 노드로 그래프의 최종 출력물에 영향을 주지 않는 인스트럭션과 파라미터를 제외시켜 컴파일 시간을 단축하고 런타임 퍼포먼스를 향상할 수 있습니다. 스태틱 스위치 노드는 값 전달, 메타데이터 지원, 파라미터 컬링, 컴파일 시간 상수 평가 등 여러 고유 기능을 지원합니다.

image alt text

캐스케이드 기능 추가

이번 버전에서는 더 많은 캐스케이드 기능이 나이아가라에 추가되었습니다. 그 중 몇 가지는 다음과 같습니다:

  • 스프라이트 컷아웃 - 쿼드 전체를 렌더링하는 대신 파티클에 대해 더 작은 바운딩 모양을 생성해 오버드로를 줄일 수 있습니다.

  • GPU 소팅 - 이미터 내 투명한 오브젝트의 순서를 제대로 정렬할 수 있습니다.

  • AnimNotify 이벤트 - 애니메이션 트랙에 파티클을 생성하고 수명을 적절하게 관리할 수 있습니다.

  • 표준화된 활성화/비활성화 - 기존 파이프라인에 간단하게 나이아가라 이펙트를 추가할 수 있습니다.

  • 블루프린트에서 스태틱 메시와 스켈레탈 메시 타깃 설정 - 기존 파이프라인에 간단하게 나이아가라 이펙트를 추가할 수 있습니다.

  • 샘플링된 본 및 소켓 트랜스폼 - 스켈레탈 메시를 사용하는 이펙트를 더 낮은 사양의 하드웨어에서 실행할 수 있습니다.

신규: 플랫폼 익스텐션

Platform Extensions (플랫폼 익스텐션)이라는 개념을 추가했으며, 개별 플랫폼에 대한 모든 코드를 한 곳에 캡슐화하여 메인 엔진 코드와 분리한다는 점에서 속성상 플러그인과 유사합니다. 엔진 및 그 빌드 시스템 작동 방식에 몇 가지 근본적인 변화가 생겨, 엔진을 수정한 정도에 따라 영향을 받을 수도 있습니다. 플랫폼 익스텐션 관련 자세한 내용은 이 가이드(영문) 를 참고하시기 바랍니다.

신규: 스킨 웨이트 프로파일

새로운 스킨 웨이트 프로파일 시스템은 스켈레탈 메시에 저장된 원본 스킨 웨이트를 오버라이드하고 퍼포먼스를 이유로 다이내믹 캐릭터 파츠가 비활성화되는 일부 플랫폼의 시각 충실도를 향상합니다. 스켈레탈 메시 에디터에서 프로파일을 임포트할 수 있으며 사용할 스킨 웨이트, 프로파일 이름, 선택적으로 LOD 인덱스가 포함된 FBX 파일을 제공해야 합니다. 새로 추가된 블루프린트 노출 API를 사용하면 Skinned Mesh Component (또는 자손 클래스)에도 스킨 웨이트 프로파일을 할당할 수 있습니다.

자세한 정보는 스킨 웨이트 프로파일 문서를 참고하세요.

신규: 애니메이션 스트리밍 (실험단계)

이제 애니메이션을 스트리밍해 메모리 사용량과 관리 방식을 향상시킬 수 있습니다. 이는 장편 시네마틱 애니메이션을 재생할 때 특히 유용합니다.

이제 애니메이션 압축 시스템은 애니메이션을 청크 단위로 압축하여 스트리밍을 원활하게 하는 동시에, 새로운 애니메이션 스트림 매니저는 스트리밍 애니메이션 데이터의 메모리 로드 및 저장을 관리하며 새 UAnimStreamable (애님 스트리머블) 애셋은 스트리밍 가능한 애니메이션을 나타냅니다.

신규: 다이내믹 애니메이션 그래프 (실험단계)

다이내믹 애님 그래프는 레이어를 사용하여 애니메이션 그래프의 서브 섹션을 동적 전환을 제공하며, 이는 레이어 노드를 통해 애님 그래프에 연결할 수 있는 별개의 그래프입니다. 이를 통해 사용자 여러 명이 협업할 수 있으며 더는 필요없는 함수 기능에 쓰이는 메모리를 절약할 수 있습니다.

레이어는 애니메이션 레이어 인터페이스 애셋으로 정의하며, 이는 기능이 제한된 애니메이션 블루프린트로 블루프린트 인터페이스 와 유사합니다. 여기서 레이어의 수, 이름, 소속 그룹, 입력을 정의합니다.

또한, 서브 인스턴스 노드가 UAnimInstance 의 SetSubInstanceClassByTag 를 사용해 실행 중인 클래스를 동적으로 전환할 수 있게 되었습니다. 이제 서브 인스턴스 노드는 서브 그래프의 여러 입력 포즈를 노출할 수도 있습니다.

애니메이션 블루프린트와 서브 애니메이션 블루프린트 모두 애니메이션 레이어 인터페이스를 구현해야 레이어 그래프를 생성하고 레이어 노드를 인스턴스화할 수 있습니다.

신규: 오픈 사운드 컨트롤 (베타)

Open Sound Control (OSC, 오픈 사운드 컨트롤) 플러그인은 오픈 사운드 컨트롤 표준 네이티브 구현을 제공합니다. 여기에 제공되는 애플리케이션 상호간 및 머신 상호간 통신을 위한 공통 프레임워크를 통해 UDP 로 파라미터를 실시간 제어할 수 있습니다.

image alt text

신규: 웨이브테이블 합성 플러그인

언리얼 엔진의 커브 에디터를 활용하는 모노 웨이브테이블 신디사이저를 추가했습니다. 타임 도메인 웨이브테이블을 작성해 게임플레이 파라미터가 이끄는 폭넓은 사운드 디자인이 가능합니다. 테이블 인덱스를 비롯한 모든 파라미터는 C++와 블루프린트로 제어할 수 있습니다.

신규: CSVToSVG 툴 (베타)

CSVToSVG는 .CSV 파일로 벡터 그래픽 이미지 파일 (.SVG)을 만들어 퍼포먼스 데이터를 시각화할 수 있게 해주는 새로운 명령줄 툴입니다. 툴은 숫자 통계 데이터를 처리하고 스무딩, 예산선과 막대 그래프를 지원합니다. 언리얼 엔진에 포함된 퍼포먼스 툴이 출력한 데이터나 자체 툴의 데이터로 그래프를 만들 수 있습니다.

image alt text

신규: 시퀀스 커브 에디터 개선 (베타)

시퀀서 커브 에디터가 크게 개선되어 많은 요청을 받은 기능 다수와 확장성 지원이 추가되었습니다! 이제 엔진 코드를 수정하지 않아도 새로운 툴 모드, 새로운 툴바 버튼, (스무딩 등) 맞춤형 데이터 필터로 커브 에디터를 확장할 수 있습니다. 게다가 이제 커브 에디터를 시퀀서와 따로 도킹할 수 있으며, 스케일은 물론 키 리타이밍 툴도 있는 트랜스폼 툴이 포함됩니다.

업데이트된 커브 에디터를 사용하려면 시퀀서 또는 UMG (언리얼 모션 그래픽) 애니메이션을 열고 커브 에디터 버튼을 누릅니다. 새로운 트랜스폼 툴과 리타임 툴은 기본 활성화된 플러그인에 제공됩니다. 이제 어디든 커브 에디터를 끌어 붙일 수 있으며, 시퀀서 또는 에디터를 닫으면 위치가 저장되었다가 시퀀서를 다시 열 때 복원됩니다.

커브 에디터 확장

업데이트된 커브 에디터는 엔진 코드 수정 없이 플러그인으로 확장할 수 있습니다. 커브 에디터를 확장할 수 있는 주된 방법 3가지는 다음과 같습니다.

  • 툴 모드 - 에디터에서 먼저 사용자 입력을 포착해 다양한 툴을 생성할 수 있게 해주는 독점 모드입니다. 예제 코드: FCurveEditorTransformTool, FCurveEditorRetimeTool. 맞춤형 툴을 새로 생성하려면 ICurveEditorToolExtension 을 구현하고 커브 에디터 모듈로 익스텐션을 등록하세요 (예제는 FCurveEditorToolsModule::StartupModule() 을 참고하세요).

  • 툴바 버튼 - 커브 에디터 툴바에 새로운 버튼을 삽입할 수 있으며, 추가한 버튼을 사용해 커브 에디터를 원하는 대로 조작할 수 있습니다. (기본 포커스를 선택하는 대신) 데이터 포커스 옵션을 추가를 구현하는 예제가 있습니다. 새로운 툴바 버튼을 생성하려면 ICurveEditorExtension을 구현하고 커브 에디터 모듈로 등록하세요. (예제는 FCurveEditorToolsModule::StartupModule() 을 참고하세요).

  • 데이터 필터 - 사용자 지정 세팅으로 동작 한 번에 선택한 커브를 조작하는 새로운 방식을 만들 수 있습니다. 현재 선택에 작동하는 데이터 필터 3개를 기본으로 제공합니다:

    • Bake 굽기 (UCurveEditorBakeFilter)

    • Simplify 단순화 (UCurveEditorReduceFilter)

    • Smoothing 스무딩 (UCurveEditorFFTFilter)

UCurveEditorFilterBase 에서 클래스를 파생하면 새 필터를 구현할 수 있습니다. 모듈 등록은 필요하지 않습니다. 새 구현은 사용자 필터 대화창에 자동으로 나타납니다. EditAnywhere 마킹된 모든 UPROPERTY 가 자동으로 나타나므로, 필터를 적용하기 전에 조작할 수 있습니다.

뷰 모드

새롭고 재밌는 방법으로 커브를 볼 수 있습니다! 커브 에디터 왼쪽에 있는 트리 뷰로 커브를 볼 수 있으며, 아래처럼 뷰 모드 버튼을 클릭하면 선택한 커브를 어떻게 볼지 정할 수 있습니다. 뷰 모드는 3개입니다.

  • 절대 뷰 - 모든 커브를 절대 공간에 표시합니다. 모두가 익숙한 기존 방식과 같습니다.

  • 중첩 뷰 - 각 커브를 정규화하고 겹치지 않게 그립니다.

  • 정규화 뷰 - 각 커브를 (중첩 뷰처럼) 정규화하지만, 모두 겹쳐 그립니다.

image alt text

신규 필터 메뉴

신규 필터 메뉴는 전체 디테일 패널과 폭넓은 세팅으로 선택에 다양한 필터를 적용합니다. 적용 버튼을 누르면 지속되기 때문에 세팅을 쉽게 반복처리할 수 있습니다. UCurveEditorFilterBase 를 파생한 새 클래스에 함수를 구현하면 이 대화창에 새 옵션을 추가할 수 있습니다.

여러 프레임 옵션

이제 여러가지 다양한 프레임 옵션을 사용할 수 있습니다.

  • Frame Selection (선택 프레임, 선택이 없으면 Frame All (모두 프레임))은 내장된 옵션으로, 기본 설정은 F 입니다.

  • 재생 커서에 프레임재생 범위에 프레임 은 새 옵션입니다. 플러그인을 사용해 툴바를 확장하는 좋은 예제입니다.

  • 예전 가로 프레임/세로 프레임 옵션은 모두 포커스 이후 ALT + SHIFT + 우클릭 해서 각 축을 개별 확대 및 축소하는 것으로 대체되었습니다. 모두 포커스 이후 ALT + 우클릭 해서 스케일을 비례 조정할 수 있습니다.

image alt text

리타임 툴

리타임 툴로 일차원 격자를 만들어 키 타이밍을 조정할 수 있습니다. 그리드 스냅과 다중 선택 등을 지원합니다! 이 툴은 기본 플러그인에 제공됩니다.

image alt text

트랜스폼 툴

트랜스폼 툴은 선택한 키의 이동 및 (적합한 경우) X, Y 양축 스케일 조정을 지원합니다. ALT 를 누르면 앵커 포인트를 반대쪽 에지에서 중앙으로 변경할 수 있습니다.

신규: 시퀀서 사용성 개선

여러가지 워크플로 및 사용성 개선이 이루어진 부분은 다음과 같습니다:

  • 트랙에 필터 및 검색 - 이제 트랙 및 액터에 필터를 적용하고 검색할 수 있습니다.

  • 프레임 늘이기/줄이기 - 이제 겹치는 엘리먼트가 없는 한 섹션과 키 사이 시간 양을 더하고 뺄 수 있습니다.

    image alt text

  • 여러 트랙 추가 및 편집 - 이제 Shift 또는 Ctrl 키로 여러 트랙을 그룹 추가 및 편집할 수 있습니다.

    image alt text

  • 여러 행에 오디오 섹션 블렌드 - 이제 오디오 섹션을 블렌드하여 크로스 페이드 이펙트를 낼 수 있습니다. 이는 트랜스폼 섹션 블렌드와 비슷하게 동작합니다.

  • 스켈레탈 애니메이션 포즈에 상태 복원 또는 상태 유지 - 이 옵션은 When Finished 프로퍼티를 사용해 애니메이션 섹션을 평가한 뒤 스켈레탈 메시를 바인드 포즈로 복원하거나, 마지막 애니메이션 섹션의 애니메이션 포즈를 유지할 수도 있습니다.

  • UMG 멀티바인딩 - 이 기능은 4.23 이전부터 있었지만, 이제 여러 위젯 바인딩을 기존 바인딩에 추가할 수 있습니다. 위젯 하나를 애니메이트하여 다른 위젯에 사용할 수 있습니다.

신규: 데이터 유효성 검사 확장

Data Validation (데이터 유효성 검사) 플러그인을 확장하여 애셋의 유효성을 검사할 때 C++, 블루프린트, Python 기반 규칙을 지원합니다. 덕분에 블루프린트 또는 Python을 사용하는 테크 아티스트도 C++ 구현을 요청하는 대신 애셋 유효성 검사 스크립트를 생성할 수 있습니다. 이제 기본 엔진 클래스가 유효성 검사 패스를 거칠 수 있습니다.

신규: 디버그 카메라 컨트롤러 개선

이번 버전에서 DebugCameraController (디버그 카메라 컨트롤러)에 새로운 기능을 추가했습니다.

  • Orbit (궤도) 기능으로 선택한 위치 또는 선택한 액터를 중심으로 궤도를 돌며 자세하게 애셋을 살펴볼 수 있습니다.

  • 버퍼 시각화 개요에는 선택한 버퍼를 전체화면으로 볼 수 있는 옵션이 있어 그래픽 카드 버퍼 콘텐츠를 살펴볼 수 있습니다.

  • 뷰 모드 순환 으로 다양한 유형의 씬 데이터가 처리되는 모습을 살펴볼 수 있습니다.

이 새로운 기능은 에디터에서 플레이(PIE) 중 디버그 카메라 컨트롤러를 사용할 때 게임 내 디버깅 능력을 증강합니다. 뷰 모드와 그래픽 버퍼를 살펴보면 게임 내에서 예상하지 못한 씬 결과를 진단할 수 있습니다.

PIE에서 디버그 카메라 컨트롤러를 열려면 콘솔 명령어에 ToggleDebugCamera를 입력하거나 새로운 세미콜론 단축키를 사용하세요.

신규: 멀티 유저 편집 개선 (베타)

실제 프로덕션 사용 사례에 더 알맞도록 멀티 유저 편집을 크게 개선했습니다.

유저 인터페이스를 간소화해 불필요한 대화창을 없애고 세션 관리에 필요한 모든 정보와 조작 방법을 한곳에 모았습니다.

(툴바의 멀티 유저 편집 아이콘이 기본 숨김으로 변경되었습니다. **창 > 개발 툴** 메뉴에서 새로 추가된 **멀티 유저 편집 브라우저** 를 열거나 **프로젝트 세팅** 대화창에서 툴바를 다시 활성화할 수 있습니다. [](Engine/Editor/MultiUser/Reference) 문서를 참고하세요.)
  • 모든 세션 참가자의 트랜잭션 시스템 안정성을 크게 개선했습니다.

  • 세션을 종료하기 전 세션 소유자에게 변경 사항을 유지할지 확인하여 사용자 오류로 세션 데이터를 잃을 가능성을 최소화했습니다. 이제 세션이 종료되면 서버가 자동으로 실행중인 모든 라이브 서버를 아카이브로 저장하며 필요하다면 나중에 아카이브에서 데이터를 복구할 수 있습니다.

  • 애셋 잠금 시스템을 개선해 여러 유저가 같은 애셋에서 작업하기 쉽도록 했습니다. 이제 같은 세션의 다른 유저가 잠근 애셋을 수정하려고 하면 알림이 표시됩니다. 해당 유저가 잠금을 해제하면 자동으로 해당 애셋의 잠금 권한이 자신에게 넘어와 다음에 저장할 때까지 유지됩니다.

멀티 유저 편집 시스템에 관한 자세한 정보는 문서 를 참고하세요.

신규: 작업 복구 (실험 단계)

새로운 Disaster Recovery (작업 복구) 시스템은 에디터의 기존 자동 저장 시스템을 증강해 예상치 못하게 작업이 종료되더라도 프로젝트 콘텐츠에 적용한 변경 사항을 복구할 수 있습니다.

작업 중 멀티 유저 편집 시스템과 동일한 트랜잭션 시스템을 사용해 편집 내용을 기록합니다. 변경 사항을 저장하지 않은 상태로 에디터가 종료된다면 프로젝트를 다시 열었을 때 마지막으로 저장한 이후 진행한 트랜잭션 목록이 표시됩니다. 목록에 있는 모든 변경 사항, 아니면 선택한 복구 지점까지의 변경 사항을 복구할 수 있습니다.

신규: 드래그 앤 드롭으로 배열 채우기

이제 콘텐츠 브라우저에서 애셋을 여러 개 선택해 배열 헤더로 드래그 앤 드롭하면 배열을 채울 수 있습니다. 배열로 만들고 싶은 같은 유형의 애셋을 여러 개 선택하고 콘텐츠 브라우저에서 배열 헤더로 드래그하세요. 애셋을 저장하는 배열에 사용할 수 있으며, 큰 배열로 작업할 때 워크플로를 단순화합니다.

자세한 정보는 배열 컨트롤 문서를 참고하세요.

신규: EditConditions 메타데이터 개선 (베타)

이제 간단한 부울 표현식으로 디테일 패널의 프로퍼티 편집을 활성화 또는 비활성화할 수 있으며, UPROPERTY 시스템의 EditCondition 메타데이터에 대해 새 표현식 파서를 사용합니다. 열거형과 숫자 유형도 지원하므로, 오버헤드를 최소로 하면서 비교적 복잡한 표현식을 작성할 수 있습니다.

사용자가 편집할 수 있는 클래스를 작성하는 경우, 예를 들면 Actor 나 Component 처럼 특정 프로퍼티가 조건부로 유효한 경우, 세부사항 전체를 커스텀 클래스로 작성하지 않고도 더욱 직관적인 UI를 생성할 수 있습니다.

이제 EditCondition 메타 태그가 거의 모든 유효한 C++ 표현식을 받습니다. 예를 들어 이번 변경 이후 유효한 프로퍼티 정의는 다음과 같습니다.

UPROPERTY(EditAnywhere, Category=EditCondition, meta=( EditCondition="IntegerEditCondition >= 5" ))

다른 유효한 표현식의 예는 다음과 같습니다.

  • MyInteger > 5 && MyFloat <= 10

  • MyEnum == EnumType::B

  • MyBool == true || MyInteger == MyFloat + 5

신규: 에디터 유틸리티 블루프린트 업데이트 (베타)

에디터 유틸리티 블루프린트 업데이트를 통해 블루프린트를 사용한 에디터 확장성이 개선되어, Python 및 C++ 확장성과 비슷해졌습니다. 이제 에디터 유틸리티 위젯으로 기존 에디터 유틸리티 블루프린트의 자동 생성 버튼보다 더욱 자세하게 UI를 커스터마이징할 수 있습니다.

개선 사항은 다음과 같습니다.

  • 부모 클래스는 위젯이 아닌 어떤 에디터 전용 클래스도 될 수 있습니다.

  • 함수 호출에 대한 인스턴싱이 필요한 에디터 유틸리티의 인스턴스를 생성할 수 있습니다.

  • 에디터 유틸리티 블루프린트 또는 에디터 유틸리티 위젯에 Run 함수를 추가하는 기능으로 에디터 시작 시 스크립트를 실행할 수 있습니다. 이렇게 하면 인스턴스 생성 및 상태 저장 에디터 이벤트에 바인딩할 수 있습니다.

신규: 관련 없는 노드 숨기기

이제 노드를 선택하고 관련 없음 숨기기 기능을 사용해 선택한 노드와 연결되지 않은 다른 모든 노드를 흐리게 만들 수 있어, 머티리얼과 블루프린트를 더욱 깔끔하고 정확한 방식으로 디버깅하고 이해할 수 있습니다.

신규: 랜드스케이프 스플라인 개선

이제 ALT + 좌클릭 드래그 를 사용해 새로운 스플라인 컨트롤 포인트와 세그먼트를 생성할 수 있습니다. 이는 새로운 스플라인을 추가하는 CTRL + 좌클릭 동작에 추가된 것입니다. ALT + 좌클릭 드래그 의 장점은 커서를 드래그하면서 새로운 스플라인이 어떻게 생겼는지 확인할 수 있다는 것입니다. 이 동작으로 스플라인을 나눌 수도 있습니다.

새로운 컨트롤 포인트를 추가하려면 기존 컨트롤 포인트를 선택하고 새로운 포인트를 만들고 싶은 방향으로 ALT + 좌클릭 드래그 합니다. 기존 스플라인을 나누려면 세그먼트 한 쪽 끝의 스플라인 포인트를 선택하고 경로를 나눌 기존 선분 쪽으로 커서를 ALT + 좌클릭 드래그 합니다.

신규: 에디터 퍼포먼스 개선

아주 큰 씬을 작업하는 일이 자주 있다면 퍼포먼스가 크게 개선되어 작업이 더욱 빠르고 부드러워졌다는 걸 알 수 있을 겁니다. 한 번에 수백, 수천 개의 앵커를 선택하거나 선택 취소할 때, 액터가 수천 개 포함된 레이어를 표시하거나 숨길 때, 다른 액터 수천 개의 부모인 액터를 선택해 작업할 때, 액터 수천 개가 든 레벨을 로드할 때 등 작업이 훨씬 빨라졌습니다.

신규: 머티리얼 에디터 업데이트

머티리얼 에디터와 머티리얼 인스턴스 에디터 워크플로가 개선되었으며, 머티리얼과 머티리얼 인스턴스 스크립트 작성 능력을 향상했습니다.

image alt text

  • 이제 머티리얼 에디터 툴바의 계층구조 버튼을 누르면 메뉴가 나타나 모든 직계 자손이 표시되므로, 빠르게 액세스해 편집할 수 있습니다.

  • 이제 머티리얼 인스턴스 에디터의 계층구조 메뉴에 머티리얼과 머티리얼 인스턴스의 부모 체인에 더해 모든 직계 자손이 표시됩니다.

  • 머티리얼 스크립팅 라이브러리에 에디터 유틸리티 위젯, 에디터 유틸리티 블루프린트, Python, C++에서 사용할 수 있는 노드를 추가했습니다.

    • 머티리얼 인스턴스: GetStaticSwitchParameterValue

    • 머티리얼: GetMaterialDefaultScalarParameterValue, GetMaterialDefaultVectorParameterValue, GetMaterialDefaultTextureParameterValue, GetMaterialDefaultStaticSwitchParameterValue, HasMaterialUsage (머티리얼에 주어진 사용 플래그가 있는지 확인할 때), GetChildInstances, Get___ParameterNames (스칼라, 벡터, 텍스처 또는 스태틱 스위치 파라미터 이름 배열을 구할 때), Get___ParameterSource (소스 애셋을 찾아, 함수인지 머티리얼인지, 파라미터가 어디서 정의되었는지 알아내며, 마찬가지로 스칼라, 벡터 등에 대한 버전도 있습니다).

  • 머티리얼 인스턴스에 표시된 파라미터 이름에 마우스를 올리면 파라미터가 정의된 애셋의 이름을 볼 수 있습니다. 여러 단계로 중첩된 함수가 있는 머티리얼 작업이 쉬워집니다.

신규: UMG 접근성 슬레이트 스크린 리더 지원 (실험단계)

이제 UE4 는 Windows 에서 서드파티 스크린 리더 또는 iOS 에서 VoiceOver 를 지원하여, 게임 UI 접근성을 높이고 CVAA 표준을 준수할 수 있도록 돕습니다. NVDA, JAWS 와 같은 스크린 리더는 소프트웨어 애플리케이션의 UI 를 사용자에게 읽어줄 수 있습니다. 시각 장애인들이 소프트웨어 애플리케이션을 사용하고 조작할 수 있도록 돕는 필수 기능입니다.

4.23 이후 UE4 에 포함된 API 를 통해 서드파티 스크린 리더로 UI 텍스트를 읽을 수 있습니다. 텍스트 블록, 편집가능 텍스트 블록, 슬라이더, 버튼, 체크박스와 같은 일반 UMG 위젯 다수를 지원합니다. 이 내장 기능 덕에 텍스트 투 스피치 기술을 별도 구현할 필요가 없어, 스크린 리더 지원이 쉬워집니다.

스크린 리더 지원을 활성화하려면, 프로젝트 또는 엔진 콘솔 변수 환경설정 파일로 가야 합니다. 그 안에 Accessibility.Enable=1 변수를 추가하면 됩니다.

자세한 정보는 Supporting Screen Readers (영문) 문서를 참고하세요.

신규: Wacom 태블릿 지원 (실험단계)

페인팅 플러그인이나 모델링 툴 등 기능을 사용한다면 새로운 플러그인을 사용해 Wacom 스타일 태블릿과 스타일러스 시스템이 제공하는 펜 압력과 기울기 등 추가 스타일러스 입력 방식에 액세스할 수 있습니다.

모든 태블릿이 API가 지원하는 모든 값을 지원하는 건 아닙니다. 서브시스템이 모든 지원값을 노출하도록 작성된 것은 의도된 사항입니다. 어떤 값에 초점을 맞춰야 하느냐는 서브시스템 사용자에게 달려있습니다.

실험단계인 기능으로, 현재 언리얼 엔진 툴에 지원되지 않습니다.

신규: UMG 위젯 비교

블루프린트 비교 기능을 확장 및 개선하여 위젯 블루프린트는 물론 액터와 애니메이션 블루프린트도 지원합니다! 새로운 툴은 블루프린트의 구조 변경, 프로퍼티 및 함수 플래그, 클래스 세팅, 부모 클래스, 컴포넌트 추가 외에도 (이제 위젯 및 위젯 슬롯의 기본 프로퍼티를 포함하는) 기본 프로퍼티 값과 블루프린트 그래프 변경사항도 표시합니다.

image alt text

이미 작성한 커스텀 블루프린트 서브클래스를 비교하려면, FindDiffs 함수를 오버라이드해서 표시하려는 구체적인 변경사항을 나열하고, 비교할 서브오브젝트를 요청하면 됩니다.

신규: 변경 유지 랜드스케이프 편집 (실험단계)

이제 변경 유지 레이어로 랜드스케이프 하이트 맵과 페인트 레이어를 편집할 수 있습니다. 랜드스케이프에 여러 레이어를 추가해도 서로 독립적으로 편집할 수 있습니다. 이 새 레이어 기능은 랜드스케이프 조각 및 페인트 작업에 대한 토대로 작동하여, 랜드스케이프 조작 및 유지 효율이 높아집니다.

레이어를 추가할 때도 변경하고 싶지 않은 레이어는 잠그고 한 번에 하나에만 집중할 수 있습니다. 다른 레이어를 숨겨서 특정 레이어에만 집중하거나 특정 레이어가 없으면 랜드스케이프가 어떻게 될지도 확인할 수 있습니다. 마지막으로 Layer Contribution (레이어 기여)를 활성화하면 레이어가 뷰포트에서 강조되어 해당 레이어 안에서 일어나는 모든 조각 및 페인트 작업을, 심지어 레이어를 추가하자 마자 볼 수 있습니다. 레이어 순서나 레이어 알파 블렌딩 조정과 같은 옵션도 새로 생겼습니다.

이제 랜드스케이프 스플라인 터레인 변경 및 페인트도 스플라인에 대한 레이어가 유지되어 변경 유지 편집이 가능합니다. 이제 스플라인을 편집, 변경, 이동해도 랜드스케이프에 길게 뻗은 도로나 길이 유지된다는 뜻입니다.

자세한 정보는 Non-Destructive Landscape Layers and Splines (영문) 문서를 참고하세요.

신규: 폴리지 툴로 인터랙티브 액터 배치

이제 폴리지 툴에 스태틱 메시 말고도 인터랙티브 액터로 씬을 채우는 기능을 지원합니다. 폴리지 툴로 배치한 액터는 스태틱 메시와 같은 방식으로 동작하므로, 지형을 조각하거나 페인트한 스태틱 메시를 옮기면 자동으로 퍼집니다.

예를 들어 이 동영상에 흩어진 나무는 상호작용 로직과 스태틱 메시 컴포넌트를 갖는 블루프린트 액터입니다. 나중에 지형을 수정하면 나무 액터가 지형의 새로운 높이에 맞게 자동으로 업데이트됩니다.

폴리지 액터가 인스턴스 메시로 렌더되지 않는 이유는 렌더러가 볼 때 레벨에 직접 각각 배치한 것처럼 취급하기 때문입니다.

자세한 정보는 폴리지 모드를 참고하세요.

신규: HDRI 백드롭 액터

새로운 HDRI 백드롭(배경막) 액터를 사용하면 HDRI 이미지 하나로 레벨에 현실적인 배경과 라이팅 환경을 더욱 쉽고 빠르게 만들 수 있습니다. 레벨에 액터를 배치하고 배경막에 투영하고 싶은 이미지를 HDRI 텍스처로 할당하면, 스카이 라이트가 자동 구성되어 이미지에서 끌어온 주변광, 정확한 리플렉션, 레벨 콘텐츠가 드리우는 그림자를 포착하는 바닥 표면을 제공합니다.

워크플로와 투영을 제어할 수 있는 세팅에 대한 자세한 정보는 HDRI Backdrop 문서를 참고하세요.

신규: 익스포넨셜 하이트 포그용 듀얼 하이트 포그

익스포넨셜 하이트 포그 볼륨을 사용할 때 추가 포그 레이어에 안개 농도, 고도 감쇠, 고도 오프셋 파라미터를 추가해 포그 제어를 개선했습니다.

image alt text

1 - 익스포넨셜 하이트 포그 없음; 2 - 익스포넨셜 하이트 포그; 3 - 듀얼 익스포넨셜 하이트 포그

신규: 다이내믹 섀도 바이어스 개선

이번 버전에서는 무버블 라이트의 섀도 바이어스를 개선하기 위해 몇 가지 파라미터를 새로 추가했으며, 라이트별로 설정하거나 콘솔 변수를 사용해 라이트 유형별로 전역 설정할 수도 있습니다. 상수 섀도 바이어스 파라미터 말고도 기울기(Slope) 바이어스를 추가해서 (전부는 아니라도) 일부 그림자 아티팩트 및 애크니를 해결할 수 있도록 했습니다. 디렉셔널 라이트의 경우, 특별 추가된 깊이 바이어스 파라미터의 섀도 캐스케이드 바이어스 분포(Shadow Cascade Bias Distribution)로 전체 캐스케이드의 바이어스 세기를 제어할 수 있습니다.

image alt text

1 - 기울기 바이어스 및 섀도 캐스케이드 바이어스 분포 조정 이전; 2 - 기울기 바이어스 및 섀도 캐스케이스 바이어스 분포 조정 이후

고려할 부분이 두 가지 있습니다. 섀도 맵 렌더 도중에는 기울기 바이어스가, 섀도 맵 읽기 도중에는 리시버 바이어스가 쓰인다는 것입니다. 기울기 바이어스는 라이트마다 제어할 수 있으며 섀도 (상수) 바이어스에 비례합니다. 상수 바이어스와 기울기 바이어스를 사용할 때는 섀도 퀄리티와 정확도 중 하나를 선택해야 하며 이렇게 하면 일부 아티팩트를 해결할 수 있습니다.

리시버 바이어스를 제어하려면, r.Shadow.* 콘솔 변수 값을 0 (정확도가 높지만, 아티팩트 많음)과 1 (정확도가 낮지만, 아티팩트 적음) 사이로 설정해 라이트 유형별로 전역 설정할 수 있습니다. 어떤 라이트 유형의 상수 및 기울기 바이어스도 콘솔 변수를 사용해 전역 설정할 수 있습니다.

신규: Pre-Skinned Local Bounds 머티리얼 표현식

스켈레탈 메시의 Pre-Skinned Local Bounds (스키닝 전 로컬 바운드)를 반환하는 새로운 머티리얼 표현식을 추가했습니다. 이 표현식으로 머티리얼을 통해 액터의 바운드 내 상대 위치를 계산할 수 있습니다. 이 바운드는 애니메이션을 적용한 경우에도 바뀌지 않으므로, 머티리얼을 일관된 또는 고정된 방식으로 적용할 수 있으며, 무기나 비히클에 적용되는 장식성 래핑같은 패턴을 예로 들 수 있습니다. 애니메이션 에디터 캐릭터 드롭다운의 메시 카테고리 아래 메시의 스킨을 입히기 전 로컬 바운드를 시각화할 수 있습니다.

신규: 커스텀 프리미티브 별 데이터 저장

이제 머티리얼 인스턴스 단위 대신 프리미티브 단위 수준에 데이터 저장을 지원하여, 프리미티브가 자동으로 다이내믹 인스턴스 드로잉 대상으로 간주하도록 할 수 있습니다.

프리미티브 별 Use Custom Primitive Data (커스텀 프리미티브 데이터 사용) 옵션으로 데이터를 저장하면 비슷한 지오메트리에 필요한 드로 콜의 수가 감소하는 이점이 있으며, 이는 각 프리미티브에 자체 커스텀 데이터가 있더라도 마찬가지입니다.

신규: From Material Expression 셰이딩 모델

새로운 From Material Expression 셰이딩 모델을 사용하면 머티리얼 하나에 셰이딩 모델 다수를 사용할 수 있습니다!

image alt text

Material Output 및 Material Attribute 노드를 사용하는 이전 워크플로는 물론, If 문, BlendMaterialAttribute, 스태틱 스위치, 머티리얼 인스턴스를 사용하는 일반적인 워크플로도 완벽 지원합니다.

이는 애셋 하나에 머티리얼이 둘 사용되어 레벨의 해당 애셋 각 인스턴스마다 드로 콜이 두 번 발생하는 경우, 사용되는 드로 콜 수를 최적화하여 줄일 수 있습니다. 두 셰이딩 모델을 사용하는 하나의 머티리얼을 통해 드로 콜을 하나로 줄일 수 있기 때문입니다.

자세한 정보는 From Material Expression (영문) 문서를 참고하세요.

신규: IES 프로파일 개선

이번 버전에는 에디터에서 IES 프로파일을 사용하고 다양한 라이트 유형에 사용하는 방식을 개선했습니다.

  • 이제 IES가 할당된 포인트 및 스포트 라이트가 포토메트릭 데이터를 3D로 시각화해서 보여줍니다.

  • C 타입 IES 파일 지원이 향상되어 축 대칭 디스플레이가 아티팩트 없이 개선됩니다.

  • 이제 콘텐츠 브라우저의 IES 텍스처 아이콘에 포토메트릭 데이터 프리뷰가 표시됩니다.

자세한 정보는 IES 라이트 프로파일 문서를 참고하세요.

신규: 렌더 종속성 그래프

Rendering Dependency Graph (렌더 종속성 그래프, RDG) 또는 줄여서 "렌더 그래프"는 최신 그래픽 API의 장점을 활용하도록 설계되어, 자동 비동기 연산 스케줄링은 물론 보다 효율적인 메모리 및 배리어 관리를 통해 퍼포먼스를 향상시킵니다.

언리얼 엔진의 렌더러를 RDG로 이식하고 있으며 이후 새로운 기능의 렌더 패스를 만들 때 해당 API를 주로 사용할 예정입니다. 아직 구현이 개발 초기고 현재 퍼포먼스 이점은 많이 부족하지만, 프로덕션에 쓰일 정도로 안정적인 API입니다.

자세한 정보는 Rendering Dependency Graph (영문) 문서를 참고하세요.

신규: 컴포셔 개선

이번 버전에서는 컴포셔에 새로운 옵션을 추가했습니다.

  • AlphaHoldOut 블렌드 모드 - 오브젝트의 머티리얼 알파를 사용하여 해당 오브젝트 뒤에 구멍을 뚫는 새로운 머티리얼 블렌드 모드입니다.

  • 컬러 그레이딩 - 이제 컴포셔가 부동 소수점 포스트 프로세싱 룩업테이블(LUT)을 사용하는 화이트 밸런스와 컬러 그레이딩을 지원합니다.

  • 컴포셔 레이어가 씬 카메라에서 포스트 프로세스 파라미터 상속 - 이제 컴포셔 레이어가 씬 카메라에서 포스트 프로세싱 파라미터를 상속해, 각 CG 레이어마다 색 보정 컨트롤을 선택적으로 활성화할 수 있습니다.

학습 탭에서 사용할 수 있는 컴포셔 샘플 역시 언리얼 엔진의 최신 합성 워크플로를 반영하도록 업데이트되었습니다!

신규: Python 임포트/익스포트 FBX

이제 Python 스크립팅이 FBX 애니메이션 임포트와 익스포트를 지원합니다.

신규: 프로 비디오 코덱

언리얼 엔진이 지원하는 비디오 코덱을 늘려 언리얼 엔진과 전문 동영상 프로덕션 파이프라인과 워크플로를 통합하기 쉽도록 했습니다.

이제 Apple ProRes Encoder로 Pro Media 파일을 익스포트할 수 있습니다.

  • 코덱의 모든 포맷을 지원합니다. 4444 XQ, 4444, 422 HQ, 422, 422 LT, 422 Proxy

  • 여러 프레임 속도와 해상도를 지원합니다.

  • 임베드한 타임코드 트랙을 지원합니다.

  • 임베드한 오디오는 지원하지 않습니다. 오디오가 다운 믹스되며 별개의 .wav 파일로 익스포트됩니다.

  • Windows 플랫폼에서만 지원합니다.

자세한 정보는 새로운 하우투 가이드인 Exporting Pro Media Files to Apple ProRes (영문) 페이지를 참고하세요.

이제 미디어 프레임워크가 HAP 코덱으로 인코딩된 파일을 재생할 수 있습니다.

  • 코덱의 모든 포맷을 지원합니다: HAP, HAP Alpha, HAP Q, HAP Q Alpha

  • 1x 4K 60 FPS 동영상 또는 2x 4K 30 FPS 동영상 재생을 지원하며, 2x 4K 60 FPS 동영상까지 늘릴 수 있습니다.

  • 알파 채널을 완벽 지원합니다.

  • 다중 프레임 속도와 해상도를 지원합니다.

  • 오디오 또는 타임코드 삽입은 지원하지 않습니다.

  • 현재 8K와 16K는 지원하지 않습니다.

자세한 정보는 미디어 프레임워크 테크니컬 레퍼런스의 HAP 코덱 재생 지원 항목을 참고하세요.

신규: 스테레오 파노라믹 캡처 툴 개선 (실험단계)

스테레오 파노라믹 캡처 툴을 업데이트해, 이제 훨씬 쉽게 가상 세계의 고퀄리티 스테레오스코픽 스틸 샷과 동영상을 산업 표준 형식으로 캡처하고, Oculus 또는 GearVR 헤드셋에서 감상할 수 있습니다. 렌더 세팅, 비트 깊이, 퀄리티 제어를 확장했습니다. 캡처할 그래픽 버퍼를 선택해 다른 애플리케이션에서 이미지를 합성하거나 후처리할 수도 있습니다.

신규: 플랫폼 SDK 업그레이드

새 출시 버전마다 플랫폼 파트너의 최신 SDK 버전을 지원하도록 업데이트하고 있습니다.

image_37

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

    • Visual Studio - Visual Studio 2017 v15.9.11 toolchain (14.16.27023) 및 Windows 10 SDK (10.0.16299.0)

      • 최소 지원 버전

        • Visual Studio 2017 v15.6

      • NET 4.6.2 Targeting Pack 필수

    • Xcode - Xcode 10.3

  • Android

    • Android NDK r14b (새 CodeWorks for Android 1r7u1 인스톨러가 Windows 및 Mac 의 이전 CodeWorks 를 대체하며, Linux 는 1r6u1에 수정 사항을 더해 사용합니다.)

  • ARCore

    • 1.7

  • HTML5

    • Emscripten 1.38.31

  • Linux "SDK" (cross-toolchain)

  • Oculus Runtime

    • 1.37

  • OpenXR

    • 1.0

  • Google Stadia

    • 1.34

  • Lumin

    • 0.19.0

  • Steam

    • 1.42

  • SteamVR

    • 1.5.17

  • Switch

    • SDK 8.3.0 + optional NEX 4.6.3 (Firmware 7.x.x-x.x)

    • 지원 IDE: Visual Studio 2017, Visual Studio 2015

  • PS4

    • 6.508.001

    • 펌웨어 버전 6.510.011

    • 지원 IDE: Visual Studio 2017, Visual Studio 2015

  • XBoxOne

    • XDK: July 2019 QFE-9

    • 펌웨어 버전: May 2019 10.0.18362.3055

    • 지원 IDE: Visual Studio 2017

  • MacOS

    • SDK 10.14

  • iOS

    • SDK 12

  • tvOS

    • SDK 12

업그레이드 노트

에디터

마티네

  • 언리얼 엔진 4.23 부터 마티네가 더이상 지원되지 않으며 추후 엔진에서 제거될 예정입니다. 제거된 이후에는, 마티네 파일을 열 수 없게 될 것입니다.

    마티네 시퀀스를 가능한 한 시퀀서 시퀀스로 변환하는 방법은 Converting Matinee Files to Sequencer 문서를 참고하세요.

VR 에디터

  • GDC 2017 에서 선보였던 VR 메시 에디터는 더이상 지원되지 않습니다. 메시 에디터 플러그인은 추후 엔진에서 제거될 예정입니다.

플랫폼

HTML5

  • HTML5 플랫폼 지원이 GitHub 에 커뮤니티 지원 플랫폼 익스텐션 으로 이주되어 앞으로는 더이상 에픽이 공식 지원하지 않습니다.

iOS

  • iOS 10 지원이 제거되었습니다. 이제 최소 지원 버전은 iOS 11 입니다.

  • iOS 에서 OpenGL 지원이 빠르면 4.24 에서 제거될 예정입니다. 제거되면, Metal 이 iOS 디바이스에서 지원되는 유일한 렌더링 패스가 됩니다.

Release Notes

AI

  • Bug Fix: AISense Sight now preserves its result history when its config gets updated at runtime.

  • Bug Fix: Fixed an edge case in EQS result sorting where it would sort the results multiple times if doing a time-sliced expensive filter test at the end.

  • Bug Fix: Fixed a bug in EQS test sorting that was resulting in test order not matching the feature's design. The fix also improves runtime EQS performance when running queries in a 'single item' mode.

  • Bug Fix: Fixed using wrong EQS test scoring sign during inverse linear scoring.

  • Bug Fix: GetKnownPerceivedActors used with a given Sense class no longer returns actors once stimuli are forgotten.

  • New: EQS Volume Test - A Simple EQS Test to check if a point is in one AVolume (volumes list generated either by a context or a AVolume class). The test can do either simple bounding box checks or a full physic test for more complex volume shapes.

  • New: TeamAttitude enum is now a BlueprintType.

  • New: Added an option in EnvQueryTest_Overlap to filter out the actor performing the query.

  • New: Added a comment keyboard shortcut for Behavior Tree editor.

  • New: The AI Support plugin now forcibly loads AI modules early in the Editor startup sequence. They are no longer loaded by Blueprint UI.

Behavior Tree

  • Bug Fix: Made Behavior Tree Editor comment creation consistent with Blueprint Editor so that comments get created when a single node is selected.

Debugging Tools

  • Bug Fix: Added logging to the two cases that can make RecastNavMeshGenerator recreate the dtNavMesh instance.

  • Bug Fix: Fixed a bug where you would not see any instances of the BehaviorTree when opening the debugger after PIE was started.

  • Bug Fix: Fixed BehaviorTree not pausing dedicated server world upon breakpoint in BehaviorTree editor in PIE.

  • Bug Fix: Behavior Tree Debugger now resumes a session paused by a Blueprint breakpoint.

  • New: Added a way to configure navmesh drawing GameplayDebugger category to mark up "forbidden" nav polys (the ones that have extended navmesh drawing to be able to optionally mark polys excluded by navmesh's default query filter (via dtQueryFilter.data.m_excludeFlags). See FRecastDebugGeometry.bMarkForbiddenPolys property and ai.debug.nav.DrawExcludedFlags console variable.

  • New: When picking pawn in the GameplayDebugger, it also selects it in the UE Editor. That way the BehaviorTreeEditor automatically changes to the right one.

  • Crashfix: Fixed editor crash when trying to use NavigationSystemBase class with NavigationSystemModuleConfig.

  • Bugfix: Fixed a tiny editor-time memory leak occurring when FRecastNavMeshGenerator fails to create or initialize dtNavMesh. This can happen when navigation bounds get removed.

  • Bugfix: Fixed Detour's CollectRegionsMonotone, CollectRegionsChunky, CollectLayerRegionsMonotone and CollectLayerRegionsChunky to not fail as 'out of memory' when no regions were found. Instead, if the region count is 0 we simply return as 'success' since no issues occurred. Updated the rest of nav generation process to handle these results properly.

  • Bugfix: Made sure we mark all the navigable space dirty after recreating dtNavMesh instance due to mismatching navmesh properties.

  • Bugfix: Fixed a bug in ARecastNavMesh::GetRandomReachablePointInRadius that resulted in erroneous behavior for large Radius values.

  • Bugfix: Fixed NavModifierVolume not updating navmesh upon undoing changes in the Editor

  • Bugfix: Fixed gathering of lazy navigation collision of landscape.

  • Bugfix: Deprecated K2_GetRandomPointInNavigableRadius, and replaced it with BlueprintCallable K2_GetRandomLocationInNavigableRadius. Initialized RandomLocation to Origin, and will only set it upon success.

  • Bugfix: NavLinkProxy using SmartLinks are now loaded with the proper transform.

  • Bugfix: Made NavModifierComponent work properly even if its owner's root component was marked as nav-irrelevant.

  • Bugfix: Forcing re-registering NavAreas modified in the Editor to support better debugging via NavigationTestingActors (for example) and changing area costs in between PIE sessions.

  • New: Added functions for quick replacing of nav area information in NavOctree and RecastNavMesh:

    • ARecastNavMesh::ReplaceAreaInTileBounds replaces occurrences of given area directly on navmesh polys (checking and setting areaID) in tiles overlapped by given bounding box.

    • UNavigationSystemV1::ReplaceAreaInOctreeData replaces occurrences of given area in object's nav representation in the NavOctree.

  • New: Added the concept of supported navigation agents to Smart Links.

  • New: Added ProjectGoalOnNavigation parameter to the AIMoveTo function to allow the user to disable navigation usage entirely.

  • New: Added a way to query the NavMesh generator to determine if generation is taking place at a given moment inside a specified bounding box.

  • New: Adding some perf starts to RegisterNavOctreeElement / UnregisterNavOctreeElement. These functions have proven to be quite expensive when there is a lot of geometry in the NavOctree.

  • New: Added a new ConditionalPopulateNavOctreeActor Delegate to the Navigation System.

Animation

  • Crash Fix: Fixed crashes and inconsistent values when accessing BoneSpaceTransform due to a memory swap that happens during evaluation.

  • Crash Fix: Fixed a crash in TriggerMontageEndedEvent when a montage end notification triggers actor destruction.

  • Crash Fix: Fixed a crash when a redirector is displayed for a skeletal mesh upon renaming an asset.

  • Bugfix: Fixed memory corruption in FSkeletalMeshMerge::GenerateLODModel().

  • Bugfix: Fixed a problem related to adding curves when using an Animation Modifier.

  • Bugfix: Addressed a couple of issues with Animation Notify functions in the AnimationBlueprintLibrary.

  • Bugfix: Fixed use of uninitialized member in Anim Instance proxy.

  • Bugfix: Fixed condition where having an Additive animation state in an Animation Sharing setup asset would cause the system not to initialise.

  • Bugfix: Ensured that Alembic files as Static Meshes import correctly when skipping empty frames.

  • Bugfix: Fixed an issue with thread access of the Default Curve UID List.

  • Bugfix: Removed unnecessary Animation Property Changed events in undo log.

  • New: Removed cloth simulation logic from FAnimationBudgetAllocator::TickEnableHelper(). Some use cases require the mesh component to tick but have cloth disabled.

  • New: Improved quality of motion vectors when playing back Geometry Cache files.

  • New: Improved Additive animation support in Animation Sharing system by making them consistent.

  • Optimization: We now normalize bone rotation only once when getting the animation pose out of the pose asset.

Animation Blueprints

  • Crash Fix: Fixed a crash related to right-clicking a Sequence Player node in an Animation Blueprint, after previously deleting Animation Sequence asset.

  • Crash Fix: Fixed crash in FAnimNode_RigidBody caused by referencing bones that don't exist at lower LODs.

  • Bugfix: Reinitialized the Copy Pose From Mesh node when the target mesh changes. Fixing the Animation Pose breaking when dynamically changing between Skeletal Meshes that use the same Animation Blueprint but have a different number of bones.

  • Bugfix: Added checks to ensure that Animation Montages cannot be played back using an Animation Sequencer Player node.

  • Bugfix: Fixed issue where Animation Notify events would not show up as implementable in the Animation Blueprint event graph.

  • New: "Layered blend per bone" node now has an option "Mesh Space Scale Blend" which performs scale blending in mesh space instead of local space.

  • New: Improved tooltips for the AnimDynamics Animation Blueprint node.

  • New: Users can now enable / disable cone drawing for the input poses with PoseDriver.

  • New: Added a warning message to the Constraint Animation Blueprint node to flag nodes which don't have normalized weights.

Animation Tools

  • Bugfix: The Animation Editor now unregisters certain detail layout delegates on shutdown.

  • Bugfix: Fixed an issue where the Editor would freeze if an Anim Composite length was set to 0, while having an animation with a notify.

  • Bugfix: Made sure Skeleton Tree is refreshed when re-importing a Skeletal Mesh.

  • New: When using custom AnimNotify classes, it is now possible to have the UI automatically generate a bone name search field for a property if the AnimNotifyBoneName is used. For example:

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AnimNotify", meta = (AnimNotifyBoneName = "true"))
    
    FName SocketName;

Import/Export

  • Bugfix: Fixed an issue with disabling import bone tracks.

  • New: Added MorphTarget support when exporting Skeletal Mesh.

Skeletal Mesh

  • Crash Fix: Attempting to rename multiple sockets in a Skeletal Mesh at the same time no longer causes a crash.

  • Crash Fix: Fixed crash in FSkeletalMeshComponentDetails::UpdateAnimationCategory when a custom Skeletal Mesh Component hides the Animation category via the HideCategories UCLASS specifier.

  • Bugfix: Fixed issue where Create Render State was destroying morphtarget values which was causing flickering.

  • Bugfix: Fixed crash when a virtual bone exists but the retargeted Skeleton does not include the virtual bone.

  • New: Support for AnimClass Property Track by exposing SetAnimClass,GetAnimClass. Added redirects for k2_SetAnimInstanceClass (and previous SetAnimInstanceClass).

Audio

  • Crash Fix: Fixed crashes when requesting an eviction of the same sound in the same frame from multiple concurrency groups.

  • Crash Fix: Fixed a crash when releasing reverb with Steam Audio.

  • Crash Fix: Fixed a crash when passing a null TimeSynth volume group to SetVolumeGroup.

  • Crash Fix: Fixed crashes when using the new Spectrum Analyzer data getter method.

  • Crash Fix: Fixed a crash in Flexiverb due to updates being called in SetSettings.

  • Crash Fix: Fixed a crash when attempting to play TimeSynth before activation.

  • Crash Fix: Fixed a hang when hot reloading in UAudioCaptureComponent.

  • Crash Fix: Fixed a crash when VirtualLoop was attempting to realize.

  • Crash Fix: Fixed a hang during cook.

  • Crash Fix: Fixed a hang in the audio mixer during flush.

  • Crash Fix: Fixed a rare crash in the editor when PIE is exited on Mac.

  • Crash Fix: Fixed a hang in audio streaming.

  • Crash Fix: Fixed crashes when handling failed sound initialization.

  • Crash Fix: Fixed a crash when updating listener transform.

  • Bug Fix: Fixed a bug in Phaser DSP effects where audio would go silent at certain project sample rates.

  • Bug Fix: Fixed a bug where Synth Sample Player would not play older sounds that still reported 0 samples.

  • Bug Fix: Fixed a bug where Concatenator Sound Nodes wouldn’t report a Delay if it was not the first child node in an execution tree.

  • Bug Fix: Fixed a bug where Distance Crossfade SoundCue node returned incorrect volume.

  • Bug Fix: Fixed a bug with hashing collisions in SoundNodes.

  • Bug Fix: Fixed a bug where stereo sources upmixing to surround used an incorrect listener distance for spread calculation.

  • Bug Fix: Fixed a bug with MIDI Pitch Bend parsing errors.

  • Bug Fix: Invalid prompts are now suppressed when importing/reimporting sound.

  • Bug Fix: Effect presets will now update in real-time while auditioning in the editor.

  • Bug Fix: Dynamic Volume feature now allows sound volumes to be selectively modified by hotfixing to work with the new audio mixer.

  • Bug Fix: Fixed concurrency not being observed properly when "Limit To Owner" was set.

  • Bug Fix: Fixed USynthComponent object reference to prevent GC.

  • Bug Fix: Fixed distortion and zippering during panning.

  • Bug Fix: Fixed leaked async task in the audio mixer.

  • Bug Fix: Fixed accidentally culling sounds before they async load in.

  • Bug Fix: Fixed potential memory leak on consoles when au.IsUsingAudioMixer was changed.

  • Bug Fix: Fixed ambisonics decoding with Google Resonance Audio.

  • Bug Fix: Fix for cvar swapping to legacy backend after launching with the audio mixer on PC when there are no audio devices available.

  • Bug Fix: Fixed issue where audio output on Android would stutter on devices that requested specific buffer sizes.

  • Bug Fix: Fixed native reverb for use with Google Resonance Audio and added the ability to disable HRTF spatialization via cvar.

  • Bug Fix: Fixed various potential crashes when loading and unloading USoundWave assets while playing streaming data.

  • Bug Fix: Fixed various issues associated with changing or disconnecting Playback Devices while the engine is running.

  • Bug Fix: Fixed pops on audio mixer due to timing problems with mixes.

  • Bug Fix: Fixed XMA2 streaming for audio mixer.

  • Bug Fix: Fixed audio streaming crashes.

  • Bug Fix: Fixed occlusion interpolation.

  • Bug Fix: Fixed a crash that would occur if a Sound Wave asset failed to cook properly.

  • Bug Fix: Fixed sound being removed from the streaming manager before it has stopped playing in the audio renderer.

  • Bug Fix: Enabled reverb to be muted while app is in the background.

  • Bug Fix: Enabled real-time decoding in audio mixer to be in the background priority thread pool.

  • Bug Fix: Added missing delete in audio streaming manager.

  • Bug Fix: Fixed failing initialization of audio device when no audio devices are available.

  • Bug Fix: Fixed virtualize when silent and loop virtualization.

  • Bug Fix: Fixed looping discontinuity with the audio mixer and ADPCM.

  • Bug Fix: Further fix for reverb, reducing the volume of quad verb by 0.5 to maintain power.

  • New: MaxChannels can now be overridden by any platform setting on initialization, not just the minimal value of the two.

  • New: Added spread to Stereo Panner effects to allow more interesting stereo channel operations.

  • New: Audio is now seekable on all platforms for streaming sounds using LPCM/ADPCM.

  • New: Included the ability to selectively target per platform audio settings and initialize accordingly. This is provided in .ini files for new projects.

  • New: Created a mid/side Spread control Source Effect.

  • New: Added mid/side decoding/encoding to the DSP library.

  • New: Standardized visualization calls with new au.3dVisualize family of commands.

  • New: Sounds limited by concurrency groups can now recover from volume ducking using a prescribed fade in/out time.

  • New: Included asset actions to create time synth clips from sound waves.

  • New: Added the ability to control Submix and Source Bus send levels based on listener distance.

  • New: Virtualizing looping audio sources is now possible; they can be visualized using the new au.VirtualLoops family of debug commands.

  • New: When importing, added the ability to templatize for non-imported properties of USoundWaves from pre-existing USoundWaves.

  • New: Concurrency now supports a user-specified fade out time due to a concurrency group stealing the playing sound's voice.

  • New: Added feature to enable audio mixer toggling to only happen once per load.

  • New: The HTML5 platform now uses the new Unreal Audio Engine by default.

  • New: Enabled Google Resonance Audio to make a global spatialization source setting, if one is not specified in the global plugin preset.

  • New: Added setting to disable creating new audio devices for PIE.

  • New: New getter functions on audio component retrieve data directly with no frequency interpolation.

  • New: Added the ability to log baked fft/envelope data to csv files.

  • New: Added the ability to override the sound wave to use for analysis of FFT attack/release envelope following.

  • Improvement: Optimized per-source low and high pass filters to run over 3 times faster.

  • Improvement: Optimized the built-in Audio Mixer Reverb Submix Effect to run 5 times faster.

  • Improvement: Command line auto-complete now supports all audio commands.

  • Improvement: The default mapping of surround speaker angles now align with Dolby specifications for 7.1 and 5.1 configurations.

  • Removed: Removed OneShotPriorityCullThreshold in AudioDevice.

  • Removed: Removed UAudioSettings::MaxWaveInstances.

Blueprints

  • Crash Fix: Fixed crash when editing user structs that are being used in a Blueprint instance that is open for editing.

  • Crash Fix: Fixed crash when changing classes on a blueprint while a different window is open for that blueprint.

  • Crash Fix: Fixed crash on load when using a Make Struct node in a blueprint, due to using a property that isn't visible to as an override pin.

  • Crash Fix: Saving a Blueprint that contains a Map variable whose default value includes an empty (unset) key will no longer crash the editor.

  • Crash Fix: Opening a partially-deleted Blueprint asset for editing after a failed attempt to force delete it will no longer crash the editor.

  • Bug Fix: Fixed rare crash when renaming a blueprint component via its variable.

  • Bug Fix: Deprecated API usage warning messages are now more consistent after compiling a Blueprint class/graph. Also fixed an issue where the deprecated API usage warning could appear more than once in the tooltip text.

  • Bug Fix: Fixed accessed none errors caused by accessing a Timeline component that is not connected to anything in its defining blueprint from another blueprint.

  • Bug Fix: Fixed crash that occurred when trying to change the type of a variable while in the blueprint diff window.

  • Bug Fix: Fixed a crash that sometimes occurred when mousing over output parameter pins during blueprint debugging.

  • Bug Fix: Fixed an ensure() that fired on an attempt to paste one or more Blueprint nodes with missing links into another graph that doesn't allow the node type(s).

  • Bug Fix: Fixed an ensure that fired when reloading a Blueprint asset with the current debug object in the Blueprint editor set to an instance of the Blueprint's class.

  • Bug Fix: PostDuplicate function for blueprints now also calls the PostDuplicate function on the CDO of their generated class.

  • Bug Fix: Enum literal values are now included in Blueprint search indexing along with functions that are referenced by Create Event nodes.

  • Bug Fix: The implicit World Context pin will no longer be visible and connected when dragging off an object pin and creating blueprint nodes that have a hidden world context pin as their first parameter.

  • Bug Fix: Fixed the DataAsset and Property Matrix editor to refresh properly when recompiling a parent blueprint

  • Bug Fix: PointLight, RectLight, and SpotLight now properly allow the contained light component to have their properties edited when subclassed in blueprints.

  • Bug Fix: Scroll wheels that can scroll in increments of less than 1 (eg. some Microsoft mice) can now zoom-in the blueprint editor.

  • Bug Fix: The 'Override Function' dropdown in blueprints is now sorted by name and searchable.

  • Bug Fix: The ConstructObject node can now correctly have a class variable of type Object connected to the Class pin.

  • Bug Fix: Changing a parameter's container type or pass by ref flag is now correctly transacted.

  • Bug Fix: Reordering categories now correctly creates an undo record and marks the Blueprint as modified.

  • Bug Fix: The Blueprint graph overlay now properly includes a client/server context label when a streaming level actor instance is selected as the active debugging context during a multiplayer PIE session.

  • Bug Fix: When applying instance changes to a blueprint, instance-only properties will no longer get copied to the blueprint.

  • Bug Fix: Blueprint compile errors are now more easily locatable after failing to start a PIE session. (contributed by KristofMorva).

  • Bug Fix: Make 'Redraw Time' have a Blueprint-friendly name

  • Bug Fix: Fixed issue which could cause blueprints using FText to cook non-deterministically

  • Bug Fix: The active debug object drop-down now includes a server/client context label during a multiplayer PIE session to differentiate between Actor instances with the same name when "All worlds" is selected. The overall selection behavior in the drop-down UX has also been improved.

  • Bug Fix: Fixed crash when adding a component in the blueprint editor after undoing an add component action

  • Bug Fix: Compact impure nodes (e.g., Array Add) now correctly show enabled/development-only/disabled states like other impure nodes

  • Bug Fix: You can now change the Multiline option for arrays, sets, and maps that contain strings or text as the inner/value property

  • Bug Fix: Removed duplicate tooltip and category settings in the details panel when editing Event Dispatchers

  • Bug Fix: Delegate nodes now correctly use DisplayName if specified on the property.

  • Bug Fix: The Blueprint editor will now open on a click to view properties from Find-in-Blueprints results.

  • Bug Fix: Fixed incorrect error message popping up when renaming a blueprint component and the text had been changed and then returned to the original value.

  • Bug Fix: Compiled Blueprint output terms now adhere to a format that utilizes the name table more efficiently (runtime memory optimization).

  • Bug Fix: Redirected delegate nodes now correctly have a target pin type of the containing blueprint.

  • Bug Fix: A compiler warning will now appear on nodes that reference a deprecated event dispatcher (MC delegate) variable in a Blueprint class.

  • Bug Fix: Soft references to actors can now be set in Data Tables, hard references are still outlawed for safety reasons

  • Bug Fix: Fixed crash reparenting a scene component blueprint to actor component.

  • Bug Fix: The active debug world instance drop-down now excludes streaming subworlds that previously appeared as 'Standalone' during a PIE session.

  • Bug Fix: Fixed ensure that would occur when multi-selecting make, break, or get class default nodes of the same node type, but for different structs with the same number of pins. Now the details panel will only display the show/hide pins if all selected nodes are of the same node type as well as the same struct/class type.

  • Bug Fix: Fixed bug where Arrays, Maps, and Sets of components/widgets were not correctly instanced at runtime when the variable was added by a blueprint class

  • Bug Fix: Stoped temporary blueprints loaded for diff or other tools from showing up in class pickers and causing data loss.

  • Bug Fix: Passing the result of GetMousePosition directly into SetMousePosition in a blueprint no longer causes the cursor to drift to the top-left corner.

  • Bug Fix: Fixed blueprint functions being able to be renamed the same as an existing property or base class function.

  • Bug Fix: ConstructObjectFromClass nodes are now included in Find-in-Blueprint search results (contributed by KristofMorva).

  • Bug Fix: The blueprint compiler and bytecode interpreter no longer call 'GetFunctionCallspace' for functions that are not flagged as net functions

  • Bug Fix: Fixed crash when dragging a non-placeable actor class on to the blueprints components panel.

  • Bug Fix: Blueprints construction script function can now be safely duplicated into a new, normal function.

  • Bug Fix: Toggle comment bubble on a blueprint node properly returns to constant visibility and comment bubbles on reroute nodes no longer disappear when compiling.

  • Bug Fix: Blueprint function parameters are now case sensitive to renaming.

  • Bug Fix: User-defined structs/enums can no longer be reloaded from the editor, to avoid crashes.

  • Bug Fix: Fixed bug that could cause the Blueprint Editor UI to make it appear as if a parent blueprint was being altered by edits to its children.

  • Bug Fix: Fixed crash when reparenting a blueprint component from scene to actor while an actor blueprint containing that component is opened.

  • Bug Fix: Changes to the scene component hierarchy in actors containing a blueprint defined component when switching the blueprint defined component from actor to scene are now more consistent with changes from adding a component from via UI.

  • Bug Fix: Multi-gate node is now correctly limited to having 32 outputs.

  • Bug Fix: Fixed bug that could cause transaction buffer reference to old instances of Blueprint archetypes, causing issues when mixing blueprint compilation, undo/redo, and changes to default values.

  • Bug Fix: Legacy Blueprint assets that own one or more child redirector objects can now be fully deleted in the Content Browser.

  • Bug Fix: The type selector for map values now correctly clips the text to the selector box.

  • Bug Fix: Fixed several issues where types like Tags, Soft Object References, and Text were not properly tracked or had redirectors fixed up if used as function inputs or local variables. As a result, localized text strings used in blueprint functions may change package namespace.

  • Bug Fix: Fixed log spam on attempt to change focus to an empty Blueprint search result.

  • New: Added support to the ke (kismetevent) command for broadcasting to all instances of a class by passing in the class name as the target

    • Improved the success/failure logging for all variants of ke.

    • ke classname command [args] will now find all instances of that class in the current world and call it on them (printing out the number of instances & successes, as well as the fully qualified class name found).

    • ke instance_name_or_path command [args] will now print out the fully qualified name of the object found and whether or not the call was successful (not just whether or not the object was found). Note that the name displayed in the world outliner for an actor is not always the same as the underlying actor name.

    • ke * command [args] will now print out the number of successes.

  • New: When getting debug info for a blueprint function's output parameter, display the value of the connected pin if the output parameter is connected to another node.

  • New: Added the ability to deprecate user-defined variables, functions and custom events in the Blueprint editor. The behavior is the same as deprecated properties, functions, and events inherited from a native C++ parent class.

  • New: Changed the function icon for pure functions to be green in the My Blueprint list.

  • New: Added development commands to audit bytecode contents:

    • ScriptAudit LongestFunctions - List functions that contain the most bytecode - optionally include the number of entries to list.

    • ScriptAudit FrequentFunctionsCalled - List functions that are most frequently called from bytecode - optionally include the number of entries to list.

    • ScriptAudit FrequentInstructions - List most frequently used instructions - optionally include the number of entries to list.

    • ScriptAudit TotalBytecodeSize - Output total size of currently loaded bytecode in bytes.

  • New: Added GetActorOfClass node.

  • New: Mouse Capture Mode can now be set from Blueprints.

  • New: The number of actions primed into the blueprint action database per frame is now controllable via the CVar bp.DatabasePrimingMaxPerFrame.

  • New: Added blueprint compiler extensions (UBlueprintCompilerExtension), providing developer modules/monolithic editor extensions a chance to do further game-specific blueprint validation.

  • New: Added Getting Player Controller via the Controller ID as a blueprint widget.

  • New: Added support for reordering and recategorizing Blueprint functions by drag-dropping in the My Blueprint list.

  • New: Impure compact nodes (e.g., array add) will now ensure that the first pin on each side is aligned with other impure nodes, making it easier to have a straight execution path.

  • New: Added support for BlueprintAutoCast functions that take in or return container types like TArray.

  • New: "Call in Editor" functions only include unique function names to avoid duplicates when functions are overridden by children.

  • New: Added support for setting the display name of the AsyncTaskProxy pin on async BP nodes by setting ExposedAsyncProxy="DisplayName". Changed the display name of the pin for GameplayTasks to AsyncTask instead of AsyncTaskProxy.

  • New: Added LoadAssetClass_Blocking and ToSoftClassReference functions to KismetSystemLibrary and improved comments and load behavior for existing Soft Object Reference versions.

  • New: Added ReturnDisplayName metadata to UFUNCTION, allowing overriding the pin name for the return value.

  • New: Added GetInputChordDisplayName node.

  • New: Deprecated function can now be exposed for use in the Blueprint editor.

  • Deprecated: The FEdGraphNode::GetDeprecationMessage() and FEdGraphNode::ShouldWarnOnDeprecation() APIs have now been deprecated in favor of FEdGraphNode::GetDeprecationResponse().

Core

  • Crash Fix: Fixed a crash when using MallocAnsi with the MSVC compiler.

  • Crash Fix: Fixed a null pointer crash in AActor::Tick.

  • Crash Fix: Fixed DoLazyStaticMeshUpdateCVarSinkFunction crash during engine start-up when running commandlets.

  • Crash Fix: Fixed LLM shutdown crash caused by FLLMCsvWriter attempting to track its own destruction.

  • Crash Fix: Fixed issues with objects not being serialized before being ConditionallyPostLoaded by other objects and LoadContext related crashes.

  • Crash Fix: Fixed a crash when detaching linkers from serialize context.

  • Crash Fix: DuplicatedDataReader and DuplicatedDataWriter will now store UObject serialize context internally so that they do not crash in case of an error.

  • Crash Fix: Fixed a crash when calling the IsValid function on a moved-from TStrongObjectPtr.

  • Bug Fix: Fixed TUnion missing the assignment operator.

  • Bug Fix: Removed obsolete comment about multicast delegates deferring removal until they get compacted.

  • Bug Fix: Made sure all UObject delete and create listeners are removed from the global UObject before static exit to avoid crashes caused by removing listeners after the global UObject array has already been destroyed.

  • Bug Fix: Fixed rounding big numbers when reading int64 from JSON.

  • Bug Fix: Fixed GetMinAlignment function returning 1 for native UStructs and UClasses.

  • Bug Fix: Changed several implicit operator bools to explicit.

  • Bug Fix: Fixed potential infinite recursion when processing malformed XML.

  • Bug Fix: Fixed cook -iterate bug with incorrect disk sizes and TagsAndValues in cooked asset registries.

  • Bug Fix: Fixed TUniquePtr::Reset destroying the object being set if it was already set to that object.

  • Bug Fix: Fixed possible null pointer crash when attempting to get the game state by unique net id.

  • Bug Fix: Fixed a race condition in cook -diffonly where the same ubulk file was being written by multiple threads.

  • Bug Fix: Fixed incorrect disk sizes in asset registry by taking CookAdditionalFiles into account.

  • Bug Fix: Made it so that asset scan paths can handle having a trailing slash.

  • Bug Fix: Fixed a crash when reporting long reference chains with the 'obj refs' command.

  • Bug Fix: Improved LLM tagging to move items out of various miscellaneous categories and into something more explicit. Also added parent tags for Audio and Meshes.

  • Bug Fix: Fixed non-determinism in custom version serialization by sorting the custom version container by key.

  • Bug Fix: Fixed migration of Cvar values across a hot reload.

  • Bug Fix: Fixed a rare crash caused by UObjectDelete listeners not being locked when freeing UObjects on the Async destruction thread.

  • Bug Fix: Fixed UMaterialExpression::PostInitProperties to not mark its package as dirty on load.

  • Bug Fix: Enabled TStrongObjectPtr to be constructed with nullptr.

  • Bug Fix: Fixed TStrongObjectPtr being unable to be constructed with TStrongObjectPtr rvalues of other types.

  • Bug Fix: Enabled functions to be overloaded on unrelated TStrongObjectPtrs.

  • Bug Fix: Fixed incorrect const correctness and parameter types in some container allocators.

  • Bug Fix: Fixed hot reload crash caused by reinstancing unreachable Blueprint objects, whose class was changed, but still had the old layout.

  • Bug Fix: Fixed deserialization into bitfield property in StructDeserializer.

  • Bug Fix: Fixed FText to truncate rounding errors.

  • Bug Fix: Fixed a small memory leak in CookOnTheFlyServer by making sure to always clear hierarchy timers.

  • Bug Fix: Fixed undefined behavior caused by signed int overflow when adding two signed ints.

  • Bug Fix: Instead of crashing, added ensure and log errors for newly spawned Tick functions that are unable to be released.

  • Bug Fix: Removed an obsolete UnrealHeaderTool error that could cause false 'class contains dependencies to itself' errors.

  • Bug Fix: Removed global locks when logging through FOutputDeviceRedirector to avoid hangs when logging crashes.

  • Bug Fix: Fixed a race condition in cook -diffonly when writing the same ubulk multiple times.

  • Bug Fix: Fixed a dangling reference to a timer handle, and added some extra game thread checks to FTimerManager.

  • Bug Fix: Added extra checks to trap bad FTimerManager internal state errors.

  • Bug Fix: Fixed ensure when using some Russian characters for Text variables.

  • Bug Fix: Fixed Algo::RemoveIf to use the correct predicate return value (false) to signal preservation.

  • Bug Fix: Fixed LLM to retain the original pointer's tag during a realloc.

  • Bug Fix: Fixed a race condition in FCrashReportingThread initialization.

  • Bug Fix: Increased buffer size for floats and doubles formatting in FGenericWidePlatformString::GetVarArgs to properly deal with MAX_DBL Buffer (which was 48 characters), and increased it to 340 characters to be sufficient for any double.

  • Bug Fix: StandardPlatformString::GetVarArgs now handles size_t and ptrdiff_t properly on 64-bit platforms — width and precision for strings now works correctly.

  • Bug Fix: Fixed an issue where UnrealPak failed to read from old pak files with no content.

  • Bug Fix: Removed some VS2015-specific TTuple workarounds.

  • Bug Fix: The cooker will no longer perform Event Driven Loader checks when doing iterative cooks because this would always lead to warnings about missing dependencies.

  • Bug Fix: Fixed documentation comments in FWeakObjectPtr.

  • Bug Fix: Fixed cooker to filter out plugin content for unsupported target platforms.

  • Bug Fix: Supported absolute log file paths that contain '(' characters.

  • Bug Fix: Fixed an UnrealHeaderTool crash when UINTERFACE declaration is not parsed properly — for example, due to a missing semicolon.

  • Bug Fix: Fixed a rare hang by pumping platform messages when a task graph drains other threads that were blocked on message dependencies.

  • Bug Fix: Fixed double to int conversion in FDumpFPSChartToEndpoint::DumpChart.

  • Bug Fix: Fixed log warning when trying to load cooked content in the editor to reflect the new setting that needed to allow it.

  • Bug Fix: Removed 'stat hicthes' from auto-completion list because it no longer exists in the engine.

  • Bug Fix: Fixed uninitialized member access in FExportReferenceSorter.

  • Bug Fix: Fixed soft object pointers to work properly if a referenced object is reimported or recreated, fixing the Data Table editor UI when reimporting a Data Table. Bug Fix: Cooked Animation Blueprints will now properly work when loaded in the Editor. Bug Fix: Optimized deserialization from compressed pak files when read from synchronous pak file handles. Bug Fix: Disallowed memory mapping of encrypted files in a .pak, especially since the CPU needs to operate on the data. Bug Fix: Pak file handles no longer store a pointer to a shared reader archive. Those readers are thread specific, and it means that handles cannot be read from different threads without causing problems. By storing a function that looks up the pak reader dynamically on each file operation, the requests will work properly from any thread. Bug Fix: Fixed a licensee reported crash of LLM during shutdown. Bug Fix: Fixed parsing error when FJsonReader reads a unicode character from a stream with a narrower char type. Bug Fix: Initialized signature checking hash cache array when using CRCs — static analysis warning fix. Bug Fix: Minor off-by-one correction to chunk hash failure warning message. Bug Fix: Corrected platform implementations of VectorSign and VectorStep so that they are all consistent with the SSE implementation. Bug Fix: Fixed call to IsValidLongPackageName function in FPackageName::DoesPackageExist to pass in the proper path. Previously, it would pass in an empty string. Bug Fix: Fixed an issue with the changelist number being ignored when checking asset compatibility against engine hotfix releases. Bug Fix: Fixed debug logging of chunk hashes for pak file signature check failures.

  • New: Cleaned up LLM behaviour with Realloc:

    • Made FMemory::Realloc not call into LLM to track a free if the original pointer was null

    • Made FMemory::Realloc not call into LLM to track alloc if the new size was zero (indicating a free)

  • New: Added concept-checking TModels trait used to check C++ concepts defined as special C++ structs.

  • New: Moved GAllowCookedDataInEditorBuilds declaration to a global header to allow it to be set programmatically by commandlets.

  • New: PkgInfo commandlet will now be automatically able to open cooked packages without the need to modify ini files.

  • New: Added -AllPackagesIn=Path command line param to recursively find all files under the specified folder, which is useful for dumping info for all cooked packages.

  • New: Added DDCCleanup commandlet that iterates over shared DDC directories and removes old (unused) cache files.

  • New: Moved code to reset linker on an object that is being destroyed before the object gets renamed to get better log output when debugging.

  • New: Added Invoke function support to Algo::Sort algorithms and TReversePredicate.

  • New: Added UnrealInsights performance inspection tool with associated event tracing and analysis framework.

  • New: Added Algo::Rotate, Algo::StableSort, and Algo::StableSortBy algorithms.

  • New: Fixed FSetElement to use default copy/move constructors and assignment operators for updates, such that TSet uses faster assignment where possible.

  • New: Replaced use of FindObject with StaticEnum<>().

  • New: Improved Visual Studio debugger visualization of FNames.

  • New: Where the iteration order does not matter, changed some TSortedMaps with FName keys to use faster ordinal-based comparisons instead of string-based comparisons.

  • New: To keep the API consistent, changed some SecureHash related buffer sizes from 32 to 64 bits.

  • New: Made string conversion significantly faster by using a constexpr ASCII bit set.

  • New: Added FAutoConsoleCommandWithWorldArgsAndOutputDevice for consistency with other auto-registering console commands.

  • New: Added support for the latest version of FramePro runtime integration code (v1.5.15.0).

  • New: FDebug::DumpStackTraceToLog can now be provided a heading to display instead of the default heading.

  • New: Added weighted moving average smoothing functions.

  • New: Added defines for string format specifiers for Unreal specific types, including int64, uint64, SIZE_T, SSIZE_T, PTRINT, and UPTRINT. Defines now exist for decimal and hexadecimal outputs — they are named with all capital letters starting with the type name and ending with _FMT. For SIZE_T, the defines are SIZE_T_FMT, SIZE_T_x_FMT and SIZE_T_X_FMT for decimal output, lowercase hexadecimal output, and uppercase hexadecimal output, respectively. The other types follow the same pattern. In addition there are several improvements and bug fixes to the generic wide character implementation of GetVarArgs, which is used in FString::Printf on some platforms.

  • New: Made FTickableGameObject registration and unregistration thread safe (registration is lock free).

  • New: Enabled TStrongObjectPtr's FInternalReferenceCollector to be destroyed on the Garbage Collector's Async destruction thread — as the underlying FGCObject generally works with it and multi-threading with garbage collection.

  • New: Removed unnecessary validation logic from FAsyncLoadingThread::ProcessLoadedPackages, reducing server load time by 10 percent on a local machine.

  • New: Removed inserting packages by priority when EDL is enabled.

  • New: Added TIsConst metafunction.

  • New: Modified Garbage Collector to perform UObject destruction on a worker thread so that it does not need to wait for it on the game thread.

  • New: Added gc.MultithreadedDestructionEnabled setting to be able to disable Async destruction.

  • New: Added boot trace instrumentation, which enables Unreal Insights to visualize all early activity that was previously only available in a separate log file using a special command-line option — these scopes now show up in the CPU profiling view of Unreal Insights.

  • New: Added general process lifetime tracing for Unreal Insights visualization.

  • New: Added bookmarks for Tick loop end, WinMain.Enter and WinMain.Exit, UnloadModulesAtShutdown, and EditorExit.

  • New: Added CookOnTheFlyServer trace and Selective DerivedDataCache instrumentation for Unreal Insights.

  • New: Removed sleep before setting Windows thread names, which were showing up in profiles.

  • New: Added FName page protection to guard against memory stomps.

  • New: Adding missing overload to Visual Logger for logging an arrow with a log category (instead of a log category name).

  • New: Switched to faster implementation of GetTypeHash(FSHAHash) to improve asset loading speed.

  • New: Added adapter operators for types that provide an operator<<, which take an FArchive& but not an FStructuredArchive::FSlot.

  • New: Enabled Visual C++ warning about incorrectly ordered member initializers in constructors.

  • New: UPackages will no longer be hashed with their outer as their outer is null and the resulting hash is the same as their name hash, nor will they be added to the object to outer map — this saves up to 3 MB of memory in our internal projects.

  • New: Enabled TSharedPtr to be comparable to nullptr.

  • New: Added proper support for TSet in StructSerializer and StructDeserializer.

  • New: Added proper support for object reference and its derivative (soft, weak, lazy, and class reference) in StructSerializer and StructDeserializer.

  • New: Returned a bool from multicast delegates' Remove function to indicate if the binding was successfully removed, and an int32 from the RemoveAll function to indicate how many bindings were removed. Changed compaction on multicast delegates to only be performed if the Remove function succeeded.

  • New: Reduced Linker annotation memory usage by introducing new annotation array type that can reclaim memory from object ranges that no longer require the annotation.

  • New: Added IncrementExchange, DecrementExchange, AddExchange, and SubExchange to TAtomic.

  • New: Added InterlockedAnd, InterlockedOr and InterlockedXor to FPlatformAtomics.

  • New: Reduced cached archetype annotation array memory usage by 50 percent on 64 bit platforms by storing the archetype index instead of a pointer.

  • New: Added AndExchange, OrExchange, XorExchange as well as operators &=, |=, and ^= to TAtomic for integral types.

  • New: Added support for uint64 bitfield properties.

  • New: Added support for using FString with RegisterConsoleVariableRef.

  • New: Changed code that used TryEnterCriticalSection, followed by EnterCriticalSection into a straight EnterCriticalSection call — TryEnter* is redundant if you already decided that you want to enter the critical section.

  • New: Made it possible to do oriented captures with the SceneCaptureCubeComponent.

  • New: Enabled fast path for unique name generation for all cooked builds by default.

  • New: Removed .complete file functionality for CSV profiles, and added the OnCSVProfileFinished delegate that can be used to register for when a CSV profile is done writing.

  • New: Added support for the latest version of MemPro when using LLM.

  • New: Added a small Zip file Utility API.

  • New: Made FMath's Perlin noise thread-safe and deterministic — this includes 2D and 3D versions.

  • New: Added new IncludeAssetBundles meta tag to support including referenced object properties in asset bundles for an owning object.

  • New: Collapsed asset redirectors when loading the redirector map — this should prevent issues where A->B B->C C->D. Previously A would not redirect to D, and now, A redirects to D.

  • New: Moved STAT_FAsyncPackage_CreateAsyncPackagesFromQueue to an inner scope to reduce the number of stat events it generates.

  • New: Dynamic Multicast delegates that are expected to be bound rarely can now specify that their storage be stored in a sparse allocation using the DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_ family of delegate definitions.

  • New: Changed 'Allow Cooked Data in The Editor' setting to prompt for editor restart.

  • New: Exposed a version of IConsoleManager::UnregisterConsoleObject, which takes a name so that unregistering can be done faster than O(N).

  • New: Added RSA support to the PlatformCrypto Plugin — only implemented for platforms that support OpenSSL. Note that other platforms have empty implementations.

  • New: Added const variants of some of the more common AddReferencedObject(s) functions to allow for FGCObjects to store const pointers to UObjects (or collections), and easily report those references; otherwise, people make the mistake of creating local pointers that cannot be nulled out correctly if they need to be collected.

  • New: Added support to pak platform file for a custom decryption function that a game can override the way decryption is performed at runtime.

  • New: Added better FGCObject reporting in object references — some FGCObject names are now reported in the "obj refs" console command.

  • New: Made FArchive::IsTextFormat return a compile time constant value when text archive support is disabled so that we can have redundant text-only code paths stripped.

  • New: Any user code that overrides SerializeBin/SerializeTaggedProperties/SerializeDefaultObject on UClass must be rewritten in terms of the FStructuredArchive base version.

  • New: Removed virtual from several internal serialization functions that take FArchive parameters to stop external code from overriding them. Some serialization paths were changed to only call the structured archive version, and as such, they would not reach these overloads. Note that this will be a compile error for licensees that have overloaded these functions.

  • New: Added new FPaths::GetPathLeaf function.

  • New: Added FContentEncryptionConfig::DissolveGroups function to the content encryption config, which moves all assets out of a given group and puts them into an unnamed "loose group".

  • New: Added a GUID to the generic crash report, which is specific to that particular execution of the project — this allows multiple records from the same run to be correlated.

  • New: Adjusted VSCode code-workspace generation for foreign projects and plugin suggestions.

  • New: Centralized the loading of pak signature data so that the same object can be reused between the SignedArchiveReader and FPakPrecacher implementations — this stops the same data being loaded and verified twice.

  • New: Added log pak key registration when something was actually mounted.

  • New: Added hardening of pak index loading. If a corrupt index is detected, do a retry but collect and log more information along the way to help diagnose the issue.

  • New: Added "debug spikemark" and "debug spikemarkcheck" to track objects that get destroyed after a mark, which can be used to track objects that go away right after being loaded — this can help reduce memory spikes of objects being loaded and garbage collected right away.

  • New: Added an option to content encryption groups to say that their members should be encrypted even if they are soft referenced by some other asset.

  • New: Added PlatformCrypto based RSA support for the engine — the RSA lib now redirects through a modular feature interface to find a crypto provider.

  • New: Added virtual memory display to "stat unitmax" — along with peak physical and virtual memory.

  • New: Made is so that when a shader pak reader is first created for a thread, return the FThreadCheckingArchiveProxy wrapped version rather than the raw archive pointer.

  • New: Removed ensure from signedarchivereader pak signature failure handler to make it consistent with the pakprecacher version. Projects can override the signature check failure delegate to choose what to do when a signature fails.

  • New: Added Unreal Insights to Win64 Installed Builds.

  • Improvement: Made it so that we no longer mount pak files that fail the initial signature check.

  • Improvement: Minor optimization in FLinkerLoad::SerializeNameMap when using binary format.

  • Improvement: Implemented minor optimization in StreamableHandle.

  • Improvement: Optimized performance while Async Loading.

  • Improvement: Optimized the destruction phase so that the Garbage Collector no longer iterates over the entire UObject array but reuses the unreachable objects array instead.

  • Improvement: Implemented serialization optimizations for tagged properties, name maps, and soft object paths.

  • Improvement: Optimized game start-up times that yielded approximately 15 percent speed-up when loading an internal project.

  • Improvement: Optimized asset gathering by changing ResolveChunkDependencyGraph to use a set of FNames.

  • Improvement: Optimized ULevel::PreSave in the cooker by moving the validation of light GUIDS to LightComponent::PreSave.

  • Improvement: Optimized UPackage::IsFullyLoaded for the cooker.

  • Improvement: Optimized cook -iterate by fast forwarding through already cooked packages instead of ticking them.

  • Improvement: Optimized cook -iterate by reducing OS file system calls during engine and cook commandlet start-up.

  • Improvement: Optimized asset gathering by calling RemoveSingleSwap on DependsNode.

  • Improvement: Made several optimizations to AssetRegistry in cook scenarios.

  • Improvement: Made several optimizations to ShaderCodeLibrary cooking.

  • Improvement: Optimized cook -iterate by reducing OS file system calls in FAssetRegistryGenerator::GenerateStreamingInstallManifest.

  • Improvement: Added FName improvements and optimizations:

  • Encoding improvements

    • Implemented new hash table without fixed upper limit and 16-byte hash limitation

    • Changed NAME_INDEX from contiguous int to monotonically increasing int

  • General improvements

    • Improved API and documentation

    • Allowed getting FName as TCHAR without dynamic allocations

    • Added New constructor that enables supplying string length

    • Document IsValid and clarify IsNone semantics

    • Hid global state such as GetNames

    • Reduced amount of implementation details visible in header

    • Decreased NameTypes.h size down by approximately one-third while adding documentation covering stronger type safety, and the new API’s performance and memory results for internal project:

      • Editor start-up wall time: 12 percent speed-up (from 22.0 seconds to 19.5 seconds)

      • Win64 Test Client memory usage with approximately 400,000 names: 30.3 MB to 22.2 MB

  • Optimizations

    • Implemented memory optimizations that reduce per entry overhead

    • Avoided dynamic allocations in string conversions greater than or equal to 128 characters

    • Avoided extra copying when splitting numbers

    • Implemented more efficient IsPureAnsi check and wide-narrow conversions

    • Implemented a single global lazy initialization call instead of multiple calls

    • Switched from single lock to sharded hash map with separate locks to reduce contention

  • Improvement: Optimized cook -iterate GenerateLongPackageNames by using a temporary set.

  • Improvement: Optimized cook -iterate by replacing individual localization AssetRegistry queries with a single query.

  • Improvement: Optimized cook -iterate overhead by reducing allocations for ConvertCookedPathToUncookedPath, which is used in GetAllCookedFiles.

  • Improvement: Optimized processing of soft object paths in the cooker.

  • Improvement: Made it so that we no longer log encryption key registration for empty key GUIDs.

  • Improvement: Improved logging of pak signature failures — now treat a missing .sig file like a signature failure, log it, and ignore the pak file.

  • Improvement: Made improvements to pak file check command:

    • Added timing information to the log.

    • If pak is signed, used a faster method where we read one byte from each signing block.

    • This is still invoked with the -checkpak command line parameter.

  • Improvement: Minor UnrealPak refactor:

    • Added a "-sign" parameter to enable signing for the given pak — the cached settings in the crypto.json file are not used to enable signing any more.

    • Encapsulated all signing and encryption keys in a single keychain object that is passed around, rather than individual keys.

    • Added some validation to UBT/UAT encryption config parsing so that if you enable any signing or encryption stuff but haven't generated a key, it'll warn and disable everything.

  • Improvement: Various improvements and bug fixes for the experimental structured archive system, which will soon provide access to human readable asset formats.

  • Improvement: Made ChunkHashToString an inline function in IPlatformFilePak.h so that it can be used by other modules without requiring a link dependency.

  • Deprecated: Deprecated default FName operator < and > — you must now choose lexical or fast sort order.

  • Deprecated: Deprecated THasInserterOperator and THasOperatorEquals in favor of new concepts, CEqualityComparable and CInsertable.

  • Deprecated: Deprecated THasGetTypeHash in favor of the CGetTypeHashable concept, which handles inheritance properly.

  • Deprecated: Deprecated CreateAbstractDefaultSubobject because it did not work as intended. CreateDefaultSubobject should now be used, and it has been improved to provide a warning when a non-abstract class tries to create an abstract default subobject.

  • Deprecated: Moved FTextRange to Core module — includes should be updated to UnrealString.h.

  • Deprecated: Made some member variables in FArchive private — this was deprecated with Unreal Engine 4.20.

Automation

  • Crash Fix: Fixed BuildPatchTool shutdown crash, as some engine code crashes if GIsRequestingExit is not true when exiting.

  • New: Added support for allowing definition and execution of test "groups" using the legacy automation framework. Groups are defined in DefaultEngine.ini by specifying a group name and then a set of filters that are used to determine group membership. Groups of tests may then be executed via "RunTests Group:GroupName".

    • See DefaultEngine.ini in the EngineTest project as an example. Filters can now also be specified via "RunTests Filter:System+Filter:Editor". This will correctly match filters instead of the old behavior of doing a substring search. For example, SomeNonEditorTest is executed by "RunTests Editor".

Gauntlet

  • New: Moved EngineTest Gauntlet script out of Gauntlet project and into EngineTest project — this is a good example of how to include Gauntlet scripts in your projects.

  • New: When the number of desktop clients in a test is greater than 1, tile the windows into a 2N configuration.

  • New: Native plugin now marked as runtime so it is available in more builds. Android device now uses a path under the Gauntlet temp directory for pulling artifacts. Also, the directory is marked for clean-up.

  • New: Moved SubmitToDashboard into its own function to ensure derived classes do not accidentally skip it.

  • New: Added Win32 support.

  • New: ITestNode now defines GetWarnings and GetErrors calls for tests to return instances that occurred during a test.

  • New: Split creation of Summary report in UnrealTestNode into header and body functions to allow tests to easily customize these.

  • New: Added GetLogChannels function to UnrealLogParser that returns all lines from multiple channels.

  • New: Added AutomatonLogParser that specifically parses the output of automation (non-Gauntlet) tests.

  • New: Rewrote RunAutomatedTests Gauntlet node in the EngineTest project to be more comprehensive in terms of error reporting and to support both Editor and Cooked formats.

  • New: Addressed various issues that prevented Gauntlet from being used on projects that were not located next to the Engine. Should also allow Gauntlet to work with Installed engine builds.

  • New: Added example of running Gauntlet with C# tests in FirstPersonTest project, and the project is located away from the Engine directory: RunUAT.sh -scriptdir=/Volumes/Data/Dev/FirstPersonTest RunUnreal -project=/Volumes/Data/Dev/FirstPersonTest/FirstPersonTest.uproject -test=FirstPersonTest.BootTest -build=editor

Media Framework

  • Bug Fix: Fixed wrong sample sometimes being used in MediaTextureResource.

  • Bug Fix: Fixed videos not respecting last loop status when changing track.

DevTools

AutomationTool

  • Bug Fix: Improved validation of platform and configuration arguments passed into BuildCookRun.

  • Bug Fix: Empty arguments on the command line (for example, arguments passed in as "") are now ignored rather than being treated as command names.

  • Bug Fix: Fixed it so that when creating the base release directory for a chunkinstall build, to copy pak sig files if they exist.

  • Bug Fix: Updated UATHelper to cache packaging notification, ensuring it is destroyed when a new packaging operation starts

  • New: Added support for overriding the launch command line per platform.

  • New: Code signing on Windows now uses SHA1 and SHA256 certificates.

  • New: Added RunUAT stub scripts to workspace root.

  • New: The P4Sync command now has an option for retries.

  • New: On Mac, AutomationTool now uses MSBuild if Mono 5.0 or later is installed, significantly improving start-up time when running UAT scripts.

  • New: UAT now performs high-level dependency checking on the input (.csproj, .cs) and output (.dll, .pdb) of all automation scripts to reduce redundant compiles.

  • New: Added BuildEditor and OpenEditor scripts. Both take a -project= argument.

  • Removed: Removed the CommandUtils.Log function to avoid shadowing the global Log class.

BuildGraph

  • New: Task now has a Project="" attribute that specifies the path to a foreign project.

Live Coding

  • Bug Fix: Fixed issues with symbols not being stripped if they can throw an exception during construction.

  • Bug Fix: Fixed crashes when patching adaptive non-unity files in those game modules that contain static global variables.

  • Bug Fix: Prevented Ctrl+Alt+F11 from triggering a full-screen toggle in packaged builds.

  • Bug Fix: Several fixes to resolve issues with global symbols being reconstructed when loading patch DLLs — this was causing asserts when log channels were being re-registered.

  • Bug Fix: Fixed an issue when Live++ recompilation would execute old HotReload code that triggered an exception in monolithic builds.

  • Bug Fix: Prevented object files being overwritten during a live coding compile, ensuring we can gather COFF data from the correct executables on relaunch — this fixes several crashes, and enables restarting and reapplying Live Coding state by triggering a compile without having to compile from the IDE first.

  • Bug Fix: Fixed support for lazy loading modules, which now passes UBT a list of modules that can be updated. UBT fails the build and writes out a list of other modules that would be modified, and Live Coding console then loads those modules and retries.

  • New: Added a "Quick Restart" button to the Live Coding console, which restarts the current process and reapplies patches.

  • New: Live Coding now supports packaged builds in more scenarios. To use it, type "LiveCoding" into the console.

    • The path to the original .uproject file is now compiled into monolithic executables when Live Coding is enabled. This allows the invoking of UnrealBuildTool with the original project file when the executable is staged to a different directory. Note that this parameter can be overridden with the LiveCoding.SourceProject CVar.

    • The original engine directory is also compiled into the executable. This enables finding the console executable path without having to enter it manually via the LiveCoding.ConsolePath CVar.

  • New: Added a LiveCoding.Compile command to trigger a compile from the console.

  • New: Added a warning for trying to add a content pack if Live Coding is enabled.

  • New: Added a build setting that allows building LiveCodingConsole automatically for any target that requires it.

  • New: Triggering a compile from the IDE now results in an error if a Live Coding session is active.

UnrealBuildTool

  • Bug Fix: Fixed case of engine directory being derived from the launch path, resulting in the engine directly potentially not matching the case of files on disk and causing build artifacts to be invalidated.

  • Bug Fix: Fixed a problem with Mono being slow on Mac when launched from AutomationTool.

  • Bug Fix: Errors caused by circular dependencies in the action graph now only show actions relevant to the cycle.

  • Bug Fix: Fixed support for multiple modules in program targets when generating project files.

  • Bug Fix: Fixed support for PCHs when compiling with Clang on Windows.

  • Bug Fix: Fixed issues creating a new plugin in a project with a unique build environment.

  • Bug Fix: Fixed the ModuleRules.bShadowVariableWarningsAsErrors = true setting being ignored.

  • Bug Fix: Fixed issues with inconsistent path casing when cross-compiling for Linux.

  • Bug Fix: Fixed issues with UBT not detecting new files with reflection markup. Previously, it was not correctly detecting sub-directories or checking for new UHT types being added to a module that was not previously being scanned.

  • Bug Fix: Modified Xcode project generator to empty header search paths and preprocessor definitions build settings for the build target to solve an issue in latest Xcode with Clang that failed with "posix_spawn failed: Argument list too long" error for some files

  • Bug Fix: Fixed makefile not being invalidated if a directory containing source files was added.

  • Bug Fix: Fixed LIB files not being generated to the same directory as the DLL when bShouldCompileAsDLL = true in the target.

  • Bug Fix: Fixed SN-DBS interaction with cl-filter.

  • Bug Fix: Fixed incorrect filename when launching DebugGame targets from VSCode (or any target that overrides the undecorated configuration).

  • Bug Fix: Fixed UHT being run every time a target was compiled in an installed build due to precompiled modules not being filtered out of the list of outdated headers for dependency checking.

  • Bug Fix: Fixed exception when enumerating older versions of Visual Studio that do not implement ISetupInstanceCatalog, causing some installed Visual Studio versions to be ignored.

  • Bug Fix: Fixed incorrect executable path in VSCode projects that use unique build environments.

  • Bug Fix: Fixed UBT not cleaning up some Linux build artifacts (.debug and .sym files).

  • Bug Fix: It is now possible to generate a console application for engine (non-editor) builds by setting TargetRules.bBuildAdditionalConsoleApp to true in XXX.target.cs .

  • Bug Fix: Reads from config files are now tracked to more accurately detect makefile dependencies. Some config files are modified whenever the editor is started, causing the makefile to be invalidated unnecessarily.

  • New: Using UE_NAME_PROJECT_AFTER_FOLDER leads to "go to source" not working from the editor. Now handle SLN naming in one place, resulting in the named SLN being written out consistently.

  • New: Excluded projects with temporary targets from generated project files by default. This functionality can be re-enabled by passing the -IncludeTempTargets argument when generating project files.

  • New: Added an explicit error for trying to use a unique build environment with an installed build.

  • New: Added a warning when a plugin reference overrides the plugin's list of supported target platforms. Silently failing at build time would cause errors at runtime.

  • New: Added reference to the System.Core assembly from compiled rules assembly, so that Linq can be used in from .build.cs and .target.cs files.

  • New: Added a TargetRules.bOverrideBuildEnvironment flag that allows bypassing errors relating to overriding the shared compile environment with custom build settings.

  • New: Added -writeactions= and -writeoutdatedactions= arguments to export the action graph to a JSON file, and an "Execute" tool mode to read in an action graph and execute it.

  • New: Removed the "Default" value for TargetRules.BuildEnvironment. The property now returns the appropriate default value depending on the target being built.

  • New: To reduce IDE load times and memory usage, source files in a ThirdParty folder are now excluded from the generated Visual Studio solution.

  • New: Added support for AoT compilation for Mono UnrealBuildTool (approximately ten percent savings on a noop build due to no JIT) - this must be opted into using "defaults write com.epicgames.ue4 MonoAOT 1"

UnrealGameSync

  • Bug Fix: If a branch does not have the requested number of changes, the fade effect is suppressed on the last entries in the main window.

  • Bug Fix: Fixed support for localized time. Previously, UGS did not format time according to local culture, meaning it always used 12-hour formats.

  • Bug Fix: Fixed issue where clients with multiple proxies will fail to get server info and refuse to connect.

  • Bug Fix: LatestData class of UGS MetadataServer now has "Comment" spelled correctly, fixing the client not finding the right field to deserialize when calling /api/cis.

  • Bug Fix: Fixed DPI scaling in "Clean Workspace" window.

  • Bug Fix: Fixed "Clean Workspace" tool not working correctly for workspaces with forward slashes in the root directory.

  • Bug Fix: Fixed incorrect handling of return code when fetching the project file for a new client.

  • Bug Fix: Fixed incorrect display of the total number of known changes when a branch has fewer changes that the default batch size.

  • Bug Fix: Fixed close button in tab control not scaling correctly on high DPI monitors.

  • Bug Fix: Fixed changes being greyed out when using bisect mode.

  • Bug Fix: Added a check which ensures that the window bounds are on one of the displays before restoring them.

  • New: Added a new build health notification feature, including the following:

    • Build health issues can be posted to the metadata server using the MetadataTool utility, and they can have multiple build jobs in different branches associated with them.

    • Users can be added as watchers to particular build health issues via the metadata server (intended to be done by an automated process), which causes a notification to be shown on the client allowing them to acknowledge or dismiss it.

    • Users can be nominated to fix a particular issue, which suppresses the notification for any watchers.

    • Users can close a build health issue by clicking on the red "Close Build Issue" button in the UGS status panel, and entering the CL that contains the fix.

    • Anyone can subscribe to notifications that are not acknowledged after a certain period of time.

    • A "Build Health" button in the status panel allows reviewing any open build health issues at a time. To enable a project, set the "ShowBuildHealth" option (under the [Options] section) to 1 in the UGS config file, and post-build issues using the newly added MetadataTool.

  • New: Errors in the log now display in red, and warnings now display in yellow.

UnrealHeaderTool

  • New: Implemented a DocumentPolicy metadata tag for structs, classes, and enums, which can be used to turn documentation validation on for:

    • Tooltips for classes, structs, enums, and functions.

    • Tooltips for properties, including uniqueness for copy-and-paste bugs.

    • Tooltips for enum entries, including uniqueness for copy-and-paste bugs.

    • Tooltips for function parameters, including uniqueness for copy-and-paste bugs.

    • UIMin and UIMax for float properties.

    • UIMin and UIMax settings for float parameters on Functions.

  • New: UHT optimization now yields 1.1-times wall-time speed improvement on a project.

UnrealVS

  • Bug Fix: Fixed UnrealVS compatibility with Visual Studio 2019.

  • Bug Fix: Fixed performance problem with P4VS Helix Visual Studio Plugin, due to the UnrealVS Plugin listening to all property change events and updating the command-line combination every time.

Editor

  • Bug Fix: Fixed recursive surface snapping by ignoring attached children Actors in raycasting to world.

  • Bug Fix: Descriptions passed from the Source Control Editor dialog now populate in Perforce again.

  • Bug Fix: Fixed a crash that happened when resolving last transaction authors in the Multi-User history.

  • Bug Fix: Soft Objects Path will not become invalid when saving a new level with the name Untitled.

  • Bug Fix: The standalone PIE window no longer has its backbuffer sized smaller than the requested resolution.

  • Bug Fix: Fixed an issue where the Blueprints File > Developers sub-menu was not opening until clicked.

  • Bug Fix: Fixed an issue where crashes occurred when trying to use Launch On with a newly created level.

  • Bug Fix: Editor now properly closes Asset Editors and maps when purging those packages in Multi-User.

  • Bug Fix: Deselecting a locked Actor now clears the selection highlight correctly.

  • Bug Fix: Improved the layout and appearance of the Per-Platform Overrides widget.

  • Bug Fix: Fixed a crash that happened when using the keyboard arrow keys or the gamepad to navigate Editor UI.

  • Bug Fix: Class pickers in the Details panel now check whether or not a dropped class passes the class filter, preventing a crash that occurs if an invalid class is dropped on it.

  • Bug Fix: Fixed an issue where the Actor transform widget was not updating its position when selected Actors move during simulation.

  • Bug Fix: Transform > Attach to Pawn is no longer an Advanced property and is now visible in the Details view of a Controller blueprint again.

  • Bug Fix: Cleared the dirty flag before purging a package, preventing the prompt. The prompt was shown when a level that doesn't exist outside a Multi-User session was purged (when leaving the session). The level is saved in the session workspace and is not deleted, so the user should not be prompted to save it once they leave the session.

  • Bug Fix: When a user leaves a session, the Multi-User system performs some cleanup to remove session-only transactions. If a level was created in a Multi-User session and the user left the session while that world package was dirty, the system would revert those transactions and that process involved deleting/reloading the map. The delete action was unexpectedly recorded by the Multi-User system as a transaction (map deleted), because the system was still connected to the Editor events when this happened. The issue was fixed by unregistering the Multi-User calls back before performing the cleanup. When a level that was created in a session (and only exists within that session) was the active world when the user left the session, the Editor would not unload it. The level could be edited, but could not be saved. Reset the world to the default level template when this situation is detected.

  • Bug Fix: Fixed a cast converting a pointer in a derived class rather than the desired base class. Since only the base class member was used, no problem occurred.

  • Bug Fix: Fixed a state consistency problem encountered in a Concert client session when a client disconnected. The list of connected clients was updated after broadcasting the disconnection notification. Calling GetSessionClients() during the callback would return an inconsistent list. Removed the client from the list before broadcasting its disconnection. Updated a comment left in the Concert active session about this particular case.

  • Bug Fix: Updated the algorithm to better detect the important activity from the transaction.

  • Bug Fix: UPROPERTY specifiers were not reflected for FTransform.

  • Bug Fix: Reduced excessive amount of error messages from invalid data inside composite data tables.

  • Bug Fix: Fixed Concert Presence showing up in camera previews in Multi-User.

  • Bug Fix: Fixed an issue where object selection was not updating when deleting selected objects in Multi-User.

  • Bug Fix: Renaming a Material Asset now immediately updates the name in the Details view.

  • Bug Fix: Fixed an issue where Actors would become partially unselected when clicking a locked Actor.

  • Bug Fix: Added a missing Toolbar. Check style.

  • Bug Fix: Map value text expands outside of the drop down menu.

  • Bug Fix: Fixed a crash happening when user selects Undo after enabling world composition, when no sub-levels are available in the folder. Also made the Levels panel and World Composition panel react properly to undo/redo.

  • Bug Fix: Fixed an issue where piloting Actors with offset cameras causes the Actor transform to be set incorrectly.

  • Bug Fix: Fixed Reset to Default transactions for an issue where custom Reset to Default was not undoable.

  • Bug Fix: Fixed incorrect baking of Materials containing an Emissive property, which was causing pink smears across the outputted texture(s).

  • Bug Fix: Fixed an error in how acknowledged segments in UdP messaging were counted.

  • Bug Fix: Fixed an issue in the StartFinalPostprocessSettings function of FSceneView where crashes occurred due to Family > Scene being nullptr, and added code to prevent a crash if Family is nullptr as an additional precaution.

  • Bug Fix: Fixed a rare issue where a crash is caused by LauncherServices updating UI on the wrong thread.

  • Bug Fix: Made ALODActor not relevant for calculating level bounds; contained Actors are already contributing, and this prevents non-center bound pivots impacting the level bound size.

  • Bug Fix: Fixed a crash occurring in GameplayTagQueryCustomization when user modifies a GameplayTagQuery that is a child property.

  • Bug Fix:

    • Added an option named "Enable Multi-User Toolbar Button" in the Multi-User settings panel, to install or not install the Multi-User button in the Level Editor toolbar. By default, the button is not installed.

    • Limited the user Display name to 32 characters.

    • Limited the default session name to 128 characters.

    • Prevented the entering of invalid characters as the default Session Name, default Save Session As and default Session to Restore.

    • Added validation on the server command line when specifying default settings, to ensure they are consistent with the Settings panel.

    • Fixed setting display name "VRAvatar Actor class" as "VR Avatar Actor Class".

  • Bug Fix: Made sure a progress bar is shown for clusters using the HLOD outliner.

  • Bug Fix: When user clicks elsewhere when renaming something, it now commits the changes.

  • Bug Fix: Updated TraceResult when clicking in the level viewport to respect AllowSelectTranslucent.

  • Bug Fix: Fixed a scenario in which autosave would not run.

  • Bug Fix: Fixed a problem where Reset to Defaults button did not show up for properties in the Actor Merging dialog.

  • Bug Fix:. Updated the CanCloseEditor function of FMainFrameHandler to prevent closing the Editor if a modal window is on screen.

  • Bug Fix: Improved the logic for determining whether or not an HLOD cluster is out-of-date, by checking whether or not it has any valid sub-actors, and whether or not they are still linked to the ALODActor.

  • Bug Fix: Updated source control integration of GetOpenedOnly operations to look in the project directory instead of the root directory.

  • Bug Fix: Updated the orbit camera to work properly with piloted Actors.

  • Bug Fix: SPropertyEditorEditInline: Fixed the inability to edit properties whose editability is not constant.

  • Bug Fix: Fixed a crash caused by pressing the Delete key while dragging an Actor in the Scene outliner.

  • Bug Fix: Fixed an issue with canvas slot resize with the mouse in Designer when display scaling is different than 1.

  • Bug Fix: Fixed an issue where the Curve Editor was not being drawn in Matinee.

  • Bug Fix: Mesh painting commands are now registered on module load instead of on activation, which allows users to change keybindings before switching to the mode for the first time.

  • Bug Fix: Fixed an issue for Scene Outliner not refreshing added Actors during PIE.

  • Bug Fix: Fixed a crash in Multi-User when editing a Blueprint instance containing object references.

  • Bug Fix: Fixed the mirror scale option in the Details panel.

  • Bug Fix: Fixed the developer folder filter in SClassViewer.

  • Bug Fix: Prevent asset view from eating all other modifier combinations with CTRL + C.

  • Bug Fix: Resolved an issue that could cause manually overridden mesh draw distance data to be lost during a project version upgrade.

  • Bug Fix: Fixed ensure when having the source control provider panel open while joining a Multi-User session

  • Bug Fix: Removed some outdated and confusing logs at SkeletalMesh import.

  • Bug Fix: For static mesh vertex painting, ensure all LODs are updated when filling all LODS. Fill also now respects bPaintOnSpecificLOD for static meshes.

  • Bug Fix: Adjusted Scale Gizmo's universal handle hitbox.

  • Bug Fix: Use Custom Depth as Mask no longer persists once the High Res Screenshot dialog closes.

  • Bug Fix: Disallowed using Square Brackets in a Folder Name to prevent Meshes from being unusable inside the Folder.

  • Bug Fix: Fixed an issue for assert for missing EndSection call.

  • Bug Fix: Fixed DPI scaling on text in a few viewports.

  • Bug Fix: Fixed a crash that could occur in the Editor after importing a skeletal mesh LOD.

  • Bug Fix: Reimporting a skeletal mesh with the vertex color option is now set to Ignore, and no longer overrides the existing vertex color data.

  • Bug Fix: Fixed a bug causing Scene Export to not preserve the scene hierarchy.

  • Bug Fix: Fixed a bug causing PCX textures to have a corrupted alpha channel after they are imported.

  • Bug Fix: Fixed and issue where Delete was not working on selected text when the ALT key was held down.

  • Bug Fix: Fixed parsing errors in RendererSettings.

  • Bug Fix: Uses the CSV factory to import the .csv or .json file to the data table to avoid crashing when a Data Table is opened.

  • Bug Fix: Fixed a bug in the Static Mesh import window that could disable the Vertex Color import option.

  • Bug Fix: The BlueprintActionDatabase is now forced to release the references on the BP during the Purge so that the BP gets garbage collected as soon as there are no maps referring to it anymore.

  • Bug Fix: Fixed a serialization / versioning issue with MeshDescription, and fixed unnecessary memory bloat by not retaining MeshDescriptionBulkData which is generated to be written to the DDC when a legacy static mesh is first loaded.

  • Bug Fix: Unified the code used by the Editor and project launcher, to fix incorrect an Editor executable being used for cooking when using the project launcher.

  • Bug Fix: Gameplay Tag—When the gameplay tag dialog opens we now focus the search field.

  • Bug Fix: Fixed a bug where a crash occurred when attempting to perform some BSP operations on a Level that has been created in the Content Browser.

  • New: Major Multi-User Browser UI refactoring:

    • Added a toolbar to containing buttons to launch (or kill) the local server, create a session, join (or cancel joining) the default session, and join, archive, restore, or delete a session.

    • Merged the server/session list view into a table using three columns (Session Type, Session Name, Server Name).

    • Added text search to quickly lookup a session or server.

    • Added primary and secondary column sorting.

    • Added the View Option to quickly filter archived and/or active sessions, or to exclude all servers except the one configured as Default in the settings.

    • Changed the UI flow to create new sessions. Sessions are now created by adding a row to the table rather than by using a pop-up.

    • Updated the icons.

    • Merged the ActiveSession and the Browser.

    • Inlined all operations in the List view.

    • Removed ConcertSessionOptions and SConcertSettingsDialog files because their functionalities were inlined in ConcertBrowser.

    • Added animated feedback when looking for available servers or sessions.

    • Added a view below the server/session list to display the selected session details.

    • Added a button that is displayed in the middle of the session list view to launch your local server when no Multi-User servers are found.

    • Added a button that is displayed in the middle of the session list view to create a new session when no Multi-User sessions are available.

    • Added hint text that is displayed in the middle of the session list view when all available sessions are filtered out.

    • Added an entry to launch the Multi-User Browser from the Editor menu: Windows > Developer Tools > Multi-User Browser.

    • Added a status bar below the session list view to display how many sessions on how many servers are available and how many are filtered out (if any).

    • Added support for renaming sessions from the Multi-User browser if the client is the session owner. Select a session and enter Rename mode using the F2 key, the right-click context menu, or a single slow click.

    • Detected and reported an invalid session name interactively as the user types the session name (for example, session name has invalid characters, or the session name is too long).

    • Added a double-click handler on archived and active sessions rows (restore/join actions).

    • Added a context menu when right-clicking an archived or active session.

    • Added a 128x128 Icon in the plugin Resources folder.

  • New: Removed PresenceManager and SequencerManager wrapped function in IConcertSyncClient interface in favor of an IConcertClientPresenceManager and IConcertClientSequencerManager interface that can be accessed through IConcertSyncClient in the Multi-User code.

  • New: Added commands to adjust the brush falloff and strength to mesh painting mode.

  • New: Made the CL description and info fields selectable in the Editor’s revision history widget.

  • New: A confirmation dialog pops up when placing actors in sublevels that aren't checked out when under source control, or outside the bounds of small sublevels.

  • New: Now saves the changelist description when Submit to Source Control Window is canceled or fails to submit.

  • New: Added a Search box to the Reference Viewer, as well as a Zoom to Fit (Home) entry to the node context menu.

  • New: Respect RF_Transient object flag in World Outliner.

  • New: Improved the tooltips for Actor and Material Merging dialog.

  • New: Exposed a Blueprint function to get the transform of a user presence in Multi-User. Added an optional parameter to JumpToMultiUserPresence Blueprint function to provide a transform offset. Added a Blueprint function to set presence visibility by client id in Multi-User.

  • New: Added the ability to auto select the default device to SDeviceOutputLog and fix static initialization shutdown bug in SOutputLog.

  • New: Source Control History: bind Escape key to close the window.

  • New: Using Force Delete on an Asset that is open in an editor no longer closes all open Asset Editors; it only closes those editors that the Asset uses.

  • New: Fixed an issue where Actor Picker was not filtering by Allowed or Disallowed classes.

  • New: Renamed Window Size to Window Resolution in Play In Editor Settings.

  • New: Mesh painter settings are now stored in EditorPerProjectUserSettings.

  • New: Search by class internal and display names in UMG Editor Palette view.

  • New: There are now better error messages when trying to drag and drop Assets in the World Outliner in certain situations.

  • New: Fixes for UI appearance after level preview changes.

  • New: The Blueprint Compilation Errors dialog that pops up after triggering Play In Editor now has hyperlinks to all Blueprints that are failing to compile.

  • New: Sound Debugging—Added an extra check to see if we are filtering sounds using AudioSoloSoundCue or AudioSoloSoundWave when printing for the Stat SoundCues or Stat SoundWaves cmd. This way we can filter and only see what we want. UnrealEngine: RenderStatSoundWaves()—If we have a solo sound name filter and the current wave instance does not contain any of the filter text, then we will print the wave. RenderStatSoundCues()—If we have a solo sound name filter and the current wave instance does not contain any of the filter text, then we will print the sound cue.

  • New: Created SCustomDialog which allows for a dialog to be created with any SWidget as its contents, and with any number of buttons.

  • New: The Collapse/expansion state of the UMG hierarchy items is now saved when filtering starts, and restored when filtering ends, so that any mutations during filtering do not affect the state the user has explicitly set.

  • New: Added support for copy, paste and duplicate on data table rows.

  • New: The UMG hierarchy search now includes the widget class name (and display name) on top of the widget name.

  • New: Added missing parameter/default values for debug draw functions.

  • New: Support added for math expressions in the margin shorthand textbox.

  • New: Miscellaneous fixes for level streaming UI and workflow:

    • Removing invalid levels from the Levels UI will no longer ensure.

    • Added a minimum size for the warning about placing Actors outside level bounds, and the warning will not trigger if you are working in the only unlocked level.

    • The level-swapping button is now fully clickable, and is hidden when there is only one level.

    • The selected Actor Level text layout has been improved.

    • We now force unloaded levels to load if you select an unloaded level from the button in the Viewport.

  • New: Added drag-and-drop to add elements to an Array.

  • New: Added a spinner for Location and Scale in the Transform section of the Details view.

  • New: Content Browser does not override window position when the Play In Editor window is centered.

  • New: Added an OnAssetsCanDelete delegate that can be used to prevent Assets from being deleted. ObjectTools now queries the new delegate before attempting to prompt, replace references, and/or delete an object or list of objects.

  • New: Merge Actors Tool—It is now possible to choose between InstanceStaticMesh and HierarchicalInstanceStaticMesh in the Instancing tool.

  • New: Added a prompt on disconnection for session owners when the session has un-persisted changes in Multi-User.

  • New: Added Arcball and Screen Rotate to the Rotation Gizmo.

  • New: Activated Multi-User auto-connection flow even when the default configured server is offline:

    • The Concert toolbar buttons shows Join even if the default configured server cannot be found.

    • The connection routine runs in the background until the server is found, then it connects.

    • Added auto-connection feedback using the asynchronous notification system.

    • User can cancel auto connection from the banner or the toolbar button that displays Cancel if the auto-connect routine is running.

  • New: Changed the prefixes on new empty classes and new UObjects on new classes created by the Editor so that they are consistent with UE coding standards.

  • New: UPROPERTY meta tag EditCondition now supports a full-fledged expression parser using C++ syntax. This provides support for expressions like "MyBool && MyInteger == 5". This expression supports all numeric types, booleans and enums tagged with UENUM, as well as most comparison operators.

  • New: Added auto-archiving support to the Concert server. The server will now auto-archive the active sessions on clean shut down rather than deleting them, to prevent teams from losing work.

  • New: Added APIs to archive active Concert session. The client can archive an active session at any point in time. The session is copied from the temporary working directory of the server into its Saved folder.

  • New: Added APIs to delete archived Concert session from a server. The client can request the server to delete archived sessions when they are not required anymore.

  • New: Fallback to development config for launching Multi-User server when the currently used configuration server is not found.

  • New: Added settings to change the Concert server working and saved path.

    • User can specify the command line: .\UnrealMultiUserServer.exe -ConcertWorkingDir="C:\Temp\Intermediate" -ConcertSavedDir="C:\Temp\Archives"

    • Modified ConcertUtil function, DeleteDirectoryTree to use a specified path to move before delete, instead of always assuming that moving to the intermediate directory was fast.

  • New: Transactions can be checked to see if they can be undone after they are finalized through IsTransient. If IsTransient is true, then they skip the undo buffer. Transient transactions are currently transactions that contain references to PIE objects or that generate a no-op once finalized.

  • New: Now acquires lock or warns user when editing a package that does not support live transactions, and releases the lock when saving the Asset in Multi-User.

  • New:

    • Disabled the Multi-User Join button on the Level Editor main toolbar if the client did not enable a plug-in compatible with the server to communicate (such as UDP Messaging).

    • Prevented the client from auto-connecting if auto-connect is enabled but the client did not enable a plug-in compatible with the server to communicate (such as UDP Messaging).

    • Prints a warning in the Project's output log reporting that the UDP Messaging plug-in is disabled when they select to launch an MU Server from the Editor.

    • Prints a warning in the Project's output log reporting that the UDP Messaging plug-in is disabled when they select to open the Multi-User Browser.

    • Prints a warning on the Multi-User server console if UDP messaging plug-in is not enabled.

    • Added a warning notification in the Multi-User Browser informing the User that UDP Messaging needs to be enabled.

  • New: Enabled iterative syncing of Multi-User sessions that have an active client cache. Since sessions are now identified by a unique ID, we no longer delete the client-side cache of a session when leaving it. This allows us to load this cache when re-joining the session and sync only the missing data.

  • New: Added persistent versioning information to Multi-User sessions, which is used for:

  • Transactions that include the version index in their payload data, so that they can be deserialized with the correct version information.

  • Checking the serialization version for equality when a client joins the session, which ensures that everyone is working with the same serialization code.

  • Checking the serialization version for compatibility when restoring an archived session, so that a session cannot be restored by a client too old to process its data.

  • New:

    • Changed the Multi-User persist prompt question to the following: "You are about to leave a session containing changes. Do you want to persist the changes?"

    • Added the Cancel button to the dialog. Yes = show persist dialog, No = don't persist and leave, Cancel = don't leave the session.

    • In the Persist Dialog, if user selects to cancel persisting, the user goes back in the session (he doesn't leave).

  • New: Allow the ImportAssetCommandlet to execute with only an Import Settings file. Old code was looking for at least 2 arguments and wasn't counting for the file.

  • New:

    • Added the UpdateLocalClientInfo function of FConcertClientSession, allowing the code to update the avatar classes (VR + Desktop), avatar color and display name.

    • The function does not update the historical transaction (color and display name). The history remains untouched.

    • The changes performed with the UpdateLocalClientInfo function are only applied to the current session.

  • New: Optimization when saving thousands of Actors.

  • New: Expose Static Mesh Sockets to Python.

  • New: Added a new console variable to enable/disable playback syncing of Sequencer scrubbing in Multi-User. This variable is also exposed in the Sequencer toolbar when connected to a Multi-User session.

  • New: Multi-User now saves client side session data to keep track of files persisted from a particular session. This means that persisted files are tracked across multiple connections to a particular session from a specific editor launch.

  • New: Universal Scene Description (USD)

    • Added memory tools to handle std allocated objects coming from the USD SDK.

    • Fixed hierarchy issues by adding components to represent additional xforms between the asset and the model.

    • Added support for vertex colors and added the vertex color material by default when no material is specified.

    • USD import into level will use the C++ scene factory by default, instead of the Python scene factory.

  • New: Improved performance of layer visibility toggling on big scenes.

  • New: Improved deselect performance.

  • New: Improved multi-selection performance.

  • New: Importing BMP images using Bitfield compression is now supported.

  • New: The level cleanup output is more verbose now, listing all objects that were detected as leaked.

  • New: Improved Editor responsiveness when a selected Actor contains many others.

  • New: Added a visualizer for IES data on point lights and spotlights.

  • New: Improve performance of creating a new level over an existing one in some cases.

  • New: Always send analytic data when enabled.

  • New: Gameplay Tags—In the Properties view, there's now a Remove button beside tags in a tag collection.

  • New: Added custom "developer tool" to MainFrame. Removed OutputLog dependency from MainFrame.

  • New: Added SessionSummary analytics event that triggers on every shutdown, which will make it easier to write queries against analytics data.

  • New: Add DetailView and SinglePropertyView to UMG widget. They are only available in Blutility.

  • New: Asset tabs will now use the icon for the generated class instead of the generic Blueprint icon.

  • New: Make components that are added to a Blueprint have their IsDataValid functions get called when IsDataValid is called on the Blueprint.

  • Improvement: Material baking blur now utilizes Hyper-threading.

  • Deprecated: Direct access to some UStaticMesh Editor-only members has been deprecated, which should now be accessed through public accessors.

  • Deprecated: The VR Mesh Editor presented at GDC 2017 is no longer supported. The Mesh Editor plugin will be removed from the engine in an upcoming release.

  • Deprecated: Improved Concert modularity:

    • Renamed ConcertUICore module as ConcertSyncUI.

    • Moved ConcertFrontend Content folder into ConcertSyncClient Content folder.

    • Prevented ConcertSyncClient module to depend on ConcertUICore module.

    • Moved Multi-User specific files/functionalities from the ConcertFrontend module into the MultiUserClient module.

    • Moved shareable UI elements found in ConcertFrontend module (for Multi-Users/Disaster Recovery) into ConcertSyncUI module.

    • Explicitly passed IConcertSyncClient interface to widgets to reduce coupling with the modules.

    • Removed ConcertFrontend plug-in—The plug-in functionality was previously split into MultiUserClient plug-in and ConcertSyncClient plug-in.

    • Made the MultiUserClient plug-in the one that a user must activate in the Editor.

    • Users that previously had the Multi-User plug-in installed must uninstall it, and install it again. This is because the module previously used to expose the plug-in (ConcertFrontend) was replaced by the MultiUserClient module.

Content Browser

  • Bug Fix: Level names are now updated when the World Asset is renamed from the Content Browser.

  • Bug Fix: Content Browser folder colors are now retained when renaming a folder.

  • Bug Fix: Fixed a crash occurring when reloading Blueprints that have derived types already loaded. Reduced Asset reloading batch size to 1 to improve correctness when reloading many Assets.

  • Bug Fix: Fixed Translucent User Interface materials not being drawn on asset thumbnails.

  • New: Improved UI material thumbnail generation.

Foliage

  • Bug Fix: Fixed a crash that occurred when deleting an instance from a Blueprint.

  • Bug Fix: Fixed a Foliage "Snap to Floor" crash when snapping on foliage that does not have a valid base component.

  • Bug Fix: Fixed an issue where foliage selection was not clearing the selection of all Instance Foliage Actors.

  • Bug Fix: Fixed race condition on load, for foliage light maps that could lead to invalid lighting on some foliage.

  • Bug Fix: Foliage now checks for a valid level in the PostLoad function.

  • New: New Foliage Type—Blueprint Actor enables using the Foliage Editing mode to paint Actors instead of StaticMesh.

  • New: Added commands to adjust the Foliage Mode brush Paint and Unpaint densities, defaulting to CTRL + [ or CTRL + ] and CTRL + SHIFT + [ and CTRL + SHIFT + ].

  • New: Added support for drag and drop of a Collection onto the Foliage Palette (sharing of FT Presets). Support was added to anything that uses the ExtractAssetDataFromDrag function of AssetUtil.

  • New: Fixed bad lightmap UVs on instances when using foliage.DensityScale.

  • New: The mesh painting settings Enable Brush Flow, Ignore Back-Facing and Color View Mode are now persisted between Editor sessions. Clamping for settings is now read from the UProperty ClampMin/ClampMax values.

Landscape

  • Bug Fix: Prevented a possible crash if the LODIndex does not exist in the Primitives static mesh list.

  • Bug Fix: Fixed Landscape Spline tangent handles so they move with the cursor when edited.

  • Bug Fix: Allow spinning for Transform property in the New Landscape UI.

  • Bug Fix: Fixed an issue where landscape LOD calculation was not taking LOD scale into account.

  • Bug Fix: Fixed an issue where Create Adjacent Landscape Proxy was not setting the proper LandscapeSectionOffset.

  • Bug Fix: Prevented a possible crash if GetDynamicMeshElement was called but InitViewCustomData was not called yet.

  • New: Added ALT + Drag functionality to Landscape Splines for duplicating control points.

  • New: The user can now specify what Screen Size LOD0 should be; the default is 1.0.

  • New: Landscape > Sculpt > Flatten tool > Flatten Mode > Interval now captures the closest interval set by the terrace interval value in world space when the left mouse button is pressed to start the Flatten operation, and proceeds to Flatten to that target height until the Flatten operation is finished by releasing the left mouse button.

  • New: Landscape component recreates Material Instances when a Material is destroyed by the Delete Asset dialog. This fixed crashes occurring when using the Delete Asset dialog.

Material Editor

  • Bug Fix: Fixed an issue for when the Material Instance Editor was not properly loading the override state of the subsurface profile.

  • Bug Fix: Added a scrollbar to the Material Parameters panel.

  • Bug Fix: Fixed an issue with incorrect values of TextureSize and GradientPixelSize in cooked builds.

  • Bug Fix: Material Default Parameters view now does not display a scrollbar unless one is required.

  • Bug Fix: Updated the Material If expression to properly evaluate whether the result is a Material attribute.

  • New: Added a parameter's source function or material to its tooltip.

  • New: Renamed the material expression ShadowReplace to ShadowPassSwitch, and added tooltips.

  • New: Added functionality to MaterialEditingLibrary: Get Static Switch Parameter Value, plus matching Get X Parameter Value functions for Materials (for scalar, vector, texture, and static switch). Also added a getter to check material usage flags.

  • New: Added a function to the Material Editing Library to get children of any Material or Material Instance.

  • New: Realtime option added for User Interface Material previews.

  • New: Now the Subsurface Profile Override is treated like the other Material Override properties in the Material Instance Editor UI.

  • New: The Material hierarchy is now hidden in the Material Editor if the user is editing a function, adding a "no instances found" item if there are no material instances.

  • New: Adding default text in cases where a parent material is not found.

Media Framework

  • Bug Fix: Cleaned up the Media ticker thread.

  • Bug Fix: Fixed an issue for race condition in startup movies due to invalidating a texture while getting its size.

  • Bug Fix: Fixed media sounds dropping out during garbage collection.

  • Bug Fix: Media ticker thread shutdown time was reduced.

  • Bug Fix: MediaFramework: Fixed multi-threaded access to the sink in MediaClock.

  • Bug Fix: MediaPlayer—Events are hidden in the Blueprint Editor Details panel because they should not be used there.

  • Bug Fix: MoviePlayerSettingsDetails—Fixed an issue where copy movie requester was showing up when it should not.

  • New: Added HAP Video Decoding support with custom Windows Media Foundation transform.

  • New: Added Apple ProRes support.

  • New: The MediaPlayer can now be created before the media module is loaded.

  • New: Startup movies on the Windows platform can now be displayed at 1920x1080.

  • New: Added a new synchronization widget in the Timecode Synchronizer. Added labels to the Timecode display.

Scripting

  • Bug Fix: Calling a Python-generated function no longer causes a crash when called from Blueprints, or with non-POD output data.

  • Bug Fix: Set GIsRunningUnattendedScript to True when running the Python commandlet. This suppresses some UI that commandlets cannot deal with correctly.

  • Bug Fix: Made the created Widget transient to allow saving the Editor Utility Widget while it is open in a tab.

  • Bug Fix: Fixed the incorrect signature of RunAssetsThroughFilter and UseFilterToExcludeAssets in IAssetRegistry.

  • Bug Fix: When changing levels, recreated the tab Widget to avoid holding a reference to the previous level.

  • New: Added scriptable extension points to the Data Validation system. Python scripts should register themselves with the EditorValidatorSubsystem, while Blueprint and C++ validators can be found automatically. These validators do not require a custom class, but instead take in an individual asset as an argument to run tests on.

  • New: Blutility updates to add more generic base classes and libraries for Editor scripting.

  • New: Added extra control over executing Python commands:

    • You can now get back the execution result and log output from running a Python command, as well as control the execution mode of the command and whether it should be run in "unattended" mode.

    • This is handled by the new ExecPythonCommandEx function of IPythonScriptPlugin, which takes an FPythonCommandEx struct containing the input flags, mode, and command, as well as fields to fill in with the result and log output.

    • ExecuteFile is the default mode to preserve existing behavior. However, since the ExecuteStatement mode allows for a REPL-like environment, there is now an additional command executor available ("Python (REPL)") which lets you build and test Python scripts in a similar manner to an interactive command line Python environment.

  • New: Added getters for the Material parameter names to the Material Editing Library.

  • New: Added support for connecting to an existing Editor instance, in order to remotely run Python commands on it. This setting is to Off by default. To enable it, you need to turn on remote discovery in the Project Settings for the Python plug-in, which will make your Editor discoverable for remote execution (through external scripts using the remote_execution.py module).

  • New: You can now set up Editor Utility Blueprint asset to run at startup, based on the Config file.

  • New: Added Material Editing Library script-callable functions to find the source of parameters (in other words, did the parameters originate in the material itself, or in a nested function?).

  • New: Exposed the Asset Registry GetDependencies and GetReferencers functions to scripting.

  • New: Added Blueprint Diff action to Editor Utility Widgets.

  • New: Exposed the import data table to Blueprint and scripts.

  • New: Added a Blueprint function library for executing Python scripts from Editor Utilities.

  • New: Added a spawn tab node for Editor Utility Widgets to the Editor Utility subsystem.

Sequencer

  • Bug Fix: When navigating Sequencer tracks with a keyboard, hidden or otherwise unselectable objects are no longer selected.

  • Bug Fix: Include Render Passes remove button in the Render Movie Settings of the Sequencer no longer crashes if the array is empty.

  • Bug Fix: Sequencer Animations are no longer jittery with a RateScale > 0.0.

  • Bug Fix: Fixed an issue with Event Tracks, adding an Event Track to cause it to be added to both the Object Binding and the folder the Object Binding was located in.

  • Bug Fix: Copy and paste for a property track now replaces the existing property tracks of same type, rather than creating a duplicate.

  • Bug Fix: Calculating Auto-Tangents for MovieSceneFloatChannels no longer resets the tangent handle values if the preceding key is a constant key. This was legacy behavior, before evaluation was changed to not take tangent values into account when evaluating constant keys.

  • Bug Fix: Added equality operators to fix serialization issues with the movie scene track and subsection data.

  • Bug Fix: Blueprints are now correctly marked as being modified when user modifies event endpoints.

  • Bug Fix: Tracks in Sequencer can now be renamed by clicking them, similar to the World Outliner.

  • Bug Fix: Converting possessable object bindings to spawnable object bindings should no longer create duplicate tracks.

  • Bug Fix: Fixed an issue where Sequencer folder labels became gray when they had items inside of them.

  • Bug Fix: Sequencer no longer scrolls to the parent track when selecting child sequencer nodes.

  • Bug Fix: Animation and geometry section playback will now play the last frame when not looping.

  • Bug Fix: Fixed an issue in Sequencer where additive animation tracks were not working with less than 1.0 weight.

  • Bug Fix: Fixed a crash that happened when the user was editing a Sequencer Blueprint and attempting to Play In Editor before recompiling the edited Blueprint.

  • Bug Fix: Fixed an issue where events were occasionally being skipped at end of sequence playback and looping.

  • Bug Fix: Fixed a crash happening when setting the struct type in the defaults of a Blueprint MovieSceneEventParameters property.

  • Bug Fix: Fixed actor reference tracks that operated on soft Actor properties.

  • Bug Fix: Fixed a vulnerability that caused object path channels to end up with hard references to Actors.

  • Bug Fix: Fixed a crash when reloading a level sequence Asset that had the sequence director open.

  • Bug Fix: Changed the take and sequence recorders to use the correct property name rather than the property's display text for its property lookup.

  • Bug Fix: Actor reference tracks are now used for any soft object Actor reference as well.

  • Bug Fix: Made it impossible for movie captures to capture the same frame twice.

  • Bug Fix: Fixed a one-frame delay between hovering over a key and being able to select it.

  • Bug Fix: Sequencer view now correctly refreshes when undoing changes to nested tracks.

  • Bug Fix: Added a transaction for renaming track nodes.

  • Bug Fix: Fixed a bug in the sequence player which was causing titles to be displayed incorrectly.

  • Bug Fix: UMovieSceneFolders now ensure that their child content actually exists. Missing content will be removed on load, and a warning message will appear in the logs. Adding child items to a folder now enforces that it does not exist in any other folder in the same movie scene.

  • Bug Fix: Fixed an issue with the Sequencer Marquee selection being stuck in an On state after using the context menu to paste keys.

  • Bug Fix: Sequencer now skips past deprecated functions for events.

  • Bug Fix: Use SetNextPositionWithEvents when playing; this fixes a problem with notifications not firing on the first frame. This used in conjunction with ticking the Sequencer first, and fixes an issue with a double-ticking of a montage when prerequisites are not set up first.

  • Bug Fix: For Movie Scene Capture—CompositionGraphCaptureProtocol now does not stop on comma (,) separators, so you can specify multiple passes at once. This fixes a regression and does not add any new behavior to CompositionGraphCaptureProtocol.

  • Bug Fix: Sequencer now allows attach and path sections to support infinite ranges. This fixes an upgrade issue where existing sections would not load as infinite.

  • Bug Fix: Sequencer now forces animation playback to be Custom when playing back a Sequencer Animation Asset, even if the character is trying to force itself back to Blueprint.

  • Bug Fix: Sequencer now does not clear keyboard focus on commit for frame number text boxes. This fixes an issue where the right-click Properties menu disappears when you type in a frame number. This was marked as a regression when editing the Start Frame Offset because it was a float property before, but when it was changed to a frame number property, it inherited this behavior.

  • Bug Fix: Sequencer—Dragging marks. Fixed a missing transaction/modify for add/remove marked frame. Right-click menu for hovered marked frame now uses HitTestMark instead of testing the single frame that the mouse is over.

  • Bug Fix: Sequencer now uses the GetLastValidTime function instead of StartTime+Duration when looping playback is reversed.

  • Bug Fix: Sequencer now snaps to playback range when dragging keys and sections if the setting is enabled.

  • Bug Fix: Fixed crashes caused by Null sections that may have been left behind by an undo action. Sequencer now removes Null sections on the PostLoad function of UObject. Added a function called RemoveSectionAt which removes a UMovieSceneSection, given the index to the array of sections on the UMovieSceneTrack.

  • Bug Fix: Made some Blueprint categories consistent. Changed "Cinematic" to "Cinematics"; "Cinematic" and "Sequencer" to "Sequence" to follow existing categories.

  • Bug Fix: Sequencer now shows decimal places up to the zero-padding value. Fixed an issue with buzzing in time displays by setting the minimum desired width based on the Min/Max view range.

  • Bug Fix: If Allow Level Edits Only is enabled, Sequencer now disables editing values in its Details panel so that accidental edits cannot be made to the Sequencer Asset.

  • Bug Fix: Sequencer now only extends an existing section if Autokey is on.

  • Bug Fix: Texture streaming toggle in Movie Scene Capture also sets r.TextureStreaming.

  • Bug Fix: Disable Editor only functions in the events quick binding.

  • Bug Fix: Sequencer now only allows setting/scrubbing time if the mouse button held down was within the time scrubber region. This fixes a bug where if you double-click a shot and hold the mouse down on the second click and drag, it will still set time. Tested multiple combinations of setting time—click and release on the scrubber, click and release on the timeline, click and drag on the timeline, click and drag without the drag being in the timeline area.

  • Bug Fix: Fixed an issue with command line sequence render.

  • Bug Fix: Sequencer now allows for event receivers in addition to the object binding.

  • Bug Fix: Disabled Copy menu for category nodes (in other words, copying Location, Rotation or Scale individually is not supported).

  • Bug Fix: If the offset into an audio clip is beyond the bounds of audio duration, Sequencer does not play the audio.

  • Bug Fix: Fixed a crash occurring when Cast to UStructProperty failed.

  • Bug Fix: Fixed an issue where audio evaluation was crashing when there is no sound.

  • Bug Fix: Fixed and issue where Vector Property Track Editor was improperly setting values.

  • Bug Fix: Take Recorder—Added a non-throttled button for the Marks button in Take Recorder, so that clicking the Marks button doesn't slow down the Editor.

  • Bug Fix: Take Recorder now sorts take numbers.

  • Bug Fix: Moved up/down/left/right/space to Sequencer-only hotkeys, so that they do not operate on both the Viewport and Sequencer when the Viewport is in focus.

  • Bug Fix: After unbinding and setting the animation mode, tick and refresh on restore to force the restored pose. You need to manually turn on SetUpdateAnimationInEditor(true) before TickAnimation as well.

  • Bug Fix: Sequencer now wraps the quick binding submenu in a max size box.

  • Bug Fix: Changed the Movie Scene Folder API to automatically call Modify() on itself. This solves a lot of issues where Modify was not getting called before using the API, which caused inconsistencies when using Undo/Redo.

  • Bug Fix: Cinematic Viewports now correctly enables Game View mode when activated.

  • Bug Fix: Fixed significant performance impact occurring when opening a Cascade Particle system before opening Sequencer. Sequencer was causing Cascade Viewports to endlessly do an expensive re-render.

  • Bug Fix: Fixed multiple components being added. This was a result of adding the event callback OnActorsAddedToSequencer in GetHandleToObject. This would cause issues because the call stack is GetHandleToObject > LightComponent GetHandleToObject > PointLight AddDefaultTracks GetHandleToObject > LightComponent. (This fails to find the first guide because the parenting structure is not set up yet). The fix is to move OnActorsAddedToSequencer to CreateBinding.

  • Bug Fix: Fixed the start/end offset upgrade paths for audio, skeletal, and geometry cache sections. Upgrade should be done based on the display resolution, not the legacy resolution.

  • Bug Fix: Restored the pre-animated state on PreCompileBlueprint since the current cached state will no longer be valid. Evaluation is forced when the Blueprint is compiled, to put objects back at their evaluated state.

  • Bug Fix: Fixed an issue where skeletal reverse was not using the complete sequence length to compute the reversed time.

  • Bug Fix: Sequencer now ensures bMouseDownInRegion is cleared on mouse up. This fixes a bug where double-clicking a shot to open it sometimes also sets the current time.

  • Bug Fix: Added a check for the active subsequence when getting subsequence IDs.

  • Bug Fix: Fixed a missing UPROPERTY() for the deprecated StartOffset.

  • Bug Fix: Matinee to Sequencer—Added support for existing component bindings and camera cuts.

  • Bug Fix: Matinee to Sequencer—Fixed component binding so an existing component binding is used if found.

  • Bug Fix: The old max tick rate is set only if it is unset during an update, so that it is not overwritten during playback.

  • Bug Fix: Sequencer now forces refresh immediately upon splitting a section. Otherwise, the trimmed section will be in a delayed restore state after the new section, causing the evaluation to be out of date.

  • Bug Fix: Sequencer now refocuses on what was previously focused when setting the current time with the Play Time widget. This allows the user to do these actions without needing to click to focus after setting the time: Spacebar to play, CTRL + G to set a time, Spacebar to play.

  • Bug Fix: Sequencer now clears/restores focus only on SetLocalTimeDirectly and changes to weak_PTR. This fixes issues where focus would clear when scrubbing in sequencer.

  • Bug Fix: Movie Scene Capture now always renders from the root master sequence (transform the range). This fixes a bug where tracks in the master sequence would not be in the correct time space.

  • Bug Fix: Fixed a weighted tangent case where cubic solves are not between 0 and 1.

  • Bug Fix: Added Modify() to camera anim/shake track to fix undo/redo.

  • Bug Fix: Take Recorder will now force a role to ROLE_Authority for client spawnables.

  • Bug Fix: Sequencer now allows easing handles only if there are supported blend types.

  • Bug Fix: Movie Scene Capture now allows game sounds if capturing audio. This fixes intermittent audio not being captured when rendering a movie.

  • Bug Fix: Sequencer now sets replicates only if HasAuthority.

  • Bug Fix: Sequencer now defaults the snapshot's active shot to the current sequence in case there are no shots being rendered. This fixes an issue where {Slate} and {TakeNumber} do not work.

  • Bug Fix: Movie Scene Capture now forces the Engine to show flag path tracing on with -PathTracer. This fixes an issue where if you render from the command line (which launches the Editor in PIE); it does not enable path tracing.

  • Bug Fix: Moved the OnStartedPlaying function to within first update in the UpdateTimeCursorPosition function. This fixes an issue where setting the hud/player visibility was getting stomped on later.

  • Bug Fix: SetLocalTime now always scrolls into view unless a sequence is playing and the Autoscroll setting is off. Tested this with the Autoscroll setting Off to ensure that when a sequence is playing, it does not scroll; also tested to ensure that when jumping to the next key, it does auto-scroll to the key. Tested that when typing in an out-of-view frame number to jump to, it also auto-scrolls.

  • Bug Fix: Sequencer now defers force evaluation until the next tick, to avoid reentrancy when compiling director Blueprints.

  • Bug Fix: Sequencer now updates with the channel metadata name. Otherwise, the key area was getting the name Location instead of Location.X. This fixes a subtle bug that appeared when copying and pasting keys. On undo, the key areas would get their names updated from Location.X to Location, Location.Y to Location, and Location.Z to Location. Then the keys would get copied with those key area names and would all be pasted to the same channel.

  • Bug Fix: Added an option to force refresh the Details panel when initializing Sequencer. This is disabled in the Actor sequence, since it can cause the Details panel refresh to be reentrant because it is initialized from the Open in Tab button in the Details panel.

  • New: Added an option to group selected Sequencer items into a new folder.

  • New: Added AnimClass Property Track to Sequencer for Skeletal Mesh Components.

  • New: Added support for filtering which Sequencer tracks are displayed. Current filters include audio tracks, event tracks, level visibility tracks, particle tracks, skeletal mesh objects, camera objects, light objects, and LiveLink tracks. Object-binding tracks can be filtered based on which sublevel the object belongs to. Plug-in developers can also easily add new filters. Additionally, filtering by text has been reworked to be more intuitive.

  • New: Added a new OnPreSequencerInit delegate called before Sequencer initialization, to allow modification of the initialization parameters (such as extending the toolbar).

  • New: The level streaming system in Movie Rendering now flushes each frame during movie capture, to ensure that streaming levels are fully loaded at the start of each frame in order to avoid pop-in mid-shot.

  • New: Added support for FBX Animation import/export using Sequencer.

  • New: Autosave is now suppressed during playback and recording of sequences.

  • New: Added support for converting object bindings with multiple bound objects to Spawnables in the Sequencer timeline.

  • New: Added an option to World Outliner to browse to an Actor in Sequencer if an open sequence controls the Actor.

  • New: Added support for blending multiple audio samples in a single Sequencer track.

  • New: Displayed a source frame indicator for SubSequence and Shot tracks.

  • New: Implemented a duplicate option for Sequencer keys.

  • New: The Sequencer timeline now focuses on the time slider when it jumps to a new position using the playback controls.

  • New: AutoKey now flattens tangents to avoid overshoot.

  • New: Fixed an issue for sending out Live Link curves for facial during Sequencer playback.

  • New: Restore State now works with Animation Sequences.

  • New: Sequencer can now inform the renderer of simulated previous frame transforms for animated objects on camera cut frames (such as for cut-frame motion blur). This works best for real-time sequence playback or captures with no warm-up frames. Note: This is currently an opt-in feature that is enabled through a CVAR: r.MotionVectorSimulation 1.

  • New: Level Sequence Editor Blueprint library added to allow Editor Utility Widgets to open, play, and stop a sequence in the Editor.

  • New: Sequencer now ticks separately. This is needed so that sequencer Actors can tick first, putting objects in their desired locations, then allowing other systems to respond. This fixes special cases where sequencer would tick animation again if it had ticked before Sequencer.

  • New: Add "Animatable Property Changed" transaction to SequencerObjectChangeListener before it broadcasts to the Track Editors. This is because there can be more than one Track Editor for each property type, so multiple transactions were being put on the stack for changing properties like Visibility.

  • New: Added "Select Camera" to the right-click context menu of the camera cut section.

  • New: Take Recorder now sets infinite length when recording starts, rather than when initializing the level sequence.

  • New: Added a hotkey (CTRL + A) to add selected Actors to Sequencer.

  • New: Changed the save icon and added * to the breadcrumb to indicate when the Asset is dirty and needs to be saved.

  • New: Added Movie Scene Capture as a BlueprintType.

  • New: For Movie Scene Capture: Added -WriteFinalCutProXML and -WriteEditDecisionList command line options.

  • New: For Movie Scene Capture—Added {sequence} as an allowable tag to movie scene capture output.

  • New: For Movie Scene Capture—Added -shot as a command line option for rendering a specific shot.

  • New: Allow for Skeletal Mesh components inside of child Actor components.

  • New: Fixed autotracking. On a pre-edit change, the changed property is checked against CanKey. This didn't work for structs, where the property chain would be something like DepthOfField > Focal Distance. A fix was made to support structs, but this broke generic properties because it would check CanKey with the property chain LightComponent > Intensity. The fix here is to find the keyable property and then use the remaining property path. For example, for intensity, the property path will be Intensity. For Focal Distance, the property path will be DepthOfField > Focal Distance.

  • New: FCPXML—Now looks for level sequence Asset without an extension. Added more log errors for clip or audio Assets that are not found.

  • New: Search is now performed through all levels (persistent and streaming) to find Actors with the given binding to export.

  • New: Added Project Settings to Take Recorder settings UI.

  • New: Scroll timeline to newly created sections if they're not in view.

  • New: Display track node is red if the property track is not bound to a valid property.

  • New: Added ShowBurnin and HideBurnin functions.

  • New: Expand parents when scrolling into view, like the World Outliner.

  • New: Made the Override Instance Data read-write by Blueprint so it can be set in Blueprint.

  • New: Repeater Event Tracks now fire properly when playing in reverse.

  • New: Movie Scene Capture: Expose delay every frame to the user for raytracing. Value is overridden by path tracer sample pixel.

  • New: Show an error when sub display rates do not match. Changed error widgets to EVisibility::Visible so that their tooltips appear when hovered over.

  • New: Added support for track editors to add tracks for all the selected object bindings.

  • New: Added section bounds to cached key positions for track lane. Renamed ObjectTrack to CombinedKeysTrack, and allow other tracks besides object tracks to display combined keyframes (such as the audio track).

  • New: Added BP delegate for Take Recorder states: started, finished, cancelled, slate changed, take number changed.

  • New: Added {Time} for burnin option on takes.

  • New: Now you can expand filtered nodes when they are searched for.

  • New: Split GetSubsceneName into GetSubsceneTrackName and GetSubsceneAssetName.

    • Appends slate and take number to Actor source sub level sequences.

    • Changes logic to find the matching track name rather than the asset name when replacing subsections.

    • Swaps the order of names for audio, level vis, and live link track names to make it more consistent with Actor sources. For example, if you are recording Scene_1 and Take 10 for Cube, the sub level sequence will be called: Cube_Scene_1_0010 rather than Cube. As another example, if you are recording Scene_1 audio, the sub level sequence will be called: Audio_Scene_1 rather than Scene_1Audio.

  • New: Added an option for the custom frame rate in Movie Scene Capture. This allows the custom frame rate to be a configuration that isn't reset every time you render a sequence (which sets the frame rate).

  • New: Added bEmitChanged to SetSlate and SetTakeNumber in Take Recorder, so that firing events can be controlled.

  • New: An Output error message is generated if a channel is not found in SetValueInChannel.

  • New: Added a stretch/shrink box to add or remove space in the timeline.

  • New: Added a camera cut in Take Recorder if there is a camera component (not just if it is a camera Actor).

  • New: Split the Event track menu to triggers/repeaters, instead of having to always create a trigger section and then a repeater.

  • New: Added default key interpolation settings to the main menu bar.

  • New: Display nodes now can show the Add Object Bindings menu and the Add Tracks menu. By default, display nodes do not show these. However folder nodes do, so you can add these tracks directly to a folder.

  • New: The Sequencer window now closes when the map changes.

  • New: Added back SetRange, but with frame numbers in display resolution. Added SetRangeSeconds.

  • New: Added GetActiveCameraComponent function to get the camera for the active camera cut. Camera cut evaluation can be allowed, but disable binding to the player when CanUpdateCameraCut is false.

  • New: Added a setting to determine whether to show the outliner info column.

  • New: More Python extensions:

    • Added set parent, set property name and path, set_start_frame, set_end_frame, bounded sequencer_examples.py

    • Added a current focal length property track for cameras, modified to use set_start_frame and set_end_frame.

  • New: Added MovieSceneTrack and MovieSceneSection as BlueprintTypes so that they are accessible in Blueprint.

  • New: Pressing CTRL + F in the Sequencer or Sequencer Curve Editor will now jump keyboard focus to the search Widget, allowing you to quickly search the tree.

  • New: Added ability to paste onto the selected object binding track, so that you can copy a component from one binding and paste it onto another component.

  • New: Decoupled keep cursor in playback range while scrubbing with key/section snapping to playback range.

  • New: Added component/property tracks for selected objects when adding through the +Track menu.

Static Mesh Editor

  • Bug Fix: Updated BodyInstanceCustomization to notify when collision is set back to default, so we can update collision visualizations. Updated the Static Mesh Editor to refresh collision visualization on instances when the source mesh collision profile is changed.

  • Bug Fix: Remove Selected button is now disabled in the UV channels dropdown of the Static Mesh Editor when only a single UV channel remains.

Editor and Tools

  • Bug Fix: Fixed a bug in the Property Editor which would cause inconsistent behavior with the expanded and collapsed state of arrays and external properties.

  • Bug Fix: Fixed ensure after undoing following a paste operation in the Editor graph.

  • Bug Fix: Clicking the Clear All button for tag queries now updates the data table viewer when the query is part of a data table row.

  • Bug Fix: Fix FSoftObjectPath/FSoftClassPath properties to handle Use Selected button and copy/paste; this fixes UI in the game mode defaults panel.

  • New: The behavior for right-clicking a node or pin in an EdGraph can now be overridden in FGraphEditorEvents. The Blueprint Diff graph uses this feature.

  • New: Improved the tooltip text for restricted gameplay tags.

Gameplay Framework

  • Crash Fix: Fixed a crash that occurred when copy pasting some child Actor components.

  • Crash Fix: Added a null check in spawn Actor to prevent crashing when called with a null class.

  • Crash Fix: Worlds are now marked "pending kill" when a user leaves them, so that the game cannot attempt to reuse them. This prevents a crash with confusing error messaging when attempting to reuse a world in that way.

  • Crash Fix: Fixed a crash when user selects an instance of an Actor which contains a recently-compiled Blueprint component.

  • Crash Fix: Fixed a call in FSoftObjectPath’s TryLoad function, because some code references to Actors in a loaded sublevel would refuse to reload the level in place and then crash.

  • Bug Fix: The Category dropdown for components is now more consistent with regard to what can and cannot be changed.

  • Bug Fix: Fixed a check to see if the GE owner is authoritative before modifying the timers for periodic effects. This resolves a log-spam issue.

  • Bug Fix: Subsystem collections no longer keep their outer alive inappropriately.

  • Bug Fix: UDataTable log messages now properly reflect their functions.

  • Improvement: Reworked UpdateOverlaps’ internal API to use TArrayView and thereby not require that all input arrays are TArrays with allocations on the heap. Converted MoveComponentImpl to use an inline array of FOverlapInfos. Prevents many allocations when objects move within a few overlapping volumes.

  • Bug Fix: Fixed an ensure that occurred when adding sublevels as part of CommitMapChange.

  • Bug Fix: Gameplay Abilities that responded to gameplay events can no longer result in the removal of other abilities triggered by the same event.

  • Bug Fix: We now clear ChildActorTemplate on an instance if the child Actor is set to a different class.

  • Bug Fix: Fixed a bug where similar paths would not be properly scanned in -Game mode. We no longer scan the path if it matches a path that has already been scanned or if it is in the file path of a child that has already been scanned.

  • Bug Fix: Reordered the code in PreActivate so that it set the current ability info before applying tags that would potentially block and cancel other abilities. This avoids potential bugs where you end up in a loop that calls back into the current ability and tries to do something that needs the current info set.

  • Bug Fix: Adjusted log levels for LogNetPlayerMovement to make Log and Verbose output less spammy, and moved some existing logs down a level to more verbose levels.

  • Bug Fix: Removed an old log in GameplayAbility.cpp that caused spam on output and was supposed to be temporary.

  • Bug Fix: Fixed ServerTravel to use the correct URL parser to extract map names. This fixes bugs occurring when user travels to maps without using a full path.

  • Bug Fix: Added a comment to SetTimer to clarify that InRate and InFirstDelay are in seconds.

  • Bug Fix: Added LastClientAckRealTime to character movement client data, to track the last time (undilated) that a client receives any Ack from the server for movement; this includes good moves and corrections. Also clarified the comments on some other timestamps.

  • Bug Fix: Added an option to InterpMovementComponent to disable swept collision movement and to set the teleport type.

  • Bug Fix: Made the following UProjectileMovementComponent helpers public instead of protected: ComputeVelocity(), ComputeMoveDelta(), ComputeAcceleration(), ComputeHomingAcceleration().

  • Bug Fix: Instanced components are now correctly attached to Blueprint constructed components.

  • Bug Fix: Moves saved by CharacterMovementComponent are now allowed to combine when changing between static base components. This saves bandwidth and reduces server RPC cost when running across many static pieces. Changing dynamic pieces still requires flushing the move, because the relative location changes. The CVar p.NetPreventMoveCombiningOnStaticBaseChange can be enabled to revert to old behavior.

  • Bug Fix: Combined fixes for bandwidth and server performance related to client character move. Character client moves can now be combined when attached to objects, even if the previous location was overlapping with a solid object that blocks movement. Attachment to an object carries the character along anyway regardless of those cases, and the character can be blocked by what it’s attached to as well. This was preventing client throttling when attached in this way. Move combining is allowed when the attachment Relative Location and Rotation changes in a very small threshold, to account for jitter from Transform updates. This happens especially when the character is attached to simulating objects. The GetClientNetSendDeltaTime function allows small control rotation changes when using the Stationary send rate, to account for jitter when attached/standing on objects.

  • Bug Fix: SceneComponent attach replication now properly handles snapping behavior for Relative Location and Rotation.

  • Bug Fix: Fixed an issue where Actors were ending up at the wrong location when user was undoing a sublevel visibility change for sublevels with a location offset.

  • Bug Fix: Forced a substep of falling character movement when the motion would pass the jump apex point. We now compute the time to the apex point and refund the remaining time for the next iteration. This also more accurately triggers the NotifyApex functionality because it is triggered after the movement that reaches the exact apex point. It can be disabled by the setting p.ForceJumpPeakSubstep 0 if the user does not want this for some reason.

  • Bug Fix: Fixed an issue where per-instance added components were not attached to the correct Blueprint-created component when the Actor was duplicated.

  • Bugfix: Spectator pawns now correctly go through the full unpossess lifecycle when the DestroySpectatorPawn function is called.

  • Bugfix: Fixed an issue where component instance data cache was not applied correctly to a root component that is attached to another Actor.

  • Bugfix: Fixed an issue occurring with the FindTeleportSpot function when finding locations for spawning an Actor (before BeginPlay). It now applies the proposed Z adjustment to all XY position permutations, instead of only applying it to the last of the XY-only permutations after all of the XY-only options failed. When an adjustment axis is nearly zero, more permutations are tried rather than duplicating the four axial permutations. The behavior of the FindTeleportSpot function for Actors that have begun play has not been changed.

  • Bugfix: Fixed an issue where you were unable to spawn four or more players when there is only one Player Start object available. Note that it is still preferable to include multiple Player Start objects to avoid contention when Player Starts are occupied.

  • Bugfix: Fixed a crash occurring when unloading a streaming level after changing bIsStatic in the level Details.

  • Bugfix: Light subclasses no longer display two sets of properties in the Details panel.

  • Bug Fix: The default class type of SpawnedSpectator now matches the type specified by the GameState.

  • Bugfix: Fixed a bug where GameplayTags were not properly redirected when using ImportText if the GameplayTags were renamed.

  • Bugfix: Fixed the result of the GetDirectionAtSplineInputKey function of USplineComponent for scaled objects.

  • New: The ActorLineTraceSingle function of AActor is now correctly marked const.

  • New: Framework - Provides functions to get the MinimalView from a SceneCaptureComponent.

  • New: Scene Capture Component - Added a way to configure the capture view using the minimal view from a camera.

  • New: Framework - Split the functions for GetPixelBoundingBox and GetPixelPoint into static functions that do not require you to rebuild the FSceneViewProjectionData. Rebuilding is expensive, and if you have the projection data, you can now run through these calculations a lot faster.

  • New: SceneCapture2D - Added a new property to allow you to control the near clipping plane of the scene capture component.

  • Improvement: CharacterMovement: Deferred "limit air control" code in the PhysFalling function until we actually need the result, which is only after a collision. This reduces the number of calls to the CalcVelocity and NewFallVelocity functions from 2 to 1 in normal cases. Added a virtual ShouldLimitAirControl function for deciding if we want to limit air control at all. This is useful for falling modes which are more like flying (low gravity or anti-gravity).

  • Improvement: Optimized UpdateOverlapsImpl (in UPrimitiveComponent) to manipulate pointers to FOverlapInfo structs rather than the large structs themselves. This reduces the cost of this function by 10 percent or more.

  • Improvement: Improved the comments for UProjectileMovementComponent regarding interpolation, to make it clear that you must do additional hookups aside from just turning on "Interpolate Movement" (in other words, point it to the interpolated visual component and plug in network updates).

  • Deprecated: Deprecated PostPhysicsComponentTick has been removed from UPrimitiveComponent.

  • Deprecated: Deprecated the Pauser function of AWorldSettings, and replaced it with the PauserPlayerState, GetPauserPlayerState and SetPauserPlayerState functions.

  • Deprecated: The PawnList function of UWorld has been removed, and instead of using FConstPawnIterator you should use TActorIterator or TActorRange. FConstPawnIterator has been reworked to be a wrapper around TActorIterator. This should allow for seamless backwards compatibility for most operations that would have been done with an FConstPawnIterator, however FConstPawnIterator might be removed in the future.

  • Deprecated: The AddPawn, RemovePawn, and GetNumPawns functions of UWorld have also been deprecated.

Localization

  • Bug Fix: Allow unloaded String Table Assets to be picked by text properties.

  • Bug Fix: Fixed the "compile" localization gather INI being ignored by source control when editing a localization target in the Localization Dashboard.

  • New: Added the Join function to FText as a way to combine delimited text in a localization-friendly way.

    • Updated FTextBuilder to use this to join several generated lines together, rather than building a single FString which loses all the localization information.

    • Note: FTextBuilder will now consistently add a line when any of its "AppendLine" functions are called. Previously, it might have done nothing if the builder was empty and indentation was disabled.

  • New: Optimized the localization gather for Assets by caching which fields from a type require gathering for localization.

Networking

  • Crash Fix: Fixed a crash with Seamless Travel caused by Network GUIDs being received or cleared during a transition.

  • Crash Fix: Fixed crash if a socket failed during a send.

  • Crash Fix: Fixed a rare crash that could occur when replicating an Actor subobject.

  • Crash Fix: Fixed a crash that could occur while processing fast shared bunches in the replication graph due to additional remote calls occurring.

  • Crash Fix: Fixed an issue in the GridSpatializaition2D node for the replication graph that could cause a crash if a replicated Actor had an invalid position.

  • Crash Fix: Fixed a rare crash when initializing a replication shadow state buffer with a missing archetype.

  • Bug Fix: Calling ForceRelevant on a dormant static Actor will now force the actor to be processed until all connections have replicated it.

  • Bug Fix: Fixed cases where properties whose Replication Conditions changed and could not be replicated until they changed again.

  • Bug Fix: Prevented Packages, Objects, or Classes loaded by Network Async Loading from being garbage collected — this could cause assets (especially Blueprints) to appear to never load on clients.

  • Bug Fix: Updated RepLayout to not pass raw pointers around, and instead used type-safe wrappers.

  • Bug Fix: Fixed NetProfiler reporting double Custom Delta Property size.

  • Bug Fix: Fixed some issues where Role and RemoteRole would get stuck when changing Possession with multiple clients.

  • Bug Fix: Fixed an issue with Actor channel clean-up in the replication graph.

  • Bug Fix: Fixed some Oodle analytics errors.

  • Bug Fix: Fixed edge cases in RepGraph that could cause crashes referencing invalid Actor Channels or Object Replicators.

  • Bug Fix: Fixed an issue where RepNotifies for BitFields may pass in an incorrect previous value.

  • Bug Fix: Fixed network driver clean-up when initializing listen server fails.

  • Bug Fix: IPv6 addresses no longer require square brackets by default when serializing in a FURL. Now, Square brackets are only necessary when expressing an address and a port number — this allows for consistent address representation with most platform network APIs.

  • Bug Fix: Fixed an issue with dynamic subobject replication that could cause components to be leaked on the client.

  • Bug Fix: Fixed an issue where connections could be initialized into a bad state if connecting to the same address and port as a prior connection.

  • Bug Fix: Initialized FSteamAuthHandlerComponent::State to Uninitialized

  • Bug Fix: Made Demo Recording Timeslicing properly use milliseconds.

  • Bug Fix: Fixed an issue where a server could receive data from the client on a closed Actor channel. The server would then try to open the channel, fail, and report that to the client, which would start explicitly nacking all packets containing references to that channel.

  • Bug Fix: Corrected typo and renamed UReplicationGraphNode_ConnectionDormanyNode to UReplicationGraphNode_ConnectionDormancyNode.

  • Bug Fix: Blueprint Replicated Property Conditions are now properly serialized out with UProperties so that they are not lost in packaged games.

  • Bug Fix: The engine now waits to broadcast "Party Initialized" until Replicated Data is received. If the local player is the party leader, we record that the data is received when initializing. Additionally, Social Parties do not trigger PartyInitialized broadcasts until the Replicated Data is received.

  • Bug Fix: Fixed an issue where a listen server without a microphone will drop clients with a microphone if voice is enabled.

  • New: The -UE4Port command-line option for the Pixel Streaming WebRTC Proxy Server has been renamed to -UE4 and supports the "Address:Port" format rather than only accepting a port. This enables a Proxy to connect to a UE4 instance running on a different machine or to use address 127.0.0.1 to connect to an instance on the local machine.

  • New: Added CVar, enabling Oodle to skip compressing packets below a particular size. If tuned to skip packets that fit within a single ethernet frame (CVar value of approximately 18), it will reduce CPU usage while theoretically keeping the same network performance — on-the-wire bandwidth stays the same, but bandwidth calculations for ISP/service costs will be affected.

  • New: Added comments and documentation for Object Replication, Connection Establishment, Packet Sending and Receiving, and other networking code.

  • New: Added better tracking of dependent Actors in the replication graph so that we can guarantee they will be removed on destruction.

  • New: Added MaxSecondsInReceive and NbPacketsBetweenReceiveTimeTest property to limit the amount of time the Receive Tick can process incoming packets. Setting both values and the IpNetDriver will stop processing incoming data when the limit is reached.

  • New: Added "net.SkipReplicatorForDestructionInfos" to control whether clients should attempt to avoid the creation of object replicators and shadow states while processing destruction info bunches from the server.

  • New: The engine will now print socket error strings in log messages in test and shipping executables.

  • New: Made the WithValidation tag for server RPCs optional.

  • New: Added configurable throttling of client to server camera update calls that could consume all the available bandwidth at high frame rates.

  • New: Made a number of scope cycle counters in networking functions conditional behind the net.EnableDetailedScopeCounters Cvar. This should allow FramePro captures to be faster by default while preserving the ability to get detailed information as needed.

  • New: Added notification to all active network drivers when an Actor is destroyed.

  • New: Added DISABLE_REPLICATED_PROPERTY macro to explicitly disable the replication of a networked property in GetLifetimeReplicatedProps. This is needed since we will start warning when we detect replicated properties not registered in GetLifetimeReplicatedProps

  • New: Added DISABLE_ALL_CLASS_REPLICATED_PROPERTIES macro to disable the replication of all replicated properties of a given class.

  • New: Added RESET_REPLIFETIME macro that allows you to reenable a networked property that was disabled in a base class.

  • New: Added new Analytics Structures that can be used to more accurately track Queued Actor Channels, Network Async Loads, and Connection Saturation.

  • New: Added ability to limit the spatialization 2D grid of the replication graph to a specific region via SetBiasAndGridBounds. When the optional grid bound is set, we clamp the player view locations to the closest grid in the bounded region instead of growing the grid list to its location. Additionally, when adding Actors, we limit the available cells to coordinates inside the region.

  • New: Added experimental AES256 GCM packet handler implementation.

  • New: To help connection stability, we now allow socket errors to happen for a configured delay before killing connections.

  • New: Added packet reordering for out-of-order packets received on the same frame. These packets will now be processed normally instead of being dropped, reducing packet loss in this case.

  • New: Ensured a connection's PlayerController and current view target (Pawn) are processed first in the RepGraph gather list.

  • New: Improved Actor prioritization when using the replication graph.

  • New: Connections' view targets and their owning Actors (usually the Player Pawn and Controller) are now prioritized higher.

  • New: Increased the default range used for distance-based priority from 30 m to 600 m, since all Actors beyond this range have the same applied priority scaling.

  • New: To prevent and detect the generation of bad dictionaries, added extra safeguards to the Oodle dictionary generator.

  • New: Improved a log message in UReplicationGraph::ProcessRemoteFunction when an Actor is not valid for replication or if an Actor is being destroyed.

  • New: Simple HTTP web server functionality can now be leveraged via the newly added FHttpServerModule and IHttpRouter public interfaces.

  • Deprecated: Deprecated CDKeyHash and CDKeyReponse strings on the net connection.

Network Profiler

  • Bug Fix: Network Profiler now correctly reports the size of RPCs with parameters larger than 8 KB.

  • Bug Fix: Fixed an issue preventing large profiles from loading in the network profiler.

  • New: Added OnNetworkProfileFinished delegate in Network Profiler, which executes when a network profile has finished being written to.

  • New: Added average time value to Network Profiler Actor list view.

  • New: Process identifier is now automatically added to network profile filenames.

Replays

  • Crash Fix: Fixed a crash when the replay spectator controller is created on a dedicated server.

  • Bug Fix: Fixed issue with Fast Arrays and Replays, where checkpoints could delete elements.

  • Bug Fix: Fixed RepNotify functions not being called on Dynamic Actors spawned into sub-levels that are streamed out and back in before garbage collection during replay playback.

  • Bug Fix: Fixed an issue with the serialization of net field exports in replays.

  • Bug Fix: Fixed an invalid backward-compatibility check in replay playback with dynamic arrays.

  • Bug Fix: Fixed a case where backward-compatible replay warnings were generated when receiving a remote call with no parameters.

  • Bug Fix: Fixed error handling for replay checkpoints attempting to serialize corrupt strings.

  • Bug Fix: Fixed an issue when loading a replay checkpoint where Actors were incorrectly attempting to register network GUIDs.

  • Bug Fix: Fixed a thread safety issue in the local file replay streamer when setting an error condition.

  • Bug Fix: Reduced memory spike of the ExportGUIDArchives when Demo recording is enabled and a client receives several new Actor channel bunches in a single frame.

  • Bug Fix: Fixed an issue where information about destroyed net start-up Actors could be missing when scrubbing past a replay checkpoint.

  • Bug Fix: Fixed a crash that could occur when starting replay playback from a console command. Bug Fix: Fixed an issue where some replicated properties in the world settings would not be reset properly when scrubbing a replay.

  • New: Added "demo.FastForwardLevelsPausePlayback" to control whether streaming levels will pause playback while they wait for streaming replay data to be available.

  • New: Removed recording of Character interpolation samples from replays in favor of standard replicated movement.

  • New: Added a call to enable flushing of active replay streamers.

  • New: Added a call to update the current playback time to the network replay streamer interface.

  • New: Added multi-perspective demo viewing functionality — this allows for multiple viewports to see the same demo from different angles during playback.

  • New: Added a config option to allow the demo net driver to filter out specific multicast RPCs.

  • New: Added the ability to use exec commands on an arbitrary replay streamer class.

  • New: Added "demo.JumpToEndOfLiveReplay" to control whether or not to fast forward to the end of a live replay when playback starts.

  • New: Added "demo.LoopCount" for playing replays a specific number of times rather than infinitely looping.

  • New: Added the full replay URL as an argument to the replay streamer when starting a recording.

  • New: Added a method to enable game code to determine when replay playback is in the middle of finalizing the fast forward process (calling RepNotify functions).

  • New: Added the ability to set an analytics provider on a replay streamer.

  • New: Adding logging of replay header flags when playback has started.

  • New: Added the option to use -replaystreamer= or -replaystreameroverride= on the command-line for testing.

  • Improvement: Reduced log spam when recording replays with the LocalFileNetworkReplayStreamer implementation.

  • Improvement: Increased the default max buffered stream chunk count in the local file replay streamer.

  • Improvement: Changed the engine default replay streamer from null to a local file. The local file streamer has improved game thread performance and supports additional replay features.

Online

  • Crash Fix: FCurlHttpRequest no longer crashes in GetContent or GetContentLength if the request has no payload.

  • Crash Fix: Fixed a crash in HandlePartySystemStateChange code in USocialParty.

  • Crash Fix: When creating other members, the system could crash if there was no existing local member. InitializePartyInternal now always initializes the local player's party member first to avoid this situation.

  • Crash Fix: The SocialToolkit no longer fires an inappropriate assert when another platform user is logged in already.

  • Crash Fix: Fixed a crash that occurred when trying to modify a session that has not yet been created when using the Steam OnlineSubsystem.

  • Crash Fix: Fixed a Steam crash that occurred when the engine was unable to read or modify the steam_appid.txt file while using development builds.

  • Bug Fix: Fixed a memory leak when storing Json in FVariantData.

  • Bug Fix: AppleHTTP no longer leaks memory when validating SSL certificates.

  • Bug Fix: We now unflag missing XMPP when a party state changes from CreatePending to Active. This fixes party functionality degraded state not updating if a previous party was Disconnected when we left it.

  • Bug Fix: Fixed memory corruption caused by using mismatched allocators in VivoxVoiceChat.

  • Bug Fix: URL handling code now removes the web link preceding "?" before parsing "&" separated value parameter pairs.

  • Bug Fix: Fixed a bug where Google OAUTH scopes were wiped during logout and reloaded from .ini, but the scope added in code during initialization was not being re-added.

  • Bug Fix: When changing the party leader, OnDemoted will now wait to broadcast on a Social Party Member until after the leader has been reassigned.

  • Bug Fix: Fixed invites to private matches using the Steam Overlay not sending lobby data due to insufficient permissions.

  • Bug Fix: Steam voice no longer stops broadcasting when seamless travel takes place.

  • Bug Fix: Fixed matchmaking and session join issues when using the Steam OSS without using the Steam NetDrivers.

  • Bug Fix: Fixed a thread safety issue in the HTTP module's libcurl implementation where a response could be considered complete before the result code was set.

  • Bug Fix: Requests in the HTTP module's libcurl implementation could return that they completed successfully despite receiving an invalid HTTP response code; these requests now fail.

  • Bug Fix: Fixed an issue where Steam lobbies stopped updating the joinability status if the "maximum number of connections" property was frequently modified.

  • Bug Fix: Fixed Steam library paths being hardcoded in the Linux build script's rpath.

  • New: Implemented CreateSessionIdFromString for Steam’s Session interface.

  • New: Added certificate SPKI hash pinning support with FSslCertificateManager to the HTTP module implementation for iOS and Mac.

  • New: Added RestoreParties and CleanupParties functions to IOnlinePartySystem to facilitate a client's party state from a backend service. Added OnPartyInviteRemoved when an invitation is removed.

  • New: We have exposed FVariantData type suffix and enabled FVariantData to create a JSON object from a string.

  • New: Added config settings for whether we should leave a party on disconnect, and whether we should cache parties for join on disconnect

  • New: The VivoxVoiceChatPlugin now has delegates to respond to connection, login, and channel state changes.

  • New: Added PATCH verb support for Curl

  • New: There is now an option to always send invitations on the primary party system in addition to platform invitations.

  • Removed: Replaced deprecated Google+ scope with basic userinfo scope.

Paper2D

  • Bugfix: Paper2D editor viewport mouse operations when using scale > 1 are no longer offset.

Physics

  • New: Exposed Transform attributes to the field components.

  • New: Added an option to have outer bounding regions for MBP.

Collision Detection

  • New: We now skip invalidating collision if no changes were applied when calling SetCollisionResponse functions.

Physics Asset Editor

  • Bugfix: Disallow moving elements/constraints in physics asset editor when simulating to prevent breaking operation stack.

Rigid Bodies

  • New: Add setting to stop simulating Anim Dynamics below a minimum timestep

  • New: Add setting to stop simulating Rigid Body nodes below a minimum timestep.

Platforms

  • Bug Fix: Async loading textures no longer stall the game thread in PostLoad when using async loading packages.

  • Bug Fix: Adjusted the way our embedded web browser's user agent string is generated. This will make the browser look more familiar to pages that check against the user agent.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: Added missing DX12 RHI for ReadSurfaceData with FLinearColor Output.

  • New: (Mac and iOS) Changed how dsyms and stripping are handled. Now only generates the dsym if we strip, and only strips in Shipping (unless command lines override it, see alwaysgeneratedsym in UBT).

  • New: Reworked virtual memory API to support page caches and heterogeneous memory architectures.

  • New: Converted hardcoded FPlatformInfo table to DataDrivenPlatformInfo.ini sections.

  • New: Fixed up ALL platform header files to match new required naming conventions for HAL files (XXXPlatformFile.h, not XXXFile.h, and all platforms must have a header file, even if it just #includes another one, like iOSPlatformTime.h just #includes ApplePlatformTime.h).

  • New: Optimize Tonemap function for non-mobile. Use Quad intrinsics to cheapen the cost of the sharpen function. Gives around 15% speedup.

  • New: Added UnrealBuildTool.GetAllEngineDirectories(string OptionaSubDirectory) that makes it easier to get, for instance, all Config directories under Engine and any PlatformExtensions. Properly scans PlatformExtensions for DataDrivenPlatformInfo files.

  • Improvement: Optimized Metal render pipeline creation code to improve load times on Apple platforms.

  • Improvement: Moved mapped .ubulk files to .m.ubulk so that they can be aligned and not compressed without affecting other bulk data, such as textures.

  • Improvement: If you were depending on dsym files in non-Shipping builds, they are no longer generated by default in non-Shipping because they are slow to generate, and almost never needed (for instance, Instruments can use the source executable instead of a dSYM to symbolicate).

All Mobile

  • Bug Fix: Fixed a black screen displaying for several seconds after the splash screen when not using a startup movie or the early preload screen system.

Android

  • Crash Fix: Fixed a crash on Android when trying to Replay Cinematic using IBM streaming. Adding VideoDecoder$FrameUpdateInfo to proguard exceptions.

  • Crash Fix: Fixed an assert in dump_syms when using Android’s clang toolchain and possibly newer clang on Linux x64.

  • Crash Fix: Fixed issue with missing class definition causing a crash on KitKat.

  • Bug Fix: Fixed an issue that was causing some devices to improperly be reported as gamepads.

  • Bug Fix: Restored support for Exit and Quit on Android.

  • Bug Fix: Allow forwarding Back button to Java on Android.

  • Bug Fix: Fixed a compile issue for Android x86 with Media Player.

  • Bug Fix: Fixed an issue with gamma correction for GLES 3.1 external texture sampling, which was causing brightness problems with video playback.

  • Bug Fix: Fixed logging of store version.

  • Bug Fix: Fixed an issue where Generated SymbolizeCrashDump for Android was invalid.

  • Bug Fix: Fixed default superclass for GameActivity (controlled by GameActivitySuperClass property in /Script/AndroidRuntimeSettings.AndroidRuntimeSettings).

  • Bug Fix: A directory for packageInfo.txt is now created if it doesn't exist.

  • Bug Fix: Fixed LLM reporting for meshes on OpenGL RHI.

  • Bug Fix: Fixed an issue with inability to summon the virtual keyboard on Android 9.0 with TargetSDKVersion=28. Now you can manually request focus when clicking on an EditText.

  • Bug Fix: Fixed an issue where Intent was passing extra data to be consistent between SplashActivity and GameActivity.

  • Bug Fix: We now keep Profile override from ConifgRules only if OverrideProfile is set.

  • Bug Fix: Disabled Oculus plugins on Android X64 (Intel) since they are not supported.

  • Bug Fix: Fixed staging of libUE4.so for Ant builds on Android.

  • Bug Fix: Fixed an issue attempting to use NetworkRequest.Builder on KitKat.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: We now default controllers to use hat d-pads on Android.

  • New: Per-device memory bucket rounding can be enabled from ConfigRules with MemoryBucketRoundingAddition variable (defaults to 384 if not set).

  • New: Added an MD5 hash check of Android build template files to invalidate intermediate source from previous packaging.

  • New: Enabled intercepting Java-side logging on Android with a callback.

  • New: Added gameActivityAfterMainViewCreatedAdditions to the GameActivity.java.template for UPL.

  • New: Added an option to split OBB into main and patch if it exceeds OBB size limit (bAllowPatchOBBFile in project settings).

  • New: Added a permission validation tool for Android that checks final merged AndroidManifest.xml in APK against permission_whitelist.txt in the project's Build/Android directory.

  • New: Added Safe Zone handling with detection of insets and display cutout for portrait and landscape orientations.

  • New: Added optional handling of activity resize events for Android. (Android.EnableNativeResizeEvent console variable).

  • New: Added support for UPL to insert a finalizing section at end of onCreate (gameActivityOnCreateFinalAdditions).

  • New: Pass on hardware (SRC_Hardware) and chipset (SRC_Chipset) information for use in device profiling matching rules.

  • New: Actions can be inserted whenever the software keyboard opens or closes on Android with UPL (gameActivityResizeKeyboardAdditions).

  • New: Enabled use of display cutout region on certain Android models (see SplashActivity.java).

  • New: Added handling of required permissions at startup in SplashActivity with com.epicgames.UE4.GameActivity.StartupPermissions in AndroidManifest.xml (comma-separated list).

  • New: Added support for store version offset by architecture, so multiple APKs may be active for building and have different store versions in manifest (required to upload to Google Play Store).

  • New: Android device profile matching rules (AndroidDeviceProfles.ini) will now be picked up from Android platform's config directory if present.

  • New: Added native Android trace support.

  • Improvement: Removed unneeded Java imports.

  • Improvement: Better chipset identification checking in ConfigRules (ignore case).

  • Deprecated: Disabled GameApplication for Android projects still using Ant (Note: Gradle should be used from now on; Ant is depreciated).

HTML5

  • Crash Fix: Fixed a crash with offscreen framebuffer mode (multi-threading) when switching to fullscreen.

  • Bug Fix: Added missing NtoHS, HtoNS, NtoHL, and HtoNL implementations in ICMP module.

  • New: HTML5 platform support will be migrated to GitHub as a community-supported Platform Extension and no longer officially supported by Epic in upcoming releases.

  • New: Added OFFSCREENCANVAS_SUPPORT.

iOS

  • Bug Fix: Fixed an issue on iOS devices where the Metal renderer was consuming CPU time unnecessarily in simple scenes which were not GPU bound. This was causing overheating, especially on iPhone X.

  • Bug Fix: Implemented a workaround for fast::sincos inaccuracy.

  • Bug Fix: Dismissing an alarm in a project no longer leaves the project's sounds muted.

  • Bug Fix: When compiling to Metal convert local constant arrays to the new safe_array template, which sanitizes input addresses. This should reduce the number of bad-access GPU timeouts according to Apple.

  • Bug Fix: Fixed an issued with reflection brightness of 0 causing problems when inverted on A11 and A12 GPUs.

  • Bug Fix: Fixed running developer iOS builds with the address sanitizer enabled.

  • Bug Fix: Now only allowing use of frame-buffer fetch in fragment shaders for iOS Metal as they aren't supported in any other shader stages.

  • Bug Fix: Fixed an issue with com.apple.developer.associated-domains when the value is a string, not an array, by adding CODE_SIGN_ENTITLEMENTS in the project file.

  • Bug Fix: Builds with dSYM Options Enabled now compile correctly.

  • Bug Fix: Fixed a bug where iOS failed during the build step with OSS Facebook plugin enabled when there are spaces in the project path.

  • Bug Fix: iPhonePackager now works properly with HiDPI monitors.

  • Bug Fix: iOS logging is now possible for all non-shipping builds, even if the xCode debugger is not attached.

  • Bug Fix: Fixed the path for dSYM.zip for embedded DLL compiles.

  • New: Implemented a BackgroundHTTP prototype feature. This allows you to make HTTP download requests that will attempt to continue downloading even while your app is backgrounded.

  • Bug Fix: Fixed the iPhonePackager signing of .ipa files with extensions or frameworks (the changing bundle ID does not currently work with extensions due to bundle ID re

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.strictions).

  • New: We now support separate MSAA and resolve targets on Metal MRT for iOS devices. This means the Forward renderer can support MSAA the same as it does on macOS.

  • New: Enabled animation memory-mapped IO on iOS. Saves 10–20 megs of memory.

  • New: Added method to FiOSAppDelegate query if recording permission is present.

  • New: Enabled Memory Mapped IO for Audio on iOS. This can save memory by letting the OS toss audio memory and reload it from flash as needed.

  • New: Changed how framework signing for dylibs works. Remove the framework searching from Xcode into UBT.

  • New: The DeploymentServer will no longer query for iOS or tvOS devices when the project does not have iOS or tvOS as supported targets.

  • New: Enabled optional high-quality voice chat.

Linux

  • Bug Fix: Fixed linking to libs with spaces in their paths.

  • Bug Fix: Bundled the Linux Toolchain for installed builds if they exist.

  • Bug Fix: UE4 can now have spaces in its install path.

  • Bug Fix: SDL is now initialized before trying to request info from the VulkanRHI.

  • Bug Fix: Fixed Linux not using RHI thread by default.

  • Bug Fix: Fixed RM64 builds by Implementing missing non-SSE Math FPU Vector functions:

    • VectorMask_LT(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_LE(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_GT(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_GE(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_EQ(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMask_NE(const VectorRegister& Vec1, const VectorRegister& Vec2)

    • VectorMaskBits(const VectorRegister& Vec1)

  • Bug Fix: Fixed an issue where the callstack frames could ignore up to the value of the si_value from the signal, possibly cutting off all the frames.

  • Bug Fix: Fixed lingering tooltips.

  • Bug Fix: Fixed testvulkan samples with UEs aarch64 SDL libraries.

  • Bug Fix: Provided callbacks to handle negative time deltas gracefully.

  • Bug Fix: Minimizing a maximized window no longer steals events from Slate.

  • Bug Fix: Temporarily disabled Editor fullscreen for Linux.

  • Bug Fix: Fixed Compute Skincache for Linux during a cook.

  • Bug Fix: Fixed a bug where the ShaderCompileWorker was crashing when setting FORCE_USE_STATS ShaderCompileWorker was passing "-ReduceThreadUsage" command line, and FTaskGraphInterface::Startup() wasn't getting called, so FTaskGraphInterface::Get() was returning NULL and crashing ShaderCompileWorker processes.

  • Bug Fix: Added code that calls FPlatformProcess::OpenProcess() in EngineSessionManager.cpp when checking previous crash data, and it is crashing on Linux—since this method isn't implemented for FUnixPlatformProcess. As a temporary solution, because OpenProcess() is a limited function in comparison to CreateProcess(), it can only be used to check if the process ID is running.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: Implemented ThreadStackWalkAndDump and CaptureThreadStackBackTrace for Unix Platform.

  • New: Added Linux game splash screen support.

  • New: Symbols are now hidden by default for non-monolithic builds for Linux/Mac.

  • New: Uses SF_VULKAN_SM5 as the default null shader language over GLSL_150.

  • New: Added SDL2 EG Wayland_Vulkan_GetRequiredInstanceExtensions.

  • New: Files created on Linux will now have permissions 664 versus the old way of 644—which is the same as Mac—to unify the platforms on file permissions.

  • New: Made unresolved symbols a compile-time error on Linux.

  • New: SDL2: Update to newer 2.0.10 version SDL 2.0.10 changes: https://icculus.org/~icculus/dotplan/SDL-2-0-10-changes.txt

  • New: Implemented FPlatformMisc::GetPlatformChunkInstall() for Linux.

  • New: When using WaitAndFork, you can now supply an exit code in a child process to request that the parent close as well.

  • Improvement: Optimized how to focus out events are handled, preventing ~150ms hits when opening/closing context menus or tooltips.

  • Improvement: Improved functionality for the support extensions Export/Import Open/Save dialog in the Slate File Dialog Window.

  • Improvement: Implemented a better Linux CreateGuid. This can be disabled with -norandomguids command-line option.

  • Improvement: Reduced monolithic binary sizes.

  • Deprecated: Disabled GoogleVRHMD on Linux until the library is bundled.

Mac

  • Crash Fix: Fixed a crash in the Slate File Dialog window when clicking on an empty space in the drop-down menu.

  • Bug Fix: Fixed failing to link to the Steam API when running on Mac OS platforms.

  • Bug Fix: Disabled HDR support on macOS older than 10.14.4 to work around an issue with older GPU drivers.

  • Bug Fix: ShaderObj files no longer accumulate in the /tmp/* directory when cooking shaders for Mac. When using native shader libraries we will emit them from the DDC to the right place.

  • Bug Fix: Changed the way we restore the macOS binary shader cache, as this may help on Intel/Nvidia Metal drivers.

  • Bug Fix: Mac Python—upgraded to 2.7.14 (bringing this in parity with Win64 and Linux)

  • Bug Fix: Fixed a Mac crash caused by an attempt to access info about a disconnected display before the display reconfiguration event was received.

  • Bug Fix: On macOS, properly disambiguated Intel command-buffer failures.

  • Bug Fix: Setting a compute shader in MetalRHI should not affect the graphics tessellation state or we'll fail to go down the proper DrawPatches rendering path and ultimately assert on a missing PrologueEncoder.

  • Bug Fix: Fixed few compile errors caused by new warnings introduced in latest Apple Clang (Xcode 10.2).

  • Bug Fix: Resolved requests from Nvidia and Intel to aid Metal performance:

    • Swaps back to Managed uniform buffers to improve performance on discrete GPUs.

    • Disables the parallel command-buffer encoding on Intel & Nvidia as the small command—buffers hurt more than they help—can be forced on with the -metalparallel command-line option.

    • Allows forcing on async. compute with -metalasynccompute so NV can A/B test whether it helps.

  • Bug Fix: Moved the 'patchCount variable to the device address space in Metal tessellation shaders to avoid an Nvidia driver bug.

  • Bug Fix: Re-enabled XGE for cross-building for Linux on Windows.

  • Bug Fix: When entering the default crash handler, it is now set to current thread.

  • Bug Fix: Removed conditions on include paths for QtCreator.

  • Bug Fix: Now using the new dsymutil with Xcode 10.2 to check the version of dsymutil before looking for alternates.

  • New: Implemented the engine changes needed for the new Platform Extension concept—which puts the entirety of the platform support into a single location outside of the main engine code. This has changed some fundamental ways that the engine and its build system works, and may affect you, depending on how much you have modified the engine.

  • New: For non-Shipping Mac builds, enabled MetalRHI's internal GPU/Metal debugging tools by default to provide more information about problems—this means that bugs that aren't 100% reproducible should still report more useful information to help identify the problem. Also fixed the location of where the GPU debugging for macOS is enabled so that it is actually useful.

  • New: All the GPURestart logs are now copied into the .log file for non-sandboxed UE4 projects so that we don't need to gather sysdiagnose from Macs to report bugs to the GPU vendors. Only happens when the crash is caused by a GPU error.

  • New: Improved startup movie playback performance on macOS by using I/O Surface backed pixel buffers.

  • New: Reports all thread backtrace when a hang happens.

  • New: Implemented ThreadStackWalkAndDump and CaptureThreadStackBacktrace.

  • New: Added TCFRef for managing Core Foundation Ref lifetimes.

VR

  • Bug Fix: When HMD display resolution is not zero, you can now override with HMD resolution in FSceneViewport::ResizeFrame().

  • Bug Fix: Fixed an issue with JNI dependency that was causing a compile issue.

Windows

  • Bug Fix: Fixed Windows directory watcher fail when watching over 63 directories.

  • Bug Fix: Fixed compilation errors on Windows when using a WinSDK version later than 10.0.18362.0 due to header conflicts in the networking layer.

  • Bug Fix: Fixed TryGetWindowsSdkDir only checking for null instead of IsNullOrEmpty.

Programming

  • New: Added support for compiling with Clang 8 on Windows.

  • New: Added support for creating client and server targets from custom-made installed builds. Use the "-set:WithClient=true" and “-set:WithServer=true” BuildGraph arguments to enable this.

  • New: Renamed IsFunctionImplementedInBlueprint to IsFunctionImplementedInScript.

  • Bug Fix: Fixed Wait function on Event class when given a large FTimespan.

Automation

  • New: Made SaveRoleArtifacts virtual so it can be overridden.

Gameplay Framework

  • New: Any subclasses of ALight must now have a VisibleAnywhere light component property similar to how ASpotLight or ADirectionalLight do. Otherwise, no light properties of that subclass will be visible in the details panel.

  • Bug Fix: Fixed the scope name of GetAllActorsWithInterface in UGameplayStatics::GetAllActorsWithInterface.

Networking

  • New: Replication Graph now supports child connections! To add support for UChildConnections in a project's custom replication graph node, iterate through the FNetViewer array given to your GatherActorListsForConnection function by the FConnectionGatherActorListParameters argument instead of using the single FNetViewer attribute from the same structure.

  • New: FInternetAddr structures can now be queried for the protocol they hold, which is useful for platforms that support multiple Internet protocols. With this change, the previously-implemented enumeration types for detecting sockets/address protocols has been deprecated in favor of using FNames for flexibility. The SocketSubsystem has also been updated with the following changes:

    • GetAddressInfo results now hold error code information for easier messaging and debugging.

    • GetAddressFromString has been introduced as a way to easily serialize a platform address to the proper structure. For most platforms, this functionality is equivalent to doing a pton operation, so no resolution is done in this function.

    • CreateInternetAddr now takes no arguments and returns a newly created FInternetAddr for the platform which can then be filled as needed.

    • The synchronous version of GetHostByName has been deprecated.

    • The asynchronous version of GetHostByName now uses GetAddressInfo to query host information.

  • New: Major refactor to the underlying network structures so that they primarily use network address datatypes (FInternetAddr) instead of strings to represent locations. This change reduces overhead and conversions when preparing to communicate over the network. It also deprecates several functions, primarily affecting projects that either interact tightly with, or contain their own implementations of, PacketHandler/HandlerComponent, NetConnection, or NetDriver, or that inherit from IpNetDriver or IpNetConnection.

    • General: Net addresses like the LocalAddr and RemoteAddr properties in platform-specific NetDriver/NetConnection code are now stored in the base NetDriver/NetConnection classes, respectively.

    • Projects that implement their own NetDriver or inherit from IpNetDriver: LowLevelGetNetworkNumber is now handled by the base class, and is no longer a pure virtual. LowLevelSend now takes an FInternetAddr as the input address, no longer relying on a string. FDisconnectedClient classes now store constant FInternetAddr information, as they should not tamper with address structures.

    • Projects that implement their own NetConnection or inherit from IpNetConnection: GetAddrAsInt is now deprecated as it cannot be supported by all platforms. GetInternetAddr is also deprecated as it allows for modification of the underlying connection data while in mid-connection; use GetRemoteAddr instead. RemoteAddressToString is no longer a pure virtual, and is handled in the base class.

    • Projects that implement their own PacketHandler/HandlerComponent: IncomingConnectionless, Outgoing, Incoming, and OutgoingConnectionless have all been updated to use FInternetAddr instead of strings.

Online

  • New: Forward declarations of party enums will now need to include a size.

  • New: Internal party fields have been marked const. Use of FOnlineParty::Config should be replaced by FOnlineParty::GetConfiguration.

  • New: OnPartyStateChanged now takes a fourth parameter for the previous state of the party.

  • New: Various party delegates now have a "Const" version. For example, OnPartyConfigChanged gives a non-const FPartyConfiguration, while OnPartyConfigChangedConst returns a const FPartyConfiguration. The “Const” version is recommended where possible.

  • Deprecated: GetParty, GetPartyMember, and similar party-related functions now return const shared pointers instead of non-const shared pointers. Some non-const functions have been deprecated in favor of their const variants.

Core

  • New: Added TArray64, which is a TArray with 64-bit indexing. Allocators must now define a SizeType which is the signed type used for representing indices and counts. FDefaultAllocator64 and TArray64 aliases added to enable a 64-bit-indexed version of TArray. Some forward declarations removed which no longer compile because they are now aliases instead of classes.

Rendering

  • New: Replaced global frame minimal graphics pipeline state TSet with a TSet per DynamicPassMeshDrawListContext. This removes RW lock contention when global TSet is accessed by multiple threads, improving performance.

  • Deprecated: The following RHI typedefs have been deprecated; please use the regular pointer versions (for example, instead of FSamplerStateRHIParamRef now use FRHISamplerState*):

    • FBlendStateRHIParamRef

    • FBoundShaderStateRHIParamRef

    • FComputeFenceRHIParamRef

    • FComputeShaderRHIParamRef

    • FDepthStencilStateRHIParamRef

    • FDomainShaderRHIParamRef

    • FGeometryShaderRHIParamRef

    • FGraphicsPipelineStateRHIParamRef

    • FHullShaderRHIParamRef

    • FPixelShaderRHIParamRef

    • FRasterizerStateRHIParamRef

    • FRayTracingPipelineStateRHIParamRef

    • FRayTracingShaderRHIParamRef

    • FRenderQueryRHIParamRef

    • FSamplerStateRHIParamRef

    • FShaderResourceViewRHIParamRef

    • FTextureReferenceRHIParamRef

    • FUnorderedAccessViewRHIParamRef

    • FVertexDeclarationRHIParamRef

    • FVertexShaderRHIParamRef

    • FUniformBufferRHIParamRef

    • FIndexBufferRHIParamRef

    • FVertexBufferRHIParamRef

    • FStructuredBufferRHIParamRef

    • FTextureRHIParamRef

    • FTexture2DRHIParamRef

    • FTexture2DArrayRHIParamRef

    • FTexture3DRHIParamRef

    • FTextureCubeRHIParamRef

Rendering

  • Crash Fix: Fixed crash cases where the low-level Material Uniform Buffer allowing invalid texture types to be bound. Now, texture will be replaced with appropriate default white texture.

  • Crash Fix: Added additional check for valid UTexture when binding to Material Uniform Buffer which avoids potential for rare crash due to data race.

  • Crash Fix: Fixed multiple crashes due to swapchain being out of date when using "DelayAcquire" mode.

  • Crash Fix: Fixed a crash that could happen with Dynamic Resolution causing query leaks.

  • Crash Fix: The DebugData of a cached FMeshDrawCommand was not cleared, when RemoveCachedMeshDrawCommands was called causing a rare crash when other FMeshDrawCommands was present. Only present in non-shipping builds.

  • Crash Fix: Fixed a crash if scene proxy emits more than one mesh batch.

  • Crash Fix: Fixed a crash issue with Instanced Static Meshes built through a Blueprint Construction Script.

  • Crash Fix: Fixed a rare crash in Volumetric Fog initialization.

  • Crash Fix: Fixed rare crash in mesh draw command caching during a Material update.

  • Crash Fix: Fixed crash in DrawTileMesh with a Translucent Material.

  • Crash Fix: Fixed a crash that could happen at runtime with Instanced Foliage.

  • Crash Fix: Fixed a crash issue with Translucent Materials using the "SceneDepth" node.

  • Bug Fix: Fixed cooked builds not working with OpenGL on Windows. SM4 was incorrectly selected while SM5 was cooked.

  • Bug Fix: When updating the instance transforms, UHierarchicalInstancedStaticMeshComponent would reallocate the instance buffers, that the vertex factor, FInstancedStaticMeshVertexFactory, has a pointer to. Added MarkRenderStateDirty so its updated

  • Bug Fix: Some unused resources (structured buffers) are null on D3D10. Point to a dummy black resource, in order to not hit checks().

  • Bug Fix: Addressed a fix for VB/IB lock with RLM_ReadOnly and Offset !=0.

  • Bug Fix: Fixed an issue where UAV overlap was never enabled for RenderDoc check happening too late for some SLI settings.

  • Bug Fix: Fixed dangling pointers when a Reflection Capture proxy is removed from the scene.

  • Bug Fix: Fixed an issue where meshes with a large number of elements could unnecessarily reserve a large amount of memory.

  • Bug Fix: Fixed an issue where IndirectArgsBuffer Static Meshes would be skipped.

  • Bug Fix: Fixed dereferencing null pointer in FRealtimeGPUProfiler at exit.

  • Bug Fix: Fixed an issue with "StationaryLightOverlap" view mode in Forward shading.

  • Bug Fix: When rendering in extreme resolutions, the Editor now clamps Volumetric Fog texture to hardware limits.

  • Bug Fix: Fix a race condition between "JoinFreeBlock" and “ReleaseBuffer” in Vulkan.

  • Bug Fix: Fixed a case where Static Meshes with MinLod greater than 0 may stop rendering when used in Instanced Static Mesh Component.

  • Bug Fix: flipped logic to only strip duplicate vertices when not supporting deferred, instead of when supporting mobile. This fixes builds that supports both Deferred and Mobile Forward renderer where you need the data to be not stripped.

  • Bug Fix: Fixed "Shader Complexity" view mode showing no instructions when running in Simple Forward Shading.

  • Bug Fix: Fix for first line being repeated in screenshots of float32 types.

  • Bug Fix: Added command list manager fence to release resources instead of frame fence.

  • Bug Fix: Fixed shader generation of RWByteAddressBuffer on HLSLcc platforms, such as Vulkan, OpenGL, Metal, and more.

  • Bug Fix: Packaged Metal shader source will now go into a zip file rather than a .tgz so it can be done on Windows builds too. It does this asynchronously while generating the Metal libraries. This file is stored in the MetaData folder so should be moved out of the content and not get packaged.

  • Bug Fix: BoneMatrices will now use an SRV on all Metal platforms. This ensures that out-of-bounds access is handled properly.

  • Bug Fix: FPackedMaterialClosestHitPayload now stores uints instead of ints. That should fix hitKind() that was not working properly.

  • Bug Fix: Fixed surface errors from the Metal shader compilation tools.

  • Bug Fix: Fixed Distance Field DDC key setup for non-default "r.DistanceFields.MaxPerMeshResolution" and “r.DistanceFields.DefaultVoxelDensity” values.

  • Bug Fix: Texture copies on Metal require exact format matches. Iit will not perform any texture conversion for you.

  • Bug Fix: Remove rendertarget size clamp from UTextureRenderTarget2D. UTextureRenderTarget2D can now be larger than the backbuffer.

  • Bug Fix: Shader workarounds to push alpha to be opaque when it is very close (but not quite). This fixes the alpha of Composure layers that were occasionally slightly transparent but were intended to be opaque.

  • Bug Fix: Fixed implementation of FD3D12CommandContext’s "RHICopyBufferRegions" when using multi-GPU to retrieve and use resources relevant to the parent device of current FD3D12CommandContext. It fixes transition validation errors due to incorrect handling of duplicate underlying resources in source or destination lists.

  • Bug Fix: Fixed an issue preventing Decals from appearing in Environment Reflection Captures.

  • Bug Fix: The Engine now uses texture views in MetalRHI's RHICopySubTextureRegion and RHICopyTexture to avoid a slower path that copies via a temporary buffer.

  • Bug Fix: Disabled Auto Exposure for Distance Field Visualization view modes.

  • Bug Fix: Fixed compiling shaders to Metal that use SceneDepth nodes but do not write any color targets and only depth. If a shader writes nothing at all then it will assume float4 input for the fragment fetch binding.

  • Bug Fix: Tile and Triangle rendering now use Index Buffers to work around Manual Vertex Fetch issue.

  • Bug Fix: Fixed an issue where view uniform buffer would not update back to full screen translucency parameters.

  • Bug Fix: Fixed an issue where scaling of R and B were swapped in FD3DFloatR11G11B10 to linear conversion.

  • Bug Fix: Fixed an issue where Render Targets would not update during Cooking.

  • Bug Fix: Fixed OverrideFarClippingPlaneDistance not being taken into account in Hierarchical Instanced Static Mesh Culling.

  • Bug Fix: Made MetalRHI work in terms of FRHIRenderPassInfo rather than the older FRHISetRenderTargetsInfo structure.

  • Bug Fix: Preserved content written by MaterialSetupCS when voxelizing primitives in Volumetric Fog.

  • Bug Fix: Fixed a race condition with BSP models and cached mesh draw commands.

  • Bug Fix: Fixed Mesh Vertex Paint LOD being clamped to 0 if an Actor includes a mesh component with no valid mesh data set.

  • Bug Fix: Fixed the collision view mode when tessellation is enabled on Static Meshes.

  • Bug Fix: Fixed an issue where a "Draw Material to RenderTarget" node invoked in the first frame of an application would result in the render target being immediately cleared afterwards.

  • Bug Fix: Pseudo texture sampling has been improved and will now sample correctly with respect to voxel center. This will now be more similar to hardware.

  • Bug Fix: When using Metal RHI's internal "fast" validation check, the depth-stencil-state against the Metal render pass configuration to ensure depth and stencil writing will work and fail if not.

  • Bug Fix: In Metal RHI tidied up the way we release private textures back in to the pool early so as to avoid placing them back in the pool twice or attempting to put nil into the pool. This change also includes the use of "setPurgeableState" behind the console variable "rhi.Metal.ResourcePurgeInPool", which is off by default.

  • Bug Fix: Fixed the validation of Metal shader versions so that it works correctly with the latest and future versions.

  • Bug Fix: D3D12 frame fence is now advanced in FD3D12Adapter’s "EndFrame" function, which happens regardless of whether the application is minimized. DefaultContext.ReleaseCommandAllocator() and GetGPUProfiler().EndFrame() steps are now also performed in FD3D12Adapter::EndFrame(), which fixes command allocator memory bloat when game is minimized. This solved GPU resource release/recycling when the game is minimized that lead to resource exhaustion and eventual crash.

  • Bug Fix: Resolve an issue with the Perceptual Quantizer (PQ) by converting it to properly use Nits (absolute units) for LUT indexing. By explicitly converting to Nits, the LUT has more correct quantization, resulting in better quality results.

  • Bug Fix: Fixed Vulkan validation messages not working starting with SDK version 1.1.85..

  • Bug Fix: Fixed some Metal shader translation bugs:

    • "Texture*Array.Load" needs to split the array index out of the vector coordinate for Metal.

    • The "GetDimensions" function needs to support the array-length/depth output argument.

    • "RemovePackedVarReferences" no longer is inserting new variables at the top of the function, and not the same scope as the source variable, which won't compile in cases where structs are used as temporaries and not function arguments.

  • Bug Fix: Hardened "MetalUniformBuffer" by caching all the data fetched from the “UniformBufferLayout” such that the RHI thread never needs to access it.

  • Bug Fix: Various fixes to the Metal buffer memory reporting.

  • Bug Fix: Paper2D render proxy now reports the correct previous frame world transition for motion blur and temporal anti-aliasing.

  • Bug Fix: Fixed Decal fade in/out Blueprint API.

  • Bug Fix: Fixed an error when attempting to run screen space denoising passes with "r.Shaders.Optimize=0". The error is reported when shader compiler doesn't remove resources from the shader, so they remain in the reflection data but high level code does not set them. Solution in this case is to always fill all slots of “FSSDSignalTextures” with one of the valid textures that are already present there.

  • Bug Fix: Fixed MTLHeap alignment restrictions not being honored when allocating from MTLHeap.

  • Bug Fix: Don’t resolve timing queries until command buffer is submitted. Fixes a validation issue with calling functions that are not allowed inside render passes.

  • Bug Fix: Fixed implementation of TD3D12Texture2D::UnlockInternal when using multi-GPU (mGPU). A common FD3D12ResourceLocation is used for all nodes in the LDA chain, therefore only the last FRHICommandUpdateTexture should take ownership of the resource and release it once it executes.

  • Bug Fix: Fixed selected Static Mesh collision color material override.

  • Bug Fix: Fixed a compilation error with PixelStreaming in WebRTC Proxy for Debug configurations.

  • Bug Fix: Simplified the way ranges are allocated and freed in "FMetalSubBufferMagazine" to avoid having to allocate/deallocate memory. This wouldn't have been leaking (it will always be referenced) but it will consume more memory than necessary as the number of magazine's increases.

  • Bug Fix: Fixed rendering artifact that looked like Z-fighting caused by depth varying between the depth and base pass.

  • Bug Fix: Fixed an issue with Widget3D render proxy to have correct local-to-world transform.

  • New: New Screen Pass API for implementing pixel shader post process passes with new Render Graph system.

  • New: Added world position offset support for Skeletal Meshes.

  • New: RHIMapStagingBuffer/RHIUnmapStagingBuffer can now be used without any blocking.

  • New: Added FirstArraySlice and NumArraySlices to FRHITextureSRVCreateInfo struct.

  • New: Vulkan app info will now include build changelist as the application version (for easier ID by the drivers).

  • New: UseGPUScene is now used to calculate DDC key.

  • New: Initial RHI validation layer is now aiming to find cross-platform issues. Use "-RHIValidation" to enable it. Current RHIs supporting it are D3D11 and Vulkan.

  • New: The frame buffer is now used as shading cache when not refracting.

  • New: Added Unfiltered MipGenSettings to generate mipmaps without averaging texels.

  • New: Added an option to globally force using DXC for D3D shaders. This is intended for testing compatibility and correctness when using the new compiler. Set "r.D3D.ForceDXC" to 1 to enable this behavior. D3D12 RHI is required to run shaders compiled with DXC.

  • New: Renamed "FSceneViewFamilyBlackboard" to “FSceneTextureParameters”.

  • New: Added ability to enable Capture Mode automatically when Intel GPU is attached.

  • New: Mark pooled Metal resource objects as volatile when they are placed into the pool awaiting reuse, for textures after two frames we'll actually reclaim the memory and just keep the MTLTexture around. This should save memory when streaming as it allows the OS to reuse the memory for other allocations. It does not purge Metal resources that are still owned by RHI objects - that would require much more bookkeeping.

  • New: Added NVIDIA Aftermath support for DX12. It can be enabled with "-gpucrashdebugging".

  • New: Initial work to support creating additive "patch" shader libraries from the metadata of two different cooked builds.

  • New: Separate static buffers from dynamic buffers when sub-allocating MTLBuffers to reduce fragmentation. Though level streaming tends to result in a lot of fragmentation even for static buffers. Also, changed the sub-buffer heap to use broader allocation ranges so that we fill empty space better. Make sure to use a sensible minimum alignment on each platform rather than the minimum allocation size as that also reduces wastage.

  • New: The command "gpuvalidation" is now also accepted together with “d3d12gpuvalidation” to enable the validation layer to be consistent with the Vulkan RHI.

  • New: A Clearer message is now shown when running the Engine with "-d3ddebug" and the Windows Graphics Tools are not installed.

  • New: "GPUScene" is now enabled for Vulkan.

  • New: Small rewrite of the GPU readback framework to support texture readback using the fence to avoid stalling.

  • New: Added a basic Shader/GPU driven debug rendering. Simple API: allocate, bind (for PS), draw. Support only wire-quad/cross/line drawing.

  • New: Added "position" and “normal” stream support to certain vertex factories.

  • New: Change vertex factory interface to use an enum instead of a bool for selecting between default vertex stream and position only stream.

  • New: Added support for enabling/disabling keeping shader debug info stored per-platform. Use the following:

    • This can be overridden per-platform in the [ShaderCompiler] section of the Platform’s Engine.ini by adding "r.Shaders.KeepDebugInfo".

    • Added support for exporting the debug info on platforms where it can be stripped and stored as separate files with "r.Shaders.ExportDebugInfo" and this is also per-platform.

    • Added "r.Shaders.ExportDebugInfoMode" to control how the exported files are stored. Use 0 for loose or 1 for an uncompressed archive.

  • New: Added dummy Reflection Capture uniform buffer to "FMeshPassProcessorRenderState". It is used for drawing tile meshes where no scene exists, but Forward Rendering Material Shaders require something bound for this buffer.

  • New: "MaterialShader" and “MeshMaterialShader” will now use the new shader permutation API.

  • New: Added R32G32_UINT format support.

  • New: ShaderPrint debugger now helps with compute shader debugging.

  • New: Composure has been changed to support Color Grading and White Balance from floating point Post Processing LUT. The Composure Layers inherit Post Processing Parameters from the Scene Camera, so color correction controls can optionally be enabled separately for each "CGLayer".

  • New: Added support for RDG_GPU_STAT_SCOPE.

  • New: Driver blacklist now supports filtering by Date as well as by Version.

  • New: Moved GPU profiling tools into RenderCore to allow RenderGraph to utilize them.

  • New: Changed Pixel Streaming’s default H264 level to 52 instead of 51. This means video encoding handles 4K (3840x2160) by default. When only up to 1080p streams are required, you can pass in "NvEncH264ConfigLevel=NV_ENV_LEVEL_H264_51".

  • New: Updated Vulkan included headers to 1.1.106.0.

  • New: Implemented mGPU virtualization on a single GPU in D3D12, enabled via -vmgpu command line argument. Virtualization works by creating multiple FD3D12Device-s, as if real SLI/LDA mode was used. All resources are created multiple times on the same physical device to simulate multiple LDA nodes. Multiple 3D, copy and compute queues are created (one per device). Explicit transfers and synchronization must be performed to share resources between virtual devices, exactly like on a real mGPU machine. This mode allows development and debugging of mGPU AFR and SFR features on any machine, using standard tools such as PIX, Nsight and RenderDoc that don't support real multi-node configurations. Up to 4 GPUs can be virtualized this way (same number as maximum supported real LDA GPUs). Example usage command line: "MyProject -game -d3d12 -MaxGPUCount=2 -VMGPU -AFR"

  • New: Metal command-buffer failure debugger in the vein of Aftermath toggled with "r.GPUCrashDebugging" prior to running the game or by using the -metalgpudebug command line flag. Requires TileShaders on iOS (iOS 11, A11) or macOS 10.14 (memoryBarrier) - it will automatically disable itself on other configurations. By default every draw call is instrumented on macOS and every 10th on iOS as TBDR GPUs suffer a much larger performance penalty. On failure it should report the last Vertex + Fragment pair to succeed and then a more detailed list of the following commands where we believe we failed. To get the best use of the output you need the Stable.csv files and the SF_METAL.tgz file for the build so you can track the PSOs back to their HLSL and Metal shaders.

  • New: Exposed "DistanceFieldAtlas" classes to other modules. It is required to have Custom Mesh Proxies generate their own Distance Field data outside of the engine module.

  • New: Compiled out all support for Metal tessellation shaders from the MetalRHI runtime and remove all vestigial references to geometry shaders using the new preprocessor flags. It resizes all the various arrays to eliminate unused entries which were previously SF_NumFrequencies in size.

  • New: Implemented a new MetalRHI debug feature "rhi.Metal.ResetOnPSOChange" which will reset all the resource bindings on each graphics PSO change to track down any missing resource bindings.

  • New: Added a tiled blue-noise image. The image is a tiled set of seven 256x256 blue noise patterns. Image data sets donated by Jacopo Pantaleoni and converted to a single uasset texture: BlueNoise.uasset.

  • New: The Material Instance Editor will now display a message if an invalid texture is assigned to overridden parameter. There is no feedback if an invalid parameter is set on a Material Instance Dynamic (MID) but will silently replace with default white texture.

  • New: Consolidated "r.GraphicsAdapter" so that you can also now use “-graphicsadapter=N” for D3D11, D3D12 and Vulkan. This deprecates the old “D3D12.GraphicsAdapter” console variable.

  • New: Enabled the "RHICopyToResolveTarget" function to be overridden on individual platforms.

  • New: Added Static Mesh’s "MinLOD" to the asset registry so it can be viewed in the Content Browser (either in column view or searched using advanced search syntax). Note that unloaded Static Meshes won't show this information until they are loaded or resaved once, which puts the information into the asset registry for future use.

  • New: "DumpStaticMeshDrawListStats" now also dumps octree stats.

  • New: For PixelStreaming, added the command line argument "-PixelStreamingReceiveStringMaxLength" to allow for larger amounts of data to be sent from Browser to UE4, default value is 1024 bytes.

  • New: Canvas rendering now uses MPC uniform buffers correctly.

  • New: Permit defragging of FMetalSubBufferHeap by moving allocations from newer to older buffers at a specified number of bytes per-frame (rhi.Metal.HeapBufferBytesToCompact). Only allocations 'owned' by an RHI object can be defragged. Temporary allocations for texture streaming can't be, they should only last a frame anyway.

  • New: Implemented mGPU support for FD3D12DynamicRHI::RHIUpdateUniformBuffer.

  • New: Changed area source representation of Spot Light from a sphere to a disk.

  • New: Niagara Mesh particles can now access velocity and corrected integration math to derive prev position.

  • New: Refactored vertex factory initialization in Instanced Static Mesh Scene Proxy.

  • New: The files added in "ShaderDebugInfo" are now put into a unique folder based on the StaticParameters. This allows you to see and compare shaders from multiple permutations. Also, in the D3D11 compiler, a description of the different parameters are appended at the end, for information.

  • New: Removed an RHI Thread stall of 2ms to 6ms with enqueue copymiplevels.

  • Improvement: We now allow for better overriding of Vulkan PSO functionality.

  • Improvement: Refactored canvas, canvas tile, and triangle rendering by removing dead code and cleaning up data flow.

  • Improvement: Improved performance when deleting Instanced Static Mesh instances with physics representations.

  • Improvement: Stability improvements in ShaderCompileWorker error report handling.

  • Improvements: ShaderComplexity improvements:

    • Added support for Mobile Preview in the Editor.

    • Translucent Materials now show their native instruction count in Forward renderer to avoid 0 cost error.

    • Fixed Scene Pre-Pass not being taken into account in the complexity result.

    • In Deferred shading, disabled all renderpasses except for Depth, Editor HitProxy, and DebugViewMode.

  • Deprecated: Deprecate OpenGL4 and D3D10 from the TargetedRHI list in the Editor. A deprecation warning will now show when starting the Editor with OpenGL4.

  • Deprecated: Removed usage of previously deprecated Draw{Indexed}PrimitiveUP.

  • Deprecated: SetRenderTarget and its family of functions are now removed per deprecation on last release.

  • Deprecated: Marked RHICopySubTextureRegion has been deprecated.Instead, use "RHICopyTexture".

  • Deprecated: The "CreateGeometryShaderWithStreamOutput" and “RHICreateGeometryShaderWithStreamOutput” APIs are now deprecated; please use a compute shader technique for equivalent functionality.

  • Removed: Multiple algorithms to perform depth of field in the Deferred shading renderer have been Removed:

    • Gaussian DOF is now Mobile Renderer only. Its settings have been moved to "Mobile Depth Of Field" category of the Post Process Volume and Camera settings. It’s properties are only editable in Mobile Preview while working in the Editor.

    • Bokeh DOF has been removed from this release forward.

    • The old "Circle" DOF algorithm (that could be enabled with r.DOF.Algorithm=0) has been deleted. Only Cinematic (“Diaphragm”) DOF method remains for DOF usage on anything other than Mobile platforms.

    • Note that any content what was using Gaussian DOF or Bokeh DOF in the Deferred Renderer will have DOF disabled. There is no longer a select using "Depth of Field Method." DOF can be simply disabled by setting the “Depth of Field F-Stop” to 0. Any content that’s using a Cine Camera or directly the Circle DOF method regardless of r.DOF.Algorithm will remain using UE 4.20’s Cinematic (“Diaphragm”) DOF method.

  • Removed: Removed all obsolete optional features from EMetalFeatures that are now universally available (or which depend solely on macOS versus. iOS) and all the associated code that branched based on them. This makes iOS and macOS more consistent as well as removing chunks of code that was no longer necessary.

FX

  • Crash Fix: Fixed a crash when using "Asset Actions > Reload" on an open Niagara Asset.

  • Crash Fix: Fixed a crash in Niagara when deleting the last renderer from a gpu emitter.

  • Crash Fix: Fixed a crash in Niagara when trying to pause a spawned system through Blueprint or C++, which has already completed.

  • Crash Fix: Fixed some issues with replacing deprecated and missing modules and dynamic inputs in Niagara. This prevents crashes and data corruption.

  • Crash Fix: Fixed a crash in Niagara DI if SRVs are not supported.

  • Crash Fix: Fixed a crash that could happen when saving a changed Niagara system.

  • Crash Fix: Fixed possible crash related to shared resource owned by UVectorFieldStatic.

  • Crash Fix: Fixed a Niagara crash if we have more than one GPU data interface.

  • Crash Fix: Fixed a crash with "SetExecutionState" where we need to adjust the DataSet allocation size and instance count before preparing the simulation.

  • Crash Fix: Prevented a crash when closing the Niagara Emitter Editor.

  • Crash Fix: Prevented a crash in the Niagara Script Editor when pressing the Refresh button.

  • Bug Fix: Fixing an issue in Spawn Per-Frame module in Niagara to account for DT properly.

  • Bug Fix: Resolved an issue so that the Dynamic Parameter module now automatically propagates names on the node in the Material Editor.

  • Bug Fix: Dynamic inputs for choosing vectors now properly set default "SpawnGroups". Skeletal Mesh sampling now has an offset vector built into the module

  • Bug Fix: Fixed an issue in Niagara with the "Engine.Time" parameter not functioning in System or Emitter execution.

  • Bug Fix: Fixed an issue in Niagara where the "Inherit Velocity" module incorrectly had all script constraint.

  • Bug Fix: Velocity modules now all have similar parameterizations, ensuring no mixup of behaviour between applying forces versus impulses and mass. Each now has a coordinate space picker to ensure flexibility and programmability in the stack.

  • Bug Fix: Removed the option to add "Dynamic Input" scripts to Niagara Scripts of any kind (Module, Function, Dynamic Input) in the context menu.

  • Bug Fix: Fixed an issue in Niagara so that Mass no longer defaults to 0 in the default solvers. This fixes sparse emitters that don’t rely on the initialized Particle module.

  • Bug Fix: Fixed an issue with certain Engine parameters such as "Engine.Time" not working in system spawn or update scripts.

  • Bug Fix: v that repaired out-of-date function call in the "Pointer Attractor" module.

  • Bug Fix: Fixed an issue in Niagara where right-clicking the stack and then selecting "Insert Module Above/Below" wouldn’t auto-select the generated search box.

  • Bug Fix: Fixed an issue in Niagara by refactoring Drag to accumulate irrespective of the other forces. High values will no longer invert the applied forces.

  • Bug Fix: Fixed an issue in Niagara so that Sample Skeletal Mesh Skeleton, Surface, and Static Mesh functions now work properly to support LocalSpace sampling.

  • Bug Fix: Resolve some issues with Spawn Beam to ensure good tangent basis derivations on the Start and End positions on a Spline.

  • Bug Fix: Fixed an issue in Niagara with missing transitions for sort buffers and dispatch overlapping.

  • Bug Fix: Fixed an issue where both the Script and Selected Details panels were having the same name in the Niagara Windows sub-menu.

  • Bug Fix: Fixed an issue in Niagara where Skeletal Mesh Data Interface was failing to bind when we use bone only sampling without CPU access to mesh data.

  • Bug Fix: Fixed an issue causing local space Static Mesh sampling to give incorrect results.

  • Bug Fix: Fixed an issue that caused system parameters to not appearing in Particle Event handlers.

  • Bug Fix: Fixed an issue causing vertex interpolators to not work with Niagara renderers.

  • Bug Fix: Fixed an issue that made "Particle.LocalToWorld" being transposed on Niagara Mesh renderer.

  • Bug Fix: Fixed an issue where Sprite Size Scale by Velocity had Solve Forces and Velocity as a post-dependency, and would have one frame old data as a result.

  • Bug Fix: Fixed an issue which could cause flickering of GPU simulations in the Niagara Editor.

  • Bug Fix: Fixed an issue in Niagara for "Get Spawn Interpolation" always returning 1 on a GPU simulation when interpolated spawning is enabled.

  • Bug Fix: Add validation for "UParticleModuleLocationBoneSocket" to ensure that all LOD levels have a matching count for SourceLocations if they will tick on update. The index is stored on the particle on spawn, so if an update module has less entries we would index out of bounds.

  • Bug Fix: Fixed an issue which would affect reactivation of Niagara Systems.

  • Bug Fix: Fixed an issue with depth-only rendering position not matching base pass rendering due to shader compiler optimizations.

  • Bug Fix: Fixed an issue where data interface calls were not being stripped correctly during compilation for the VectorVM.

  • Bug Fix: Niagara particles will now take into account the "PerViewTranslation."

  • Bug Fix: Niagara fix GetTriCoordVertices VM binding and reading off the end of the array Niagara fix GetVertexUV reading off end of the array.

  • Bug Fix: Niagara only writes HLSL data interface functions for methods that are used

  • Bug Fix: In Niagara, moved deferred system instance deletion into the World Manager to ensure that render commands have completed before we perform deferred deletion.

  • Bug Fix: Niagara now caches player view locations in the World Manager and uses the cached locations inside the system instance tick to set the LOD.

  • Bug Fix: Fixed an issue with Niagara Mesh Vertex Factory Shader to assign the "Local To World" vector correctly so that it's correct when used in Materials.

  • Bug Fix: Fixed an issue in the Niagara Sequencer integration where you could end up with duplicate frames when using the "System Life Cycle" Track.

  • Bug Fix: Fixed several issues which were causing Niagara systems to recompile on open and during cooking. Also, added console commands to reset the internal state of systems which continue to recompile after the code fixes. These commands are "fx.PreventSystemRecompile" and “fx.PreventAllSystemRecompiles”.

  • Bug Fix: Fixed an issue where activating an already active Niagara component would reset it. It now does nothing if it's not being forced to reset, which matches Cascade’s behavior.

  • Bug Fix: Fixed an issue that caused deferred deletion of system instances having circular references to the system, which causes both the system and instances to not be destroyed if the system will no longer tick.

  • Bug Fix: Fixed an issue for potentially not deleting contexts if the batcher was set to nullptr.

  • Bug Fix: Fixed an issue where deferred data in the batcher was potentially not getting destroyed.

  • Bug Fix: The Min and Max Velocity in the Niagara "Fountain" template are no longer switched.

  • Bug Fix: Don't use Cached Emitter in destructor. With deferred deletion the Cached Emitter can be garbage collected before we perform instance destruction. This fixes a memory leak with "ParticleDataSet" which wasn't deleted for CPU systems.

  • Bug Fix: Fix flickering caused by inconsistent position calculation between prepass and base pass on CPU Cascade Sprites.

  • Bug Fix: Fixed an issue in Cascade for a race condition between MeshProcessor and VertexFactory on Sorted Particles. This resolves accessing incorrect sorted particle index buffer due to binding being made between we determined the last buffer.

  • Bug Fix: Fixed an issue in Niagara with incorrect max ThreadGroup count.

  • Bug Fix: Fixed an issue with "Clears VariableToMetaData_DEPRECATED" on Niagara Graph’s “PostLoad” after migrating the old data.

  • Bug Fix: Fixed an issue with Niagara to handle nullptr for TextureReferenceRHI, which can happen during cooking

  • Bug Fix: Fixed an issue with Niagara where it could infinitely loop if a system instance is complete.

  • Bug Fix: Fix to Shader Complexity on Forward Shading when using the Velocity buffer.

  • Bug Fix: Fixed an issue with numeric pin's connection lines sometimes being colored incorrectly.

  • Bug Fix: Fixed some issues in Niagara’s simulation shader cooking. Now, GPU shaders will never be cooked for CPU emitters. The Editor has better error messaging and it is printed to the cook log. This can also prevent several types of crashes from happening.

  • Bug Fix: Fixed circular TSharedPtr's found in Niagara causing Editor resources to not be released.

  • Bug Fix: Fixed Niagara Mesh Particle Camera Facing not using the correct World Position.

  • New: Niagara random sampling functions now support a fixed seed input which allows the randomness to be driven by a single number instead of a combination of seeds.

  • New: Added a toggle in Niagara under "Simulation" tab of the Emitter/System Editor to enable synchronized resetting of Emitters and to open Systems that include that Emitter.

  • New: Added support for Sprite Cutout Geometry in Niagara.

  • New: When adding Niagara Template Emitters to systems, we now disable data inheritance from the parent emitter. There is also an option to break the inheritance connection for Emitters in Systems.

  • New: In the Niagara Script Editor, the Metadata UI has been moved to a tab on the right and is editable by selecting the parameter in the "Parameters" tab. This more closely matches the workflow in Blueprints and prevents some issues with the Details tab on the left.

  • New: It is now possible to trigger Niagara systems from "Anim Notify" tracks. Use Anim Notify’s “Play Niagara Effects” and Anim Notify State’s “Timed Niagara Effect”. These work similarly to “Play Particle Effect” and “Timed Particle Effect.”

  • New: Added automatic tessellation for Niagara Ribbons.

  • New: Large refactor of Niagara's Renderers.

    • Fixed several thread safety issues.

    • Avoids copy of particle data to Render Thread giving some performance and memory optimization.

    • Improved clarity of renderer code and Emitter Instance.

  • New: Moved Niagara Skeletal Mesh HLSL from code to a separate shader file Implement missing GPU functionality for triangle/bone/ vertex Skeletal Mesh sampling, specific bone/specific sockets

  • New: Added Bone Rotations to Niagara's Skeletal Mesh Data Interface.

  • New: Niagara "Set Fixed Bounds" now works with GPU emitters.

  • New: Added option to override bounds of all Emitters in a System through the System Details panel.

  • New: Moved Niagara shader files from Engine to Niagara Plugin folder.

  • New: Added a Niagara menu option to display script (CPU and GPU) instruction counts.

  • New: Skeletal Mesh DI interpolation:

    • Skeletal Mesh Interface can now optionally interpolate in its "Get Skinned Data" function.

    • Updated "Sample Skeletal Mesh Surface" module.

    • New utility op "Get Spawn Interpolation" function could be useful for other things.

  • New: In the Niagara Script Editor, we added support for multiple accepted values for visible and edit conditions on script inputs and add properties for common meta-data rather than using the name-string map to define them.

  • New: In Niagara, we’ve enabled Compute Dispatch Overlap by default.

  • New: Moved variable metadata interaction from the "Variables Metadata" header in the Script Details panel to using the Parameters and Selected Details panels instead. This makes it similar to how Blueprint variables are presented and edited.

  • Selecting variables in the Parameters panel works concurrently with selecting nodes in the Graph, but only one selection is valid at a time.

  • New: Added a warning for multiple renderers if its a GPU simulation as we don't currently support this.

  • New: Added particle GPU sorting for GPU Niagara simulation when using Sprites and Meshes. Use the following console variables:

    • "Niagara.GPUSorting" controls whether GPU sorting is enabled.

    • "Niagara.GPUSorting.CPUToGPUThreshold" controls if CPU particles should be sorted through the GPU path.

    • "Niagara.GPUSorting.BufferSlack" controls the slack when increasing/decreasing the GPU sort buffers.

    • "Niagara.GPUSorting.MinBufferSize" minimum size for the GPU sort buffers.

    • "Niagara.GPUSorting.FrameCountBeforeShrinking" controls how many frames before shrinking GPU sort buffers.

  • New: Niagara Skeletal Mesh sampling uses 4x3 for Bone matrices. The Matrix Storage Type was changed from "StructuredBuffer" to “Buffer” to support more platforms.

  • New: When we don't have a dynamic parameter set in Niagara, we will take the Material default rather than overriding with 1,1,1,1 This differs from the functionality in Cascade but is more intuitive.

  • New: Torus Location rewritten and optimized to support:

    • Random or Direct set location modes.

    • Torus, TorusKnot, or Ring modes.

    • Space transforms and offset vectors.

    • Output vectors for Tangent, Bitangent, and Normal for the parametric surface.

  • New: Location modules now support Coordinate Space input options for more user control.

  • New: Niagara Module Scripts now have an "Expose to Library" tag that allows non-library scripts to be filtered out when adding modules in the stack.

  • New: Niagara Module Scripts can now be dragged-and-dropped into the stack from the Content Browser.

  • New: Added new Dynamics inputs to Niagara to create custom Float/Int/Color/Quat/Vector2D/Vector from booleans in the stack.

  • New: Added support in Niagara for Sample Skeletal Mesh module to use random or direct set sampling modes, and they can toggle between sampling triangles or vertices.

  • New: Added simple search to Niagara’s Script Graph Editor. Pressing Ctrl+F (default binding) will bring up a Text Search Bar that can find named nodes and pins.

  • New: Niaraga now supports SpawnGroups for the SpawnRate, Spawn Per-Unit, and Spawn Per-Frame modules.

  • New: Pendulum Constraint has been refactored to apply forces before the solver and apply its constraint afterwards. Established a framework around the "Calculate Accurate Velocity" module to allow multiple constraints to be satisfied and still retain inertia.

  • New: Sample Skeletal Mesh Skeleton has been refactored to include "Deterministic Randoms Independently" choosing sampling coordinate spaces for all three sampled attributes Interpolated spawning Sampling bone rotation Comments Metadata

  • New: Added Niagara support for exporting full tangent basis from Bezier and Catmull Rom spline functions. These have also been optimized.

  • New: SubUV Animation Module now supports Linear or Random frame selection.

  • New: Compiling Niagara Scripts or Systems now presents compile messages in a new Niagara "Message Log" tab. It can be found in the Niagara Script and Niagara System Editor. Compile messages notify whether compiling the Niagara Script or System was successful, and provide one-click access to the source of compile errors if any have occurred.

  • New: Added a new Niagara module to provide an "official" module to perform the “Camera Offset” function (similarly to what is in Cascade).

  • New: Niagara - Searching in the Stack view now finds linked parameters, making it easier to search for the usage of specific named parameters in an Emitter or System.

  • New: Added improvements to Niagara Ribbon rendering:

    • Added a new "facing" mode with “Custom Side Vector” that now uses the Particle’s “Ribbon Facing” attribute to dictate the vector that the ribbon width is extended along.

    • There is a new parameter with "Curve Tension" that defines how sharp the ribbon is.

    • Several Tessellation parameters have been exposed.

  • Improvement: Niagara optimizes compile times by switching to Static on the solver.

  • Improvement: In Niagara, mesh rotation has been split out into a separate solver with proper dependencies, which reduces the instruction count of the default solver to 40% in cases where rotations do not need to be calculated. "Apply Initial Forces" has been updated to provide spawn script dependencies.

  • Improvement: Modified Skeletal Mesh Skeleton location in Niagara to automatically set Ribbon ID to the sampled Bone index to make Ribbon default behavior more clear.

  • Improvement: Niagara script compile errors no longer fail a cook. Instead, they will print to the log as warnings.

Lighting

  • Crash Fix: Fixed crashes that could occur when building lightmap in levels with Foliage where the Foliage.DensityScale is less than 1. With density scaling, the removed instances need to be skipped when setting up lightmap UVs after encoding them.

  • Bug Fix: Fixed issues where overbright specular highlights with Decals in the Forward Renderer. Roughness is now clamped to a reasonable level and the Normal is normalized post blending.

  • Bug Fix: Reflection Capture component now honors Detail Mode setting in the same way other components do.

  • Bug Fix: Fixed an issue with Static Light sources not rendering correctly inside Reflection Captures.

  • Bug Fix: Fixed some issues where translucent objects were not correctly applying Sky Light changes.

  • Bug Fix: Fix ProjectionDepthBiasParameters being applied twice when evaluating subsurface scattering with the float3 CalculateOcclusion version. (used in ShadowQuality 1 or 3/4 with non-Gather4 support).

  • Bug Fix: Fixed an issue with missing reflection on pure specular surface.

  • New: We now support Static textured Area Lights in Reflection Capture and change the lights to be additive instead of lerping them

  • New: We’ve added the ability to move selected Atmosphere Sun Directional Light (used by the Atmospheric Fog component) by holding CTRL+L while moving the mouse around. This updates the Directional Light orientation.

  • New: Added the ability to set Reflection Capture supersampling by the console variable "r.ReflectionCaptureSupersampleFactor".

  • New: Enabled Atmospheric Fog component to affect illuminance of the selected Atmosphere Sun Light during runtime and in lightmass. You must enable "Atmosphere Affects Sun Illuminance" under the “Sun” category first.

  • New: We now force Reflection Captures to use full rough materials allowing for better representation of metal contributions in Reflection Capture volumes.

  • New: Disabled sun rendering in reflection captures from AtmosphericFog component to avoid double sun specular contribution, which is already handled analytically when rendering Directional Lights.

  • Improvement: Improve Virtual Texturing (VT) support for Lightmaps. When VT lightmaps are enabled, the Editor doesn’t generate non-VT lightmaps by default (controllable by console variable). It enables VT Lightmaps to avoid size restrictions imposed on regular lightmaps and should reduce the number of lightmap sheets generated, potentially improving batching.

  • New: Expanded Sky Light and Reflection Cubemap limits to the target devices limits. There is a warning if cubemap may use a large amount of memory based on the request.

  • New: The per-object directional shadow map cast distance now increases with the size of the object when large enough. Added the console variable "PerObjectCastDistanceRadiusScale" to control it. Set to 8 by default.

  • Deprecated: Movable Lights will now always be invalid for the LightGUID. They will only be assigned when a light is made Static or Stationary and the existing Movable Lights have had their GUID cleared.

Ray Tracing

  • Crash Fix: Fixed a crash where a data interface proxy is in an instance batchers deferred destroy queue and the owning UObject is destroyed on the game thread. The destroy will enqueue a render command to delete the proxy leaving the stale proxy inside the deferred destroy queue. We now ref count the RT proxy, allowing the destroy to be deferred until after the instance batcher has been destroyed or ticked.

  • Bug Fix: Fixed pre-exposure application when rendering Ray Traced Translucency.

  • Bug Fix: Disable normal-culling when casting a shadow ray from geometry with Hair Material. Use proxy light direction and hair tangent direction to reconstruct a plausible normal for ray biasing.

  • Bug Fix: Fixed exposure not being taken into account in Ray Tracing barycentrics and view mode.

  • Bug Fix: Fixed an issue with Unlit Materials not showing in Ray Tracing Reflections. As a small side effect, LightCullMask calculations now only happen when direct lighting flag is enabled.

  • Bug Fix: Ray Tracing no longer creates vertex buffers when ray tracing is not enabled, which saves a significant amount of memory on scenes that have large Landscapes.

  • Bug Fix: Use "DispatchRaysIndex" function to initialize a fake “SV_Position” in Ray Tracing Material Shaders.

  • Bug Fix: Fixed an issue where SSAO is applied to Ray Tracing Debug view modes.

  • Bug Fix: Fixed naming inconsistencies in Ray Tracing parameters.

  • Bug Fix: Fixed an issue where Stochastic Rect Light would not respect the Light’s "samples per pixel" parameter.

  • Bug Fix: Fixed an issue Ray Tracing view mode not saving correctly between sessions.

  • Bug Fix: Fixed Ray Tracing Debug visualization view modes not using tonemapping or any other post-processing.

  • Bug Fix: Render Target recycling should not happen if Ray Tracing was prearranged by other code.

  • Bug Fix: Fixed an issue where Post Processing passes will no longer order incorrectly in Ray Tracing Debug view mode.

  • Bug Fix: RayTracing Translucency now relies on "Payload.Hitkind" to refract the ray.

  • Bug Fix: Fixed issues where "PrepareRayTracingShadows" was missing some denoiser requirements.

  • Bug Fix: Alpha-masked materials are now correctly handled during shadow Ray Tracing.

  • Bug Fix: General stability fixes for Skeletal Meshes in Ray Tracing.

  • Bug Fix: Provided cone-angle culling behavior from the point-source location to provide mimic lighting function for Ray Tracing Shadow and Global Illumination.

  • Bug Fix: Tonemapped Ray Tracing Debug view modes should now use pre-exposure.

  • Bug Fix: Added the console variable "r.RayTracing.GlobalIllumination.EnableTwoSidedGeometry" to Ray Traced Global Illumination. It’s enabled by default.

  • Bug Fix: Resolved a packaging race condition that caused Static Meshes to be missing from Ray Tracing effects in a packaged project.

  • Bug Fix: Fixed some issues with Ray Traced Global Illumination energy explosion caused by two problems: 1, neglecting to include tMin and tMax in the "IsHit" function comparisons, 2, adding normal-based biasing on subsequent path chains. Correctness was verified with path tracing after comparing results under FurnaceTest.

  • Bug Fix: Fixed a shadow artifacting with raytraced directional occlusion.

  • Bug Fix: Fixed an issue with the Path Tracer with invalidation caused by a precision issue.

  • Bug Fix: Fixed an issue with the Path Tracer with invalidation when the projection changed, for example, Field of View..

  • Bug Fix: Fixed wrong composition between Ray Traced Reflection and cubemap/sky when pre-exposition is enabled.

  • Bug Fix: Fixed a bug that caused Path Tracing to not respect the object "Cast Shadows" flag.

  • Bug Fix: Fixed a regression that made pure specular brdfs render black in Path Tracing mode.

  • New: IES Profiles are now supported in Ray Tracing Reflections and Translucency passes.

  • New: Clear Coat shader model in Materials now match the Raster technique when used with Ray Traced Reflections.

  • New: Ray tracing scene now explicitly holds references to all FD3D12Resources that are bound to the SBT to prevent them from being released while some ray tracing commands may still be in flight. Added a command to explicitly clear all SBTs for a scene, which releases resource references and allows resources to be immediately reused.

  • New: Ray Traced Reflection can now sample Reflection Capture volumes as the last reflection event (avoids causing black metal material in reflections). Enabled using r.RayTracing.Reflections.ReflectionCaptures.

  • New: Implemented support for multiple instance transforms within one FRayTracingInstance. This is now used in FInstancedStaticMeshSceneProxy’s function "GetDynamicRayTracingInstances", which can generate thousands of instances. This gives a significant CPU performance improvement in scenes with many Instanced Static Meshes.

  • New: Added "cast ray traced shadows" Material flag in the Material Editor.

  • New: Ray Traced Shadows now consider geometry to be double-sided by default. This is controllable by console variable with "r.RayTracing.Shadows.EnableTwoSidedGeometry".

  • New: We now use 64-bit hash of the shader bytecode in FRayTracingPipelineStateInitializer to generate a more robust shader table signature.

  • New: Added Halton sequences as a set of RenderResources.

  • New: Implemented support for loose parameters (global constant buffer) for Ray Tracing Hit Shaders.

  • New: Added a new console variable to test enable/disable all Ray Tracing features at once with "r.RayTracing.ForceAllRayTracingEffects".

  • New: Added memory stat counters for bottom and top level acceleration structures.

  • New: Implemented support for DXR callable shaders. Callable shaders are similar to hit shaders, but they can be invoked from RayGen shaders without tracing any rays. They have records in the shader binding table and allow local parameters to be bound. The total number of callable shader slots/records must be declared when creating a Ray Tracing Scene. Each record must be filled using the function "SetRayTracingCallableShader" command, which is similar to “SetRayTracingHitGroup”.

  • New: Added an optional any-hit material support to SkyLight pass. r.RayTracing.SkyLight.EnableMaterials (default = 0) allows support for visibility tracing against masked materials.

  • New: Changed "r.RayTracing.SkyLight.EnableTwoSidedGeometry" default to 1 to match ray traced shadows behavior.

  • New: Changed the Blueprint Sky Sphere template (BP_Sky_Sphere) to now have "Is Visible In Ray Tracing" disabled by default so that we do not need to exclude all Unlit geometries out of the Ray Tracing Acceleration Structure.

  • New: Acceleration structures and other resources are now created on all GPUs. Ray Tracing commands are handled by "FD3D12CommandContextRedirector".

  • New: Added automatic Ray Tracing pipeline state object cache eviction. By default only up to 50 full pipeline states are kept in the cache. This reduces the likelihood of Editor crash when many Ray Tracing Shaders are being continuously loaded, for example, when shaders are recompiling.

  • New: Added optional any-hit material support to the AmbientOcclusion pass. Use the console variable "r.RayTracing.AmbientOcclusion.EnableMaterials" (default = 0) to enable support for visibility tracing against Masked Materials.

  • New: Added support for Procedural Geometries and intersection shaders in Ray Tracing.

  • New: Added "ERayTracingGeometryType" to differentiate between triangle and procedural geometries.

  • New: Changed FRayTracingGeometryInstance’s "Mask" default value from 0 to 0xFF, as it's a more sensible default (0 causes geometry to be invisible).

  • New: Added basic resource usage stats for ray tracing. Use stat D3D12RayTracing to show the report.

  • New: Adding methods for World Position reconstruction, primary ray creation, and camera-relative depth biasing.

  • New: Parameterize DirectionalLight next-event ray to be consistent with other "infinite" rays.

  • New: Added an early-out path to Ray Tracing Material hit shaders. This is useful when tracing visibility rays against masked geometry, where closest-hit shaders only need to fill the hit distance. Added 8-bit flags field to the packed ray tracing payload.

  • New: Implemented asynchronous Ray Tracing pipeline creation within single frame. Render thread now immediately returns after requesting a pipeline and actual compilation happens on a separate task. RHI command list that's associated with RTPSO request is set to depend on the creation task.

  • New: Increases number of bins used for sorting rays during Ray Traced Reflection rendering.

  • New: Implemented separate compilation and run-time caching of Ray Tracing shaders and linking into final pipeline state objects. This significantly improves Ray Tracing PSO creation performance when loading new shaders into an existing large scene.

  • New: Shader reflection data is now used to more accurately compute how many view descriptors to allocate for Ray Tracing resource descriptor heaps.

  • New: Use structured buffer for Ray Tracing light constants.

  • New: Implemented parallel compilation of shaders when creating the ray tracing pipeline state object.

  • New: D3D12 root signature size warning is now only reported in verbose mode and only for non-Ray Tracing root signatures.

  • Improvement: Sample generation has been decoupled from ray traversal in the Sky Light pass. We’ve created "GenerateSkyLightVisibilityRays" compute shader. We leverage the “QuasiRandom” sequence and infinite light properties of Sky Light to cache importance-sampled ray directions for the “RayTracingSkyLight” ray generation shader, that amounts to noticeable performance improvement without observable increases in variance. This is set in the console variable “r.RayTracing.SkyLight.DecoupleSampleGeneration” (defaults to 1). It decouples sample generation from ray traversal.

  • Improvement: Ray Traced Reflection bounces are now correctly terminated on accumulated roughness.

  • Improvement: Reduced the number of descriptor heaps that are kept alive in D3D12RayTracing. Default shader tables no longer allocate heaps. Unused heaps are now released after 100 frames.

  • Improvement: Refactored Ray Tracing payload structures and removed redundant miss/hit shaders. All Ray Tracing payloads now inherit from a common base that contains ray intersection distance (HitT). Most Ray Tracing effects now use a single common miss shader that simply sets the HitT of the common base payload to a negative value.

  • Improvement: Improved our Ray Tracing Debug view modes:

    • They now use DebugViewModeRendering to avoid polluting the regular post processing pipeline.

    • Opacity view mode inverted to match Raster buffer visualization mode.

    • Gamma is now applied only in the modes that need it.

  • Improvement: Implemented an optimization for Ray Tracing resource binding. SBT records are now cached using uniform buffer pointers as key. Records with matching keys are simply copied, avoiding the entire cost of resource binding. CPU performance in large scenes with many identical mesh instances is significantly improved by this (up to 4-5x speedup in one of our unreleased sample projects, approximately a 1.5x speedup in Infiltrator). This optimization assumes that the contents of uniform buffers will not change during a frame. Use the console variable "r.RayTracing.CacheShaderRecords" (default = 1) to turn off caching.

  • Removed: Removed "bIsDynamic" from FRayTracingSceneInitializer, as dynamic refit is not currently supported.

  • Removed: Removed mutual exclusivity between Ambient Occlusion and RTGI. This bypasses an RTGI artifact that produces poor ambient values.

Materials

  • Bug Fix: Resolved an issue that caused all Materials using Material Parameter Collections to recompile when added or removed.

  • Bug Fix: Added a new FMaterialCompiler method with "getTextureForExpression." Previously, this logic was implemented in terms of “GetParameterType” and “GetParameterUniformExpression” but these methods are overridden to do nothing in the Lightmass Material compiler. By moving this logic to a new method, Lightmass can continue to override the previous methods but still work correctly with the new method. This fixes Materials that use Texture Objects causing them to show up black during Lightmass bakes, which means they didn’t reflect any indirect light.

  • Bug Fix: Fixed possible non-deterministic cooking with UMaterialInterface because of how we resolve texture references.

  • Bug Fix: Fixed an issue with Material Parameters sometimes not updating if a large numeric value is assigned. Setting the value to "- 1.0f" in an attempt to force inequality to be true will fail for very large floating point values, where precision is greater than 1.

  • Bug Fix: Fixed some cases where a UMaterial invalidation would fail to invalidate child UMaterialInstances.

  • New: Added 8-bit and 16-bit data Texture Groups.

  • New: Tessellation now works in Vulkan and OpenGL.

  • New: Added Mesh Distance Field downsampling capability during serialization time (compressed and not compressed). The variable "DownSampleMeshDistanceFieldDivider" can be used per-platform.

  • New: Added a compute shader for generating Mips on platforms that do not have native support. This enables users to set the sampler type in Editor on a Canvas Render Target. It fixes bAutoGenerateMips not working in Editor, too.

  • New: Material cooking now replaces the full shader map ID with a hash which reduces the size of the runtime data.

Mobile Rendering

  • Crash Fix: Fixed a case where Skeletal Mesh with "Render Static" option would crash Editor in Mobile Preview

  • Bug Fix: We now prevent Materials attempting to use SceneDepth in the Vertex Shader in Feature Level ES3_1. It is not supported but was not protected against setting it, causing a shader compile error on those devices.

  • Bugfix: Android GLES no longer flips Y axis on any pass that could be used as input for Post Process Material. The GLES Y axis flip only on final tonemapper or last material in the after tonemapper Post Process Material stage.

  • Bug Fix: Fixed a case where filmic tonemapper with MSAA enabled was producing slightly darker image on iOS devices.

  • Bug Fix: Fixed an issue with incorrect intensity on Materials that use High Quality Reflections.

  • Bug Fix: Fixed occasional flickering that could occur on mobile devices with Mali GPUs when running with Vulkan.

  • Bug Fix: Fixed wireframe-like corruption on Decals when running on iOS and some Android devices.

  • Bug Fix: Fixed incorrect timing for a rendering thread on iOS devices, for example, Stat Units.

  • Bug Fix: Fixed issues with Issues with SceneDepth Material node usage in post-process materials

  • Bug Fix: Fixed issue with High Quality Depth of Field on mobile devices running Vulkan.

  • Bug Fix: Fixed issues with occasional artifacts with bloom rendering on iOS devices.

  • New: Added experimental support for auto-instancing on mobile, which is disabled by default. It can be enabled with the command "r.Mobile.SupportGPUScene" in DefaultEngine.ini. It requires Metal, Android Vulkan or OpenGL ES3.1.

  • New: Material 'Pixel Depth Offset' feature will be disabled by default when packaging your project for mobile platforms. Enable it with the console variable "r.Mobile.AllowPixelDepthOffset".

  • New: Software Occlusion culling now supports Instanced Static Meshes as occluders.

  • Deprecated: Disabled Vulkan support for Adreno5xx based devices running on Android version earlier than 8, because of driver issues with input attachments usage.

Optimizations

  • Bug Fix: Removed stall on DX11 rhithread caused by csvprofiler.

  • Bug Fix: Resolved an issue where FRealtimeGPUProfilerEvent was forcing the Query to wait.

  • New: Added the command line argument "-usedcomponents" to liststaticmeshes. It dumps the StaticMeshComponent usage count for UStaticMeshes and all used components by path. It strips Mobile data when running in builds that can't accurately count mobile data.

  • New: Added throttling capabilities when copying Mesh Distance Fields to Atlas Distance Fields. This can be enabled with the console variable "r.DistanceFields.ThrottleCopyToAtlasInBytes".

  • New: Replaced global frame minimal graphic pipeline state TSet to a TSet per DynamicPassMeshDrawListContext. It removes RW lock contention when global TSet is accessed by multiple threads.

  • New: Added float3 version of FastExp.

  • New: Shaved some memory off of FVertexFactory FLocalVertexFactory. It went from 1072 bytes to 480

  • New: Optimized UploadDynamicPrimitiveShaderDataForView so that it doesn't upload entire scene primitive buffer if the current view doesn't have dynamic draws.

  • New: Base pass can now output velocity data for movable objects with no Static Lighting (in both Forward and Deferred Renderer). This saves CPU draw call submissions. In base Vertex and Pixel Shader pass, uniform variable OutputVelocityBuffer is tested to output or not velocity data. It’s configurable per-project and/or per-platform when using the console variable "r.BasePassOutputsVelocity".

  • New: Added the command line argument "-CountApplicableToMin" to listtextures to see how many textures would be affected by changing the minimum required streaming LODs.

  • New: Added AbsoluteTime Queries to FD3D11RenderQueryBatcher, like occlusion batches. At the end of every frame, readback of all the available queries are scheduled.

  • Improvement: Added a new Geometry Cache code that is significantly faster to decode and enables multithreaded decoding for additional speed. The Geometry Cache will have to be reimported to take advantage of this improvement.

  • Improvement: Changed Subsurface Occlusion to use a fast exp, instead exp.

  • Improvement: We now skip half of UpdateGPUScene work when bAllowStaticLighting is set to false.

  • Improvement: Saved 24 bytes from FRenderResource for platforms that set PLATFORM_NEEDS_RHIRESOURCELIST to 0.

  • Improvement: Optimized RenderAssetStreamingMipCalcTask so that a low priority task is now approximately 2.3 times faster.

  • Removed: Removed NVIDIA 20xx workaround for Vulkan on drivers 430.yy or newer.

Post Processing

  • Bug Fix: Fixed pre-exposure issues with Decal Emissive and Planar Reflection.

  • Bug Fix: Fixed some errors in the Eye Adaptation (Auto Exposure) readback logic that made the engine read invalid pre-exposure entries. Enabled pre-exposure by default on all platforms that have "r.EyeAdaptationQuality 1".

  • New: Enable stencil testing for Post Processing Materials. The stencil can be written to Post Process input 0 if able and copy Post Process Input 0 to target if unable. It allows SM4 to make a copy DS if necessary and allows the Post Process Material to use Blend modes to composite onto output.

  • New: Added Post Process option to Motion Blur to set the Target Frame Rate for Shutter Angle.

  • New: Added functionality to force FFT Bloom Convolution texture to be resident so that Bloom functions properly under memory texture streaming pressure.

  • New: Disabled writing alpha from the Tonemapper if Anti-Aliasing is disabled. This leaves the alpha channel with a value of 1.

Tools

  • Bug Fix: Fix crash when changing Skeletal Mesh and the Persona Viewport is showing some bones (whether selected or all hierarchy).

  • Bug Fix: Added -m option to always mangle symbols for dumps, and by default, send all stderr to "nul" on windows.

  • Bug Fix: PropertyNode no longer stores the internal index for sets and maps, and instead, stores the logical index. This was causing a crash when deleting multiple entries from a map because the physical index overruns the size of a copy of the map (for instance, in an object created from a CDO) because it does not copy the gaps in the map.

  • Bug Fix: Fixed Skeletal Mesh temporary build structure to support high precision tangents.

  • Bug Fix: Import all blend shapes even if they have the same name using the FBX Unique ID to identify them.

  • Bug Fix: Keep the Skeletal Mesh asset user data when reimporting

  • Bug Fix: Keep the cloth binding when reducing a source model with itself has the source LOD

  • Bug Fix: Fixed Skeletal Mesh to compute normal with MikkT to use the connected triangle island with a smoothing group instead of only the smoothing group.

  • Bug Fix: Added option to control if the material can be reordered to the FBX file material order.

  • Bug Fix: Fixed an issue where the import settings of Static Mesh and Skeletal Mesh would not have the same restriction in the Assets Detail Panel as with the Import Dialog.

  • Bug Fix: Fixed conversion from Skeletal Mesh to FRawMesh — bi-normal vector should now be able to compute something like (Z^X) * biNorm Sign.

  • Bug Fix: Made sure Static Mesh reimport of embedded LOD can also remap the section info map.

  • Bug Fix: Made sure to restore the section data (cast a shadow and compute tangent) when reducing a Skeletal Mesh.

  • Bug Fix: Fixed FBX file open conversion attempting to open the FBX file twice — the conversion was bad the second time.

  • Bug Fix: Fixed FBX Static Mesh importer — will not fail on import if not all parts have completely degenerated.

  • Bug Fix: Fixed it to ensure that the FBX exporter correctly configures the FBX SDK timeline properties.

  • Bug Fix: Fixed a bug where, when exporting a scene to FBX, the Collision Meshes would not be placed correctly.

  • Bug Fix: When a Skeletal Mesh LOD gets imported and the skeleton is not compatible previously made the import fail, preventing the addition of a material slot if the create material was chosen in the import options.

  • Bug Fix: Fixed a bug where the "Vertex Color" import option would always be overridden to "replace" when no existing Vertex Color data was present.

  • Bug Fix: FBX skeletal mesh importer now sends a token error if there is any NAN or zero-scale in the imported bone transform.

  • New: Added support for an option to allow for implicit uploading of crashes.

  • New: The Framepro ConnectionChangedCallback now passes the filename of the current capture into any delegates that are registered for it.

  • New: A new function was added to the ViewportClient class to validate if permanent Capture is required. By overloading it in GameViewPortClient, we can prevent the game from getting a permanent capture of the mouse if the console is active.

  • New: Added a portable call stack hash for crashes.

  • New: Added Tooltip support to the Visual Logger, which shows the time and all logs (both normal and shape descriptions) for the closest point in a timeline track

  • New: Added OnBeforeHandleSystemError in FCoreDelegates to move registry writing for editor analytics before main crash reporting, since killing the editor process once the "Fatal error!" dialog pops up (and then freezes for a while during crash reporting) would cause an abnormal shutdown to be reported. This should help reduce the number of crashes being reported as abnormal shutdowns because the analytics are never written out.

  • New: Added delete custom attribute curve to FBX reimport menu.

  • New: Enabled inline reduction of Skeletal Mesh custom LOD.

  • New: EditorUtilityWidgets now has ShowWorldContextPin enabled so that the editor Widgets can make choices about what World they're interacting with — whether it is the Editor or Game World.

  • New: The 360 StereoPanorama Plugin has been renamed to PanoramicCapture with the following updates:

    • Merged left and right eye images into and single top and bottom image to support top and bottom stereo standard.

    • Output several types of buffers, including AO, Metallic, Roughness, Depth, Basecolor, Worldnormal, and FinalColor for post compositing in other DCCs.

    • Always output depth pass in 32-bit, since the 8-bit depth pass is not usable.

    • Added support for post-process volumes with blendables.

    • Disabled undesired screen space post processes by default since they create color bandings and black bars in the output.

    • Added Blueprint with settings to output the best quality captures.

    • Added Blueprints to view 360 stereo stills and movies for GearVR and Oculus.

    • Using console commands, exposed new parameters to set bit depth and render passes.

    • Switched all containers and calculations using FLinearColor to ensure everything stays in 32-bit/channel to avoid quality loss.

    • Added support for 8-bit (PNG) and 32-bit (EXR) format.

    • All logging info is now under the "Message Log".

    • Users can now output in monoscopic.

    • Added monoscopic capture support to support post processes and blendables in the same way that stereoscopic does.

Virtual Production

  • Crash Fix: Fix for a Maya crash occurring when unloading the LiveLink Plugin.

  • Crash Fix: Fixed a crash that occurred when starting PIE with VirtualCamera Game Mode when you have an Oculus headset plugged in. Activating the Game Mode changes the tracking system, which does not have an HMD device.

  • Crash Fix: Fixed a crash on shutdown — Used to call a virtual function in the destructor of SMediaFrameworkCapture, and fixed synchronization issue with SharedPtr on the render thread in MediaCapture.

  • Bug Fix: Fixed the incorrect loading of movement stabilization values from presets in Virtual Camera.

  • Bug Fix: Fixed a reset of Slate in the Take Editor that occured on entering PIE when using the Virtual Camera.

  • Bug Fix: Fixed an issue where the recording button was disabled in Virtual Camera when trying to record over a previous take.

  • Bug Fix: Focus on the PIE window is now enforced when starting or stopping recording using the Virtual Camera.

  • Bug Fix: Improved the thread safety of MediaCapture.

  • Bug Fix: Fixed an infinite loop occurring when closing a game with MediaCapture enabled.

  • New: RemoteSession now supports sending controller input to the host machine.

  • New: Enabled the Virtual Camera to run in-game, though you cannot use it to create a new take and view previous takes.

  • New: Added an option to display the MediaProfile name in the Main Frame status bar.

  • New: Only the correct VR controllers show up in the editor config. The "None" option has been deleted because we always want a controller selection — VirtualScoutingController and VirtualScoutingTeleporter match names.

  • New: Improved the Media Player and time code synchronizer toolbar UX, separating the main button from the combo box.

  • New: VP Bookmarks are now notified when a map has changed in the editor.

  • New: Added CustomTimeStep that ticks only when a new timecode is available.

  • New: LiveLink has been revamped to better accept arbitrary data. Data is now associated to a role describing the underlying data structure.

  • New: LiveLink sources and subjects settings can now be saved to a preset so you can reconnect easily.

  • New: LiveLink Subjects can now have preprocessors to manipulate incoming data before being buffered, custom interpolator and support various translators if other output roles can be supported.

  • New: Actor's component can now be easily controlled via LiveLink with the LiveLinkComponentController.

  • Deprecated: LiveLink now associates a role to data.

  • Deprecated: When pushing data, instead of using PushSubjectSkeleton and PushSubjectData, use PushSubjectStaticData and PushSubjectFrameData with the right LiveLink Role.

  • Deprecated: Generic GetSubjectData is now deprecated when fetching data from LiveLink — now, use EvaluateFrame with the right role.

  • Deprecated: Whitelisting a subject is now deprecated — calling SetSubjectEnabled now enables and disables subjects.

  • Deprecated: FLiveLinkFrameData and FLiveLinkSubjectFrame structures are now deprecated. You can now define your own data structure to stream using FLiveLinkBaseStaticData and FLiveLinkBaseFrameData.

  • Deprecated: LiveLinkComponent Blueprint functions are now deprecated. Use the globally accessible functions like GetLiveLinkEnabledSubjectNames, GetLiveLinkSubjects and the new node EvaluateLiveLinkFrame.

nDisplay

  • New: Added Scalable Display Easy Blend Integration with support for:

    • Planar Configurations

    • Curved Surfaces

    • Spherical (Dome) Surfaces

  • New: Added Warp and Blend/MPCDI, integrating the industry-standard implementation of MPCDI, including:

    • Defining how multiple displays and typically projectors are combined to create a single seamless display.

    • Supporting MPCDI 1.0 Standard.

    • Supporting 2D and Advanced 3D (A3D) Profiles.

  • New: Extended Render API extension, providing means to easily access these functionalities:

    • Projection and synchronization techniques.

    • Stereoscopic modes.

    • Warp and multi-viewports.

    • Tracking, inputs, and custom post-processing.

    • By substituting their own implementation, users can achieve customization that enables them to get nDisplay for their projects.

    • Made it such that the user Implementation can be made in separate modules without UE4 source code.

  • New: In-camera pixels, including:

    • Support for secondary asymmetric frustum overlay.

    • Improved resolution of the camera takes.

    • Parallax effects provided by camera tracked frustum.

    • Separated set lighting from camera movement.

UI

  • Bug Fix: Dragging a widget from a non-canvas parent to a canvas in the UI editor no longer causes the widget to be offset.

  • New: Made several improvements to game controller handling in UI code:

    • Made a focus change callback to FNavigationConfig that can be used to override focus changes or play a game-specific effect.

    • Added NavigationAction enum and functions to navigation config to replace hardcoded keys like Virtual_Accept. This can be overridden by a game to handle game-specific remapping.

    • Fixed SSlider to use navigation instead of key input, which fixes deadzone handling and allows remapping.

    • Added some functions to KismetInputLibrary to query navigation; this is useful for UMG widgets that handle input themselves.

  • Deprecated: Legacy localized fonts are now disabled by default.

    • These have been "soft" deprecated since 2014, were formally deprecated (emitting a warning if used) in 4.22, and will be removed in 4.24.

    • They can be temporarily enabled again by setting Slate.EnableLegacyLocalizedFallbackFont to 1.

      • You should instead ensure that your font assets are set-up correctly by using this overview.

Slate

  • Bug Fix: Updated MaterialProxySettings and MaterialOptions customizations, so that they adjust metadata for their FIntPoint instances instead of adjusting metadata for all FIntPoint properties.

  • Bug Fix: Fixed .IsEnabled for single column widgets (buttons). The enabled state was being blocked by IsPropertyEditingEnabled.

  • Bug Fix: Addressed issues where password fields were not ignoring word breaks, and SHIFT + DELETE was not cutting text.

  • Bug Fix: Fixed an issue with the SInputKeySelector OnKeySelected event, where it was not firing when clearing the selected key.

  • Bug Fix: Game and Editor now have separate navigation configs.

  • Bug Fix: Fixed an issue where SCombobox returned as unhandled when input is captured and the menu is closed.

  • Bug Fix: Fixed a bug in SButton::OnPaint() where the ColorAndOpacity property was ignored for rendering.

  • Bug Fix: Corrected instances of SListView Garbage Collecting a UObject in ListItems while being used by the List, which caused an assert.

  • Bug Fix: Addressed issue where SpinBox widget would clamp initial values to the slider min/max instead of the true min/max.

  • Bug Fix: Fixed navigation in ListView widget not working as expected toward the end of the list when it contains a large number of items (over 500K) and partial items are visible.

  • Bug Fix: Corrected ListView widget not scrolling to end of list when it contains a large number of items (over 500K).

  • Bug Fix: Fixed issue where properties in sub-categories wouldn't appear in the details panel for an EditInlineNew object.

  • Bug Fix: Updated curve struct customization to disable editing on curves when the corresponding property isn't editable.

  • New: Added extension points to level editor toolbar blueprint menu.

  • New: Included bRequireFocusForGamepadInput CVar to filter out incoming gamepad input when the editor doesn't have focus.

  • New: When the SlateUI draw event fires it appears as "SlateUI - {WindowTitle}" instead of “SlateUI”.

  • New: Removed padding from scrollbar borders which prevented having a scrollbar thinner than a certain width.

  • New: When moving array elements in the Blueprint Editor, the element being dragged will now highlight.

  • New: Added "Down" touch click method to match mouse click types.

UMG

  • Bug Fix: Fixed a bug where variables were duplicated when dragging and dropping in the hierarchy view.

  • Bug Fix: Correction to the Replace With context menu option of the hierarchy view to keep the original name when it's not a generic name.

  • Bug Fix: Fixed UComboBoxString not broadcasting all changes when the slate widget is not ready.

  • Bug Fix: Updated WidgetComponent to no longer display screen-space widgets when owning actor is hidden.

  • Bug Fix: Fixed events not firing on first frame of UMG animations.

  • Bug Fix: Corrected OnDragCancelled to now trigger when pressing Esc while dragging a UMG widget.

  • Bug Fix: Fixed case where copying and pasting Canvas Panel Slots in UMG Animations would have a broken reference.

  • Bug Fix: Removed erroneous "Search Start" header from "All Named Widgets" menu.

  • Bug Fix: Centered the notch unsafe zone in the iPhone XS Max and XR Blueprint Widget templates.

  • Bug Fix: Fixed the copy & paste of a Widget with named slot that creating a copy of the widget in the root.

  • Bug Fix: Fixed Widget Component collision width when "Draw at Desired Size" is enabled (both for plane and cylinder cases).

  • Bug Fix: Corrected a problem with drag and drop in the Designer and Hierarchy view that caused widgets to be incorrectly set to Transient after a drop.

  • Bug Fix: Widgets will no longer reorder when being moved in the widget editor.

  • Bug Fix: Fixed a problem when ComboBox::SetSelectedIndex() is called while CurrentOption is not set.

  • Bug Fix: Stopped log spamming when copying and pasting widgets by removing the parent slot property from the exported text.

  • Bug Fix: Stopped UComboBoxString from recreating default STextBlock when changing selection.

  • Bug Fix: Fixed WidgetBlueprint compilation to enable BindWidget on widget in a parent WidgetBlueprint.

  • Bugfix: Making sure the bottom bar safe zone is defined to extend the whole length of the phone.

  • New: Added MinAspectRatio to SizeBox.

  • New: Adding Child to Grid now takes in a row and column.

  • New: Expanded support for binding multiple widgets to binding tracks in UMG animations.

  • New: Added getter for the scroll offset of the bottom of the ScrollBox.

  • New: Filter custom rows in UMG Details View.

  • New: Exposed support for getting and setting hint text for UMultiLineEditableText and UMultiLineEditableTextBox from code and blueprint.

  • New: Exposed GridSlot's SetNudge function to blueprints.

  • New: Added user-defined min/max to sliders to Slate and UMG.

  • New: Updated UMG WidgetComponent default behavior was changed to handle hit test differently.

    • The inner SlateWindow used by the component now uses visibility SelfHitTestInvisible by default which means that a hit test in an empty portion of the WidgetComponent window will let the mouse hit pass through.

    • All data created with previous versions will keep the previous default value of Visible.

  • New: Added GetText() method to URichTextBlock.

  • New: Now includes support for UMG bindings for integer to float.

  • New: Included Favorites in the Palette view.

  • New: Supports changing WidgetStyle (FTextBlockStyle) on MultiLineEditableText in Blueprint. New: Supports changing WidgetStyle (FEditableTextBoxStyle) and TextStyle (FTextBlockStyle) on MultiLineEditableTextBox in Blueprint.

  • New: Exposed FDesignerExtension in UMG Editor to public interface to allow users to create UMG Designer extensions.

  • New: Updated the copy/paste in the Hierarchy view to keep the current name and add _X at the end instead of generating a new name.

  • New: Added new Play Animation nodes with a Finished output pin

  • New: Unlinked UMG default colors from editor settings colors.

  • New: Fix for font material not applied correctly on rich text.

XR

  • Bugfix: Fixed an out-of-bounds read when detecting a main view for Instanced Stereo Rendering.

  • Bugfix: Set the instanced uniform buffer for mobile multi-view.

  • Bugfix: Using FXRTrackingSystemBase::GetRelativeEyePose eyes were reversed. We had the left eye on the right, and right eye on the left.

  • New: The parent for scalars is now used instead of providing suggested bindings for both child paths in OpenXRInput.

  • New: VR Mode and VR Preview can now be selected when the WMR plugin is enabled, and there is no headset attached.

  • New: Updated the OpenXR plugin to version 1.0.

AR

  • Bugfix: Fixed a call to LoadModuleChecked when not on the game thread.

  • Bugfix: Fixed missing image and object scanning session type checks.

  • Bugfix: Merged in a UDN fix for orientation where AR sessions were not enabling the autofocus flag if requested.

  • Bugfix: Fixed a bug where Android clients were not locked into a minimum or maximum vertical camera rotation if the ARCore plugin was enabled.

  • Bugfix: Fixed the ARKit camera being allocated on the render thread causing assertions.

  • Bugfix: Updated the AR rotation to match the change to using UI orientation instead of device orientation.

  • Bugfix: Fixed mismatched sRGB flags in the ARKit environment capture probes.

  • Bugfix: Fixed missing retain for the ReferenceObject that is passed into the completion handler by ARKit.

  • Bugfix: Turned sRGB off for the camera image that comes from the remote AR device.

  • Bugfix: In UARPlaneGeometry's DebugDraw() function, previously PersistForSeconds and OutlineThickness were ignored for BoundaryPolygons, now passing them through.

  • Bugfix: Packaging for HoloLens when project root directory is different from uproject name no longer fails.

  • New: Added a method to set the friendly name of a candidate object.

  • New: ARKit camera image texture objects now take device orientation into account.

  • New: Hooked up the ARKit2 scene understanding API to our AR layer.

  • New: Added some scene understanding support to our AR layer.

  • New: Added UARCameraImage support for ARKit.

  • New: Changed how tracked geometries are removed when restarting a AR session on ARKit.

  • New: Removed the pause of the existing session on ARKit when restarting sessions, as it was not needed and introduced delay.

  • New: Removed an ensure from ARKit updates that was no longer valid after a session restart.

  • New: Reworked ARKit pass-through camera rendering to use the UARTextureCameraImage that is updated per frame on the render thread.

  • New: Changed the ARKit camera texture conversion to use linear color space.

  • New: Added an AR session configuration option to enable/disable scene understanding detecting closed meshes in a scene.

  • New: Added support for AR systems that can match planes to slopes.

  • New: Added MRMesh generation (collision, nav mesh, and rendering) for AR planes and AR tracked images on ARKit.

  • New: Hooked up the AR delegates for Add/Update/Remove of tracked geometry for HoloLens.

  • New: Added a factory method to return the singleton AROriginActor to the requesting AR system.

  • New: Added support for an underlying mesh to be part of UARTrackedGeometry.

  • New: Added an AROriginActor for AR systems to spawn when they need to place UActorComponent derived components into the world.

  • New: Removed the tvOS blacklist for the Apple Image Utils plugin.

  • New: Removed the beta tag from the Apple Image Utils plugin.

  • New: Moved Apple Image Utils from Experimental to Runtime.

  • New: Added support for the AR platform's unique id for tracked items.

  • New: Added delegates so that AR apps can use an event based approach rather than polling for changes.

  • New: Added some console commands to control face AR data logging: "FaceAR StartFileWriting" to start writing, "FaceAR StopFileWriting" to stop writing, "FaceAR SavePerFrame" to write a file each frame when logging is enabled, and "FaceAR SaveOnDemand" to write a file on close of the app or on user command.

  • New: Added a material node for converting screen space UVs to passthrough camera UVs.

  • New: Reworked Face AR console command support. The commands are now thread safe.

  • New: Added the update scene understanding AR support to the Magic Leap AR API.

  • New: We remove all tracked geometry immediately when the user restarts a session and has the reset tracked geometry flag set to true, instead of waiting for ARKit to send the notifications of removal. Changed the removal notification to handle removing items that we removed manually.

  • New: Added support for speech when remoting to HoloLens 2.

  • New: Allow iOS projects to offer optional ARKit features without setting the device capability that requires ARKit compatible hardware. To do this add the following to DefaultEngine.ini

    • [/Script/AppleARKit.AppleARKitSettings]

    • bRequireDeviceSupportsARKit=false

  • New: Updated ARCore to version 1.7.

  • Deprecated: Deprecated the ARKit pass-through material since it is no longer valid. Use UARBlueprintLibrary::GetCameraImage() to get a UARTextureCameraImage object instead.

  • Deprecated: Removed ARKit classes that were marked deprecated and for removal in 4.22 or earlier.

  • Deprecated: Removed the unused texture cache and various Y/CrCb properties from ARKit classes. Use the AR camera image object instead.

VR

  • Crashfix: Added a fix and logging for a crash in UE4Editor_SteamVR!FSteamVRModel::GetRawMeshData().

  • Crashfix: Fixed a crash caused by an incorrect assertion in OculusHMD.

  • Crashfix: Fixed a crash in the late update manager when a collection was modified on the game thread while the rendering thread was walking the contents in a ranged-for loop.

  • Bugfix: Fixed a potential race condition in SteamVR stereo layers.

  • Bugfix: Fixed bug where the delta rotation on Oculus splash layers was ignored instead of applied every other frame.

  • Bugfix: Fixed a bug where world locked stereo layers were shown as tracker locked stereo layers on Steam VR.

  • Bugfix: Fixed showing external textures, such as media framework textures on Stereo Layers, on OpenGL ES.

  • Bugfix: Fixed an assertion in SteamVR when showing splash screens was auto enabled.

  • Bugfix: Fixed a bug where there was inconsistent rendering between left and right eye when r.SeparateTranslucencyScreenPercentage was less than 100.

  • Bugfix: Fixed a bug that made it impossible to reenter a Daydream game after dismissing the "Place phone into daydream headset" dialog at the start of the game.

  • Bugfix: Fixed a bug where custom depth-based rendering was rendering incorrectly with instanced stereo enabled.

  • Bugfix: Fixed a bug where the Oculus Touch Gamepad Special Left/Right inputs were swapped.

  • Bugfix: Fixed pixel shader not being bound when rendering the SteamVR spectator view.

  • Bugfix: Fixed a race condition that could occur in late update handling.

  • Bugfix: Fixed bug where GPU simulated particles with depth-buffer based collision would not collide with world geometry on Oculus.

  • Bugfix: Reduced logging of SCE_VR_TRACKER_ERROR_TIMESTAMP_OUT_OF_RANGE when the Move Motion Controller is turned off during Launch on PSVR.

  • Bugfix: Reduced logging when AllocateDepthTexture is being called every frame on OculusVR.

  • Bugfix: Reduced logging on Oculus Rift when running PIE with more than one player.

  • Bugfix: Fixed a SteamVR plugin controller latency issues that was causing jittery movement and some major artifacting with Temporal AA.

  • Bugfix: We no longer log an error after re-enabling stereo rendering from Blueprints on Oculus Rift.

  • Bugfix: Reduced logging in Oculus Rift by not waiting on the same frame multiple times in OculusHMD_Splash.

  • Bugfix: WMR HMD worn state events now function correctly.

  • Bugfix: Downsampled translucent rendering now also sets the instanced view uniform buffer.

  • Bugfix: Updated certificate requirements to package for HoloLens 2. "CN=" is now required in the company name when creating a certificate.

  • Bugfix: Fixed mobile preview when in sRGB mode and no editor elements are composited (G key press).

  • Bugfix: Moved the InstanceFactor to draw command submission rather than building to avoid an ensure when instanced stereo is turned on.

  • Bugfix: Moved the cubemap flip to the correct code path.

  • Bugfix: Updated enqueuing of render command handling device rotation.We shouldn't enqueue a render command inside of the delegate handling device rotation - this ends up being unsafe due to the render thread being suspended. Now the new pass-through image is stored, and enqueued on the next GT tick.

  • New: Added Set/GetLeftTexture to UStereoLayerComponent. This allows dynamic access to both eyes’ stereoscopic cubemap layers.

  • New: Fixed the texture color order for FSteamVRTexture and extended FSteamVRTexture to work outside of the editor.

  • New: Upgraded OpenVR for Steam VR to version 1.5.17.

  • New: Added instanced stereo rendering support for instanced particles.

  • New: Added Vulkan mobile multiview support.

  • New: Updated Oculus runtime to version 1.37 for Rift-S support.

  • New: Converted parts of the SteamVR plugin to use the OpenVR module context.

  • Deprecated: Removed Cardboard iOS platform support from the GoogleVR plugin.

Upgrade Notes

Blueprints

  • New: Added a new blueprint-callable function, GetAllMorphTargetNames, to USkeletalMesh to retrieve all morph target names.

Core

  • New: Container allocators must now define a SizeType member typedef, which must be a signed integer, representing the type of any indices or element counts passed through the API of the allocator. User-defined allocators must add this typedef or they will no longer compile when used by TArray.

  • New: TArray's template signature has changed and existing forward declarations will no longer compile. "Containers/ContainersFwd.h" should be included to get the correct forward declaration of TArray.

Editor

  • API Change: Some editor-only UStaticMesh UPROPERTYs have been deprecated, and should now be accessed using new accessors, namely:

    • SourceModels: There is now a small API in UStaticMesh for manipulating the source models data. In general, access to the SourceModels array should be replaced by the GetSourceModels function; in addition there are the GetNumSourceModels, GetSourceModel(LOD), AddSourceModel, RemoveSourceModel and IsSourceModelValid functions.

    • SectionInfoMap: Please access this using the GetSectionInfoMap function.

    • OriginalSectionInfoMap: Please access using the GetOriginalSectionInfoMap function.

Media Framework

  • New: Added a global cache for image sequence, which is enabled by default. If you had previously changed the size of the cache for image sequences, then you will need to change the size of the global cache to a similar value, or you will be running with a smaller cache than before. Alternatively, you could disable the global cache in the settings to revert to per-player caching.

Scripting

  • Bug Fix: The Get and Filter functions on the Asset Registry are no longer pure, as they were potentially expensive operations. This will help to avoid performance issues, but existing Blueprints will need to wire in the new execution pins.

Gameplay Framework

  • New: The parameters of the "Atan2 (Degrees)" and "Atan2 (Radians)" nodes have been changed from "A" and "B" to "Y" and "X" for better consistency with the rest of the API.

Networking

  • Bug Fix: There is now an error log when DOREPLIFETIME is not called on a replicated property inside GetLifetimeReplicatedProps. If this is inrended, use DISABLE_REPLICATED_PROPERTY to silence the error. See "UnrealNetwork.h" for more information.

  • New: Introduced MaxNetTickRate, which defaults to 120, to limit how often the net connection ticks. This helps very high framerate clients to replicate without overloading their connections or wasting excessive amounts of bandwidth. MaxNetTickRate is configurable in .ini files by adding "MaxNetTickRate=120" (or your own value) to the "[/Script/OnlineSubsystemUtils.IpNetDriver]" section.

Online

  • New: Steamworks support has been updated to version 1.42 of the Steam SDK. If your project uses the "-force_steamclient_link" flag, you must now bundle it with the following .dll files for the architecture your application is targeting. (Note that these file names are appended with "x64" on 64-bit machines):

    • steamclient

    • tier0_s

    • vstdlib_s

    • These files are typically located in the installation directory of the Steam client software, and are no no longer included with UE4. Place them in the same directory as your "steam_api.dll", generally located in the Engine's "/Binaries/ThirdParty/Steamworks/(SteamVersion)/(WindowsPlatformArchitecture)" path.

Platforms

  • New: Generating stable shader info while cooking is now configurable. This data only needs to be generated if one or more platforms in your project use PSO caching. To do this, you will need to explicitly enable outputting shader stable keys by adding "NeedsShaderStableKeys=true" under the section "[DevOptions.Shaders]" in the engine .ini file for PSO platforms (for example, "AndroidEngine.ini" and "iOSEngine.ini"). This saves disk space and significant time (around 90 seconds in Epic's use cases) on iterative cooks for large projects.

Rendering

  • New: Many classes and functions related to texture streaming have been given more generic names, such as references to "Texture" being changed to "RenderAsset". Game or engine code that use those APIs will need to be updated, and you will need to recompile the appropriate binaries.

Tools

UnrealGameSync

  • Deprecated: UnrealGameSync MetadataServer - Deprecated the CIS table in favor of new Projects and Badges tables. Deploying the new server will automatically populate all projects it finds in the existing tables to the new one, but old badge data is not migrated and anything posted prior to the migration will no longer be displayed in UGS.

Virtual Production

  • New: LiveLink source factory has been moved to runtime to support creating sources out of editor. BuildCreationPanel, CreateSource and GetMenuType will have to be overloaded to create your widget.

  • New: ILiveLinkSource::IsSourceStillValid is now const. If you have overridden this function, you will need to update your override’s signature.

알려진 이슈

언리얼 엔진 4.23 에 영향을 주는 알려진 이슈 전체 목록은 Unreal Engine Public Issue Tracker (영문) 를 확인하세요.

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼