Controlar la cámara del usuario

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

La visión del mundo del usuario se representa por un objeto Camera .Puedes cambiar el comportamiento de la cámara para adaptar tu experiencia de varias maneras.Por ejemplo, la cámara puede reaccionar a eventos en el mundo, como temblar cuando un monstruo camina por el lado, o bloquearse al lado del personaje del usuario, como en un desplazador lateral.

Crear una cámara de primera persona

Una cámara de primera persona es una vista en la que la cámara se mantiene bloqueada con la cabeza del personaje, lo que es más preciso para la vida real.Es común en experiencias de disparo y de historia donde el objetivo es hacer que el usuario se sienta inmerso en el mundo.

Cámara de primera persona
Cámara clásica de Roblox

En Studio, el objeto StarterPlayer contiene una serie de propiedades que afectan la cámara del usuario.La propiedad Modo de cámara determina cómo se comporta la cámara.

  1. Seleccione StarterPlayer .

  2. Cambia el modo de cámara a LockFirstPerson . Esto garantiza que la cámara del usuario no se mueva lejos de su cabeza.

  3. Prueba para ver la primera cámara de persona en acción.

Crear una cámara de desplazamiento lateral

Una vista de desplazamiento lateral mantiene la cámara en una posición fija con respecto al lado del personaje, dándole al mundo una sensación de dos dimensiones.

Script de la cámara

  1. Expandir StarterPlayer, y en StarterPlayerScripts agregar un LocalScript llamado CameraManager .

  2. En la parte superior del script, copia y pega el siguiente ejemplo de código para obtener el servicio de jugadores , y luego en una nueva variable obtén el usuario local.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Crea una función llamada updateCamera. Esto contiene la lógica necesaria para obtener y establecer una nueva posición para la cámara.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    end
  4. Dentro de la función, obtenga el modelo de personaje del usuario y verifique si existe usando una declaración if.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    end
    end

Apunta la cámara

Todos los modelos de personajes contienen una parte llamada Parte raíz humanoide , que se puede utilizar para obtener la posición del personaje en el mundo.Esto establece la posición a la que apuntan los puntos de la cámara.

  1. Usa FindFirstChild para obtener la parte raíz humanoide y verificar que existe usando una declaración 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. La posición de la parte raíz humana es en realidad 2 espárragos por debajo de la cabeza del usuario.Para corregir esto, agregue un nuevo Vector3 con una altura de 2 tachuelas a la posición de la raíz.


    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

Establecer la posición de la cámara

La cámara también necesita una posición.Para darle al usuario una vista de desplazamiento lateral de 2D, la cámara debe mirar directamente al lado del personaje.Coloca la cámara al lado del usuario agregando profundidad solo al eje Z de la posición de la cámara usando un 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

Actualizar la cámara actual

Ahora que las variables para la posición de la cámara y el objetivo de la cámara están listas, es hora de actualizar la posición de la cámara.Puedes acceder a la cámara del usuario a través de la propiedad CurrentCamera de Workspace.La cámara tiene una propiedad CFrame para determinar su posición.

Puedes usar CFrame.lookAt() para actualizar la cámara.Se necesitan dos posiciones y se crea un marco C que se encuentra en la primera posición apuntando hacia la segunda.Usa CFrame.lookAt() para crear un marco C que está posicionado en cameraPosition y apuntado hacia 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

Sincronizar la cámara

El último paso es ejecutar esta función repetidamente para mantener la cámara sincronizada con el usuario.La imagen que ve el usuario se actualiza constantemente.El segundo que tarda en hacer todos los cálculos necesarios se llama el paso de renderizado renderizar .

RunService:BindToRenderStep() hace que sea sencillo ejecutar una función en cada marco al aceptar estos tres parámetros:

  • name - El nombre de esta vinculación, que debe ser único para que no choque con otras funciones de mismo nombre.
  • priority - Cuanto mayor sea el número, mayor será la prioridad.Esta función debe ejecutarse después de la actualización predeterminada de la cámara de Roblox, por lo que la prioridad se establece en 1 nivel superior a la prioridad de renderizado de la cámara interna.
  • function - La función para vincular con el paso de renderizado.
  1. Usa RunService:BindToRenderStep() para vincular la función updateCamera a el paso de renderizado.


    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. Prueba tu código. Usa las teclas A y D para mover tu personaje de lado a lado.

Crear una cámara isométrica

La estructura básica de obtener la posición del usuario y actualizar la posición de la cámara en cada marco se puede adaptar a muchos otros estilos de cámara, como una cámara isométrica .Una cámara isométrica es una vista 3D que apunta ligeramente hacia abajo en un ángulo fijo hacia el personaje del usuario.

Modificar posición y vista

  1. Usando el código del ejemplo anterior, modifica cameraPosition para agregar la misma cantidad a todas las 3 dimensiones.


    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. Cambiar la propiedad de la cámara FieldOfView simula acercarla y alejarla, lo que puede darle a la vista un aspecto más plano.Prueba establecerlo en un valor de 20 para acercar y aumentar la distancia de la cámara del usuario 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()

Al cambiar la forma en que se comporta la cámara, puedes lograr un aspecto completamente nuevo para tu experiencia.Vea si puede cambiar el cameraPosition para lograr una cámara de arriba hacia abajo con el mismo script.¡Prueba ajustar las configuraciones para obtener un resultado que te guste!