控制使用者的相機

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

用戶對世界的視圖由 Camera 對物件代表。您可以通過一系列方式變更攝影機的行為來適應您的體驗。例如,攝影機可以反應世界中的事件,例如當怪物走過時震動,或鎖定在用戶角色旁邊,如在側邊捲動器中。

建立第一人稱相機

第一人稱攝影機是一種槍頂式攝影機,鏡頭可以固定在角色的頭上,更準確地反應實際生活中的場景。這是在遊戲和故事體驗中的常見模式,目標是讓用戶感覺身處世界。

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

在 Studio 中,StarterPlayer 對象包含一些影響用戶相機的屬性。 CameraMode 屬性決定攝影機的行為。

  1. 選擇 StarterPlayer

  2. 將 CameraMode 變更為 鎖定第一人稱 。這確保使用者的相機不會從他們的頭部移動。

  3. 進行遊戲測試,以查看第一個人稱攝影機的行動作。

創建一個側向捲動式相機

一個側向捲動視圖會使相機保持在角色的側邊,給世界兩次元的感覺。

攝影機的指令碼

  1. 將 StarterPlayer 擴展,並在 StarterPlayerScripts 中加入名為 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 個單位的高度 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 側面捲動外觀,攝影機需要直接看向角色的側面。將攝影機的位置添加到使用者的深度,使用 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 - 此 binding 的名稱,應該是獨一無二的,以便與其他名稱相同的功能不會碰撞。
  • 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 鍵來將您的角色從一側到另一側移動。

建立一個鏡狀攝影機

獲得用戶位置並更新相機位置每個框架可以適應許多其他攝影機風格,例如 是否幾何學攝影機 。 是非幾何學攝影機是向用戶角色指向固定角度的 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 以獲得與同一個腳指令碼的上下文鏡頭。嘗試調整設置以獲得您喜歡的結果!