用户对世界的视图由一个 Camera 对象表示。您可以通过各种方式改变相机的行为,以满足您的各种体验。例如,相机可以反应世界上的事件,例如当怪物经过时颤抖,或锁定在用户角色的一侧,如在侧滚动器中。
创建第一人称摄像镜头
第一人称相机是指镜头与角色的头部锁定的视角,这更接近于现实生活。这在射击和故事体验中很常见,目标是让用户感觉身临其世界。


在工作室中,StarterPlayer 对象包含一些影响用户相镜头的属性。 相机模式 属性决定了相机的行为方式。
选择 启动玩家 。
将相机模式更改为 LockFirstPerson 。这确保用户的相机不会离开他们的头部。
进行游戏测试,看到第一个人在动作中的相机。
创建侧滚动镜头
侧滚动视图使相机保持与角色边缘固定位置,给世界带来两维感觉。
脚本相镜头
扩展启动玩家,并在启动玩家脚本中添加一个名为 LocalScript 的 CameraManager 。
在脚本顶部,复制并粘贴以下代码示例以获取 玩家服务 ,然后在新变量中获取本地用户。
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 thenendendend人形根部件的位置实际上是距离用户头部 2 格。为了解决这个问题,请在根位置添加一个新的 Vector3 ,其高度为 2 格 。
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 的用户旁边,从而将相机放置在用户旁边。
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 属性访问用户的相机。相机有一个 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 的默认相机更新后运行 ,因此优先级设置为内部相镜头的渲染优先级高于 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 更改为实现相同脚本的顶层摄像头。尝试调整设置以获得你喜欢的结果!