Controlando a Câmera do Usuário

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

A visão do mundo do usuário é representada por um ObjetoCamera. 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 tremendo quando um monstro passa, ou bloqueada ao lado do personagem do usuário, como em um side-scroller.

Criando uma Câmera de 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 shooter e de história onde o objetivo é fazer com que o usuário se sinta imerso no mundo.

Câmera de Primeira Pessoa
Câmera Clássica do Roblox

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.

  1. Selecione Jogador Iniciante .

  2. Altere o Modo da Câmera para LockFirstPerson . Isso garante que a câmera do usuário não se mova de sua cabeça.

  3. Testar o jogo para ver a primeira câmera em ação.

Criando uma Câmera de Scroll Lateral

Uma visão lateral em rolagem mantém a câmera em uma posição fixa em relação ao lado do personagem, dando ao mundo um sentido de duas dimensões.

Programando a Câmera

  1. Expanda StarterPlayer e, em StarterPlayerScripts, adicione um LocalScript chamado CameraManager.

  2. Na parte superior do script, copie e cole o seguinte código de exemplo para obter o Players service , e em seguida, em uma nova variável, obtenha o usuário local.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Crie 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.LocalPlayer
    local function updateCamera()
    end
  4. Dentro 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.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    end
    end

Pontando a Câmera

Todos os modelos de personagens contêm uma parte chamada HumanoidRootPart , que pode ser usada para obter a posição do personagem no mundo. Isso configura a posição dos pontos da câmera.

  1. Use FindFirstChild para obter o HumanoidRootPart e verificar se ele existe usando uma declaração if.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    end
    end
    end
  2. A posição da 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 da raiz.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    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)
    end
    end
    end

Configurando a Posição da Câmera

A câmera também precisa de uma posição. Para dar ao usuário uma visão 2D lateral-rolante, a câmera precisa olhar diretamente para o lado do personagem. Coloque a câmera ao lado do usuário ao adicionar profundidade ao apenas o Z axis 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 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 uma CFrame localizada na primeira posição apontada para a segunda. Use CFrame.lookAt() para criar uma CFrame que está posicionada em cameraPosition e apontada para 1> rootPosition1>.


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

O último passo é executar esta 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 segundo 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 ao aceitar esses três parâmetros:

  • name - O nome deste binding, que deve ser único para que não seja confundido com outras funções do mesmo nome.
  • priority - Quanto maior o número, maior a prioridade. Essa função deve ser executada depois da atualização de câmera padrão do Roblox, para que a prioridade seja definida como 1 nível acima da renderização interna da Câmera.
  • function - A função para ser vinculada ao passo de renderização.
  1. 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.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
    RunService:BindToRenderStep("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. Teste seu código. Use as teclas A e D para mover seu personagem do lado ao lado.

Criando uma Câmera Isomé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 visualização 3D que aponta ligeiramente para baixo em um ângulo fixo em direção ao personagem do usuário.

Modificando Posição e Visão

  1. 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.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    local 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)
    end
    end
    end
    RunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. Alterar a propriedade FieldOfView da Câmerasimula azoá-la para dentro e para fora, o que pode dar à visão um olhar mais suave. Tente definir para um valor de 20 para zoomar para dentro, e aumentar a distância da Câmerado usuário para compensar.


    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local player = Players.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 64
    local HEIGHT_OFFSET = 2
    camera.FieldOfView = 20
    local function updateCamera()

Ao alterar a maneira como a câmera se comporta, você pode alcançar um novo olhar para sua experiência. Veja se você pode alterar o cameraPosition para obter uma câmera de cabeça para baixo com o mesmo script. Tente ajustar as configurações para obter um resultado que você gosta!