Controlar a Câmerado 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 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.

Câmera da 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 Inicial .

  2. 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.

  3. 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

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

  2. 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.LocalPlayer
  3. Crie 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.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

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.

  1. Use FindFirstChild para obter a HumanoidRootPart e verificar se ela 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 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.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

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.
  1. 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.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 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

  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. 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.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 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!