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.
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.
Seleccione StarterPlayer .
Cambia el modo de cámara a LockFirstPerson . Esto asegura que la cámara del usuario no se mueva de su cabeza.
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
Expand StarterPlayer, and in StarterPlayerScripts add a LocalScript named CameraManager .
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.LocalPlayerCrea 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.LocalPlayerlocal function updateCamera()endEn 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.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
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.
Usa FindFirstChild para obtener el HumanoidRootPart y comprobar que existe usando una declaración if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendLa 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.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 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.
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.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)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
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.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)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.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local 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!