I’ve got a script that changes the camera offset of the player for a better first person view, thats moves the camera forward a little, everything works and stuff, but whenever the player gets close to a wall they can see through it.
I’ve got a script hat kinda works here but when the player looks directly down, the raycast doesnt sense it, and changes it back to the normal cameraOffset.
local Character = script.Parent
local Humanoid = Character:FindFirstChild("Humanoid")
local Camera = game.Workspace.CurrentCamera
local Head = Character:FindFirstChild("Head")
local HumRootPart = Character:WaitForChild("HumanoidRootPart")
Humanoid.CameraOffset = Vector3.new(0, 0, -0.8)
local OriginalCameraOffset = Humanoid.CameraOffset
local function TweenCamera(SetPosition)
local TweenService = game:GetService("TweenService")
local Info = TweenInfo.new(0.2, Enum.EasingStyle.Exponential)
local Goal = {CameraOffset = SetPosition}
local Tween = TweenService:Create(Humanoid, Info, Goal)
Tween:Play()
end
game:GetService("RunService").RenderStepped:Connect(function()
local IgnoreParts = {}
for _, part in pairs(game.Workspace:GetChildren()) do
if (part:IsA("BasePart") or part:IsA("MeshPart")) and part.Transparency == 1 then
table.insert(IgnoreParts, part)
end
end
for _, part in pairs(Character:GetDescendants()) do
if part:IsA("BasePart") or part:IsA("MeshPart") then
table.insert(IgnoreParts, part)
end
end
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = IgnoreParts
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local Raycast = game.Workspace:Raycast(Head.Position + OriginalCameraOffset, Camera.CFrame.LookVector * 1.3, rayParams)
if Raycast and Humanoid.CameraOffset.Z < 0 then
print(Raycast.Distance)
print(Raycast.Instance)
local NewPosition = Vector3.new(0, 0, (Humanoid.CameraOffset.Z + Raycast.Distance) * 0.05)
TweenCamera(NewPosition)
elseif not Raycast then
TweenCamera(OriginalCameraOffset)
end
end)
Nevermind, got it working. Full script here for anyone that wants it.
local RunService = game:GetService("RunService")
local Character = script.Parent
local Humanoid = Character:FindFirstChild("Humanoid")
local Camera = game.Workspace.CurrentCamera
local Head = Character:FindFirstChild("Head")
local HumRootPart = Character:WaitForChild("HumanoidRootPart")
Humanoid.CameraOffset = Vector3.new(0, 0, -0.8)
local OriginalCameraOffset = Humanoid.CameraOffset
local function TweenCamera(SetPosition)
local TweenService = game:GetService("TweenService")
local Info = TweenInfo.new(0.4, Enum.EasingStyle.Exponential)
local Goal = {CameraOffset = SetPosition}
local Tween = TweenService:Create(Humanoid, Info, Goal)
Tween:Play()
end
local function FixCameraClip()
local IgnoreParts = {}
for _, part in pairs(game.Workspace:GetChildren()) do
if (part:IsA("BasePart") or part:IsA("MeshPart")) and part.Transparency == 1 then
table.insert(IgnoreParts, part)
end
end
for _, part in pairs(Character:GetDescendants()) do
if part:IsA("BasePart") or part:IsA("MeshPart") then
table.insert(IgnoreParts, part)
end
end
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = IgnoreParts
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local Raycast = game.Workspace:Raycast(Head.Position + OriginalCameraOffset, Head.CFrame.LookVector * 1.7, rayParams)
if Raycast and Humanoid.CameraOffset.Z < -0.4 then
print(Raycast.Distance)
print(Raycast.Instance)
local NewPosition = Vector3.new(0, 0, -0.4)
TweenCamera(NewPosition)
elseif not Raycast then
TweenCamera(OriginalCameraOffset)
end
end
local Connection = RunService.RenderStepped:Connect(function ()
FixCameraClip()
end)