用户对世界的视图由 Camera 对象表示。您可以通过多种方式改变相机的行为来满足您的体验。例如,相机可以反应世界中的事件,例如 when a monster 走过,或者锁定在用户角色旁边,如果在侧面滚动器中。
创建第一人称视角的相机
第一人称视角是一种视角,在 котором камера保持与角色头部的锁定状态,这是更接近现实生活的视角。它是游戏和故事体验中的常见模式,目标是让用户感受世界的现实。
在 Studio 中,StarterPlayer 对象包含影响用户相镜头的多个属性。 CameraMode 属性确定相机的行为。
选择 新手玩家 。
将 CameraMode 修改为 锁定第一人称视角 。这确保用户的相机不会从他们的头部移动。
进行游戏测试,以查看第一个人称视角在动作中的表现。
创建一个侧向滚动相机
侧面滚动视图使相机保持在角色一侧相对固定的位置,给世界带来二维感觉。
脚本相机
扩展 StarterPlayer,在 StarterPlayerScripts 中添加一个名为 CameraManager 的 CameraManager。
在脚本的顶部,复制并粘贴以下代码示例以获得 玩家服务 ,然后在新变量中获取本地用户。
local Players = game:GetService("Players")local player = Players.LocalPlayer创建一个名为 updateCamera 的函数。这包含用于获取和设置新相镜头位置所需的逻辑。
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()end在函数中,获取用户的角色模型,并使用“如果”语句检查它是否存在。
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
指向相机
所有角色模型都包含一个名为 HumanoidRootPart 的部分,可用于获取角色在世界中的位置。这将位置设置为相机所指向的位置。
使用 FindFirstChild 来获取人形根部分,并使用 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 将镜头机位置添加到使用 Datatype.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 和指向 1> rootPosition1> 的 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 来实现顶向下相机与同一脚本的相机。尝试调整设置以获得您喜欢的结果!