A visão do usuário do mundo é representada por um objeto Camera. Você pode alterar o comportamento da câmera para se adequar ao seu jogo de várias maneiras. Por exemplo, a câmera pode reagir a eventos no mundo, como tremer quando um monstro passa, ou ficar travada 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 permanece travada com a cabeça do personagem, o que é mais preciso em relação à vida real. É comum em jogos de tiro e de história, 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 mova para longe 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 da câmera
Expanda StarterPlayer e, em StarterPlayerScripts, adicione um LocalScript chamado CameraManager.

No topo do script, copie e cole o seguinte exemplo de 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. Esta função 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 está 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 uma aparência de rolagem lateral 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
endAtualizar 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 tem uma propriedade CFrame para determinar sua posição.
Você pode usar CFrame.lookAt() para atualizar a câmera. Ele aceita 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
endSincronizar a câmera
A última etapa é executar essa função repetidamente para manter a câmera sincronizada com o usuário. A imagem que o usuário vê está constantemente se atualizando. O breve momento que leva para fazer todos os cálculos necessários é chamado de render step.
RunService:BindToRenderStep() torna simples executar uma função em cada quadro, aceitando esses três parâmetros:
- name - O nome dessa vinculação, que deve ser único para não conflitar com outras funções do mesmo nome.
- priority - Quanto maior o número, maior a prioridade. Esta função deve ser executada após a 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 a ser vinculada ao render step.
Use RunService:BindToRenderStep() para vincular a função updateCamera ao render step.
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 a 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 para muitos outros estilos de câmera, como uma câmera isométrica. Uma câmera isométrica é uma visão 3D apontando levemente 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 uma aparência mais plana. Tente definir um valor de 20 para dar 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()
Mudando a forma como a câmera se comporta, você pode alcançar uma aparência totalmente nova para o seu jogo. Veja se você consegue alterar a cameraPosition para conseguir uma câmera de cima para baixo com o mesmo script. Tente ajustar as configurações para obter um resultado que você goste!