Il comportamento di un PNG è definito dal suo script di comportamento. Lo script di comportamento indica ai personaggi le azioni da compiere nel mondo, come ad esempio dove andare, cosa combattere e come interagire con gli altri personaggi. Personaggi come guardie e animali selvatici possono avere comportamenti aggiuntivi, come la percezione, la vigilanza e la capacità di essere assoldati o addomesticati.
Un Comportamento PNG è uno script Verse definito dall'utente che aggiunge funzionalità aggiuntive ai comportamenti esistenti di un personaggio PNG. L'API npc_behavior ti permette di definire il codice che viene eseguito quando un personaggio PNG si genera o si rimuove e puoi utilizzarlo per creare personaggi personalizzati come medici, negozianti o boss. I comportamenti dei PNG ereditano dalla classe abstract npc_behavior e richiedono l'importazione del modulo /Fortnite.com/AI per essere utilizzati.
Per eseguire uno script del comportamento del PNG, devi collegarlo a una Definizione personaggio PNG. Il modo in cui uno script del comportamento del PNG interagisce con la definizione di un personaggio dipende dal tipo di personaggio PNG. I PNG di tipo personalizzato hanno bisogno di uno script del comportamento per eseguire le azioni, mentre i PNG di tipo Guardia e Animali selvatici eseguono il loro comportamento predefinito se non ricevono uno script del comportamento. Per maggiori informazioni sulla creazione di una Definizione di personaggio PNG e sul diverso personaggio tipo, consulta la pagina Definizione personaggio.
Questo tutorial illustra le basi della creazione di uno script del comportamento per PNG e ti insegna come generare un PNG e farlo dirigere verso un obiettivo.
Creazione di un nuovo script del comportamento PNG
Segui questi passaggi per creare uno script del comportamento PNG in UEFN che genera una guardia e la pattuglia tra due punti.
Apri il tuo progetto in UEFN, poi nella barra del menu vai su Verse > Verse Explorer.
In Verse Explorer , fai clic con il tasto destro del mouse sul nome del tuo progetto e scegli Aggiungi nuovo file di Verse al progetto per aprire la finestra Crea script Verse.
Nella finestra Crea script Verse, fai clic su Comportamento PNG per selezionarlo come modello.
Assegna un nome al comportamento PNG modificando il testo nel campo Nome comportamento PNG con il nome del tuo dispositivo. In questo esempio, il dispositivo è denominato my_first_npc_behavior.
Fai clic su Crea per creare il file Verse.
In Verse Explorer fai due volte clic sul nome del file Verse per aprirlo in Visual Studio Code.
Salva il codice, compilalo e crea una nuova definizione di personaggio PNG. Per maggiori informazioni sulla creazione di un personaggio PNG, consulta la pagina Definizione personaggio.
Assegna il tuo script
my_first_behaviorcome comportamento Verse della tua nuova Definizione personaggio.Fai clic su Avvia sessione nella barra degli strumenti UEFN per eseguire il playtest del tuo livello. Quando esegui il playtest del tuo livello, i personaggi generati dal tuo Generatore di PNG devono scegliere un punto casuale vicino a quello di generazione e raggiungerlo. Quando raggiungono quel punto, devono aspettare un certo periodo di tempo e tornare al punto di partenza. Se hai abilitato Disegno debug Verse dal dispositivo Impostazioni isola, devi vedere disegnate delle frecce che mostrano il punto in cui il personaggio si sta mettendo a fuoco e dei riquadri che indicano il punto verso cui un personaggio si sta dirigendo.
Navigabile
Puoi utilizzare l'API Navigatable per dirigere i personaggi verso determinate destinazioni e per attività come pattugliare, sorvegliare un punto o seguire un altro personaggio. I PNG di tipo guardia possono eseguire queste azioni con i nodi Percorso di pattuglia IA, ma in questo caso utilizzerai il codice Verse per estendere questa funzionalità a qualsiasi tipo di personaggio ed evitare di inserire ulteriori dispositivi nel livello. L'interfaccia navigatable del personaggio ti permette di dirigere i personaggi verso una Navigation_target, che puoi creare da un agent o da una position. I PNG di tipo Personalizzato, Guardia e Animali selvatici possono tutti utilizzare l'interfaccia navigabile. Per ottenere l'interfaccia navigatable del personaggio dovrai prima ottenere un riferimento al suo fort_character, il che è possibile chiamando GetFortCharacter[].
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
Nell'esempio del modello, il codice sceglie una posizione da un offset casuale in cui il personaggio si genera e la salva in una variabile GoToPoint. Crea quindi un navigatoin_target sia dal GotToPoint che dal punto di generazione del personaggio.
# 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 := AIDebugDrawTime)
# Create a navigation target from these two positions that the navigation interface can use.
NavTargetStart := MakeNavigationTarget(GoToPoint)
La funzione NavigateTo() restituisce un enum navigation_result, che contiene informazioni sul raggiungimento di navigation_target da parte del personaggio. Puoi controllare il valore del tuo navigation_result per assegnare ai personaggi dei comportamenti basati sul raggiungimento o meno della destinazione.
# 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)Per maggiori informazioni su come i personaggi si spostano nel mondo e per visualizzare le diverse aree in cui i personaggi possono dirigersi, consulta la pagina Mesh di navigazione.
Concentrazione
Quando i personaggi compiono delle azioni, guardano dei target specifici. Il target specifico che un personaggio sta guardando è la concentrazione del personaggio. I personaggi si concentrano sul personaggio con cui stanno parlando, sul bersaglio che stanno attaccando o sulla posizione verso cui si stanno dirigendo. La focus_interface ti permette di identificare target specifici su cui i tuoi personaggi possono concentrarsi. I PNG di tipo Personalizzato, Guardia e Animali selvatici possono tutti utilizzare l'interfaccia di concentrazione. La funzione MaintainFocus() concentra il tuo personaggio su un target, che può essere una posizione vector3 o un agent. La focus_interface fa parte dell'interfaccia fort_character e puoi recuperarla utilizzando GetFocusInterface[].
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
Nell'esempio del modello, dopo che il personaggio inizia a tornare verso la posizione iniziale, il codice utilizza MaintainFocus() per forzare la concentrazione sul precedente navigation_target. Questo fa sì che il personaggio cammini all'indietro e guardi dietro di sé, mentre torna al punto di partenza.
# 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)
Leashable
Quando le guardie sorvegliano un obiettivo, devi assicurarti che rimangano in un'area intorno all'obiettivo e che non si allontanino troppo. L'interfaccia fort_leashable è un'interfaccia specifica per i PNG di tipo Guardia che ti permette di specificare un raggio intorno a un target dal quale le guardie non potranno allontanarsi per pattugliare. Puoi legare al guinzaglio le guardie in posizioni specifiche o ad altri PNG e le guardie aggiorneranno la loro posizione per rimanere vicino al target del guinzaglio, se questo si muove. Tieni presente che attualmente i personaggi PNG di tipo Personalizzato e Animali selvatici non possono utilizzare l'interfaccia fort_leashable. Puoi recuperare l'interfaccia fort_leashable utilizzando GetFortLeashable[].
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Puoi legare al guinzaglio le guardie alle posizioni o ad altri agenti, ad esempio per sorvegliare un punto di cattura o proteggere un PNG importante. Ogni guinzaglio ha un InnerRadius e un OuterRadius, che specificano rispettivamente di quanti centimetri le guardie devono stare vicine o lontane dal loro target del guinzaglio. L'esempio di modello non utilizza l'interfaccia leashable, ma potrebbe esserti utile per creare i tuoi PNG di 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()
Debug disegno
All'inizio del file, questo modello definisce un canale dedicato al tracciamento debug. Puoi utilizzare il Tracciamento debug per visualizzare determinati dati di gioco a scopo di test. Ad esempio, puoi visualizzare il raggio di visibilità del tuo personaggio o disegnare una forma intorno al luogo verso cui sta viaggiando. Per visualizzare queste forme di debug, è necessario abilitare Disegno debug Verse dalla scheda Impostazioni isola e non appariranno nelle esperienze pubblicate. Il canale nella parte superiore del file ti permette di nascondere, mostrare o cancellare tutte le forme di debug in un canale utilizzando un unico metodo.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
La classe modello new_npc_behavior definisce diversi valori utilizzati per la visualizzazione e il movimento.
Il parametro
MoveToWaitDurationdefinisce quanto tempo in secondi il personaggio attende in un punto prima di muoversi.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.0La
DistanceFromSpawnPtToMovedefinisce l'intervallo di offset casuale dal punto di generazione per lo spostamento del tuo personaggio.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.0Il valore logico
ShowAIDebugti permette di attivare il disegno delle forme di debug dall'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 = trueIl float
AIDebugDrawTimeti permette di specificare la quantità di tempo di rendering della posizione di disegno di debug.Verse# How long in seconds to render the debug draw location and print text. # It is recommended to keep this in sync with MoveToWaitDuration otherwise the print will not be shown if a previous message is displayed. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0Il float
LookAtDebugDrawDurationti permette di identificare la durata del rendering del disegno di debug della freccia di osservazione.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5Il canale
DebugDrawNPCdefinisce l'istanza di disegno di debug e utilizza il canale definito all'inizio del file.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.5Infine, il parametro
VerticalOffsetToNPCHeaddefinisce l'offset dal bacino del PNG alla testa da cui disegnare la freccia di osservazione di debug. Senza questo offset, la freccia di osservazione di debug verrebbe tracciata dal centro del PNG.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
Due funzioni della classe modello new_npc_behavior disegnano forme di debug. La funzione DrawDebugLocation() disegna un grande punto in una posizione specifica per un periodo di tempo 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 funzione DrawDebugLookAt() ti permette di visualizzare dove sta guardando un personaggio disegnando una freccia dalla testa dell'agente al suo punto di osservazione.
# 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,
Aggiunta del tuo personaggio al livello
Ora che hai imparato a conoscere il BehaviorScript dei PNG, è il momento di creare un personaggio e di utilizzare lo script su un'isola. Il seguente flusso di lavoro è stato pensato per i personaggi di tipo Guardia, ma lo script comportamento PNG funzionerà comunque per i personaggi di tipo Personalizzato e Animali selvatici.
Crea una nuova definizione del personaggio PNG denominata MyFirstCharacterDefinition. Fai clic sulla nuova definizione del personaggio per aprire la schermata Definizione personaggio.
Nella schermata Definizione personaggio , modifica le seguenti proprietà:
In Tipo di personaggio PNG, imposta il tipo su Guard. L'interfaccia della guardia ti permette di accedere alle funzionalità specifiche del personaggio, come gli eventi per quando la guardia è allertata o sospettosa e ti permette di assoldare guardie da utilizzare come alleati. Le guardie possono anche equipaggiare armi, mentre i personaggi di tipo Personalizzato e Animali selvatici attualmente non possono. Puoi anche modificare il nome del tuo personaggio nella scheda Nome.
In Comportamento personaggio PNG, imposta Comportamento su Comportamento Verse. Quindi imposta lo Script comportamento NPG su
my_first_npc_behavior. Il tuo personaggio avrà ancora accesso alle funzionalità dell'interfaccia di guardia, ma utilizzerà il tuo script Verse per decidere come procedere duranteOnBegineOnEnd.Nella scheda Modificatori, sotto Modificatore di generazione guardia, fai clic sulla scheda Estetica per modificare l'aspetto estetico del tuo personaggio. Puoi scegliere un'estetica preesistente o attivare il Retargeting estetica del personaggio per utilizzare un modello personalizzato. Tieni presente che solo le guardie e i personaggi di tipo personalizzato possono utilizzare il retargeting estetica del personaggio, mentre gli animali selvatici non possono farlo. Per maggiori informazioni sui modificatori dei personaggi e su quali si applicano ai diversi tipi di personaggi, consulta la pagina Definizione personaggio PNG.
Nella scheda Modificatori fai clic su Aggiungi elemento per aggiungere un nuovo modificatore al tuo personaggio. Modifica il tipo del nuovo modificatore in Modificatore inventario. Tieni presente che solo le guardie possono utilizzare il modificatore inventario.
In Modificatore di inventario, fai clic su Aggiungi Elemento per aggiungere un nuovo oggetto all'inventario del tuo personaggio. Imposta la Definizione dell'oggetto su un'arma, un oggetto o qualsiasi altra cosa che il tuo personaggio dovrebbe avere. Puoi aggiungere più oggetti all'inventario del tuo personaggio e i tuoi personaggi utilizzeranno armi per combattere, oggetti per guarire ecc.
Nella scheda Modificatori fai clic su Aggiungi elemento per aggiungere un nuovo modificatore al tuo personaggio. Modifica il tipo del nuovo modificatore in Modificatore UI.
In Modificatore UI, fai clic sulla scheda Nome per modificare il nome del tuo personaggio. Il nome del tuo personaggio verrà visualizzato sopra la sua testa.
Salva la definizione del tuo personaggio PNG. In Esplora contenuti, trascina la definizione del tuo personaggio PNG nel livello. Ciò creerà automaticamente un nuovo Generatore di PNG e gli assegnerà la definizione del tuo personaggio.
Seleziona il tuo Generatore di PNG. Nell'Outliner, sotto Opzioni utente:
Imposta Contatore di generazione su 20. Avrai bisogno di alcune guardie che ti aiutino, quindi divertiti e potenzia questo risultato.
Fai clic su Avvia sessione nella barra degli strumenti UEFN per eseguire il playtest del tuo livello. Durante il playtest, il tuo personaggio deve generarsi e pattugliare tra il punto di partenza e un punto casuale vicino ad esso, affrontando eventuali nemici lungo il percorso.
Ora tocca a te
Dopo aver completato questa guida, hai imparato a creare uno script comportamento PNG per creare i tuoi personaggi personalizzati. Per saperne di più e per imparare a creare tipi specifici di personaggi e scenari, dai un'occhiata ai tutorial sul comportamento dei PNG elencati di seguito.