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 tu intervención activa.
El comportamiento de un NPC se define por su secuencia de comandos de comportamiento. La secuencia de comandos de comportamiento es la que dirige las acciones de los personajes en el entorno, como sus destinos, contra qué luchar y cómo interactuar con otros personajes. Personajes como los guardias y los animales salvajes pueden tener comportamientos adicionales, como percepción, niveles de alerta y la posibilidad de ser contratados o domados.
El comportamiento de PNJ es una secuencia de comandos de Verse definida por el usuario que añade funcionalidad adicional a los comportamientos existentes de un PNJ. La API npc_behavior
te permite establecer código que se ejecute cuando aparezca o desaparezca un PNJ. Puedes utilizarla para crear personajes personalizados como médicos, comerciantes o jefes. Los comportamientos de PNJ heredan desde la clase abstracta npc_behavior
y necesitan importar el módulo /Fortnite.com/AI
para utilizarse.
Para ejecutar una secuencia de comandos de comportamiento de PNJ, necesitas adjuntarla a una definición de personaje PNJ. La manera en la que las secuencias de comandos de comportamiento de PNJ interactúan con los personajes dependen del tipo de PNJ. Los PNJ personalizados necesitan una secuencia de comandos de comportamiento para realizar acciones, mientras que los PNJ guardianes o animales salvajes ejecutarán su comportamiento predeterminado si no tienen secuencias de comandos de comportamiento. Para más información sobre crear definiciones de personajes PNJ y los distintos tipos de personajes, consulta la página Definición de personajes.
Este tutorial detalla los aspectos básicos de crear una secuencia de comandos de comportamiento de PNJ y te enseña a generar un NPC y a desplazarlo hasta un objetivo.
Cómo crear una nueva secuencia de comandos de comportamiento de PNJ
Sigue estos pasos para crear una secuencia de comandos de comportamiento de PNJ en UEFN para crear un guardia que patrulle entre dos puntos.
Abre tu proyecto en UEFN. Luego, en la barra de menús, dirígete a Verse > Explorador de Verse.
En el explorador de Verse, haz clic derecho en el nombre de tu proyecto y elige Añadir nuevo archivo de Verse al proyecto para abrir la ventana Crear secuencia de comandos de Verse.
En la ventana Crear secuencia de comandos de Verse, haz clic en Comportamiento de PNJ para seleccionarlo como plantilla.
Asigna un nombre a tu comportamiento de PNJ. Para ello, cambia el texto del campo Nombre de comportamiento de PNJ por el nombre de tu dispositivo. En este ejemplo, el dispositivo se denomina my_first_npc_behavior.
Haz clic en Crear para crear el archivo de Verse.
En el explorador de Verse, haz doble clic en el nombre del archivo de Verse para abrirlo en Visual Studio Code.
Guarda tu código, compílalo y crea una nueva definición de personaje PNJ. Para más información sobre crear personajes PNJ, consulta la página Definición de personajes.
Asigna tu secuencia de comandos
my_first_behavior
como el comportamiento de Verse de tu nueva definición de personaje.Haz clic en Comenzar sesión en la barra de herramientas de UEFN para hacer una prueba de juego de tu nivel. Cuando hagas una prueba de juego de tu nivel, los personajes que se generen en tu generador de PNJ deben elegir un punto aleatorio cercano al lugar donde aparecieron y dirigirse hasta él. Cuando alcancen dicho punto, deberían esperar un cierto tiempo y desplazarse de vuelta a su punto original. Si habilitaste Dibujo de depuración de Verse en el Dispositivo Ajustes de isla, deberías ver que aparecen flechas que muestran el enfoque del personaje, así como cajas que muestran el punto al que se desplaza el personaje.
Navegable
Puedes usar la API Navigatable
para dirigir a los personajes a ciertos objetivos y para funciones como patrullar, resguardar puntos o seguir a otro personaje. Los PNJ de tipo guardia pueden hacer esto con nodos de recorrido de patrulla de IA, pero aquí tendrás que usar código de Verse para extender esta función a cualquier tipo de personaje y ahorrarte la necesidad de colocar dispositivos adicionales en el nivel. La interfaz navigatable
del personaje te permite que los personajes se desplacen a un navigation_target
, que puedes crear desde un agent
o position
. Los PNJ personalizados, guardias y animales salvajes pueden usar la interfaz navegable. Para obtener la interfaz navigatable
del personaje, primero tendrás que obtener la referencia a su fort_character
, lo cual puedes lograr llamando a GetFortCharacter[]
.
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
En el ejemplo de plantilla, el código elige una posición con una diferencia aleatoria a donde se genera el personaje y la guarda en la variable GoToPoint
. Entonces, crea un navigation_target
, tanto a partir del GotToPoint
y del punto de aparición del personaje.
# Create a random offset from the spawn point to walk toward.
GoToPoint := NPCSpawnPoint + vector3{X := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Y := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Z := 0.0 }
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateBeginMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTi
# Create a navigation target from these two positions that the navigation interface can use.
NavTargetStart := MakeNavigationTarget(GoToPoint)
La función NavigateTo()
devuelve un enum de navigation_result
, que contiene información que confirme si el personaje ha alcanzado su navigation_target
o no. Puedes revisar el valor de tu navigation_result
para asignar comportamientos a los personajes con base en si lograron alcanzar su objetivo o no.
# Check to see if something has interfered with the NPC reaching the intended location and print a
# message to the output log.
if (NavResultGoTo <> navigation_result.Reached):
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
else:
# Once it arrives at its location, wait for this duration in seconds
Navigatable.Wait(?Duration := MoveToWaitDuration)
Para más información sobre la manera en la que los personajes navegan el mundo y para visualizar las distintas zonas a las que los personajes pueden desplazarse, consulta la página de Malla de desplazamiento.
Enfocar
Cuando los personajes realizan acciones, miran hacia objetivos específicos. El objetivo específico al que mira al personaje se conoce como su punto de enfoque. Los personajes se enfocan en el personaje con el que están hablando, en el objetivo que están atacando o en la posición a la que se están desplazando. La focus_interface
te permite especificar objetivos de enfoque para tus personajes. Los PNJ personalizados, guardias y animales salvajes pueden usar la interfaz de enfoque. La función MaintainFocus()
hace que tu personaje se enfoque en un objetivo, que puede ser una posición vector3
o un agent
. La focus_interface
es parte de la interfaz fort_character
y puedes obtenerla con GetFocusInterface[]
.
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
En la plantilla de ejemplo, después de que el personaje termine de desplazarse de vuelta a la posición inicial, el código utiliza MaintainFocus()
para obligarlo a enfocarse en el navigation_target
anterior. Esto ocasiona que el personaje camine hacia atrás y mira detrás de donde estaba mientras se dirige a su punto de inicio.
# Leveraging concurrency to wait until the NPC reaches its destination, while the calls to look back at its origin point
# and drawing a debug arrow never completes, continuing, ensures only the NavigateTo can win the race.
NavResultGoToNext := race:
# Move back to its starting position.
Navigatable.NavigateTo(NavTargetEnd)
# Sets NPC to look at its previous position which will make it walk backwards.
# This is meant to show the utility of the focus interface.
block:
Focus.MaintainFocus(GoToPoint)
Riendas
Cuando los guardias resguardan un objetivo, debes asegurarte de que se queden en una zona alrededor del objetivo y que no se desplacen demasiado lejos. La interfaz fort_leashable
es una interfaz específica para PNJ tipo guardias que te permite establecer un radio alrededor de un personaje en el cual no saldrán de su ruta de patrullaje. Puedes crear riendas para los guardias a posiciones específicas y los guardias actualizarán su posición para quedarse cerca del objetivo de rienda si se mueve. Ten en cuenta que los personajes PNJ personalizados y animales salvajes no pueden usar la interfaz fort_leashable
. Puedes obtener la interfaz fort_leashable
con GetFortLeashable[]
.
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Las riendas de los guardias pueden ser a posiciones o a otros agentes, como cuando se resguarda un punto de captura o cuando se protege a un PNJ importante. Cada rienda tiene un InnerRadius
y un OuterRadius
, que especifican qué tan cerca y lejos (en centímetros) deberían quedarse los guardias de su objetivo de rienda. La plantilla ejemplo no usa la interfaz leashable
, pero te podría resultar útil al crear tu propio PNJ guardia.
# Leash the guard to a position so they stay between 500 and 1000
# cm of the position they're leashed to
Leashable.SetLeashPosition(NPCSpawnPoint, InnerRadius := 500.0, OuterRadius := 1000.0)
# Leash the guard to an agent so they stay between 500 and 1000
# cm of the agent they're leashed to
Leashable.SetLeashAgent(AgentToFollow, InnerRadius := 500.0, OuterRadius := 1000.0)
# Clear all leashes on the guard
Leashable.ClearLeash()
Trazado de depuración
En la parte superior del archivo, esta plantilla define un canal dedicado para el dibujo de depuración. Puedes usar el dibujo de depuración para visualizar ciertos datos del juego con fines de pruebas. Por ejemplo, puedes visualizar el rango de visibilidad de tu personaje o dibujar una forma alrededor de la ubicación a la que se desplace. Debes habilitar Dibujo de depuración de Verse en la pestaña Depuración en Ajustes de isla para visualizar las formas de depuración, que no aparecerán en las experiencias publicadas. El canal en la parte superior del archivo te permite ocultar, mostrar o borrar todas las formas de depuración del canal con un solo método.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
La clase plantilla new_npc_behavior
define varios valores que se utilizan para la visualización y el movimiento.
MoveToWaitDuration
define el tiempo, en segundos, que espera tu personaje en un punto antes de moverse.Verse# How long to wait in seconds after the NPC navigates to a point before moving on. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5}, MaxValue:=option{10.0} MoveToWaitDuration:float = 5.0
La
DistanceFromSpawnPtToMove
define el rango de la diferencia aleatoria al punto de aparición para el movimiento del personaje.Verse# The negative min and absolute max x & y coordinate offset in centimeters to tell the NPC to move to @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.0} DistanceFromSpawnPtToMove:float = 1500.0
El valor lógico
ShowAIDebug
te permite alternar entre las formas de dibujo de depuración desde el editor.Verse# Whether to draw debug to the NPC channel when Verse Debug Draw is enabled in Island Settings. @editable: Categories:=array{my_first_npc_behavior_message_module.SettingsCategory} ShowAIDebug:logic = true
El float
AIDebugDrawTime
te permite especificar el tiempo para renderizar la ubicación de dibujo de depuración.~~(verse) # El tiempo, en segundos, para renderizar la ubicación del dibujo de depuración e imprimir el texto. # Se recomienda mantener la sincronización con MoveToWaitDuration. De otra manera, la impresión no se mostrará si se está mostrando un mensaje previo. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0 ~~
El float
LookAtDebugDrawDuration
te permite especificar el tiempo para renderizar la flecha de vista a la ubicación de dibujo de depuración.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5
El canal
DebugDrawNPC
define la instancia de dibujo de depuración y utiliza el canal que se define en la parte superior del archivo.Verse# How long in seconds to render the look at arrow's debug draw. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} LookAtDebugDrawDuration:float = 0.5
Finalmente,
VerticalOffsetToNPCHead
define esta diferencia desde la pelvis del PNJ hasta su cabeza para poder dibujar la flecha de vista de depuración. Sin esta diferencia, la flecha de vista de depuración se dibujaría desde el centro del PNJ.Verse# Used for specifying a point offset from the NPC pelvis to the head to draw the look at arrow from. VerticalOffsetToNPCHead<private>:float = 55.0
Hay dos funciones en la clase new_npc_behavior
que hacen dibujos de depuración. La función DrawDebugLocation()
dibuja un punto grande en una posición específica por una cantidad de tiempo LookAtDebugDrawDuration
.
# This function draws a box around a specified position for a finite amount of time.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLocation(Location:vector3):void =
DebugDrawNPC.DrawPoint( Location,
?Color := NamedColors.SteelBlue,
?Thickness := 100.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
?Duration := AIDebugDrawTime )
La función DrawDebugLookAt()
te permite visualizar a dónde está viendo un personaje mediante una flecha desde la cabeza del agente hasta su punto de visión.
# This function draws an arrow from the Agent's head to its look at point every half a second.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLookAt(Character:fort_character, LookAtPoint:vector3)<suspends>:void=
loop:
DebugDrawNPC.DrawArrow( Character.GetTransform().Translation + vector3{ Z := VerticalOffsetToNPCHead},
LookAtPoint,
?ArrowSize := 50.0,
?Color := NamedColors.Yellow,
?Thickness := 5.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
Cómo añadir tu personaje al nivel
Ahora que aprendimos de las secuencias de comandos de comportamiento de PNJ, es hora de crear un personaje que pueda usar la secuencia de comandos en la isla. El siguiente flujo de trabajo está diseñado para personajes tipo guardia, pero la secuencia de comandos de comportamiento de personajes seguirá funcionando para personajes personalizados y salvajes.
Crea una nueva definición de PNJ llamado MyFirstCharacterDefinition. Haz clic en tu nueva definición de personaje para abrir la pantalla Definición de PNJ.
En la pantalla Definición de PNJ, modifica las siguientes propiedades:
En Tipo de personaje PNJ, establece el tipo de guardia. La interfaz de guardia te permite acceder a funcionalidades específicas del personaje de guardia, como eventos en los que el guardia está alerta o tiene sospechas, y te permite contratar guardias para usarlos como aliados. Los guardias también pueden portar armas, mientras que los personajes de los tipos personalizado y salvaje actualmente no pueden. También puedes cambiar el nombre de tu personaje en la pestaña Nombre.
En Comportamiento del personaje PNJ, establece el comportamiento en Comportamiento de Verse. Luego, establece la secuencia de comandos de conducta del PNJ en
my_first_npc_behavior
. Tu personaje aún tendrá acceso a la funcionalidad de la interfaz de guardia, pero utilizará tu secuencia de comandos de Verse para decidir qué hacer duranteOnBegi
yOnEnd
.En la pestaña Modificadores, en Modificador de aparición de guardias, haz clic en la pestaña Estéticos para cambiar la apariencia cosmética de tu personaje. Puedes elegir entre una estética preexistente o activar Redestinación estética del personaje para utilizar un modelo personalizado. Ten en cuenta que solo los guardias y los personajes de tipo personalizado pueden utilizar la redestinación estética del personajes, mientras que los animales salvajes no pueden. Para obtener más información sobre los modificadores de personajes y cuáles se aplican a los distintos tipos de personajes, consulta la página Definición del personaje.
En la pestaña Modificadores, haz clic en Agregar elemento para añadir un nuevo modificador a tu personaje. Cambia el tipo del modificador nuevo a modificador de inventario. Ten en cuenta que solo los guardias pueden usar el modificador de inventario.
En el Modificador de inventario, haz clic en Agregar elemento para añadir un nuevo objeto al inventario de tu personaje. Establece la Definición de objeto a un arma, objeto o cualquier cosa que deba tener tu personaje. Puedes añadir varios objetos al inventario de tu personaje, y tus personajes utilizarán armas para luchar, objetos para curar, etc.
En la pestaña Modificadores, haz clic en Agregar elemento para añadir un nuevo modificador a tu personaje. Cambia el tipo del modificador nuevo a modificador de IU.
En el Modificador de IU, haz clic en la pestaña Nombre para cambiar el nombre de tu personaje. Se mostrará el nombre de tu personaje sobre su cabeza.
Guarda tu definición de PNJ. En el explorador de contenido, arrastra tu definición de PNJ al nivel. Esto creará, de forma automática, un nuevo generador de PNJ y le asignará tu definición de personaje.
Elige tu generador de PNJ. En el esquematizador, en Opciones de usuario:
Establece el Recuento de generación en 20. Necesitarás varios guardias para que te ayuden, así que diviértete y lleva esto al máximo.
Haz clic en Comenzar sesión en la barra de herramientas de UEFN para hacer una prueba de juego de tu nivel. Cuando hagas la prueba de juego, tu personaje debería generarse y patrullar entre su punto inicial y un punto aleatorio cercano, combatiendo a todos los enemigos en el camino.
Por tu cuenta
Al completar esta guía, aprendiste a crear una secuencia de comandos de comportamiento de PNJ para crear tus personajes personalizados. Si quieres leer más al respecto y aprender a crear tipos específicos de personajes y escenarios, revisa algunos de los tutoriales de comportamiento de PNJ a continuación.
Tutoriales que utilizan comportamiento de PNJ
Crear su propio médico PNJ
Utiliza el código de Verse para crear un PNJ médico personalizado.