使用者對世界的視角由 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 個 studs。為了解決這個問題,將一個高度為 2 studs 的新 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 以實現一個俯視相機,並使用相同的腳本。嘗試調整設置以獲得您喜歡的結果!