Esta función está en acceso anticipado. Puedes publicar una isla con esta función, pero ten en cuenta que durante el periodo de acceso anticipado, los cambios pueden alterar el funcionamiento de tu isla y, por ende, requerir de tu intervención activa.
Los generadores de PNJ requieren una pista con vinculación de por vida en el sequencer. No existe forma de añadir de forma retroactiva esta pista a las secuencias existentes creadas antes de la 31.00. Tienes que volver a publicar toda isla en la que se use un generador de PNJ en una secuencia después de añadir la pista con vinculación de por vida.
Para añadir una pista con vinculación de por vida, debes hacer lo siguiente:
-
Haz clic en el ícono + junto al generador de PNJ en la lista de pistas.
-
Selecciona Vinculación de por vida en el menú desplegable.
Utiliza Sequencer para crear animaciones de personajes personalizadas, que pueden reproducirse de diferentes maneras y en varios dispositivos, incluido el dispositivo generador de PNJ. Puedes utilizar eventos o Sequencer emparejados con dispositivos de secuencia cinemática para establecer y reproducir animaciones con comportamientos con patrones junto con la ruta de patrulla de IA.
Puedes importar y trasladar animaciones personalizadas desde Unreal Engine (UE), lo que incluye MetaHumans. Para hacerlo, podrías reorientar la malla esquelética para ajustar los personajes de PNJ, ya que los personajes de Fortnite tienen su propia estructura esquelética.
Los personaje MetaHuman son de memoria intensiva. Es mejor limitar la cantidad de recursos de MetaHuman que puedes utilizar.
Cómo animar PNJ con Sequencer
El dispositivo generador de PNJ abre una variedad de creatividad de juego para tu proyecto, desde personajes interactivos hasta escenas de corte informativo. Crea animaciones personalizadas para el generador de PNJ con el rig de control, o puedes importar animaciones compradas o creadas en otro software.
También puedes utilizar el rig de control FK para animar a los PNJ con una animación reorientada o gesto.
Para obtener más información sobre el flujo de trabajo de animación del rig de control FK en la documentación de UE.
Para capturar las animaciones con PNJ, sigue los pasos siguientes.
-
Haz clic derecho en el explorador de contenido para crear una secuencia de niveles.
-
Renombra la miniatura de la secuencia de niveles.
-
Haz doble clic en la miniatura de la secuencia de niveles para abrir el editor de Sequencer.
-
Haz clic en +Pista*; luego, selecciona Actor a Sequencer > Generador de PNJ**. Esto añade el dispositivo generador de PNJ a la pista de secuencia de niveles.
Puedes arrastrar el dispositivo generador de PNJ hacia la lista de pista desde el esquematizador para añadir a la secuencia de niveles.
-
Haz clic en el ícono + junto al dispositivo generador de PNJ en la lista de pista y selecciona Rig de control > Clases de Rigs de control > Rig de control de FK. Esto añade el esqueleto de PNJ a la pista, lo que da acceso a los huesos individuales del esqueleto para manipular y grabar.
-
Selecciona los huesos que quieres mover desde el visor, el esquematizador de animación o Sequencer y muévelos hacia una posición inicial para tu animación.
-
Establece el primer fotograma clave al hacer clic en el ícono + junto a los huesos movidos.
Si tienes una animación creada o comprada como un archivo de secuencia de animación FBX, puedes añadir esos archivos a una pista de animación del dispositivo generador de PNJ en la línea de tiempo al hacer clic en el ícono + junto al generador de PNJ y seleccionar Animación > Archivo de animación.
Continúa moviendo los huesos y establece nuevos fotogramas clave en la línea de tiempo de Sequencer hasta que tu animación esté completa. Una vez que está completa, reproduce la animación en Sequencer para asegurarte de que el movimiento se ajuste a tus preferencias.
Una manera simple de reproducir una animación hacia atrás es hacer clic derecho en el archivo de animación en la línea de tiempo y selecciona Propiedades > Reversa.
Una vez conforme con los resultados, es hora de integrar la animación a la malla. Haz clic derecho en el generador de PNJ y selecciona Integrar secuencia de animación.
Es necesario asegurarte de que las extremidades de la malla esquelética no se superpongan con otras partes del cuerpo de malla esquelética cuando reproduces la animación.
Cómo grabar atributos de comportamiento
Puedes utilizar también atributos de comportamiento con el dispositivo generador de PNJ. Las opciones de comportamiento determinan las características de base que el PNJ hereda de los PNJ de la batalla campal de Fortnite. Estas características determinan si el PNJ actúa como un guardia o un animal salvaje.
Para obtener más información sobre cómo establecer los atributos de comportamiento con el dispositivo generador de PNJ, consulta el documento de definición de PNJ.
Una vez establecidos los atributos de comportamiento, puedes establecer las animaciones en una secuencia de nivel y reproducirlas en un dispositivo de secuencia cinemática durante el juego. A diferencia de los pasos anteriores, no necesitas integrar el rendimiento en el rig de control, ya que el comportamiento está establecido en las opciones de dispositivo generador de PNJ.
También puedes usar la animación que creaste, o el comportamiento heredado con el dispositivo de nodo de ruta de patrulla de IA y grabar el PNJ que sigue la ruta creada con el actor de cámara de cine.
Vinculaciones de PNJ que se pueden generar y reemplazar
Ahora existen dos maneras más de traer un PNJ a tus secuencias: la vinculación de PNJ generable y la vinculación de PNJ reemplazable. Estas vinculaciones se crean desde definiciones de PNJ.
Vinculación de PNJ generable
Mediante una secuencia cinemática, la vinculación de PNJ generable puede generar un actor en el entorno en función de una definición de PNJ. Puedes animar este PNJ en el sequencer de la misma manera que lo harías con cualquier malla esquelética.
Para crear una vinculación de PNJ que pueda generarse, solo arrastra tu definición de PNJ al sequencer:
Haz clic en el gif para ampliarlo.
La vinculación generable puede animarse como cualquier otro actor de malla esquelética. Por ejemplo:
-
Haz clic en *+ Animación y selecciona un gesto de baile para la definición de PNJ.
Haz clic en el gif para ampliarlo.
-
Mueve el cursor de reproducción más adelante, arrastra tu PNJ a una nueva ubicación y establece un nuevo fotograma clave. El PNJ ahora se moverá del punto A al punto B.
Haz clic en el gif para ampliarlo.
Vinculación de PNJ reemplazable
La vinculación de PNJ reemplazable tomará el control de un PNJ generado en el entorno y lo colocará en tu secuencia. Luego, podrá realizar animaciones creadas en el sequencer. Mientras el sequencer vincula al PNJ, todo el comportamiento, la percepción y el seguimiento de ruta están en pausa. Estos se reanudan cuando se desvincula el PNJ.
El PNJ se devolverá a su ubicación original cuando ya no esté vinculado.
Para crear una vinculación de PNJ reemplazable, crea una vinculación de PNJ generable, haz clic derecho en tu vinculación y elige Convertir selección de vinculación en > **PNJ reemplazable.
Haz clic en el gif para ampliarlo.
Después de la conversión, la pista se reemplaza con una pista con vinculación de por vida. Se conservan todos los cambios realizados en la vinculación generable.
Para que el PNJ se encuentre y se vincule durante el juego, debes añadir un modificador a la definición de PNJ: el modificador del sequencer. Puedes añadir esto a tu definición de PNJ utilizando el mismo método que otros modificadores. Si no añades este modificador, obtendrás un error de validación.
Haz clic en el gif para ampliarlo.
El modificador del sequencer tiene una propiedad de identificador único. Esta propiedad se utiliza para localizar al PNJ generado en el juego. El valor predeterminado es el nombre de la definición de PNJ. Ten en cuenta que si dos definiciones de PNJ diferentes tienen el mismo identificador único, ambas pueden vincularse cuando la secuencia se reproduce en el juego.
Cómo reproducir secuencias en el juego
Para reproducir tus secuencias, utiliza el dispositivo de secuencia cinemática con normalidad.
Una vinculación generable no necesita más configuración para reproducirse.
Una vinculación reemplazable requiere que agregues un generador de PNJ en tu entorno que utilice tu definición de PNJ. Si la vinculación reemplazable no encuentra un PNJ al que vincularse, verás la siguiente línea en el registro de cliente:
LogFortNPCMovieSceneBindings: Advertencia: no se pudo vincular a un peón mediante la definición del PNJ. Garantiza la aparición de al menos uno
.
Si quieres que aparezca el PNJ al mismo tiempo que tu secuencia debe reproducirse. Considera la posibilidad de utilizar una vinculación generable o conectar el evento Al generarse a la función Reproducir en el dispositivo de secuencia cinemática.
PNJ de blueprint personalizado
La mayoría de los tipos de PNJ se vincularán como malla esquelética, con la excepción de una definición de PNJ que utiliza un blueprint personalizado.

Esto vinculará el blueprint y expondrá componentes adicionales, como VFX, que luego podrán modificarse en el sequencer.
Aquí puedes ver que se modificó un sistema de partículas de Niagara en el sequencer para hacer expandir la cabeza del PNJ:
Haz clic en el gif para ampliarlo.
Restricciones conocidas
- Las vinculaciones de PNJ reemplazables solo pueden utilizarse con el dispositivo de secuencia cinemática definido en Visibilidad: todos. Si se utiliza cualquier otra configuración de visibilidad, fallará la validación.
- Si intentas utilizar una vinculación de PNJ reemplazable con PNJ de vida salvaje domesticables o montables, la validación fallará.
- Las vinculaciones de PNJ reemplazables que utilizan una definición de PNJ no pueden utilizar la opción Forzar conservación de estado en la opción de usuario Anular estado de finalización. Si intentas utilizar esta opción, fallará la validación.
- Cuando el sequencer vincula al PNJ , este se acoplará en su sitio. Además, los problemas de latencia pueden provocar errores visuales muy breves cuando el PNJ se vincula y se desvincula. Por este motivo, se recomienda utilizar técnicas como la aparición del PNJ fuera de la pantalla, los desvanecimientos de la pantalla, los VFX o la pista de visibilidad cuando se utiliza una vinculación de PNJ reemplazable.
Cómo llamar animaciones con Verse
Al exponer las animaciones a Verse mediante el uso de reflexión de recursos, puedes reproducir las animaciones personalizadas en tus PNJ con el módulo de animación.
Interfaz de controlador de animación
La interfaz play_animation_controller
te permite reproducir una animación en un personaje y pueden recuperarse con la función GetPlayAnimationController()
. Esta interfaz presenta dos funciones que reproducen animaciones. La función sincrónica Play()
y la función asincrónica PlayAndAwait()
.
Ambas funciones aceptan los siguientes parámetros:
Opción | Valor | Descripción |
---|---|---|
Animación | Seleccionar una animación | La animación para reproducir. Se debe especificar una animación en el archivo Assets.digest.verse . |
Frecuencia de reproducción | 1.0, seleccionar una frecuencia de reproducción | Velocidad con la que se reproduce la animación. Un valor de 1,0 corresponde a la velocidad predeterminada de la animación |
BlendInTime | 0.0, seleccionar un BlendInTime | La longitud de tiempo para combinar la animación previa con la actual. |
BlendOutTime | 0.0, seleccionar un BlendOutTime | La longitud de tiempo para combinar a la animación actual con la siguiente. |
StartPositionSeconds | 0.0, seleccionar un StartPositionSeconds | La posición en segundos desde la cual comenzar a reproducir la animación. |
Función de reproducir y esperar
La función PlayAndAwait()
reproduce una animación asincrónicamente y devuelve una instancia de play_animation_result
enum, que contiene tres valores, Completed
, Interrupted
y Error
. Estos corresponden a una animación completa, una animación que fue interrumpida y un error que acontece, respectivamente. Al consultar esta enumeración, puedes ejecutar diferentes códigos basados en el resultado de tu animación.
AnimationResult := PlayAnimController.PlayAndAwait(MyAnimation)
case(AnimationResult):
play_animation_result.Completed => Print("¡Animación completada!")
play_animation_result.Interrupted => Print("Animación interrumpida.")
play_animation_result.Error => ("Se produjo un error durante la animación").
Reproducir función
La función Play()
se ejecuta de manera sincrónica y devuelve una instancia de la clase playing_animation_instance
. La clase playing_animation_instance
te permite consultar y manipular una animación en curso y contiene los siguientes valores:
Valor | Explicación |
---|---|
GetState() | Esta función devuelve el estado actual de la reproducción de animación en una enumeración play_animation_state . |
Stop() | Detiene la animación actual. |
CompletedEvent | Este evento se activa cuando la animación se completa |
InterruptedEvent | Este evento se activa cuando la animación se interrumpe. |
BlendedInEvent | Este evento se activa cuando la animación termina de combinarse. |
BlendedOutEvent | Este evento se activa cuando la animación comienza a combinarse. |
Await() | Esta función espera para que la animación esté completa o interrumpida. Notablemente, esto devuelve una enumeración play_animation_result , y es funcionalmente idéntica a llamar PlayAndAwait() . |
Puedes utilizar la función Play()
para manipular animaciones en curso o para ejecutar códigos cuando se cumplen ciertas condiciones en tu animación.
# Reproduce una animación simultáneamente y obtén su instancia de animación
AnimationInstance := PlayAnimController.Play(MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Suscríbete a una función que se ejecute cuando la animación se completa
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
# Si la animación se sigue reproduciendo después de un segundo, detén la animación
if(AnimationState = play_animation_state.BlendingOut):
AnimationInstance.Stop()
Reproduce un ejemplo de animación
El código que aparece debajo muestra un ejemplo de un comportamiento de PNJ que utiliza el módulo de animación para reproducir una animación. Ten en cuenta que cualquier animación personalizada que quieras reproducir en tus personajes, primero debe exponerse en Verse a través de la reflejo de recursos, y debe aparecer en el archivo Assets.digest.verse
. En este ejemplo, la animación MyAnimation se ubica en el módulo Animaciones del personaje personalizado MyCharacter en Assets.digest.verse, y se la llama a través de MyCharacter.Animations.MyCharacter.
using { /Fortnite.com/AI }
using { /Fortnite.com/Animation/PlayAnimation }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
basic_play_anim_example := class(npc_behavior):
# Frecuencia de reproducción de la animación
@editable
PlayRate : float = 1.0
# Por cuánto tiempo combinar la animación anterior
# con la actual.
@editable
BlendInTime : float = 0.25
# Por cuánto tiempo combinar la animación actual
# con la siguiente.
@editable
BlendOutTime : float = 0.25
# La posición en segundos desde la cual comenzar a reproducir
# la animación.
@editable
StartPositionSeconds : float = 0.0
# Cuánto tiempo se debe esperar antes de reiniciar la animación.
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# Obtener el controlador de animación del PNJ
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
PlayAnimController := FortCharacter.GetPlayAnimationController[]
then:
AnimationResult := PlayAnimController.PlayAndAwait(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Imprime el resultado de la ejecución de la animación.
case(AnimationResult):
play_animation_result.Completed => Print("¡Animación completada!")
play_animation_result.Interrupted => Print("Animación interrumpida.")
play_animation_result.Error => ("Se produjo un error durante la animación").
Sleep(SleepDuration)
# Reproducir una animación simultáneamente y obtener su instancia de animación.
AnimationInstance := PlayAnimController.Play(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Sleep(SleepDuration)
AnimationState := AnimationInstance.GetState()
# Imprime el estado actual de la animación.
case(AnimationState):
play_animation_state.Playing => Print("¡Animación en reproducción!")
play_animation_state.Playing => Print("¡Animación comienza a combinarse!")
play_animation_state.Playing => Print("¡Animación termina de combinarse!")
play_animation_state.Completed => Print("¡Animación completada!")
play_animation_state.Stopped => Print("¡Animación detenida!")
play_animation_state.Interrupted => Print("¡Animación interrumpida!")
play_animation_state.Error => Print("Se produjo un error durante la animación")
else:
Print("No se pudo obtener el controlador de animación")