Tutoriales intermedios

Controla 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 vista del mundo del usuario está representada por un objeto Camera. Puedes cambiar el comportamiento de la cámara para adaptarlo a tu experiencia de varias maneras. Por ejemplo, la cámara puede reaccionar a eventos en el mundo, como temblar cuando un monstruo pasa cerca, o estar bloqueada al lado del personaje del usuario, como en un juego de desplazamiento lateral.

Crea una cámara en primera persona

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

Cámara en Primera Persona
Cámara Clásica de Roblox

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

  1. Selecciona StarterPlayer.

    alt

  2. Cambia CameraMode a LockFirstPerson. Esto asegura que la cámara del usuario no se aleje de su cabeza.

    alt

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

Crea una cámara de desplazamiento lateral

Una vista de desplazamiento lateral mantiene la cámara en una posición fija relativa al lado del personaje, dando al mundo una sensación bidimensional.

alt

Programa la cámara

  1. Expande StarterPlayer, y en StarterPlayerScripts añade un LocalScript llamado CameraManager.

    alt

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


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Crea una función llamada updateCamera. Esta 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, obtén el modelo del personaje del usuario y verifica si existe utilizando 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 personaje contienen una parte llamada HumanoidRootPart, que se puede usar para obtener la posición del personaje en el mundo. Esto establece la posición hacia la que apunta la cámara.

  1. Utiliza FindFirstChild para obtener el HumanoidRootPart y verifica que exista 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 del HumanoidRootPart está, de hecho, a 2 studs por debajo de la cabeza del usuario. Para corregir esto, añade un nuevo Vector3 con una altura de 2 studs a la posición del root.


    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

Establece la posición de la cámara

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

Actualiza CurrentCamera

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. Toma dos posiciones y crea un CFrame ubicado en la primera posición apuntando hacia la segunda. Usa CFrame.lookAt() para crear un CFrame que esté posicionado en cameraPosition y apuntando 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

Sincroniza 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 está actualizando constantemente. La fracción de segundo que lleva hacer todos los cálculos necesarios se llama el paso de renderizado.

RunService:BindToRenderStep() hace que sea simple ejecutar una función en cada fotograma aceptando estos tres parámetros:

  • name - El nombre de este enlace, que debe ser único para que no choque con otras funciones del mismo nombre.
  • priority - Cuanto más alto es el número, mayor es la prioridad. Esta función debe ejecutarse después de la actualización de la cámara predeterminada de Roblox, por lo que la prioridad se establece a 1 nivel más alto que la RenderPriority de la cámara interna.
  • function - La función que se va a vincular al paso de renderizado.
  1. Usa RunService:BindToRenderStep() para vincular la función updateCamera al 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.

Crea 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 fotograma se puede adaptar a muchos otros estilos de cámara, como una cámara isométrica. Una cámara isométrica es una vista en 3D que apunta ligeramente hacia abajo con un ángulo fijo hacia el personaje del usuario.

alt

Modifica la posición y la vista

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

    alt


    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 FieldOfView de la cámara simula el acercamiento y alejamiento, lo que puede dar a la vista un aspecto más plano. Intenta establecerlo en un valor de 20 para acercar, y aumentar la distancia de la cámara al usuario para compensarlo.


    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 una apariencia totalmente nueva para tu experiencia. ¡Ve si puedes cambiar la cameraPosition para lograr una cámara en perspectiva superior con el mismo script! Intenta ajustar la configuración para obtener un resultado que te guste.

©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.