Questa funzione è disponibile in Accesso anticipato. Puoi pubblicare un'isola con questa funzionalità, tenendo presente che, durante il periodo di accesso anticipato, eventuali modifiche potrebbero influenzarne il funzionamento, rendendo necessario il tuo intervento.
I generatori di PNG richiedono una traccia di durata dell'associazione nel sequencer. Non c'è modo di aggiungere retroattivamente questa traccia alle sequenze esistenti create prima di 31.00. Devi ripubblicare qualsiasi isola che utilizza un generatore di PNG in una sequenza dopo aver aggiunto la traccia di durata dell'associazione.
Per aggiungere una traccia di durata dell'associazione:
-
Fai clic sull'icona + accanto al Generatore di PNG nella lista Tracce.
-
Seleziona Durata dell'associazione dal menu a tendina.
Utilizza il Sequencer per creare animazioni di personaggi personalizzate riproducibili in svariati modi e su vari dispositivi, tra cui il dispositivo Generatore di PNG. Utilizza eventi o il Sequencer unitamente a dispositivi per Sequenze cinematiche per impostare e riprodurre animazioni con comportamenti modellati lungo punti di selezione del Percorso di pattuglia IA.
Puoi importare e migrare le animazioni personalizzate da Unreal Engine (UE) tra cui MetaHuman. Per eseguire questa operazione, potresti reindirizzare la mesh scheletrica per adattarla ai personaggi PNG dato che i personaggi di Fortnite hanno la loro struttura scheletrica.
I personaggi MetaHuman richiedono molta memoria. È meglio limitare il numero di asset MetaHuman impiegati.
Animazione di PNG nel Sequencer
Il dispositivo Generatore di PNG apre una gamma di possibilità creative per il gameplay del tuo progetto, dai personaggi interattivi alle cutscene informative. Crea animazioni personalizzate per il Generatore di PNG con Control Rig oppure puoi importare le animazioni acquistate o create con altri programmi.
Puoi anche utilizzare FK Control Rig per animare i PNG con un'animazione reindirizzata o un'emote.
Scopri di più sui flussi di lavoro di animazione con FK Control Rig nella documentazione di UE.
Per riprendere le animazioni con i personaggi PNG, segui gli step sottostanti.
-
Fai clic con il tasto destro del mouse in Esplora contenuti per creare una Sequenza livelli.
-
Rinomina la miniatura della tua Sequenza livelli.
-
Fai due volte clic sulla miniatura della Sequenza livelli per aprire l'Editor del Sequencer.
-
Fai clic su +Pista poi seleziona Attore su Sequencer > Generatore di PNG. In questo modo, aggiungerai il dispositivo Generatore di PNG alla pista della Sequenza livelli.
Puoi trascinare il dispositivo Generatore di PNG nella lista tracce dall'Outliner per aggiungerlo alla Sequenza livelli.
-
Fai clic sull'icona + accanto al dispositivo Generatore di PNG nella lista piste e seleziona Control Rig > Classi di Control Rig > FK Control Rig. Vedrai aggiunto lo scheletro PNG alla pista, che dà accesso a singole ossa dello scheletro da manipolare e registrare.
-
Seleziona le ossa che vuoi spostare dalla Viewport, dall'Outliner anim o dal Sequencer e spostale in una posizione di partenza per la tua animazione.
-
Imposta il primo keyframe facendo clic sull'icona + accanto alle ossa che hai spostato.
Se hai un'animazione che hai creato o acquistato come file di sequenza animata FBX, puoi aggiungere quei file alla traccia di animazione del dispositivo Generatore di PNG nella linea temporale facendo clic sull'icona + accanto al Generatore di PNG e selezionando Animazione > File animazione.
Continua a spostare le ossa e a impostare nuovi keyframe nella linea temporale del Sequencer fino a quando la tua animazione non sarà completa. Una volta che l'animazione è terminata, riproducila nel Sequencer per verificare che il movimento risponde alle tue preferenze.
Un sistema semplice per riprodurre un'animazione all'indietro è fare clic con il tasto destro del mouse sul file dell'animazione nella linea temporale e selezionare Proprietà > Reverse.
Quando sei soddisfatto dei risultati, è il momento di eseguire il baking dell'animazione sulla mesh scheletrica. Fai clic con il tasto destro del mouse sul Generatore di PNG e seleziona Esegui baking della Sequenza animata.
Verifica che gli arti della tua mesh scheletrica non attraversino altre parti del corpo della mesh quando riproduci l'animazione.
Registrazione di attributi comportamentali
Puoi utilizzare attributi comportamentali anche con il dispositivo Generatore di PNG. Le opzioni comportamentali determinano le caratteristiche basilari che il PNG eredita dai PNG di Battaglia reale di Fortnite. Queste caratteristiche determinano se il PNG agisca come una guardia o come un animale selvatico.
Per maggiori informazioni su come impostare gli attributi comportamentali con il dispositivo Generatore di PNG, consulta il documento Definizione del personaggio PNG.
Una volta configurati questi attributi comportamentali, puoi applicare i keyframe alle animazioni in una Sequenza livelli e riprodurle su un dispositivo di Sequenze cinematiche durante il gameplay. A differenza degli step precedenti, non è necessario eseguire il baking delle prestazioni nel Control Rig poiché il comportamento è impostato nelle opzioni del dispositivo di Generatore di PNG.
Puoi anche usare l'animazione creata o il comportamento ereditato con il dispositivo del Nodo Percorso di pattuglia IA e registrare il PNG seguendo il percorso creato con l'Attore da macchina da presa.
Associazioni di PNG generabili e sostituibili
Adesso ci sono altri due modi per portare un PNG nelle tue sequenze: l'associazione PNG generabile e l'associazione PNG sostituibile. Tali associazioni vengono create dalle definizioni di personaggio PNG.
Associazione di PNG generabile
Utilizzando una sequenza cinematografica, l'associazione di PNG generabile può generare un attore nel mondo in base a una definizione di personaggio PNG. Questo PNG può essere animato in Sequencer allo stesso modo di qualsiasi mesh scheletrica.
Per creare un’associazione di PNG generabile, trascina semplicemente la definizione di personaggio PNG in Sequencer:
Fai clic sulla gif per ingrandirla.
L'associazione generabile può essere animata come qualsiasi altro attore con mesh scheletrica. Ad esempio:
-
Fai clic su + Animazione e seleziona un'emote di danza per la definizione di personaggio PNG.
Fai clic sulla gif per ingrandirla.
-
Sposta la testina di riproduzione più avanti, trascina il PNG in una nuova posizione e imposta un nuovo keyframe. Il PNG si sposterà ora dal punto A al punto B.
Fai clic sulla gif per ingrandirla.
Associazione di PNG sostituibile
L'associazione di PNG sostituibile prenderà il controllo di un PNG generato nel mondo e lo inserirà nella tua sequenza. Possono quindi eseguire animazioni create in Sequencer. Mentre il PNG è vincolato dal sequencer, tutto il comportamento, la percezione e il percorso che segue sono messi in pausa. Sono ripristinati quando il PNG non è vincolato.
Il PNG sarà ricollocato nella sua posizione originale quando non sarà più vincolato.
Per creare un'associazione di PNG sostituibile, crea un'associazione di PNG generabile, fai clic con il tasto destro del mouse sull'associazione e scegli Converti l'associazione di selezione in > Personaggio PNG sostituibile.
Fai clic sulla gif per ingrandirla.
Dopo la conversione, la traccia viene sostituita con una traccia di durata dell'associazione. Tutte le modifiche apportate all'associazione generabile sono mantenute.
Affinché il PNG sia trovato e associato durante il gameplay, devi aggiungere un modificatore alla Definizione di personaggio PNG: il modificatore di sequencer. Puoi aggiungerlo alla tua Definizione di personaggio PNG utilizzando lo stesso metodo degli altri modificatori. Se non aggiungerai questo modificatore, otterrai un errore di convalida.
Fai clic sulla gif per ingrandirla.
Il modificatore di sequencer ha una proprietà di Identificatore univoco. Questa proprietà viene utilizzata per individuare il PNG generato nel gioco. Il valore predefinito è il nome della Definizione di personaggio PNG. Tieni presente che se due Definizioni di personaggio PNG diverse hanno lo stesso Identificatore univoco, entrambe possono essere associate quando la sequenza viene riprodotta nel gioco.
Sequenze di riproduzione nel gioco
Per riprodurre le tue sequenze, utilizza normalmente il dispositivo di sequenza cinematografica.
Un'associazione generabile non richiede ulteriori impostazioni per essere riprodotta.
Un'associazione sostituibile richiede l'aggiunta di un Generatore di PNG nel tuo mondo che utilizza la tua Definizione di personaggio PNG. Se l'associazione sostituibile non riuscirà a trovare un PNG a cui associarsi, vedrai la seguente riga nel registro del client:
LogFortNPCMovieSceneBindings: Attenzione: impossibile associare una Pedina utilizzando la Guardia di definizione di personaggio PNG. Assicurati che ne venga generato almeno uno.
Se vuoi generare il PNG nello stesso momento in cui la tua sequenza deve essere riprodotta. Prendi in considerazione l'utilizzo di un'associazione generabile o collega la funzione A evento generato alla funzione Riproduci sul dispositivo della sequenza cinematografica.
PNG Blueprint personalizzati
La maggior parte dei tipi di PNG si assocerà come mesh scheletrica, ad eccezione di una definizione di personaggio PNG che utilizza una Blueprint personalizzata.
Questa operazione assocerà la Blueprint ed esporrà i componenti aggiuntivi, come VFX, che potranno poi essere modificati nel sequencer.
Qui puoi vedere un sistema particellare Niagara che è stato modificato in Sequencer per far esplodere la testa del PNG:
Fai clic sulla gif per ingrandirla.
Restrizioni note
- Le associazioni di PNG sostituibili possono essere utilizzate solo col dispositivo di sequenza cinematografica impostato su Visibilità: tutti. L'utilizzo di qualsiasi altra impostazione di Visibilità non consentirà la convalida.
- Il tentativo di utilizzare un'associazione di PNG sostituibile con PNG di animali selvatici cavalcabili o addomesticabili non consentirà la convalida.
- Le associazioni di PNG sostituibili che utilizzano una Definizione di personaggio PNG non possono utilizzare l'opzione Forza Mantieni Stato sull'opzione utente Termina override stato di completamento. Il tentativo di utilizzare questa opzione non consentirà la convalida.
- Quando un PNG è associato al sequencer, scatta in posizione. Inoltre, i problemi di latenza possono causare bug visivi molto brevi quando il PNG è associato e non associato. Per questo motivo, si consiglia vivamente di utilizzare tecniche come la generazione del PNG fuori schermo, le dissolvenze dello schermo, i VFX o la traccia di visibilità quando si utilizza un'associazione di PNG sostituibile.
Chiamare le animazioni con Verse
Esponendo le animazioni a Verse tramite la riflessione dell'asset, puoi riprodurre animazioni personalizzate sui tuoi PNG utilizzando il modulo animazioni.
Interfaccia controller animazioni
L'interfaccia play_animation_controller ti permette di riprodurre un'animazione su un personaggio e di recuperarla con la funzione GetPlayAnimationController(). Questa interfaccia espone due funzioni che riproducono le animazioni. La funzione sincrona Play() e la funzione asincrona PlayAndAwait().
Entrambe le funzioni accettano i seguenti parametri:
| Opzione | Valore | Descrizione |
|---|---|---|
| Animazione | Seleziona un'animazione | Animazione da riprodurre. Deve specificare un'animazione nel file . |
| PlayRate | 1.0, Seleziona una Velocità di riproduzione | Velocità di riproduzione dell'animazione. Un valore di 1.0 corrisponde alla velocità predefinita dell'animazione |
| BlendInTime | 0.0, Seleziona un BlendInTime | Intervallo di tempo per fondere l'animazione precedente con quella attuale. |
| BlendOutTime | 0.0, Seleziona un BlendOutTime | Intervallo di tempo per fondere l'animazione attuale con quella successiva. |
| StartPositionSeconds | 0.0, Seleziona StartPositionSeconds | Posizione in secondi da cui far partire l'animazione. |
Funzione riproduci e attendi
La funzione PlayAndAwait() riproduce un'animazione asincronicamente e restituisce un'istanza dell'enumplay_animation_result che contiene tre valori: Completed, Interrupted e Error. Questi corrispondono rispettivamente a un'animazione completa, un'animazione interrotta e a un errore occorso. Interrogando questo enum, puoi eseguire un codice differente basato sul risultato della tua animazione.
AnimationResult := PlayAnimController.PlayAndAwait(MyAnimation)
case(AnimationResult):
play_animation_result.Completed => Print("Animation Completed!")
play_animation_result.Interrupted => Print("Animation Interrupted.")
play_animation_result.Error => ("Error Occurred during animation.")
Funzione riproduci
La funzione Play() è eseguita sincronicamente e restituisce un'istanza della classe playing_animation_instance. La classe playing_animation_instance ti permette di interrogare e manipolare un'animazione in corso e contiene i seguenti valori:
| Valore | Spiegazione |
|---|---|
| GetState() | Questa funzione restituisce lo stato corrente della riproduzione dell'animazione in un enum play_animation_state. |
| Stop() | Questa funzione interrompe l'animazione corrente. |
| CompletedEvent | Questo evento è attivato quando un'animazione è terminata |
| InterruptedEvent | Questo evento è attivato quando un'animazione è interrotta. |
| BlendedInEvent | Questo evento è attivato quando un'animazione ha terminato la fusione in uscita. |
| BlendingOutEvent | Questo evento è attivato quando un'animazione inizia a fondersi in uscita. |
| Await() | Questa funzione attende che l'animazione sia terminata o interrotta. In particolare, restituisce un enum play_animation_result ed è identica a livello di funzioni alla chiamata di PlayAndAwait(). |
Puoi utilizzare la funzione Play() per manipolare animazioni in corso o eseguire codice quando sono soddisfatte determinate condizioni nella tua animazione.
# Riproduci un'animazione sincronicamente e determina la sua istanza di animazione
AnimationInstance := PlayAnimController.Play(MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Registrati a una funzione che viene eseguita al termine dell'animazione
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
# Se l'animazione è ancora in riproduzione dopo un secondo, interrompi l'animazione
if(AnimationState = play_animation_state.BlendingOut):
AnimationInstance.Stop()
Riproduci esempio di animazione
Il codice sottostante mostra un esempio di comportamento PNG che utilizza il modulo di animazione per riprodurre un'animazione. Tieni presente che qualunque animazione personalizzata desideri riprodurre sui tuoi personaggi deve prima essere esposta a Verse attraverso il riflesso dell'asset e deve apparire nel file . In questo esempio, l'animazione MyAnimation è posizionata nel modulo Animazioni del personaggio personalizzato MyCharacter in Assets.digest.verse e così viene chiamata tramite 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):
# La velocità di riproduzione dell'animazione.
@editable
PlayRate : float = 1.0
# Durata della fusione in entrata dell'animazione precedente con
# quella attuale.
@editable
BlendInTime : float = 0.25
# Durata della fusione in uscita dell'animazione attuale con
# quella successiva.
@editable
BlendOutTime : float = 0.25
# La posizione in secondi da cui iniziare la riproduzione
# dell'animazione.
@editable
StartPositionSeconds : float = 0.0
# Tempo di attesa prima di far ripartire l'animazione.
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# Determina il controller dell'animazione del Personaggio PNG
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
PlayAnimController := FortCharacter.GetPlayAnimationController[]
then:
AnimationResult := PlayAnimController.PlayAndAwait(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Stampa il risultato dell'esecuzione dell'animazione.
case(AnimationResult):
play_animation_result.Completed => Print("Animation Completed!")
play_animation_result.Interrupted => Print("Animation Interrupted.")
play_animation_result.Error => ("Error Occurred during animation.")
Sleep(SleepDuration)
# Riproduci un'animazione sincronicamente e determina la sua istanza di animazione.
AnimationInstance := PlayAnimController.Play(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Sleep(SleepDuration)
AnimationState := AnimationInstance.GetState()
# Stampa lo stato attuale dell'animazione.
case(AnimationState):
play_animation_state.Playing => Print("Animazione in corso!")
play_animation_state.BlendingIn => Print("Animazione in fusione in entrata!")
play_animation_state.BlendingOut => Print("Animazione in fusione in uscita!")
play_animation_state.Completed => Print("Animazione completata!")
play_animation_state.Stopped => Print("Animation arrestata!")
play_animation_state.Interrupted => Print("Animation interrotta!")
play_animation_state.Error => Print("Si è verificato un errore durante l'animazione")
else:
Print("Impossibile ottenere il controller dell'animazione")