A visão do mundo do usuário é representada por um ObjetoCamera .Você pode alterar o comportamento da câmera para se adaptar à sua experiência de várias maneiras.Por exemplo, a câmera pode reagir a eventos no mundo, como sacudir quando um monstro passa por perto, ou trancada ao lado do personagem do usuário, como em um rolagem lateral.
Crie uma Câmerade primeira pessoa
Uma câmera de primeira pessoa é uma visão onde a câmera fica trancada com a cabeça do personagem, o que é mais preciso para a vida real.É comum em experiências de atirador e história onde o objetivo é fazer o usuário se sentir imerso no mundo.


No Studio, o objeto StarterPlayer contém uma série de propriedades que afetam a câmera do usuário.A propriedade Modo de Câmera determina como a câmera se comporta.
Selecione Jogador Inicial .
Altere o Modo da Câmera para LockFirstPerson . Isso garante que a câmera do usuário não se mova longe de sua cabeça.
Teste de jogo para ver a primeira câmera de pessoa em ação.
Criar uma Câmerade 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 um sentimento de duas dimensões.
Programar a Câmera
Expand 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 de jogadores , e depois 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 manté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 de personagem do usuário e verifique se ele existe usando uma declaraçã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 personagens contêm uma parte chamada Parte Raiz Humanoide , que pode ser usada para obter a posição do personagem no mundo.Isso define a posição em que os pontos da câmera se encontram.
Use FindFirstChild para obter a HumanoidRootPart e verificar se ela existe usando uma declaraçã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 metros abaixo da cabeça do usuário.Para corrigir isso, adicione um novo Vector3 com uma altura de 2 metros à posição da raiz.
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
Defina a posição da câmera
A câmera também precisa de uma posição.Para dar uma aparência de rolagem lateral de 2D para a visão do usuário, 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âmerausando 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 Câmera Atual
Agora que as variáveis para a posição da Câmerae o alvo da Câmeraestã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.Leva duas posições e cria um CFrame localizado na primeira posição apontado para a segunda.Use CFrame.lookAt() para criar um CFrame que está posicionado em cameraPosition e aponta 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
Sincronize a Câmera
O último passo é executar essa função repetidamente para manter a câmera sincronizada com o usuário.A imagem que o usuário vê está sendo atualizada constantemente.O segundo de divisão que leva para fazer todos os cálculos necessários é chamado de etapa de renderização .
RunService:BindToRenderStep() torna simples executar uma função em cada quadro aceitando esses três parâmetros:
- name - O nome desta vinculação, que deve ser único para não entrar em conflito com outras funções de mesmo nome.
- priority - Quanto maior o número, maior a prioridade.Essa função deve executar depois de a atualização padrão da câmera do Roblox, então a prioridade é definida como 1 nível maior que a Prioridade de Renderização da Câmerainterna.
- function - A função que deve ser vinculada ao passo de renderização.
Use RunService:BindToRenderStep() para vincular a função updateCamera ao passo 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 o seu código. Use as teclas A e D para mover o seu personagem de lado a lado.
Criar uma Câmeraisométrica
A estrutura básica de obter a posição do usuário e atualizar a posição da Câmeraa 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 para o personagem do usuário.
Modifique a posição e a ver
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)Mudar a propriedade da CâmeraFieldOfView simula dar zoom para dentro e para fora, o que pode dar à visão um aspecto mais plano.Tente definir para um valor de 20 para dar aproximare aumentar a distância da Câmerado 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()
Ao alterar a maneira como a câmera se comporta, você pode alcançar um olhar completamente novo para sua experiência.Veja se você pode alterar o 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!