Preciso de ajuda com a Movimentação de um Mob

Gente, estou precisando de ajuda para a movimentação de um mob, esta acontecendo o seguinte: quando ele esta sem nada para executar uma animação ele funciona como deveria, dando umas lagadas mas funciona o básico, ou seja, ele segue o player direitinho. Agora com a animação ele começa a seguir o player como se estivesse muito lagado ou como se estivesse pegando a ultima posição que o player esteve(Como vocês podem ver no Vídeo). Se puderem me ajudar para que ele funcione direito mesmo com animação seria muito grato!

Vídeo Demonstrando: https://youtu.be/zMRnjiGlThM

Script:
local humanoid = script.Parent.Humanoid

local debounce = true

local anm = script.Parent.Humanoid.Animation

local load = script.Parent.Humanoid:LoadAnimation(anm)

while wait() do
for i, v in pairs(game.Players:GetChildren())do
local character = game.Workspace:WaitForChild(v.Name)
humanoid:MoveTo(character.PrimaryPart.Position)

	load:Play()
	humanoid.MoveToFinished:Wait(1)
	load:Stop()
	
	script.Parent.Torso.Touched:Connect(function(hit)
		if debounce == true and hit.Parent.Name == character.Name then
			
			debounce = false 
			
			character.Humanoid.Health = character.Humanoid.Health - 25
			
			wait(1)
			
			debounce = true
		end
	end)
	
end

end

Print do Script:
image

É porque você está esperando o mob chegar na posição alvo para então passar ao próximo loop.

image

Se quiser usar a animação, existe uma propriedade chamada IsPlaying, que diz se a animação está rodando.

O script ficou assim (eu mudei alguns nomes, mas é questão de preferência):

local humanoid = script.Parent.Humanoid

local debounce = true

local anm = script.Parent.Humanoid.Animation

local load = script.Parent.Humanoid:LoadAnimation(anm)

while true do
	for _, player in pairs(game.Players:GetPlayers())do
		local character = player.Character  -- uma forma melhor de pegar o character
		
		if character then
			humanoid:MoveTo(character.PrimaryPart.Position)

            -- Rodando a animação caso ela esteja pausada
			if not load.IsPlaying then
				load:Play()
			end

            -- Escutando quando o humanoid chegar ao final e parando a animação (não congela o código)
			humanoid.MoveToFinished:Connect(function()
				load:Stop()
			end)

			script.Parent.Torso.Touched:Connect(function(hit)
				if debounce == true and hit.Parent.Name == character.Name then

					debounce = false 

					character.Humanoid.Health = character.Humanoid.Health - 25

					wait(1)

					debounce = true
				end
			end)
		end
	end
	
	wait()
end
1 Curtida

Vlw cara! Funcionou direitinho, resolveu alguns problemas que ainda nem tinha tentado resolver!
Mas fiquei com uma duvida no Script, qual é a função do ultimo “Wait()” junto com os “ENDs” no final?

		end
		end)
	end
end

wait()

end

Olá!
Os “ENDs” só estão aí para fechar os loops e os if’s.

O wait() faz a mesma coisa que seu script fazia:

while wait() do

end

-- São a memsa coisa

while true do

   wait()
end

O wait() sem nenhum argumento espera uma fração de segundo, isso quer dizer que o loop está rodando várias vezes dentro de um segundo.

Porém, usar wait() como condição não é uma boa, o loop tem chance de quebrar. Na verdade, wait() sem nenhum argumento por si só não é uma boa, mas não precisa se preocupar com isso agora.

-- Ruim (tem chance de qubrar)
while wait() do

end

-- Bom
while true do

   wait()
end

Aqui tem um post interessante sobre isso:

1 Curtida

Interessante… Vlw pela explicação!

1 Curtida