UE5Coro는 게임플레이 로직, 편의성, 엔진과의 원활한 통합 제공에 중점을 두고 Unreal Engine 5에 대한 C++20 코루틴 지원을 구현합니다.
메모
C++17, 이전 컴파일러, 플랫폼, 엔진 버전에 대한 지원은 레거시 UE5Coro 1.x 시리즈에서 제공됩니다.
잠재 UFUNCTION을 쉽게 작성할 수 있는 지원 기능이 내장되어 있습니다. 잠재 UFUNCTION의 반환 유형을 변경하여 코루틴으로 만들면 BP 안전 멀티스레딩 지원과 함께 모든 FPendingLatentAction 상용구를 무료로 얻을 수 있습니다.
UFUNCTION (BlueprintCallable, meta = (Latent, LatentInfo = LatentInfo))
FVoidCoroutine Example(FLatentActionInfo LatentInfo)
{
UE_LOGFMT (LogTemp, Display, " Started " );
co_await UE5Coro::Latent::Seconds ( 1 ); // Does not block the game thread!
UE_LOGFMT (LogTemp, Display, " Done " );
co_await UE5Coro::Async::MoveToThread (ENamedThreads::AnyThread);
auto Value = HeavyComputation ();
co_await UE5Coro::Async::MoveToGameThread ();
UseComputedValue (Value);
}
이 코루틴은 스레드 전체에서 대상 UObject를 자동으로 추적하므로, 소유한 개체가 완료되기 전에 파괴되더라도 게임 스레드에 매달린 this
인해 충돌이 발생하지 않습니다.
디자이너를 방해하지 않기 위해 코루틴 반환 유형도 BP에서 숨겨집니다.
잠재 UFUNCTION에 관심이 없나요? 문제 없습니다. 동일한 기능 세트를 갖춘 원시 C++ 코루틴도 지원됩니다. 지원 구현은 컴파일 타임에 선택됩니다. 잠재 액션은 실제로 사용하는 경우에만 생성됩니다.
반환 유형을 이 플러그인에서 제공하는 코루틴 유형 중 하나로 변경하면 직접 구현하기 어려운 복잡한 비동기 작업이 Just Work™의 간단한 한 줄짜리 작업이 되어 콜백 및 기타 핸들러가 필요하지 않게 됩니다.
UObject* HardPtr = co_await AsyncLoadObject(SoftPtr);
혜택(및 FPS)만 유지할 수 있습니다.co_await NextTick();
루프 내부에서는 이미 완료되었습니다. 원하는 처리 시간을 직접 지정하고 코루틴이 동적으로 자체 일정을 예약할 수 있게 해주는 시간 예산 클래스가 있습니다.co_await Ticks(bCloseToCamera ? 1 : 2);
co_await MoveToTask();
를 추가하세요. 함수에 추가하면 해당 줄 이후의 모든 내용은 작업자 스레드의 UE::Tasks 시스템 내에서 실행됩니다.co_await MoveToGameThread();
.co_await Timeline(this, From, To, Duration, YourUpdateLambdaGoesHere);
co_await YourDynamicDelegate;
(전체 코드입니다)auto [Your, Parameters] = co_await YourDynamicDelegate;
이를 통해 이 플러그인을 사용하면 코드와 노력이 크게 줄어드는 것을 맛볼 수 있습니다. 작성하기 쉽고 간단한 코드는 일반적으로 버그가 적다는 것을 의미하며, 비동기 코드 작성이 쉽다는 것은 작업을 올바른 방식으로 즉시 수행하는 데 있어 마찰이 없다는 것을 의미합니다.
아직 두 번의 업데이트가 있을 예정이며 아직 배송 중인 LoadSynchronous에 작별 인사를 하세요. 현재 작업이 "모든 StreamableManager 상용구 작성 및 호출 함수의 일부를 콜백으로 이동"에서 단순히 "co_await 앞에 붙이기"로 줄어들면 예상보다 더 빨리 완료할 수 있습니다. 동기식 차단 버전이 어떻게든 허용되는 이유에 대한 정당성을 제공합니다.
플러그인에는 다양한 수의 값을 반환하기 위해 전체 TArray 할당을 방지할 수 있는 생성기 등 추가 기능이 많이 있습니다. 작성하기 쉽고, 컴파일러가 최적화하기 쉽고, N 항목에 대해 O(N) 대신 O(1) 저장소만 필요합니다. 마음에 들지 않는 점은 무엇입니까?
다음 링크를 클릭하면 문서의 관련 페이지로 이동할 수 있습니다. 최신 문서를 브라우저에서 읽거나 IDE에서 직접 읽으려면 이 섹션을 북마크에 추가하세요. 모든 API 함수는 C++ 헤더에 문서화되어 있으며 릴리스에는 현재 읽고 있는 문서의 Markdown 소스가 포함되어 있습니다.
이러한 기능은 코루틴을 엔진의 나머지 부분에 노출하는 데 중점을 둡니다.
이러한 래퍼는 코루틴에서 엔진 기능을 사용하는 편리한 방법을 제공합니다.
메모
이러한 함수 대부분은 UE5Coro::Private
네임스페이스에서 문서화되지 않은 내부 유형을 반환합니다. 클라이언트 코드는 이 네임스페이스의 어떤 것도 직접 참조해서는 안 됩니다. 내부의 모든 내용은 사전 지원 중단 없이 향후 버전에서 변경될 수 있기 때문입니다.
대부분의 경우 이는 문제가 되지 않습니다. 예를 들어 co_await Something()
의 이름 없는 임시 개체는 소스 코드에 나타나지 않습니다. Private
반환 값을 저장해야 하는 경우 auto
(또는 제한된 TAwaitable auto
)를 사용하여 유형 이름을 쓰지 않도록 하세요.
필요에 따라 공개 C++ 대기 가능 함수를 직접 호출하는 await_ready
, await_suspend
및 await_resume
어떤 waiter에서도 지원되지 않습니다.
번호가 매겨진 릴리스만 지원됩니다. Git 분기를 직접 사용하지 마세요.
선택한 릴리스를 다운로드하고 프로젝트의 플러그인 폴더에 추출하세요. 버전 번호 없이 폴더 이름을 UE5Coro로 바꾸세요. 올바르게 수행하면 YourProjectPluginsUE5CoroUE5Coro.uplugin
으로 끝날 것입니다.
메모
1.x를 사용하는 경우 릴리스 자체 README를 참조하세요. 여러 플러그인을 사용하는 다른 설치 방법이 있었습니다.
프로젝트에서 C++20 지원을 잠금 해제하기 위해 제거해야 하는 일부 레거시 설정을 사용할 수도 있습니다. 그렇지 않으면 Unreal Engine 5.3 이상에서 만든 새 프로젝트에서 표준으로 제공됩니다.
Target.cs 파일(모두)에서 최신 설정을 사용하고 있는지 확인하고 주문 버전을 포함하세요.
DefaultBuildSettings = BuildSettingsVersion . Latest ;
IncludeOrderVersion = EngineIncludeOrderVersion . Latest ;
레거시 bEnableCppCoroutinesForEvaluation
플래그를 사용하는 경우 더 이상 필요하지 않으며 더 이상 명시적으로 켜서는 안 됩니다. 그렇게 하면 문제가 발생할 수 있습니다. 빌드 파일에서 이에 대한 모든 참조를 제거하는 것이 좋습니다.
Build.cs 파일에서 CppStandard
CppStandardVersion.Cpp17
로 설정하는 경우... 하지 마세요. :)
다른 C++ 모듈과 마찬가지로 Build.cs에서 "UE5Coro"
모듈을 참조하고 #include "UE5Coro.h"
사용하세요. 플러그인 자체를 활성화할 필요는 없습니다.
일부 기능은 별도로 참조해야 하는 선택적 모듈에 있습니다. 예를 들어 게임플레이 어빌리티 시스템을 지원하려면 Build.cs에 "UE5CoroGAS"
필요하고 #include "UE5CoroGAS.h"
필요합니다. 핵심 UE5Coro 모듈은 기본적으로 활성화된 엔진 모듈에만 의존합니다.
중요한
다른 헤더를 직접 #include하지 말고 모듈 이름과 일치하는 헤더만 포함하세요. Unreal Engine과 함께 사용되는 주요 IDE는 헤더 제안이 잘못된 것으로 알려져 있습니다. UE5Coro.h를 PCH에 추가하면 어디에서나 사용할 수 있습니다.
업데이트하려면 프로젝트의 Plugins 폴더에서 UE5Coro를 삭제하고 위 지침에 따라 새 버전을 설치하세요.
(플러그인 창에서) UE5Coro를 별도로 패키징할 필요도 없고 지원되지도 않습니다.
프로젝트에서 플러그인을 제거하려면 해당 기능 없이 모든 코루틴을 다시 구현하고, 플러그인 및 해당 모듈에 대한 모든 참조를 제거한 다음, /Script/UE5CoroK2.K2Node_UE5CoroCallCoroutine
에서 /Script/BlueprintGraph.K2Node_CallFunction
으로의 핵심 리디렉션을 추가하세요.