控制使用者的攝影機

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

使用者對世界的觀點由 Camera 個對物件表示。您可以以各種方式變更相機行為,以適應各種體驗。例如,相機可以對世界上的事件做出反應,例如當怪物經過時搖晃,或將鏡頭鎖定在使用者角色一側,如同在側捲動器中。

創建第一人稱攝影機

第一人稱攝影機是指攝影機與角色的頭部保持鎖定的視角,這更接近於現實生活。這在射手和故事體驗中很常見,目標是讓使用者感到身處世界中。

第一人稱攝影機
經典 Roblox 相機

在工作室中, StarterPlayer 對象包含一些影響使用者相攝影機的屬性。 相機模式 屬性決定相機的行為方式。

  1. 選擇 新手玩家

  2. 將攝影機模式變更為 LockFirstPerson 。這樣可以確保使用者的攝影機不會離開他們的頭部。

  3. 進行測試以查看第一個人攝影機在動作動中。

創建一個側滾動攝影機

滾動視窗會將相機保持在與角色側面相對的固定位置,讓世界獲得兩維感覺。

腳本攝影機

  1. 擴展初始玩家,並在初始玩家腳本中添加 本地腳本 名為 CameraManager 的。

  2. 在腳指令碼頂部,複製並粘貼以下代碼示例以獲得 玩家服務 ,然後在新變量中獲得本地用戶。


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. 創建名為 updateCamera 的函數。這裡保存了獲得和設置相攝影機新位置所需的邏輯。


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    end
  4. 在函數內,獲取使用者的角色模型,並使用 if 語句檢查是否存在。


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    end
    end

指向相攝影機

所有角色模型都包含一個名為 HumanoidRootPart 的部分,可用於獲得角色在世界上的位置。這會設置相機指向的位置。

  1. 使用 FindFirstChild 取得人形根部件,並使用 if 語句檢查它是否存在。


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    end
    end
    end
  2. 人形根部件的位置實際上是距離使用者頭部下方 2 個單位。要修復這個問題,請在根的位置添加一個新的 Vector3 ,高度為 2 個單位


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    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)
    end
    end
    end

設置相機位置

相機也需要位置。為了給使用者的視覺一個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 - 要綁定到渲染步驟的功能。
  1. 使用 RunService:BindToRenderStep()updateCamera 功能綁定到渲染步驟。


    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    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("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. 測試您的代碼。使用 AD 鍵將角色從一側移動到另一側。

創建一個平面相攝影機

獲得使用者位置和每秒更新相攝影機位置的基本結構可以適應許多其他相機風格,例如 是ometric 相機 。平面鏡頭是指以固定角度向使用者角色稍微向下的 3D 視圖。

修改位置和視檢視

  1. 使用上一個例子的代碼,修改 cameraPosition 以將相同數量添加到所有 3 個維度。


    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 = rootPosition + Vector3.new(CAMERA_DEPTH, CAMERA_DEPTH, CAMERA_DEPTH)
    camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)
    end
    end
    end
    RunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. 變更相攝影機的 FieldOfView 屬性模擬縮放它進出,這可以讓視圖看起來更平坦。嘗試將其設置為值 20 以放大,並增加相攝影機與使用者的距離以進行補償。


    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local player = Players.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 64
    local HEIGHT_OFFSET = 2
    camera.FieldOfView = 20
    local function updateCamera()

通過改變相機的行為方式,您可以為體驗帶來全新的外觀。看看你能否將 cameraPosition 變更為達到相同腳指令碼的頂部攝像機。嘗試調整設定以獲得你喜歡的結果!