Como adicionar peso na camera do roblox

Aqui está um tutorial simples sobre como adicionar peso à câmera para que ela se arraste para trás do personagem conforme eles se movem, em vez de ficar rigidamente presa a ele.

Isso funciona colocando o assunto da câmera em uma parte invisível que tenta alcançar o personagem por meio de interpolação linear. Isso tem o efeito de arrastar a câmera atrás do personagem conforme ele se move. Uma vantagem disso é que há um mínimo de conflito com a função normal da câmera e você pode fazer coisas como girar a câmera normalmente

Passo 1:
Crie um LocalScript dentro de StarterCharacterScripts e insira uma Parte no script.
06d1278a3d0a820eaf32cce2989cdaaad6b1e16c
Esta parte será o assunto da câmera que flutua atrás do player, então mude as propriedades para que interfira com o resto do espaço de trabalho o mínimo possível.
46035879d0d15db7e33a89db615e8fc9823fa84d
O mais importante aqui é que a peça seja ancorada para que fique onde a definimos

Passo 2:
Dentro do LocalScript, defina o assunto da câmera para a parte Assunto, então crie uma função que: Lerp () é a posição do Assunto para a posição da cabeça do personagem. Esta função será conectada à etapa de renderização do RunService do jogo para que a parte Assunto se aproxime cada vez mais do personagem a cada tick

Codigo

local camera = workspace.CurrentCamera
local head = script.Parent:WaitForChild("Head")
local subject = script:WaitForChild("Subject")

subject.Position = head.Position
camera.CameraSubject = subject

local WEIGHT = 20

local function updateSubject()
	subject.Position = subject.Position:Lerp(head.Position,1/WEIGHT)
end

RunService:BindToRenderStep("UpdateSubject", Enum.RenderPriority.Camera.Value, updateSubject)

A variável PESO determina o quão ‘pesada’ a câmera é e pode ser ajustada de acordo com sua preferência, com 1 sendo nenhum peso da câmera.

Como adicionar pesos diferentes ao movimento horizontal e vertical da câmera

Você pode querer ponderar o movimento vertical de forma diferente do movimento horizontal, pois sua tela é provavelmente mais curta do que larga.

Para fazer isso, separe a posição do sujeito e a posição da cabeça em componentes verticais e horizontais, leia-os com pesos separados e, em seguida, some os resultados para sua posição total.

local RunService = game:GetService("RunService")

local camera = workspace.CurrentCamera
local head = script.Parent:WaitForChild("Head")
local subject = script:WaitForChild("Subject")

subject.Position = head.Position
camera.CameraSubject = subject

local WEIGHT_XZ = 20
local WEIGHT_Y = 5

local function updateSubject()
	local subPos = subject.Position
	local headPos = head.Position

	local xzPos = Vector3.new(subPos.X,0,subPos.Z):Lerp(Vector3.new(headPos.X,0,headPos.Z),1/WEIGHT_XZ)
	local yPos = Vector3.new(0,subPos.Y,0):Lerp(Vector3.new(0,headPos.Y,0),1/WEIGHT_Y)

	subject.Position = xzPos + yPos
end

RunService:BindToRenderStep("UpdateSubject", Enum.RenderPriority.Camera.Value, updateSubject)
Como fazer ele funcionar para shiftlock

O script acima faz com que o modo de câmera shift lock seja interrompido porque shift lock apenas gira o personagem se ele for o assunto da câmera (que agora foi definido para a parte Assunto). Isso pode ser corrigido girando manualmente o personagem na função de atualização de acordo com o LookVector da câmera:

local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local camera = workspace.CurrentCamera
local rootPart = script.Parent:WaitForChild("HumanoidRootPart")
local head = script.Parent:WaitForChild("Head")
local subject = script:WaitForChild("Subject")

subject.Position = head.Position
camera.CameraSubject = subject

local WEIGHT = 20

local function updateSubject()
	subject.Position = subject.Position:Lerp(head.Position,1/WEIGHT)
	
	if UserInputService.MouseBehavior == Enum.MouseBehavior.LockCenter then
		local lookXZ = Vector3.new(camera.CFrame.LookVector.X,0,camera.CFrame.LookVector.Z)
		rootPart.CFrame = CFrame.lookAt(rootPart.Position,rootPart.Position + lookXZ)
	end
end

RunService:BindToRenderStep("UpdateSubject", Enum.RenderPriority.Camera.Value, updateSubject)

UserInputService é usado para verificar se o mouse está travado no centro, indicando que o shift lock está ativo. Se estiver ativo, então o CFrame da parte raiz é definido para apontar na direção do componente XZ do LookVector da câmera (apenas o componente XZ, uma vez que a parte raiz deve seguir apenas o movimento horizontal da câmera).

Agora você está pronto :sun_with_face:

A razão disso funcionar é porque: Lerp () atualiza a posição do sujeito em uma fração (1 / PESO) da distância restante até a parte da raiz, de modo que ele se move rapidamente quando está longe, mas diminui à medida que se aproxima, como uma espécie de primavera.

De qualquer forma, espero que tenha ajudado :grinning_face_with_smiling_eyes:

1 Curtida