Answered by
6 years ago Edited 6 years ago
I wrote an answer on it here
As you said, you want WorldToScreenPoint
or whatever, but you also want to use GetPartsObscuringTarget
.
Edit
What you actually want is "Character facing towards part", not "Player looking at part"
You can do this with vectors:
01 | player = game:GetService( "Players" ).LocalPlayer |
02 | character = player.Character or player.CharacterAdded:wait() |
03 | torso = character:WaitForChild( "Humanoid" ).RootPart |
04 | target = workspace:WaitForChild( "LookyLou" ) |
08 | function dotProduct(a, b) |
09 | return a.x * b.x + a.y * b.y + a.z * b.z |
13 | function getAngle(a, b) |
14 | return math.acos(dotProduct(a, b) / (a.magnitude * b.magnitude)) |
18 | function drawVector(position, angle, magnitude, name) |
20 | vectors [ name ] :Destroy() |
23 | local p = Instance.new( "Part" ) |
25 | p.Size = Vector 3. new( 0.1 , 0.1 , magnitude) |
26 | p.CFrame = CFrame.new(position + angle * magnitude / 2 , position + angle) |
34 | game:GetService( "RunService" ).RenderStepped:Connect( function () |
35 | local torsoAngle = torso.CFrame.lookVector |
36 | local targetVector = torso.Position - target.Position |
37 | local flatTorsoAngle = Vector 3. new(torsoAngle.x, 0 , torsoAngle.z) |
38 | local flatTargetVector = Vector 3. new(targetVector.x, 0 , targetVector.z) |
39 | drawVector(torso.Position - Vector 3. new( 0 , 2.5 , 0 ), flatTorsoAngle, flatTargetVector.magnitude, "torso" ) |
40 | drawVector(target.Position, flatTargetVector.unit, flatTargetVector.magnitude, "target" ) |
42 | local angle = math.deg(getAngle(-flatTorsoAngle, flatTargetVector)) |
44 | target.BrickColor = BrickColor.new( "Bright red" ) |
46 | target.BrickColor = BrickColor.new( "Bright green" ) |
Put a brick in the workspace called "LookyLou" -- it will go red when you're within 40 degrees of facing it.