UE5Coro implementa soporte de rutina C++20 para Unreal Engine 5 con un enfoque en la lógica del juego, la conveniencia y brindando una integración perfecta con el motor.
Nota
La compatibilidad con C++ 17, compiladores, plataformas y versiones de motor anteriores está disponible en la serie UE5Coro 1.x heredada.
Hay soporte integrado para la creación sencilla de UFUNCTIONs latentes. Cambie el tipo de retorno de una UFUNCTION latente para convertirla en una corrutina y obtendrá todo el texto estándar de FPendingLatentAction de forma gratuita, con soporte multiproceso seguro para BP listo para usar:
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);
}
Esta rutina rastreará automáticamente su UObject objetivo a través de los subprocesos, por lo que incluso si el objeto que lo posee se destruye antes de que finalice, no se bloqueará debido a que this
cuelgue en el subproceso del juego.
Incluso el tipo de retorno de rutina está oculto a BP para no molestar a los diseñadores:
¿No te interesan las UFUNCTIONS latentes? No es un problema. También se admiten corrutinas de C++ sin formato, con exactamente el mismo conjunto de características. La implementación de respaldo se selecciona en el momento de la compilación; Las acciones latentes sólo se crean si realmente las usas.
Cambie su tipo de devolución a uno de los tipos de corrutina proporcionados por este complemento, y las tareas asincrónicas complejas que sería engorroso implementar usted mismo se convierten en frases triviales que Just Work™, eliminando la necesidad de devoluciones de llamadas y otros controladores.
UObject* HardPtr = co_await AsyncLoadObject(SoftPtr);
te permite conservar solo los beneficios (y tu FPS).co_await NextTick();
dentro de un bucle, y ya habrás terminado. Hay una clase de presupuesto de tiempo que le permite especificar el tiempo de procesamiento deseado directamente y dejar que la rutina se programe dinámicamente.co_await Ticks(bCloseToCamera ? 1 : 2);
co_await MoveToTask();
a su función, y todo lo que sigue a esa línea se ejecutará dentro del sistema UE::Tasks en un subproceso de trabajo.co_await MoveToGameThread();
.co_await Timeline(this, From, To, Duration, YourUpdateLambdaGoesHere);
co_await YourDynamicDelegate;
(ese es el código completo)auto [Your, Parameters] = co_await YourDynamicDelegate;
Esto debería dar una idea de la importante reducción de código y esfuerzo que es posible con este complemento. Menos código y más simple de escribir generalmente se traduce en menos errores, y el hecho de que el código asincrónico sea fácil de escribir significa que no hay fricciones cuando se trata de hacer las cosas de la manera correcta, de inmediato.
Dígale adiós a ese LoadSynchronous suficientemente bueno por ahora™ que todavía está en envío, dos actualizaciones después. Con la tarea en cuestión reducida de "escribir todo el texto estándar de StreamableManager y mover una parte de la función de llamada a una devolución de llamada" a simplemente "poner co_await delante", terminará más rápido de lo que hubiera tardado en aparecer. con una justificación de por qué la versión de bloqueo sincrónico es de alguna manera aceptable.
Hay muchas características adicionales en el complemento, como generadores que le permiten evitar asignar un TArray completo solo para devolver una cantidad variable de valores. Es más fácil de escribir para usted, más fácil de optimizar para el compilador, solo necesita almacenamiento O(1) en lugar de O(N) para N elementos, ¿qué es lo que no le gusta?
Los siguientes enlaces le llevarán a las páginas relevantes de la documentación. Marque esta sección si prefiere leer la documentación más reciente en su navegador o leerla directamente desde su IDE. Cada función de API está documentada en los encabezados de C++ y las versiones contienen la fuente de Markdown de la documentación que está leyendo ahora mismo.
Estas características se centran en exponer las corrutinas al resto del motor.
Estos contenedores proporcionan formas convenientes de consumir funciones del motor de sus rutinas.
Nota
La mayoría de estas funciones devuelven tipos internos no documentados del espacio de nombres UE5Coro::Private
. El código del cliente no debe hacer referencia a nada de este espacio de nombres directamente, ya que todo lo que contiene está sujeto a cambios en versiones futuras, sin desaprobación previa.
La mayoría de las veces, esto no es un problema: por ejemplo, el objeto temporal sin nombre en co_await Something()
no aparece en el código fuente. Si es necesario almacenar un valor de retorno Private
, utilice auto
(o un TAwaitable auto
restringido) para evitar escribir el nombre del tipo.
La llamada directa a las funciones de espera de C++ públicas por necesidad await_ready
, await_suspend
y await_resume
no se admite en ningún awaiter.
Solo se admiten versiones numeradas. No utilice las ramas de Git directamente.
Descargue la versión que ha elegido y extráigala a la carpeta Complementos de su proyecto. Cambie el nombre de la carpeta a solo UE5Coro, sin un número de versión. Si se hace correctamente, debería terminar con YourProjectPluginsUE5CoroUE5Coro.uplugin
.
Nota
Consulte el archivo README de la versión si está utilizando 1.x. Tenía un método de instalación diferente que involucraba múltiples complementos.
Es posible que su proyecto utilice algunas configuraciones heredadas que deben eliminarse para desbloquear la compatibilidad con C++ 20, que de otro modo viene como estándar en nuevos proyectos realizados en Unreal Engine 5.3 o posterior.
En sus archivos Target.cs (todos), asegúrese de estar utilizando la configuración más reciente e incluya la versión del pedido:
DefaultBuildSettings = BuildSettingsVersion . Latest ;
IncludeOrderVersion = EngineIncludeOrderVersion . Latest ;
Si está utilizando el indicador heredado bEnableCppCoroutinesForEvaluation
, ya no es necesario y ya no debería estar activado explícitamente; hacerlo puede causar problemas. Se recomienda eliminar todas las referencias a él de sus archivos de compilación.
Si está configurando CppStandard
en CppStandardVersion.Cpp17
en un archivo Build.cs... no lo haga :)
Haga referencia al módulo "UE5Coro"
de su Build.cs como lo haría con cualquier otro módulo de C++ y use #include "UE5Coro.h"
. No es necesario habilitar el complemento en sí.
Algunas funciones se encuentran en módulos opcionales a los que es necesario hacer referencia por separado. Por ejemplo, la compatibilidad con Gameplay Ability System necesita "UE5CoroGAS"
en Build.cs y #include "UE5CoroGAS.h"
. El módulo principal UE5Coro solo depende de los módulos del motor que están habilitados de forma predeterminada.
Importante
No #incluya directamente ningún otro encabezado, solo el que coincida con el nombre del módulo. Se sabe que los principales IDE utilizados con Unreal Engine generan sugerencias de encabezado incorrectas. Si agrega UE5Coro.h a su PCH, puede hacerlo disponible en todas partes.
Para actualizar, elimine UE5Coro de la carpeta Complementos de su proyecto e instale la nueva versión siguiendo las instrucciones anteriores.
No es necesario ni compatible empaquetar UE5Coro por separado (desde la ventana Complementos).
Para eliminar el complemento de su proyecto, vuelva a implementar todas sus rutinas sin su funcionalidad, elimine todas las referencias al complemento y sus módulos y agregue una redirección principal desde /Script/UE5CoroK2.K2Node_UE5CoroCallCoroutine
a /Script/BlueprintGraph.K2Node_CallFunction
.