A visão do usuário sobre o mundo é representada por um objeto Camera. Você pode alterar o comportamento da câmera para se adequar à sua experiência de várias maneiras. Por exemplo, a câmera pode reagir a eventos no mundo, como tremer quando um monstro passa, ou ficar presa ao lado do personagem do usuário, como em um side-scroller.
Criar uma câmera em primeira pessoa
Uma câmera em primeira pessoa é uma visão onde a câmera fica presa à cabeça do personagem, o que é mais preciso em relação à vida real. É comum em experiências de tiro e histórias onde o objetivo é fazer o usuário se sentir imerso no mundo.


No Studio, o objeto StarterPlayer contém várias propriedades que afetam a câmera do usuário. A propriedade CameraMode determina como a câmera se comporta.
Selecione StarterPlayer.

Altere CameraMode para LockFirstPerson. Isso garante que a câmera do usuário não se afaste de sua cabeça.

Teste para ver a câmera em primeira pessoa em ação.
Criar uma câmera de rolagem lateral
Uma visão de rolagem lateral mantém a câmera em uma posição fixa em relação ao lado do personagem, dando ao mundo uma sensação bidimensional.

Script para a câmera
Expanda StarterPlayer e, em StarterPlayerScripts, adicione um LocalScript chamado CameraManager.

No topo do script, copie e cole o seguinte código para obter o serviço Players, e então em uma nova variável obtenha o usuário local.
local Players = game:GetService("Players")local player = Players.LocalPlayerCrie uma função chamada updateCamera. Isso contém a lógica necessária para obter e definir uma nova posição para a câmera.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endDentro da função, obtenha o modelo do personagem do usuário e verifique se ele existe usando uma instrução if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Apontar a câmera
Todos os modelos de personagem contêm uma parte chamada HumanoidRootPart, que pode ser usada para obter a posição do personagem no mundo. Isso define a posição para a qual a câmera aponta.
Use FindFirstChild para obter o HumanoidRootPart e verifique se ele existe usando uma instrução if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendA posição do HumanoidRootPart é na verdade 2 studs abaixo da cabeça do usuário. Para corrigir isso, adicione um novo Vector3 com uma altura de 2 studs à posição do root.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal HEIGHT_OFFSET = 2local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)endendend
Definir a posição da câmera
A câmera também precisa de uma posição. Para dar à visão do usuário um visual de rolagem lateral em 2D, a câmera precisa olhar diretamente para o lado do personagem. Coloque a câmera ao lado do usuário adicionando profundidade apenas ao Eixo Z da posição da câmera usando um Vector3.
local player = Players.LocalPlayer
local CAMERA_DEPTH = 24
local HEIGHT_OFFSET = 2
local function updateCamera()
local character = player.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root then
local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
end
end
end
Atualizar CurrentCamera
Agora que as variáveis para a posição da câmera e o alvo da câmera estão prontas, é hora de atualizar a posição da câmera. Você pode acessar a câmera do usuário através da propriedade CurrentCamera do Workspace. A câmera possui uma propriedade CFrame para determinar sua posição.
Você pode usar CFrame.lookAt() para atualizar a câmera. Ele recebe duas posições e cria um CFrame localizado na primeira posição apontando para a segunda. Use CFrame.lookAt() para criar um CFrame que está posicionado em cameraPosition e apontado para rootPosition.
local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
local CAMERA_DEPTH = 24
local HEIGHT_OFFSET = 2
local function updateCamera()
local character = player.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root then
local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)
end
end
end
Sincronizar a câmera
A última etapa é executar essa função repetidamente para manter a câmera em sincronia com o usuário. A imagem que o usuário vê está constantemente se atualizando. O breve momento que leva para realizar todos os cálculos necessários é chamado de etapa de renderização.
RunService:BindToRenderStep() torna simples executar uma função a cada quadro, aceitando esses três parâmetros:
- name - O nome dessa ligação, que deve ser único para não colidir com outras funções com o mesmo nome.
- priority - Quanto maior o número, maior a prioridade. Esta função deve ser executada depois da atualização padrão da câmera do Roblox, então a prioridade é definida para 1 nível acima da RenderPriority interna da câmera.
- function - A função que será vinculada à etapa de renderização.
Use RunService:BindToRenderStep() para vincular a função updateCamera à etapa de renderização.
local Players = game:GetService("Players")local RunService = game:GetService("RunService")local player = Players.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 24local HEIGHT_OFFSET = 2local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)endendendRunService:BindToRenderStep("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)Teste seu código. Use as teclas A e D para mover seu personagem de lado.
Criar uma câmera isométrica
A estrutura básica de obter a posição do usuário e atualizar a posição da câmera a cada quadro pode ser adaptada a muitos outros estilos de câmera, como uma câmera isométrica. Uma câmera isométrica é uma visão 3D apontando ligeiramente para baixo em um ângulo fixo em direção ao personagem do usuário.

Modificar posição e visão
Usando o código do exemplo anterior, modifique cameraPosition para adicionar a mesma quantidade a todas as 3 dimensões.
local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)local cameraPosition = rootPosition + Vector3.new(CAMERA_DEPTH, CAMERA_DEPTH, CAMERA_DEPTH)camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)endendendRunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)Alterar a propriedade FieldOfView da câmera simula o zoom para dentro e para fora, o que pode dar à visão um aspecto mais achatado. Tente definir para um valor de 20 para aumentar o zoom e aumentar a distância da câmera em relação ao usuário para compensar.
local Players = game:GetService("Players")local RunService = game:GetService("RunService")local player = Players.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local function updateCamera()
Alterando o comportamento da câmera, você pode conseguir uma aparência completamente nova para sua experiência. Veja se você consegue mudar a cameraPosition para alcançar uma câmera de cima para baixo com o mesmo script. Tente ajustar as configurações para obter um resultado que você goste!