Esta característica 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 romper tu isla y requerir tu intervención activa.
PNJ generador requiere una vinculación de duración pista en Sequencer. No hay forma de añadir retroactivamente esta pista a una secuencia existente creada antes de la 31.00. Tienes que volver a publicar las islas que utilicen un generador PNJ en una secuencia después de añadir la pista de duración de vinculación.
Para añadir una vinculación duradera pista:
-
Haz clic en el icono + que hay junto al **PNJ generador en la lista de pistas.
-
Selecciona duración de la vinculación en el menú desplegable.
Utiliza Sequencer para crear animaciones de personajes personalizadas que se pueden reproducir de varias formas y en varios dispositivos, incluido el dispositivo Generador de PNJ. Usa eventos o Sequencer emparejado con dispositivos Secuencia cinemática para establecer y reproducir animaciones con patrones de comportamiento a lo largo de puntos previamente seleccionados de la ruta de patrulla de la IA.
Puedes importar y migrar animaciones personalizadas desde Unreal Engine (UE) incluidos MetaHumans. Para ello, es posible que tengas que reposicionar la malla esquelética para que se ajuste a los personajes PNJ, ya que los personajes de Fortnite tienen su propia estructura esquelética.
Los personajes MetaHuman requieren mucha memoria. Lo mejor es limitar el número de recursos de MetaHuman que utilizas.
Cómo animar PNJ en Sequencer
El dispositivo Generador de PNJ pone a tu disposición toda una gama creativa de opciones de juego para tu proyecto, desde personajes interactivos hasta cinemáticas informativas. Crea animaciones personalizadas para el generador de PNJ con el rig de control o importa animaciones que hayas adquirido o creado en otro software.
También puedes usar el rig de control de FK para animar a los PNJ con una animación de reposicionamiento o un gesto.
Obtén más información sobre los procesos de trabajo de animación del rig de control de FK en la documentación de UE.
Para capturar animaciones con personajes PNJ, sigue los pasos a continuación.
-
Haz clic con el botón derecho del ratón en el explorador de contenido para crear una secuencia de nivel.
-
Cambia el nombre de la miniatura de la secuencia de nivel.
-
Haz doble clic en la miniatura de Secuencia de nivel para abrir Sequencer Editor.
-
Haz clic en +Pista y, a continuación, selecciona Actor a Sequencer > Generador de PNJ. Esto añade el dispositivo Generador de PNJ a la pista Secuencia de nivel.
Puedes arrastrar el dispositivo Generador de PNJ a la lista de pistas desde el esquematizador para añadirlo a la secuencia de nivel.
-
Haz clic en el icono + al lado del dispositivo Generador de PNJ en la lista de pistas y selecciona Rig de control > Clases de rig de control > Rig de control de FK. Esto añade el esqueleto del PNJ a la pista, lo que te da acceso a los huesos individuales del esqueleto para manipularlos y grabarlos.
-
Selecciona los huesos que quieres mover desde el visor, el esquematizador de animaciones o Sequencer y muévelos a una posición inicial para tu animación.
-
Establece el primer fotograma clave haciendo clic en el icono + al lado de los huesos que has movido.
Si tienes una animación que has creado o adquirido como archivo de secuencia de animación FBX, puedes añadir dichos archivos a la pista de animación de un dispositivo Generador de PNJ en el cronograma haciendo clic en el icono + junto al generador de PNJ y seleccionando Animación > Archivo de animación.
Continúa moviendo los huesos y establece nuevos fotogramas clave en el cronograma de Sequencer hasta que se complete la animación. Una vez finalizada la animación, reprodúcela en Sequencer para asegurarte de que el movimiento se ajuste a tus preferencias.
Puedes reproducir una animación hacia atrás de forma sencilla haciendo clic derecho en el archivo de animación en el cronograma y seleccionando Propiedades > Invertir.
Una vez te satisfagan los resultados, es hora de hacer bake de la animación en la malla esquelética. Haz clic con el botón derecho del ratón en el generador de PNJ y selecciona Hacer bake de la secuencia de animación.
Asegúrate de que las extremidades de tu malla esquelética no atraviesen otras partes del cuerpo de la malla esquelética cuando reproduzcas la animación.
Cómo registrar atributos de comportamiento
También puedes usar atributos de comportamiento con el dispositivo Generador de PNJ. Las opciones de comportamiento determinan la característica básica que el PNJ hereda de los PNJ de Battle royale de Fortnite. Estas características determinan si el PNJ actúa como guardia o como 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 Definición de personaje PNJ.
Cuando hayas configurado estos atributos de comportamiento, puedes ajustar el fotograma clave a las animaciones en una secuencia de nivel y reproducirlas en un dispositivo Secuencia cinemática durante el juego. A diferencia de los pasos anteriores, no es necesario hacer bake del rendimiento en el rig de control ya que el comportamiento se establece en las opciones del dispositivo Generador de PNJ.
También puedes usar la animación que crees o el comportamiento heredado con el dispositivo Nodo de la ruta de patrulla de la IA y grabar al PNJ siguiendo el camino que crees con el actor Cámara de cine.
Vinculaciones de la PNJ generable y reemplazable
Ahora hay más de dos formas de traer una PNJ a tu secuencia: la vinculación de la PNJ generable y la vinculación de la PNJ reemplazable. Estas vinculaciones se crean desde la definición de personaje PNJ.
Vinculación general del PNJ
Mediante una secuencia cinemática, la vinculación generable del PNJ puede generar un actor en el mundo basándose en una definición de personaje del PNJ. Esta PNJ puede animarse en Sequencer del mismo modo que cualquier malla esquelética.
Para crear una vinculación generable del PNJ, solo tienes que arrastrar la definición de tu personaje del PNJ a Sequencer:
Haz clic en el gif para ampliarlo.
La vinculación general 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 del personaje del PNJ.
Haz clic en el gif para ampliarlo.
-
Mueve el cursor de reproducción más adelante, arrastra el PNJ a una nueva posición y establece (definir) un nuevo fotograma clave. El PNJ se moverá ahora del punto A al punto B.
Haz clic en el gif para ampliarlo.
Vinculación de la PNJ reemplazable
La vinculación PNJ reemplazable tomará el control de un PNJ generado en el mundo y lo colocará en tu secuencia. A continuación, pueden realizar la animación creada en Sequencer. Mientras la PNJ está vinculada por Sequencer, se detiene todo el comportamiento, la percepción y el seguimiento de ruta. Se reanudan cuando se desvincula al PNJ.
La PNJ volverá a su posición original cuando deje de estar vinculada.
Para crear una vinculación de la PNJ reemplazable, crea una vinculación de la PNJ generable, haz clic derecho en tu vinculación, y elige Convertir vinculación de selección a > Personaje PNJ reemplazable.
Haz clic en el gif para ampliarlo.
Tras la conversión, la pista se sustituye por una pista de vinculación duradera. Se conservan todos los cambios realizados en la vinculación general.
Para que el PNJ se encuentre y se vincule durante la jugabilidad, necesitas Añadir a modificadores a la definición del personaje PNJ: el modificador de Sequencer. Puedes añadir esto a tu definición de personaje del PNJ utilizando el mismo método que para los otros modificadores. Si no añades estos modificadores, obtendrás un fallo de validación.
Haz clic en el gif para ampliarlo.
Los modificadores de Sequencer tienen una propiedad de Identificador única. Esta propiedad se utiliza para localizar al PNJ generado en el juego. El valor predeterminado es el nombre de la definición de personaje PNJ. Ten en cuenta que si dos definiciones de personaje del PNJ diferentes tienen el mismo identificador único, ambas pueden vincularse cuando tu secuencia reproducir en el juego.
Reproducción de secuencias en el juego
Para reproducir tu secuencia, utiliza normalmente el dispositivo Secuencia cinemática.
Una vinculación general no necesita ninguna configuración adicional para reproducirse.
Una vinculación reemplazable requiere que añadas un generador del PNJ a tu mundo que utilice la definición de personaje del PNJ. Si la vinculación reemplazable no encuentra una PNJ a la que vincularse, verás la siguiente línea en tu registro de cliente:
LogFortNPCMovieSceneBindings: Advertencia: no se ha podido vincular a un peón utilizando la protección de la definición del personaje PNJ. Por favor, asegúrate de que se ha generado al menos uno.
Si quieres generar el PNJ al mismo tiempo que debe reproducirse tu secuencia. Considere la posibilidad de utilizar una vinculación generable o una Generación de interés con la función Evento en generación hasta la función reproducir del dispositivo de secuencia cinemática.
PNJ de blueprint personalizados
La mayoría de los tipos del PNJ se vincularán como mallas esqueléticas, con la excepción de una definición de personaje del PNJ que utiliza un blueprint personalizado.

Esto vinculará el blueprint y expondrá componentes adicionales, como los efectos visuales, que luego podrán modificarse en Sequencer.
Aquí puedes ver que se ha modificado un sistema de partículas de Niagara en Sequencer para hacer explotar la cabeza del PNJ:
Haz clic en el gif para ampliarlo.
Restricciones conocidas
- La vinculación del PNJ sustituible solo puede utilizarse con el dispositivo cinemática secuencia configurado en Visibilidad: todos. El uso de cualquier otra configuración de visibilidad fallará la validación.
- Si intentas utilizar una vinculación del PNJ sustituible con PNJ de animales salvajes que puedan montar o domesticar, fallará la validación.
- La vinculación del PNJ reemplazable que utiliza una definición de personaje del PNJ no puede utilizar la opción Forzar mantener estado de la opción de usuario Finalizar anulación de estado completada. Si intentas utilizar esta opción, fallará la validación.
- Cuando se vincula una PNJ con Sequencer, se ajusta en su sitio. Además, los problemas de latencia pueden provocar un error muy breve de elementos visuales cuando la PNJ está vinculada y no vinculada. Por esta razón, se recomienda encarecidamente utilizar técnicas como la generación fuera de campo de la PNJ, los desvanecimientos en pantalla, los efectos visuales o la pista de visibilidad cuando se utilice una vinculación de la PNJ reemplazable.
Cómo llamar a animaciones con Verse
Al exponer animaciones a Verse mediante el reflejo de recursos, puedes reproducir animaciones personalizadas en tus PNJ utilizando el módulo de animación.
Interfaz del controlador de animación
La interfaz play_animation_controller
te permite reproducir una animación en un personaje y se puede recuperar con la función GetPlayAnimationController()
. Esta interfaz expone dos funciones que reproducen animaciones. La función síncrona Play()
y la función asíncrona PlayAndAwait()
.
Ambas funciones aceptan los siguientes parámetros:
Opción | Valor | Descripción |
---|---|---|
Animación | Seleccionar una animación | La animación que se va a reproducir. Se debe especificar una animación en el archivo Assets.digest.verse . |
PlayRate | 1.0, Seleccionar una velocidad de reproducción | La velocidad a la que se va a reproducir la animación. Un valor de 1.0 corresponde a la velocidad predeterminada de la animación. |
BlendInTime | 0.0, Seleccionar un BlendInTime | Duración del tiempo que se debe mezclar la animación anterior con la actual. |
BlendOutTime | 0.0, Seleccionar el BlendOutTime | Duración del tiempo que se debe mezclar la animación actual con la siguiente. |
StartPositionSeconds | 0.0, Seleccionar 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 de forma asíncrona y devuelve una instancia del enumerador play_animation_result
, que contiene tres valores: Completed
, Interrupted
y Error
, los cuales corresponden a una animación completada, una animación que se ha interrumpido y un error que se ha producido, respectivamente. Al consultar esta enumeración, puedes ejecutar código diferente según 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 => ("Ha ocurrido un error durante la animación.")
Función de reproducir
La función Play()
se ejecuta de forma síncrona 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 la animación en un enumerador play_animation_state . |
Stop() | Esta función detiene la animación actual. |
CompletedEvent | Este evento se activa al completarse una animación. |
InterruptedEvent | Este evento se activa al interrumpirse una animación. |
BlendedInEvent | Este evento se activa cuando una animación ha terminado de difuminarse. |
BlendingOutEvent | Este evento se activa cuando una animación comienza a difuminarse. |
Await() | Esta función espera que la animación se complete o se interrumpa. Esto devuelve una enumeración play_animation_result , y es funcionalmente lo mismo que llamar a PlayAndAwait() . |
Puedes utilizar la función Play()
para manipular animaciones en curso o ejecutar código cuando se cumplan determinadas condiciones en tu animación.
# Reproduce una animación de forma síncrona 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 ejecuta cuando se completa la animación.
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
# Si la animación continúa reproduciéndose después de un segundo, detenla.
if(AnimationState = play_animation_state.BlendingOut):
AnimationInstance.Stop()
Ejemplo de reproducción de animación
El siguiente código muestra un ejemplo de comportamiento de un 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 debe exponerse primero a Verse a través del reflejo de recursos y debe aparecer en el archivo Assets.digest.verse
. En este ejemplo, la animación MyAnimation se encuentra en el módulo Animaciones del personaje personalizado MyCharacter en Assets.digest.verse y por lo tanto se 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):
# Velocidad a la que reproducir la animación.
@editable
PlayRate : float = 1.0
# Indica cuánto tiempo se debe mezclar la animación anterior
# con la actual.
@editable
BlendInTime : float = 0.25
# Indica cuánto tiempo se debe mezclar la animación actual
# con la siguiente.
@editable
BlendOutTime : float = 0.25
# Posición en segundos desde la que comenzar a reproducir
# la animación.
@editable
StartPositionSeconds : float = 0.0
# Indica cuánto tiempo esperar antes de volver a iniciar la animación.
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# Obtén el controlador de la animación del personaje 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 ejecutar 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 => ("Ha ocurrido un error durante la animación.")
Sleep(SleepDuration)
# Reproduce una animación de forma síncrona y obtén 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.BlendingIn => Print("Animación mezclándose.")
play_animation_state.BlendingOut => Print("Animación difuminándose.")
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("Ha ocurrido un error durante la animación.")
else:
Print("No se ha podido obtener el controlador de animación.")