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 provocar problemas en tu isla y requerir tu intervención activa.
El comportamiento de un personaje PNJ está definido por su secuencia de comandos de comportamiento. La secuencia de comandos de comportamiento es lo que indica a los personajes qué acciones deben realizar en el mundo, como dónde ir, contra qué luchar y cómo interactuar con otros personajes. Los personajes, como los guardias y los animales salvajes, pueden tener otros comportamientos, como la percepción, el estado de alerta y la capacidad de contratarse o domesticarse.
Un comportamiento de PNJ es una secuencia de comandos de Verse que define el usuario para añadir más funcionalidad a los comportamientos existentes de un personaje PNJ. La API de npc_behavior
te permite definir el código que se ejecuta cuando un personaje PNJ aparece o desaparece, y puedes utilizarla para crear personajes personalizados como médicos, comerciantes o jefes. Los comportamientos de los PNJ heredan de la clase abstracta npc_behavior
y requieren importar el módulo /Fortnite.com/IA
para utilizarlo.
Para ejecutar una secuencia de comandos de comportamiento de PNJ, tienes que adjuntarlo a una definición de personaje PNJ. La forma en que una secuencia de comandos de comportamiento de PNJ interactúa con la definición de un personaje depende del tipo de personaje PNJ. Los PNJ de tipo personalizado necesitan una secuencia de comandos de comportamiento para realizar acciones, mientras que los PNJ de tipo guardia y animal salvaje ejecutarán su comportamiento predeterminado si no se les da una secuencia de comandos de comportamiento. Para obtener más información sobre la creación de una definición de personaje PNJ y los distintos tipos de personaje, consulta la página Definición de personaje.
Con este tutorial repasarás los conceptos básicos de la creación de una secuencia de comandos de comportamiento de PNJ y aprenderás cómo generar un PNJ y dirigirlo a 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 que genere un guardia y lo haga patrullar entre dos puntos.
Abre tu proyecto en UEFN y, a continuación, en la barra de menús, ve a Verse > Explorador de Verse.
En Explorador de Verse, haz clic con el botón derecho del ratón en el nombre de tu proyecto y selecciona 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.
Para darle un nombre a tu comportamiento de PNJ, cambia el texto del campo Nombre del comportamiento de PNJ por el nombre de tu dispositivo. En este ejemplo, el dispositivo se llama 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 de tu 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 obtener más información sobre cómo crear un personaje PNJ, consulta la página Definición de personaje.
Asigna tu secuencia de comandos
my_first_behavior
como el comportamiento Verse de tu nueva definición de personaje.Haz clic en **Iniciar sesión** en la barra de herramientas de UEFN para probar tu nivel. Cuando pruebes tu nivel, los personajes que aparezcan desde tu generador de PNJ tendrán que elegir un punto aleatorio cerca de donde aparecen y desplazarse hasta él. Cuando lleguen a ese punto, esperarán un tiempo determinado y volverán a desplazarse hasta el punto de partida. Si has habilitado la opción Dibujo de depuración de Verse activado desde el dispositivo Configuración de la isla, verás flechas dibujadas que muestran hacia dónde se está enfocando el personaje, así como cuadros que muestran el punto hacia el que se está desplazando un personaje.
Navigatable
Puedes utilizar la API Navigatable
para dirigir a los personajes hacia determinados objetivos y que realicen acciones como patrullar, vigilar un punto o seguir a otro personaje. Los PNJ de tipo guardia pueden hacerlo con los **nodos de la ruta de patrulla de la IA**, pero aquí usarás código Verse para extender esta funcionalidad a cualquier tipo de personaje y evitar colocar más dispositivos en el nivel. La interfaz navigatable
del personaje permite a los personajes desplazarse hasta un objetivo de desplazamiento navigation_target
, que puedes crear a partir de un agent
o una position
. Los PNJ de tipo personalizado, guardia y animal salvaje pueden utilizar la interfaz Navigatable. Para obtener la interfaz navigatable
del personaje primero tienes que obtener una referencia a su fort_character
, para lo cual puedes llamar a GetFortCharacter[]
.
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
En el ejemplo de la plantilla, el código elige una posición de un desplazamiento aleatorio donde aparece el personaje y la guarda en una variable GoToPoint
. A continuación, crea un navigation_target
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 enumerador navigation_result
, que contiene información sobre si el personaje ha alcanzado su navigation_target
. Puedes comprobar el valor de tu navigation_result
para dar a los personajes comportamientos que se basen en si han alcanzado 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 obtener más información sobre cómo se desplazan los personajes por el mundo y visualizar las distintas zonas a las que pueden dirigirse, consulta la página Malla de desplazamiento.
Enfoque
Cuando los personajes realizan acciones, miran a objetivos específicos. El objetivo específico al que mira un personaje es su enfoque. Los personajes se enfocan en el personaje con el que hablan, el objetivo al que atacan o la posición hacia la que se desplazan. La interfaz focus_interface
te permite especificar objetivos concretos para que tus personajes se enfoquen en ellos. Los PNJ de tipo personalizado, guardia y animal salvaje pueden utilizar la interfaz de enfoque. La función MaintainFocus()
enfoca a tu personaje en un objetivo, que puede ser una posición vector3
o un agent
. focus_interface
es parte de la interfaz fort_character
, y puedes recuperarla mediante GetFocusInterface[]
.
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
En el ejemplo de la plantilla, después de que el personaje comience a desplazarse de vuelta a la posición inicial, el código utiliza MaintainFocus()
para forzarlo a centrarse en el navigation_target
anterior. Esto hace que el personaje retroceda y mire hacia atrás mientras vuelve a su punto de partida.
# 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)
Separación
Cuando los guardias vigilan un objetivo, debes asegurarte de que permanecen en una zona alrededor del objetivo y no se alejan demasiado. La interfaz fort_leashable
es una interfaz específica para los PNJ de tipo guardia que te permite especificar un radio alrededor de un objetivo fuera del cual los guardias no patrullarán. Puedes encadenar guardias a posiciones específicas o a otros PNJ, y los guardias actualizarán su posición para permanecer cerca de su objetivo de separación si este se mueve. Ten en cuenta que actualmente los personajes PNJ de tipo personalizado y animal salvaje no pueden utilizar la interfaz fort_leashable
. Puedes recuperar la interfaz fort_leashable
mediante GetFortLeashable[]
.
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Puedes encadenar a los guardias a posiciones o a otros agentes, por ejemplo, para vigilar un punto de captura o proteger a un PNJ importante. Cada distancia de separación tiene un InnerRadius
y OuterRadius
, que especifican lo cerca y lo lejos en centímetros que los guardias deben permanecer de su objetivo de separación respectivamente. El ejemplo de la plantilla no utiliza la interfaz leashable
, pero puede resultarte útil a la hora de crear tus propios PNJ de guardias.
# 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()
Dibujo de depuración
En la parte superior del archivo, esta plantilla define un canal dedicado para el dibujo de depuración. Puedes utilizar el dibujado de depuración para visualizar ciertos datos del juego para realizar pruebas. Por ejemplo, puedes visualizar el rango de visibilidad de tu personaje o dibujar una forma alrededor del lugar al que viaja. El dibujado de depuración de Verse debe habilitarse desde la pestaña Depuración en Ajustes de la isla para visualizar estas formas de depuración, y no aparecerán en las experiencias publicadas. El canal situado en la parte superior del archivo permite ocultar, mostrar o borrar todas las formas de depuración de un canal mediante un único método.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
La clase de plantilla new_npc_behavior
define varios valores que se utilizan para la visualización y el movimiento.
MoveToWaitDuration
define cuánto tiempo en segundos 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
DistanceFromSpawnPtToMove
define el rango del desfase aleatorio desde el punto de aparición para que tu personaje se mueva.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 el dibujo de formas 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 la cantidad de tiempo con la que representar la ubicación del dibujado de depuración.~~(verse) # Indica cuánto tiempo, en segundos, se debe representar la ubicación del dibujado de depuración e imprimir el texto. # Se recomienda mantener esto sincronizado con MoveToWaitDuration. De lo contrario, la impresión no se mostrará si se muestra un mensaje anterior. @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 durante cuánto tiempo se representará el dibujo de depuración de la visión de la flecha.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 dibujado de depuración y utiliza el canal definir 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
Por último,
VerticalOffsetToNPCHead
define este desplazamiento desde la pelvis del PNJ hasta la cabeza desde la que dibujar la flecha de visión de depuración. Sin este desfase, la flecha de visión 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
Dos funciones en las formas de dibujo de depuración de la clase `new_npc_behavior
. La función DrawDebugLocation()
dibuja un punto grande en una posición especificada durante un período 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 hacia dónde mira un personaje al dibujar 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 has aprendido sobre la secuencia de comandos de comportamiento del PNJ, es hora de crear un personaje y usar la secuencia de comandos en una isla. El siguiente proceso de trabajo está diseñado para personajes de tipo guardia, pero la secuencia de comandos de comportamiento de PNJ seguirá funcionando para personajes personalizados y de tipo animal salvaje.
Crea una nueva definición de personaje de PNJ con el nombre MyFirstCharacterDefinition. Haz clic en tu nueva definición de personaje para abrir la pantalla Definición de personaje.
En la pantalla Definición de personaje, modifica las siguientes propiedades:
En Tipo de personaje PNJ, define Tipo como Guardia. La interfaz de guardia te permite acceder a funciones de personajes específicas de los guardias, como eventos para cuando el guardia recibe una alerta o sospecha, y te permite contratar guardias para usarlos como aliados. Los guardias también pueden equipar armas, mientras que los personajes personalizados y de tipo animal salvaje no pueden actualmente. También puedes cambiar el nombre de tu personaje en la pestaña Nombre.
En Comportamiento de personaje PNJ, define Comportamiento como Comportamiento de Verse. A continuación, configura la secuencia de comandos de comportamiento de PNJ como
my_first_npc_behavior
. Tu personaje seguirá teniendo acceso a la funcionalidad desde la interfaz de guardia, pero usará tu secuencia de comandos de Verse para decidir qué hacer duranteOnBegin
yOnEnd
.En la pestaña Modificadores, en Modificador de aparición de guardia, haz clic en la pestaña Estética para cambiar la estética de la aparición de tu personaje. Puedes elegir entre un cosmético preexistente o habilitar el Reposicionamiento cosmético del personaje para usar un modelo personalizado. Ten en cuenta que solo los guardias y los personajes de tipo personalizado pueden usar el reposicionamiento cosmético de los personajes, al contrario que los animales salvajes. Para obtener más información sobre los modificadores de personaje y cuáles se aplican a los distintos tipos de personaje, consulta la página Definición de personaje.
En la pestaña Modificadores, haz clic en Añadir elemento para añadir un nuevo modificador a tu personaje. Cambia el tipo del nuevo modificador a Modificador de inventario. Ten en cuenta que solo los guardias pueden usar el modificador del inventario.
En Modificador de inventario, haz clic en Añadir elemento para agregar un nuevo elemento al inventario de tu personaje. Establece la Definición del elemento en un arma, objeto, consumible o cualquier otra cosa que tu personaje deba tener. Puedes añadir varios elementos al inventario de tu personaje, y tus personajes usarán armas para luchar, objetos para curarse, etc.
En la pestaña Modificadores, haz clic en Añadir elemento para añadir un nuevo modificador a tu personaje. Cambia el tipo del nuevo modificador a Modificador de IU.
En Modificador de IU, haz clic en la pestaña Nombre para cambiar el nombre de tu personaje. El nombre de tu personaje aparecerá sobre su cabeza.
Guarda tu definición de PNJ. En el explorador de contenido, arrastra tu definición de PNJ al nivel. Esto creará automáticamente un nuevo generador de PNJ y le asignará tu definición de personaje.
Selecciona tu generador de PNJ. En el esquematizador, en Opciones de usuario:
Establece Límite de generación en 20. Necesitarás que algunos guardias te ayuden, así que diviértete y lleva este valor al máximo.
Haz clic en Iniciar sesión en la barra de herramientas de UEFN para probar tu nivel. Cuando hagas la prueba, tu personaje debería aparecer y patrullar entre su punto de partida y un punto aleatorio cercano y enfrentarse a cualquier enemigo en el camino.
Por tu cuenta
Al completar esta guía, habrás aprendido cómo crear una secuencia de comandos de comportamiento de PNJ para crear tus propios personajes personalizados. Para obtener más información y aprender a crear tipos específicos de personajes y situaciones, consulta algunos de los tutoriales de comportamiento de PNJ que se enumeran a continuación.
Tutoriales que utilizan el comportamiento de PNJ
Cómo crear tu propio PNJ médico
Utiliza el código de Verse para crear un PNJ médico personalizado.