Controlando 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 que se ajuste a tu experiencia de varias maneras. Por ejemplo, la cámara puede reaccionar a los eventos en el mundo, como sacudir cuando un monstruo camina por, o bloquear al lado del personaje de usuario, como en un side-scroller.

Crear una cámara de primera persona

Una cámara de primera persona es una vista donde 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 las experiencias de shooter y de historias donde el objetivo es hacer que el usuario se sienta inmerso en el mundo.

Primera cámara de 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 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 asegura que la cámara del usuario no se mueva de su cabeza.

  3. Probar la cámara de primera persona en acción.

Crear una cámara que desplaza lateralmente

Una vista desplazada lateralmente mantiene la cámara en una posición fija en relación con el lado del personaje, lo que le da a la world un sentido de profundidad.

Programar la cámara

  1. Expand StarterPlayer, and in StarterPlayerScripts add a LocalScript named CameraManager .

  2. En la parte superior del script, copia y pegue el siguiente código de ejemplo para obtener el servicio de jugadores , y luego en una nueva variable obtenga al 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. En el interior de la función, obtenga el modelo de personaje del usuario y verifíquelo 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

Enfoque de la cámara

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

  1. Usa FindFirstChild para obtener el HumanoidRootPart y comprobar 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 de raíz humanoide en realidad está 2 espárragos por debajo de la cabeza del usuario. Para solucionar esto, agregue una nueva Vector3 con una altura de 2 espárragos 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

Configurando la posición de la cámara

La cámara también necesita una posición. Para darle a la vista del usuario un aspecto 2D de desplazamiento lateral, la cámara debe mirar directamente a la parte del personaje. Coloca la cámara en la parte del usuario al agregarle profundidad al solo 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 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. Puede acceder a la cámara a través de la propiedad de Workspace. La cámara tiene una propiedad de Datatype.CFrame para determinar su posición.

Puede usar CFrame.lookAt() para actualizar la cámara. Tiene dos posiciones y crea un CFrame que está en la primera posición apuntando hacia la segunda. Usa CFrame.lookAt() para crear un CFrame que está en la posición cameraPosition y apuntando hacia 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 la cámara

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

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

  • name - El nombre de este vínculo, que debe ser único para que no se duplique con otras funciones del mismo nombre.
  • priority - Cuanto mayor sea el número, mayor será la prioridad. Esta función debería ejecutarse después de la actualización de cámara predeterminada de Roblox, para que la prioridad sea 1 nivel mayor que la rendería interna.
  • function - La función para ser vinculada al paso de renderizado.
  1. Usa RunService:BindToRenderStep() para vincular la función updateCamera a la etapa 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. Pruebe su código. Usa las teclas A y D para mover a tu personaje de un lado a otro.

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 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 hacia abajo ligeramente hacia el personaje del usuario.

Modificando la posición y la 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 cambiarlo dentro y fuera, lo que puede darle a la vista un aspecto de plano. Intenta configurarlo para un valor de 20 para acercarlo y aumentar la distancia de la cámara desde el 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 la cámara se comporta, puede lograr un aspecto completamente nuevo para su experiencia. Vea si puede cambiar la cameraPosition para obtener una cámara de arriba para abajo con el mismo script. Prueba ajustar las configuraciones para obtener un resultado que te guste!