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.
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 Iniciante .
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.
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
Expanda StarterPlayer e, em StarterPlayerScripts, adicione um LocalScript chamado CameraManager.
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.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 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
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.
Use FindFirstChild para obter o HumanoidRootPart e verificar se ele 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 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.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
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.
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 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
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â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.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 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!