Essa funcionalidade está em Acesso Antecipado. Você pode publicar uma ilha com essa funcionalidade, mas lembre-se de que, durante o período de Acesso Antecipado, alterações poderão danificar sua ilha e exigir sua intervenção ativa.
O gerador de PNJ requer a faixa vitalícia de vinculação no Sequencer. Não há como adicionar retroativamente essa faixa a uma sequência existente criada antes de 31.00. Você terá que publicar novamente qualquer ilha que use um gerador de PNJ em uma sequência depois de adicionar a faixa vitalícia de vinculação.
Para adicionar a faixa vitalícia de vinculação:
-
Clique no ícone + ao lado do Gerador de PNJ na lista de faixas.
-
Selecione Tempo de vida da vinculação no menu suspenso.
Use o Sequencer para criar animações de personagens personalizadas que podem ser reproduzidas de várias maneiras e em vários dispositivos, incluindo o Gerador de PNJs. Use eventos ou o painel Sequencer emparelhado com dispositivos Sequência Cinematográfica para definir e reproduzir animações com comportamentos padronizados ao longo de pontos selecionados da Trilha de Patrulha de IA.
Você pode importar e migrar animações personalizadas da Unreal Engine (UE) incluindo MetaHumans. Para fazer isso, talvez seja necessário redirecionar a malha do esqueleto para caber nos personagens PNJ, já que os personagens do Fortnite têm sua própria estrutura esquelética.
Personagens MetaHuman consomem muita memória. É melhor limitar o número de ativos MetaHuman usados.
Como animar PNJs no Sequencer
O Gerador de PNJs permite que você use sua criatividade nas interações do seu projeto, desde personagens interativos até cenas informativas. Crie animações personalizadas para o Gerador de PNJs com o Control Rig, ou importe as animações que comprou ou criou em outro software.
Você também pode usar o Control Rig de CD para animar PNJs com uma animação redirecionada ou gesto.
Saiba mais sobre os fluxos de trabalho de animação do Control Rig de CD na documentação da UE.
Para capturar animações com PNJs, siga as etapas abaixo.
-
Clique com o botão direito no Navegador de Conteúdo para criar uma Sequência de Nível.
-
Renomeie sua miniatura de Sequência de Nível.
-
Clique duas vezes na miniatura de Sequência de Nível para abrir o Editor de Sequência.
-
Clique em +Rastrear e selecione Ator para Sequencer > Gerador de PNJs. Isso adiciona o Gerador de PNJs à faixa de Sequência de Nível.
Você pode arrastar o Gerador de PNJs até a lista de faixas do Organizador para adicioná-lo à Sequência de Nível.
-
Clique no ícone + ao lado do Gerador de PNJs na lista de trilhas e selecione Control Rig > Classes do Control Rig > Control Rig de CD. Isso adiciona o esqueleto do PNJ à faixa, dando acesso a ossos individuais do esqueleto para manipular e registrar.
-
Selecione os ossos que deseja mover na janela de visualização, no Organizador de Animações ou no Sequencer e mova-os até uma posição inicial para a animação.
-
Defina o primeiro keyframe clicando no ícone + ao lado dos ossos que você moveu.
Se tiver uma animação criada ou comprada como um arquivo de sequência de animação FBX, poderá adicionar esses arquivos à faixa de animação de um Gerador de PNJs na linha do tempo clicando no ícone + ao lado do Gerador de PNJs e selecionando Animação > Arquivo de animação.
Continue movendo os ossos e defina novos keyframes na linha do tempo do Sequencer até que a animação seja concluída. Assim que a animação estiver concluída, reproduza-a no Sequencer para ter certeza de que o movimento atende às suas preferências.
Uma maneira simples de reproduzir uma animação de trás para frente é clicar com o botão direito do mouse no arquivo de animação na linha do tempo e selecionar Propriedades > Inverter.
Quando estiver satisfeito com os resultados, é hora de incorporar a animação à malha esquelética. Clique com o botão direito no Gerador de PNJs e selecione Incorporar sequência de animação.
Na hora de reproduzir a animação, certifique-se de que os membros da malha esquelética não passem por outras partes do corpo da malha esquelética.
Como gravar atributos comportamentais
Você também pode usar atributos comportamentais com o Gerador de PNJs. As opções de comportamento determinam a característica básica que o PNJ herda dos PNJs do Battle Royale do Fortnite. Essas características determinam se o PNJ atua como um guarda ou como um animal selvagem.
Para obter mais informações sobre como definir os atributos comportamentais com o Gerador de PNJs, consulte o documento sobre definição de personagem PNJ.
Depois de configurar esses atributos comportamentais, você pode aplicar keyframes às animações em uma Sequência de Nível e reproduzi-las em um dispositivo Sequência Cinematográfica durante o jogo. Ao contrário das etapas acima, você não precisa incorporar o desempenho no Control Rig, pois o comportamento é definido nas opções do Gerador de PNJs.
Você também pode usar a animação criada ou o comportamento herdado com o Nó de Trilha de Patrulha de IA e gravar o PNJ seguindo o caminho criado com o Ator de câmera cinematográfica.
Vinculações de PNJ geráveis e substituíveis
Agora, há mais duas maneiras de trazer um PNJ para suas sequências: a vinculação de PNJs geráveis e a vinculação de PNJs substituíveis. Essas vinculações são criadas a partir da definição de um Personagem PNJ.
Vinculação de PNJ gerável
Usando uma sequência cinematográfica, a Vinculação de PNJ geradora pode gerar um ator no mundo com base em uma definição de personagem PNJ. Esse PNJ pode ser animado no Sequencer da mesma forma que você faria com qualquer malha de esqueleto.
Para criar uma vinculação de PNJ gerável, basta arrastar a definição de personagem PNJ até o Sequencer:
Clique no gif para ampliar.
A vinculação gerada pode ser animada como qualquer outro Ator de malha esquelética. Por exemplo:
-
Clique em + Animação e selecione um gesto de dança para a definição de personagem PNJ.
Clique no gif para ampliar.
-
Mova seu indicador de reprodução mais para frente, arraste seu PNJ até uma nova posição e defina um novo keyframe. O PNJ agora se moverá do ponto A para o ponto B.
Clique no gif para ampliar.
Vinculação de PNJ substituível
A vinculação de PNJ substituível assumirá o controle de um PNJ gerado no mundo e o colocará em sua sequência. Eles podem então realizar a animação criada no Sequencer. Enquanto o PNJ está vinculado ao Sequencer, todo o comportamento, percepção e acompanhamento de caminho são pausados. Estes serão retomadas quando o PNJ for desvinculado.
O PNJ será colocado de volta na sua posição original quando não estiver mais vinculado.
Para criar uma vinculação de PNJ substituível, crie uma vinculação de PNJ gerável, clique com o botão direito na vinculação e escolha Converter vinculação de seleção para > Personagem PNJ substituível.
Clique no gif para ampliar.
Após a conversão, a faixa é substituída por uma faixa vitalícia de vinculação. Todas as alterações feitas na vinculação gerável são mantidas.
Para que o PNJ seja encontrado e vinculado durante a jogabilidade, você precisa Adicionar um modificador à definição de personagem PNJ: **os modificadores do Sequencer. Você pode adicioná-lo à sua definição de personagem PNJ usando o mesmo método que outros modificadores. Se você não adicionar esses modificadores, obterá uma falha de validação.
Clique no gif para ampliar.
Os modificadores do Sequencer têm uma propriedade de Identificador exclusivo. Essa propriedade é usada para localizar o PNJ gerado no jogo. O valor padrão é o nome da definição de personagem PNJ. Observe que se duas Definições de personagens NPC diferentes tiverem o mesmo Identificador exclusivo, ambas poderão ser vinculadas quando sua sequência for reproduzida no jogo.
Como reproduzir sequências no jogo
Para reproduzir sua sequência, use o dispositivo Sequência cinematográfica normalmente.
A vinculação gerada não precisa de mais configurações para reproduzir.
Uma vinculação substituível exige que você adicione um gerador de PNJ no seu mundo que use a definição de personagem PNJ. Se a vinculação substituível não encontrar um PNJ ao qual se vincular, você verá a seguinte linha no log do cliente:
LogFortNPCMovieSceneBindings: Aviso: não foi possível vincular a um pawn usando o Guarda de definição de personagem PNJ. Certifique-se de que haja pelo menos um gerado.
Se quiser gerar o PNJ ao mesmo tempo em que a sua sequência deve ser reproduzida. Considere usar uma vinculação gerável que pode ser gerada ou conecte o evento Ao gerar à função Reproduzir no dispositivo de sequência cinematográfica.
PNJs de Blueprints personalizados
A maioria dos botões de PNJ se vinculará como malhas do esqueleto, com exceção de uma definição de personagem PNJ que usa um Blueprint personalizado.

Isso vinculará o Blueprint e exporá componentes adicionais, como efeitos visuais, que podem ser modificados no Sequencer.
Aqui você pode ver que um sistema de partículas do Niagara foi modificado no Sequencer para fazer a cabeça do PNJ explodir:
Clique no gif para ampliar.
Restrições conhecidas
- A vinculação de PNJ substituível apenas pode ser usada com o dispositivo Sequência cinematográfica definido como Visibilidade: Todos. O uso de qualquer outra configuração de visibilidade falhará na validação.
- Tentar usar uma vinculação de PNJ substituível com PNJs animais selvagens modificáveis ou domáveis falhará na validação.
- A vinculação de PNJ substituível que usa uma definição de personagem PNJ não pode usar a opção Forçar Manter Estado na opção Finalizar Substituição do Estado de Conclusão. Tentar usar esta opção falhará na validação.
- Quando um PNJ estiver vinculado ao Sequencer, ele se encaixará no lugar. Além disso, problemas de latência podem causar um bug visual de elemento muito curto quando o PNJ estiver vinculado e desvinculado. Por isso, é altamente recomendável usar técnicas como gerar PNJ fora da tela, fades de tela, efeitos visuais ou faixa de visibilidade ao usar uma vinculação de PNJ substituível.
Como chamar animações com Verse
Expondo animações à linguagem Verse usando reflexão de ativos, você pode reproduzir animações personalizadas nos seus PNJs usando o módulo de animação.
Interface do controle de animação
A interface play_animation_controller
permite reproduzir uma animação em um personagem e pode ser recuperada com a função GetPlayAnimationController()
. Essa interface expõe duas funções que reproduzem animações. A função síncrona Play()
e a função assíncrona PlayAndAwait()
.
Ambas as funções aceitam os seguintes parâmetros:
Opção | Valor | Descrição |
---|---|---|
Animação | Selecione uma animação | A animação a ser reproduzida. É necessário especificar uma animação no arquivo Assets.digest.verse . |
Taxa de Reprodução | 1.0, Selecione uma taxa de reprodução | A velocidade de reprodução da animação. Um valor de 1.0 corresponde à velocidade padrão da animação |
BlendInTime | 0.0, Selecione um BlendInTime | O período de tempo para mesclar a animação anterior com a atual. |
BlendOutTime | 0.0, selecione um BlendOutTime | O período de tempo para combinar a animação atual com a próxima. |
StartPositionSeconds | 0.0, Selecione StartPositionSeconds | A posição em segundos da qual iniciar a reprodução da animação. |
Funções "Play" e "Await"
A função PlayAndAwait()
reproduz uma animação de forma assíncrona e retorna uma instância da enumeração play_animation_result
que contém três valores, Completed
, Interrupted
e Error
. Eles correspondem a uma animação concluída, uma animação interrompida e um erro ocorrido, respectivamente. Ao consultar essa enumeração, você pode executar códigos diferentes com base no resultado da animação.
AnimationResult := PlayAnimController.PlayAndAwait(MyAnimation)
case(AnimationResult):
play_animation_result.Completed => Print("Animação concluída!")
play_animation_result.Interrupted => Print("Animação interrompida.")
play_animation_result.Error => ("Ocorreu um erro durante a animação.")
Função "Play"
A função Play()
é executada de forma síncrona e retorna uma instância da classe playing_animation_instance
. A classe playing_animation_instance
permite consultar e manipular uma animação em andamento e contém os seguintes valores:
Valor | Explicação |
---|---|
GetState() | Retorna o estado atual da reprodução da animação em uma enumeração play_animation_state . |
Stop() | Interrompe a animação atual. |
CompletedEvent | Esse evento é acionado quando uma animação é concluída |
InterruptedEvent | Esse evento é acionado quando uma animação é interrompida. |
BlendedInEvent | Esse evento é acionado quando uma animação termina de ser mesclada. |
Evento BlendingOut | Este evento é acionado quando uma animação começa a se mesclar. |
Await() | Espera que a animação seja concluída ou interrompida. Notavelmente, ela retorna uma enumeração play_animation_result e é funcionalmente idêntica a chamar PlayAndAwait() . |
Você pode usar a função Play()
para manipular animações em andamento ou executar um código quando certas condições na sua animação são atendidas.
~~~(verse)
Reproduza uma animação de maneira síncrona e obtenha sua instância de animação
AnimationInstance := PlayAnimController.Play(MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Inscreva uma função que será executada quando a animação for concluída
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
Se a animação ainda estiver sendo reproduzida após um segundo, interrompa-a
if(AnimationState = play_animation_state.BlendingOut): AnimationInstance.Stop()
### Exemplo de reprodução de animação
O código abaixo mostra um exemplo de comportamento de um PNJ que usa o módulo de animação para reproduzir uma animação. Observe que quaisquer animações personalizadas que você queira reproduzir nos seus personagens devem primeiro ser expostas em Verse por meio da [reflexão de ativos](exposing-assets-to-verse-in-unreal-editor-for-fortnite) e devem aparecer no arquivo `Assets.digest.verse`. Neste exemplo, a animação MyAnimation está localizada no módulo Animations do personagem MyCharacter personalizado em Assets.digest.verse e, portanto, é chamada por meio de MyCharacter.Animations.MyCharacter.
~~~(verse)
using { /Fortnite.com/AI }
using { /Fortnite.com/Animation/PlayAnimation }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
basic_play_anim_example := class(npc_behavior):
# A velocidade de reprodução da animação.
@editable
PlayRate : float = 1.0
# Por quanto tempo mesclar a animação anterior
# na atual.
@editable
BlendInTime : float = 0.25
# Por quanto tempo mesclar a animação atual
# na seguinte.
@editable
BlendOutTime : float = 0.25
# A posição em segundos da qual começar a reproduzir
# a animação.
@editable
StartPositionSeconds : float = 0.0
# Quanto tempo esperar antes de reiniciar a animação.
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# Obtenha o controle de animação do PNJ
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
PlayAnimController := FortCharacter.GetPlayAnimationController[]
then:
AnimationResult := PlayAnimController.PlayAndAwait(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Imprima o resultado da execução da animação.
case(AnimationResult):
play_animation_result.Completed => Print("Animação concluída!")
play_animation_result.Interrupted => Print("Animação interrompida.")
play_animation_result.Error => ("Ocorreu um erro durante a animação.")
Sleep(SleepDuration)
# Reproduza uma animação de maneira síncrona e obtenha sua instância de animação.
AnimationInstance := PlayAnimController.Play(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Sleep(SleepDuration)
AnimationState := AnimationInstance.GetState()
# Imprime o estado atual da animação.
case(AnimationState):
play_animation_state.Playing => Print("Animação em reprodução!")
play_animation_state.BlendingIn => Print("Animação com mesclagem interna!")
play_animation_state.BlendingOut => Print("Animação com mesclagem externa!")
play_animation_state.Completed => Print("Animação concluída!")
play_animation_state.Stopped => Print("Animação parada!")
play_animation_state.Interrupted => Print("Animação interrompida!")
play_animation_state.Error => Print("Ocorreu um erro durante a animação")
else:
Print("Não foi possível obter o controle de animação")