How to make NPC get out of player FOV?

title is self-explanatory, here is what I have so far

NPC Script:

local ServerStorage = game:GetService("ServerStorage")
local PlayerService = game:GetService("Players")
local Debris = game:GetService("Debris")
local SimplePath = require(ServerStorage.SimplePath)

-- Define npc
local Dummy = script.Parent
local humrp = Dummy.HumanoidRootPart

-- Define Events
local HideEvent = workspace.Hide
local EscapeEvent = workspace.Escape

-- Get Path or smth
local Path = SimplePath.new(Dummy)

HideEvent.Event:Connect(function()
	local camera = workspace.CurrentCamera
	
	local worldPoint = script.Parent.Torso.Position
	local vector, onScreen = camera:WorldToScreenPoint(worldPoint)

	local screenPoint = Vector2.new(vector.X, vector.Y)
	local player2DPosition = UDim2.new(screenPoint.X / camera.ViewportSize.X, 0, screenPoint.Y / camera.ViewportSize.Y, 0)
	local depth = vector.Z
	
	if screenPoint.X < camera.ViewportSize.X * 0.5 then
		-- Player is on the left side, set X_Scale to 0
		local edgePosition = UDim2.new(0, 0, player2DPosition.Y.Scale, player2DPosition.Y.Offset)
		Path:Run(edgePosition)
	else
		-- Player is on the right side, set X_Scale to 1
		local edgePosition = UDim2.new(1, 0, player2DPosition.Y.Scale, player2DPosition.Y.Offset)
		Path:Run(edgePosition)
	end
	
	--[[local length = 500
	local unitRay = camera:ScreenPointToRay(vector.X, vector.Y)
	local ray = Ray.new(unitRay.Origin, unitRay.Direction * length)]]
	

end)

EscapeEvent.Event:Connect(function()
	--- Nothing as of now
end)

StarterCharacterScript (normal script):

local npc = game.workspace:WaitForChild("Dummy")
local character = script.Parent

local HideEvent = workspace.Hide
local EscapeEvent = workspace.Escape

while task.wait() do	
	local npcToCharacter = (npc.Head.Position - character.Head.Position).Unit
	local npcLook = character.Head.CFrame.LookVector

	local dotProduct = npcToCharacter:Dot(npcLook)

	if dotProduct > .3 and dotProduct < 0.55 then
		--- When being looked at
		HideEvent:Fire()
		workspace.Baseplate.Color = Color3.new(1, 0.52549, 0.52549)
	elseif dotProduct > .55 then
		EscapeEvent:Fire()
		workspace.Baseplate.Color = Color3.new(1, 0, 0)
	else
		npc.AI.Enabled = true
		workspace.Baseplate.Color = Color3.new(0.631373, 1, 0.54902)
	end
end	
1 Like