Criando um script no Roblox para o NPC encontrar um caminho sozinho até um alvo

Olá galera! Hoje vou compartilhar uma coisa muito maneira. Imagina que você está criando seu jogo e pensa: “Humm… Eu poderia colocar inimigos que perseguem meu personagem”, ou então “Humm… Aquele NPC poderia ir até ali sozinho”. Bom, com esse script você pode realizar estas e muito mais ideias, para deixar seu jogo muito maneiro.

O que é o Path Finding (ou Encontrar Caminho):
Este algoritmo já existe dentro do Roblox, e serve para que um determinado NPC consiga chegar a um determinado alvo (NPC, ‘player’ ou ponto qualquer) no mapa, isso acontece de forma automática e mesmo se houver algum obstáculo na frente ele tenta driblar esse obstáculo.

Então vamos a um passo a passo:

Primeiros passos (requisitos):
Depois de já ter criado um projeto em branco ou ter aberto um projeto existente no Roblox Studio, a primeira coisa a ser fazer é adicionar um NPC.

Untitled

  • Para o boneco chegar em algum lugar, é claro, precisamos desse lugar. Então vamos criar um simples objeto e renomeamos ele para “alvo”. Ele simboliza aonde o NPC quer chegar.

Bora pro script:
Depois de criar e adicionar os objeto necessários, vamos colocar a mão na massa e criar um script para achar o caminho.

  • Primeiro, devemos adicionar um script ao objeto que representa o NPC. Então renomeamos ele para “EncontrarCaminho”.

Untitled(2)

  • Agora guardamos em uma variável o serviço que vai nos ajudar a encontrar o caminho.

  • Buscamos os objeto que representam o NPC e sua RootPart.

  • Guardamos a posição do alvo no cenário dentro de uma variável.

Untitled(5)

  • Criamos o objeto que representa o caminho e calculamos o caminho até o alvo.

  • Esse objeto vai gerar um conjunto de waypoints (Um waypoint é basicamente uma posição no mapa), ou seja, uma sequência de posições que representa um caminho. Temos que guardar essas posições em uma variável.

  • Agora a mágica, precisamos de um loop para percorrer essa posições, e pedir pro nosso NPC se mover até elas, seguindo o caminho até o alvo.

    Para cada waypoint chamamos o método de mover o Humanoid até um ponto do mapa, nesse caso estamos pedindo pro NPC se mover até a posição de cada waypoint

Assim terminamos os script do Humanoid, vamos testar? Para isso basta clicar neste botao

Sem_ttulo

O script final fica assim:

--Buscando Servio para encontrar caminho
local ServicoParaEncontrarCaminho = game:GetService("PathfindingService")

--faz um referencia para o modelo do NPC e a raiz dentro dele
local Humanoid = script.Parent.Humanoid
local Root = script.Parent:FindFirstChild("HumanoidRootPart")
--retorna a posição do alvo
local alvo = game.Workspace.Alvo.Position

--cria o objeto de caminho
local caminho = ServicoParaEncontrarCaminho:CreatePath()

--calcula o caminho
caminho:ComputeAsync(Root.Position, alvo)

--guarda em uma variável os waypoints gerados que representam o caminho
local waypoints = caminho:GetWaypoints()

--percorre os waypoints
for i, waypoint in ipairs(waypoints) do
	Humanoid:MoveTo(waypoint.Position)

	Humanoid.MoveToFinished:Wait()
end

E aí, funcionou?

Poxa! É até legal ver o boneco andando sozinho, mas já imaginou ver o boneco desviando de obstáculos, pulando, etc.? Vem ver essa parte do tutorial.

  • Primeiramente adicione obstáculos

  • Mãos na massa novamente, agora vamos adaptar o script para ele pular. Temos que adicionar dentro no nosso for que usamos pra mover o seguinte.

  • O código ficará assim:

    --Buscando Servio para encontrar caminho
    local ServicoParaEncontrarCaminho = game:GetService("PathfindingService")
    
    --faz um referencia para o modelo do NPC e a raiz dentro dele
    local Humanoid = script.Parent.Humanoid
    local Root = script.Parent:FindFirstChild("HumanoidRootPart")
    --retorna a posição do alvo
    local alvo = game.Workspace.Alvo.Position
    
    --cria o objeto de caminho
    local caminho = ServicoParaEncontrarCaminho:CreatePath()
    
    --calcula o caminho
    caminho:ComputeAsync(Root.Position, alvo)
    
    --guarda em uma variável os waypoints gerados que representam o caminho
    local waypoints = caminho:GetWaypoints()
    
    --percorre os waypoints
    for i, waypoint in ipairs(waypoints) do
    	Humanoid:MoveTo(waypoint.Position)
    	
    	--verifica se ha o obstaculo pulável, se tiver ele pula
    	if waypoint.Action == Enum.PathWaypointAction.Jump then
    		Humanoid.Jump = true
    	end
    
    	Humanoid.MoveToFinished:Wait()
    end
    

Lembrando que, se o boneco não se mexer depois dessas alterações, os obstáculos são muito difíceis para um simples Humanoid!

E aí, curtiu o post? Comenta aqui se você conseguiu.

Esse tipo de script é de nível avançado, então se você não conseguiu fazer de primeira, não se preocupe, repita novamente prestando atenção nos detalhes. Use sua criatividade pra criar e mudar os objetivos, obstáculos e tudo mais!

5 Curtidas

Não vejo a hora de botar isso no meu jogo!

Gostei do tutorial, esta muito bem explicado