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 comportamento de um PNJ (personagem não jogável) é definido por seu script de comportamento. O script de comportamento é o que diz aos personagens quais ações realizar no mundo, por exemplo, para onde ir, contra o que lutar e como interagir com outros personagens. Personagens como guardas e animais selvagens podem ter comportamentos adicionais, como percepção, estado de alerta e capacidade de serem contratados ou domesticados.
Um Comportamento de PNJ é um código Verse definido pelo usuário que adiciona funcionalidade extra aos comportamentos existentes de um PNJ. A API npc_behavior
permite definir o código executado quando um PNJ surge ou desaparece, e você pode usá-la para criar personagens personalizados como médicos, comerciantes ou chefes. Os comportamentos de PNJ herdam da classe abstrata npc_behavior
e requerem a importação do módulo /Fortnite.com/AI
módulo a ser usado.
Para executar um script de comportamento de PNJ, você precisa anexá-lo a uma Definição de personagem PNJ. A forma como um script de comportamento de PNJ interage com uma definição de personagem depende do tipo de PNJ. Os PNJs do tipo personalizado precisam de um script de comportamento para realizar ações, enquanto PNJs do tipo guarda e animais selvagens executarão seu comportamento padrão se não receberem um script de comportamento. Para obter mais informações sobre como criar uma definição de personagem PNJ e os diferentes tipos de personagens, consulte a página Definição de personagem.
Este tutorial aborda os fundamentos da criação de um script de comportamento de PNJ e ensina como gerar um PNJ e orientá-lo até um objetivo.
Como criar um novo script de comportamento de PNJ
Siga estas etapas para criar um script de comportamento de PNJ no UEFN que gera um guarda que faz o patrulhamento entre dois pontos.
Abra seu projeto no UEFN e, na barra de menus, acesse Verse > Explorador do Verse.
No Explorador do Verse, clique com o botão direito do mouse no nome do seu projeto e escolha Adicionar novo arquivo Verse ao projeto para abrir a janela Criar código Verse.
Na janela "Criar código Verse", clique em Comportamento de PNJ para selecioná-lo como seu modelo.
Dê um nome ao comportamento, alterando o texto no campo Nome do comportamento de PNJ para o nome do seu dispositivo. Neste exemplo, o dispositivo se chama my_first_npc_behavior.
Clique em Criar para criar o arquivo do Verse.
No Explorador do Verse, clique duas vezes no nome do arquivo Verse para abri-lo no Visual Studio Code.
Salve o código, compile-o e crie uma nova definição de PNJ. Para obter mais informações sobre como criar um personagem PNJ, consulte a página Definição de personagem.
Atribua seu script
my_first_behavior
como o comportamento de Verse da sua nova definição de personagem.Clique em Iniciar Sessão na barra de ferramentas do UEFN para testar o nível. Quando você testar o nível, os personagens gerados pelo Gerador de PNJs deverão escolher um ponto aleatório próximo ao momento em que surgiram e navegar até ele. Ao chegarem a esse ponto, deverão esperar um certo tempo e retornar ao ponto de partida. Se você tiver Debug Draw em Verse habilitada no dispositivo Configurações da Ilha, setas desenhadas deverão aparecer mostrando o foco do personagem, bem como caixas mostrando o ponto para onde ele está navegando.
Navigatable
A API Navigatable
pode ser usada para direcionar personagens a determinados destinos e para ações como patrulhar, proteger um ponto ou seguir outro personagem. PNJs do tipo guarda podem fazer isso com nós de Trilha de Patrulha de IA. Porém, aqui, você usará o código Verse para estender essa funcionalidade a qualquer tipo de personagem e evitar colocar dispositivos adicionais no nível. A interface navigatable
do personagem permite que você oriente personagens até um navigation_target
, que pode ser criado a partir de um agent
ou position
. PNJs do tipo personalizado, guarda e animais selvagens podem usar a interface `navigatable`. Para obter a interface navigatable
do personagem, você primeiro precisa obter uma referência ao seu fort_character
, o que pode ser feito chamando GetFortCharacter[]
.
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
No exemplo do modelo, o código escolhe uma posição em um deslocamento aleatório em que o personagem é gerado e o salva em uma variável GoToPoint
. Em seguida, cria um navigation_target
a partir de GoToPoint
e também do ponto de geração do personagem.
# 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)
A função NavigateTo()
retorna um enum navigation_result
, que contém informações sobre se o personagem atingiu seu navigation_target
. Você pode verificar o valor do seu navigation_result
para fornecer comportamentos ao personagem com base em se ele alcançou o alvo ou não.
# 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 obter mais informações sobre como o personagem navega pelo mundo e visualizar as diferentes áreas pelas quais o personagem pode navegar, consulte a página Malha de navegação.
Foco
Quando os personagens realizam ações, eles observam alvos específicos. O alvo específico que um personagem observa é o foco desse personagem. Os personagens se concentram no personagem com quem estão falando, no alvo que estão atacando ou na posição para onde estão se dirigindo. A focus_interface
permite definir alvos específicos nos quais seus personagens focarão. PNJs do tipo personalizado, guarda e animais selvagens podem usar a interface de foco. A função MaintainFocus()
faz seu personagem focar em um destino, que pode ser uma posição de vector3
ou um agent
. A focus_interface
faz parte da interface fort_character
, e você pode recuperá-la usando GetFocusInterface[]
.
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
No exemplo do modelo, depois que o personagem começa a retornar à posição inicial, o código usa MaintainFocus()
para forçá-lo a focar no navigation_target
anterior. Assim, o personagem anda para trás e observa atrás de si enquanto retorna ao ponto inicial.
# 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 os guardas protegem um objetivo, convém ter certeza de que eles permaneçam em uma área ao redor desse objetivo e não se afastem muito dele. A interface fort_leashable
, específica para PNJs do tipo guarda, permite especificar um raio em torno de um alvo que os guardas não patrulharão. Você pode restringir os guardas em posições específicas ou outros PNJs, e eles atualizarão suas posições para permanecerem próximos do alvo de restrição caso este se mova. Observe que, atualmente, PNJs do tipo personalizado e animais selvagens não podem usar a interface fort_leashable
. Você pode recuperar a interface fort_leashable
usando GetFortLeashable[]
.
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Você pode restringir guardas a posições ou outros agentes, como ao proteger um ponto de captura ou um PNJ importante. Cada restrição tem um InnerRadius
e um OuterRadius
, que especificam quão próximo e quão distante, em centímetros, os guardas devem ficar do alvo do domínio, respectivamente. O exemplo do modelo não usa a interface leashable
, mas ela pode ser útil ao criar seus próprios PNJs guardas.
# 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()
Desenho de depuração
Na parte superior do arquivo, esse modelo define um canal dedicado ao desenho de depuração. Você pode usar o Debug Draw para visualizar determinados dados do jogo para fins de teste. Por exemplo, pode visualizar o alcance de visibilidade de um personagem ou traçar uma forma ao redor do local para onde ele está se dirigindo. A opção Debug Draw em Verse deve estar habilitada na aba Depuração nas Configurações da Ilha para que se possa visualizar essas formas de depuração, e elas não aparecerão em experiências publicadas. O canal na parte superior do arquivo permite ocultar, exibir ou limpar todas as figuras de depuração em um canal usando um único método.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
A classe de modelo new_npc_behavior
define vários valores usados para visualização e movimento.
MoveToWaitDuration
define quanto tempo, em segundos, seu personagem espera em um ponto antes de se mover.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 o intervalo do deslocamento aleatório do ponto de geração para o personagem se mover.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
O valor lógico
ShowAIDebug
permite alternar o traçado de formas de depuração no 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
O float
AIDebugDrawTime
permite especificar a quantidade de tempo para renderizar o local do desenho de depuração.~~(verse) # O tempo em segundos pelo qual renderizar a posição do desenho de depuração e imprimir o texto. # Recomenda-se manter este elemento em sincronia com MoveToWaitDuration, ou a impressão não será exibida se uma mensagem anterior for exibida. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0 ~~
O float
LookAtDebugDrawDuration
permite especificar por quanto tempo renderizar o Debug Draw da seta de observação.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5
O canal
DebugDrawNPC
define a instância do Debug Draw e usa o canal definido na parte superior do arquivo.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 fim,
VerticalOffsetToPNJHead
define esse deslocamento, da pélvis à cabeça do PNJ, para criar a seta de observação de depuração. Sem esse deslocamento, a seta de observação de depuração seria criada a partir do centro do 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
Duas funções na classe de modelo new_npc_behavior
traçam formas de depuração. A função DrawDebugLocation()
traça um ponto grande em uma posição especificada por um período de tempo LookAtDedugDrawDuration
.
# 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 )
A função DrawDebugLookAt()
permite visualizar para onde um personagem está olhando ao traçar uma seta partindo da cabeça do agente até seu ponto de observação.
# 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,
Como adicionar seu personagem ao nível
Agora que você aprendeu sobre o script de comportamento de PNJ, é hora de criar um personagem e usar esse script em uma ilha. O fluxo de trabalho a seguir foi projetado para personagens do tipo guarda, mas o script de comportamento de PNJ também funcionará para personagens do tipo personalizado e animais selvagens.
Crie uma nova definição de personagem PNJ chamada MyFirstCharacterDefinition. Clique na sua nova definição de personagem para abrir a tela Definição de Personagem.
Na tela Definição de Personagem, modifique as seguintes propriedades:
Em Tipo de personagem PNJ, defina Tipo como Guarda. A interface de guarda permite acessar funcionalidades específicas do personagem, como eventos para quando o guarda entra em estado de alerta ou suspeita e permite que você contrate guardas como aliados. Guardas também podem equipar armas, enquanto os personagens do tipo personalizado e animais selvagens não. Você também pode alterar o nome do personagem na aba Nome.
Em Comportamento do personagem PNJ, defina Comportamento como Comportamento de Verse. Em seguida, defina o Script de comportamento de PNJ como
my_first_npc_behavior
. Seu personagem ainda terá acesso à funcionalidade na interface de guarda, mas usará seu script Verse para decidir o que fazer duranteOnBegin
eOnEnd
.Na aba Modificadores, em Modificadores de geração de guardas, clique na aba Cosmético para alterar a aparência cosmética do seu personagem. Você pode escolher um elemento cosmético preexistente ou habilitar o Redirecionamento cosmético de personagem para usar um modelo personalizado. Observe que apenas guardas e personagens do tipo personalizado podem usar o redirecionamento cosmético de personagem, mas o tipo animais selvagens não. Para obter mais informações sobre os modificadores de personagens e quais se aplicam a diferentes tipos de personagens, consulte a página Definição de personagem PNJ.
Na aba Modificadores, clique em Adicionar elemento para adicionar um novo modificador ao seu personagem. Altere seu tipo para Modificador de Inventário. Observe que apenas guardas podem usar o modificador de inventário.
Em Modificador de Inventário, clique em Adicionar elemento para adicionar um novo item ao inventário do personagem. Marque a Definição do item como uma arma, um item ou qualquer outra coisa que seu personagem deva ter. Você pode adicionar vários itens ao inventário do personagem, e os personagens usarão armas para lutar, itens para curar, etc.
Na aba Modificadores, clique em Adicionar elemento para adicionar um novo modificador ao seu personagem. Altere o tipo dos novos modificadores para Modificador de IU.
Em Modificador de IU, clique na aba Nome para alterar o nome do seu personagem. O nome do personagem será exibido acima de sua cabeça.
Salve a definição de personagem PNJ. No Navegador de Conteúdo, arraste a definição do seu personagem PNJ até o nível. Assim, um novo Gerador de PNJs será criado automaticamente e será atribuída a ele a definição do personagem.
Selecione o Gerador de PNJs. No Organizador, em Opções do Usuário:
Defina Contagem de gerações como 20. Convém ter alguns guardas para ajudar você. Então divirta-se e aproveite ao máximo.
Clique em Iniciar sessão na barra de ferramentas do UEFN para testar o nível. Durante o teste, seu personagem deve surgir e patrulhar entre o ponto inicial e um ponto aleatório próximo a ele e também enfrentar todos os inimigos ao longo do caminho.
Por si só
Tendo concluído este guia, você aprendeu a criar um script de comportamento de PNJ para criar seus próprios personagens personalizados. Para ler mais e aprender a criar tipos específicos de personagens e cenários, confira alguns dos tutoriais sobre comportamento de PNJ listados abaixo.
Tutoriais que usam comportamento de PNJ
Como criar seu próprio PNJ médico
Use o código Verse para criar um PNJ médico personalizado.