Tutorial de Roblox: Como detectar se um jogador está olhando para uma parte

Isso pode vir a ser útil para jogos de terror, por exemplo: Um inimigo em que o jogador não pode olhar.

Para fazer isso, vamos usar a seguinte função:

	-- Verificar se uma parte está dentro da visão de outra parte
function PartIsInFieldOfView(Object, Observer)
	local Vector = Observer.CFrame.LookVector
	local Dot = Vector:Dot(Object.Position)
	return Dot > 0
end

O que essa função faz é calcular o produto escalar entre o LookVector do observador e a posição do objeto. Se o resultado for maior do que 0, quer dizer que o objeto está dentro do campo de visão do observador, caso seja negativo, ele está fora do campo de visão do jogador.

(Recomendo ver o vídeo sobre vetores do canal Cria Jogo: https://www.youtube.com/watch?v=ajtVU35hw_4)

Exemplo: Uma parte que fica vermelha quando algum jogador está observando e vermelha quando não está sendo observada por ninguém.

-- Variáveis
local Part = script.Parent
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")

-- Funções

	-- Verificar se uma parte está dentro da visão de outra parte
function PartIsInFieldOfView(Object, Observer)
	local Vector = Observer.CFrame.LookVector
	local Dot = Vector:Dot(Object.Position)
	return Dot > 0
end

	-- Loop para verificar se a parte está no campo de visão de algum jogador
function Update()
	local inFov = false
	
	for i, player in pairs(Players:GetPlayers()) do
		local Character = player.Character
		local Root = Character and Character.HumanoidRootPart
		
		if Character and Root then
			inFov = PartIsInFieldOfView(Part, Root) and true or inFov
		end
		
		-- Pintar a parte de vermelho caso ela não esteja sendo observada
		if inFov then
			Part.Color = Color3.fromRGB(255, 0, 0)
		else
			Part.Color = Color3.fromRGB(0, 0, 255)
		end
	end
	
end

-- Eventos
RunService.Stepped:Connect(Update)

Resultado:

(Não Observando)

(Observando)

3 Curtidas

Obrigado pelo tutorial, @alamo564.

Recomendações:

  • Defina ou coloque um link para o que a sigla FOV significa, para quem nunca ouviu falar em Field of View, ler FOV diretamente pode ser confuso.
  • Defina ou coloque um link para alguma definição de produto escalar (dica, tem um vídeo no Cria Jogo sobre vetores).

Em todo caso, o artigo usa boa linguagem e contém um ótimo exemplo, você vai receber o badge de Assistente! :raised_hands:

2 Curtidas

Sei que faz tempo, mas muto obrigado por esse tutorial. Me ajudou muito e tem várias utilidades. Além de ser simples e direto ao ponto.

1 Curtida