Загрузка данных


local RunService = game:GetService("RunService")
local player = game.Players.LocalPlayer
local camera = workspace.CurrentCamera

-- НАСТРОЙКИ
local SMOOTHNESS = 0.12 -- Чем меньше, тем сильнее задержка (0.05 - очень плавно, 0.2 - быстро)
local OFFSET = Vector3.new(0, 2, 10) -- Стандартное смещение (отдаление)

camera.CameraType = Enum.CameraType.Scriptable

local function getTargetCFrame()
	local char = player.Character
	if not char or not char:FindFirstChild("HumanoidRootPart") then return nil end
	
	local root = char.HumanoidRootPart
	-- Берем позицию игрока, но сохраняем вращение камеры из стандартного ввода
	local targetPos = root.Position + Vector3.new(0, 2, 0) -- Высота головы
	
	-- Мы используем текущее вращение камеры, чтобы игрок мог крутить мышкой
	local rotation = camera.CFrame - camera.CFrame.Position
	return CFrame.new(targetPos) * rotation * CFrame.new(0, 0, 10) 
end

-- Если хочешь оставить стандартный зум и управление, используй этот метод:
RunService.RenderStepped:Connect(function()
	local char = player.Character
	if char and char:FindFirstChild("HumanoidRootPart") then
		-- Камера будет плавно "плыть" к позиции игрока
		-- Но мы меняем только позицию, чтобы не ломать вращение мышью
		local root = char.HumanoidRootPart
		local goalCF = camera.CFrame
		
		-- Это магия: мы заставляем камеру чуть-чуть не успевать за игроком
		camera.Focus = root.CFrame
	end
end)

-- ВАЖНО: Самый простой рабочий костыль без смены типа камеры:
-- Просто добавь это в LocalScript:
camera:GetPropertyChangedSignal("CFrame"):Connect(function()
	-- Этот метод сложен тем, что Roblox обновляет камеру каждый кадр жестко.
end)