使用者對於世界的看法是由 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 個釘子。要修正此問題,將一個新的 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
設置相機位置
相機也需要一個位置。為了讓使用者的視圖呈現二維側捲動的外觀,相機需要直接面向角色的一側。透過使用 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 以在三個維度上添加相同的數量。
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 以達成一種自上而下的相機,並使用相同的腳本。嘗試調整設置,以獲得您喜歡的結果!