用户对世界的视图由 Camera 对象表示。您可以通过多种方式更改相机行为以适应您的游戏。例如,相机可以对世界中的事件做出反应,例如在怪物经过时摇晃,或者锁定在用户角色的侧面,就像在横向卷轴游戏中一样。
创建第一人称相机
第一人称相机是一种视图,其中相机与角色的头部保持锁定,这更符合现实生活。它在射击游戏和故事游戏中很常见,目标是让用户感到沉浸在世界中。


在 Studio 中,StarterPlayer 对象包含多个影响用户相机的属性。CameraMode 属性决定相机的行为。
选择 StarterPlayer。

将 CameraMode 更改为 LockFirstPerson。这确保用户的相机不会远离他们的头部。

进行游戏测试以查看第一人称相机的效果。
创建横向卷轴相机
横向卷轴视图将相机保持在与角色侧面固定的位置,使世界呈现出二维的感觉。

脚本化相机
展开 StarterPlayer,并在 StarterPlayerScripts 中添加一个名为 CameraManager 的 LocalScript。

在脚本的顶部,复制并粘贴以下代码示例以获取 Players 服务,然后在一个新变量中获取本地用户。
local Players = game:GetService("Players")local player = Players.LocalPlayer创建一个名为 updateCamera 的函数。这个函数包含获取和设置相机新位置所需的逻辑。
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()end在函数内部,获取用户的角色模型并使用 if 语句检查它是否存在。
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
指向相机
所有角色模型都包含一个名为 HumanoidRootPart 的部件,可以用来获取角色在世界中的位置。这设置了相机指向的位置。
使用 FindFirstChild 获取 HumanoidRootPart,并使用 if 语句检查它是否存在。
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendHumanoidRootPart 的位置实际上在用户头部下方 2 个单位。为了解决这个问题,向根部位置添加一个高度为 2 个单位 的新 Vector3。
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
设置相机位置
相机还需要一个位置。为了给用户的视图提供 2D 横向卷轴的外观,相机需要直接看向角色的侧面。通过使用 Vector3 在相机位置的 Z 轴 上添加深度,将相机放置在用户的侧面。
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更新 CurrentCamera
现在相机位置和相机目标的变量已经准备好,是时候更新相机的位置了。您可以通过 Workspace 的 CurrentCamera 属性访问用户的相机。相机具有 CFrame 属性来确定其位置。
您可以使用 CFrame.lookAt() 来更新相机。它接受两个位置,并创建一个位于第一个位置指向第二个位置的 CFrame。使用 CFrame.lookAt() 创建一个位于 cameraPosition 并指向 rootPosition 的 CFrame。
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() 使在每一帧上执行函数变得简单,它接受这三个参数:
- name - 此绑定的名称,应该是唯一的,以免与其他同名函数冲突。
- priority - 数字越高,优先级越高。此函数应在 Roblox 的默认相机更新 之后 运行,因此优先级设置为比内部相机的 RenderPriority 高 1 级。
- function - 要绑定到渲染步骤的函数。
使用 RunService:BindToRenderStep() 将 updateCamera 函数绑定到渲染步骤。
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)进行代码测试。使用 A 和 D 键将角色从一侧移动到另一侧。
创建等距相机
获取用户位置并在每帧更新相机位置的基本结构可以适应许多其他相机样式,例如 等距相机。等距相机是一个 3D 视图,稍微向下指向用户角色,固定角度。

修改位置和视图
使用前一个示例中的代码,修改 cameraPosition,在所有 3 个维度上添加相同的量。
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)更改相机的 FieldOfView 属性可以模拟缩放,这可以使视图看起来更平坦。尝试将其设置为 20 的值以进行缩放,并增加相机与用户的距离以补偿。
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()
通过改变相机的行为,您可以为游戏实现全新的外观。看看您是否可以更改 cameraPosition 以实现一个俯视相机,使用相同的脚本。尝试调整设置以获得您喜欢的结果!