มุมมองของโลกของผู้ใช้ถูกแทนที่ด้วยวัตถุ Cameraคุณสามารถเปลี่ยนพฤติกรรมของกล้องให้เหมาะกับประสบการณ์ของคุณได้หลายวิธีตัวอย่างเช่น กล้องสามารถตอบสนองต่อเหตุการณ์ในโลก เช่น การสั่นเมื่อมอนสเตอร์เดินผ่าน หรือล็อคไว้ที่ด้านข้างของตัวละครผู้ใช้ เช่นในสไลเดอร์ด้านข้าง
สร้างกล้องบุคคลที่หนึ่ง
กล้องบุคคลแรกคือมุมมองที่กล้องถูกล็อคด้วยหัวของตัวละครซึ่งแม่นยำมากขึ้นในชีวิตจริงเป็นที่นิยมในประสบการณ์นักยิงและเรื่องราวที่เป้าหมายคือการทำให้ผู้ใช้รู้สึกสมจริงในโลก


ในสตูดิโอ วัตถุ StarterPlayer มีคุณสมบัติหลายอย่างที่มีผลต่อกล้องของผู้ใช้คุณสมบัติ CameraMode กำหนดวิธีที่กล้องทำงาน
เลือก StarterPlayer .
เปลี่ยนโหมดกล้องเป็น ล็อคคนแรก ซึ่งจะทำให้กล้องของผู้ใช้ไม่เคลื่อนออกจากหัว
แอ็คชัน
สร้างกล้องม้วนข้าง
มุมมองแบบสไลด์ด้านข้างจะให้กล้องอยู่ในตำแหน่งคงที่เมื่อเทียบกับด้านข้างของตัวละคร ทำให้โลกมีความรู้สึกสองมิติ
สคริปต์กล้อง
ขยาย StarterPlayer และใน StarterPlayerScripts เพิ่ม LocalScript ชื่อ CameraManager
ที่ด้านบนของสคริปต์ คัดลอกและวางตัวอย่างโค้ดต่อไปนี้เพื่อรับบริการ ผู้เล่น จากนั้นในตัวแปรใหม่จะได้รับผู้ใช้ท้องถิ่น
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 เพื่อรับส่วนรากมนุษย์และตรวจสอบว่ามันมีอยู่โดยใช้คำสั่ง 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ตำแหน่งของ HumanoidRootPart เป็นจริง 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 กล้องจะต้องมองตรงที่ด้านข้างของตัวละครโดยตรงวางกล้องไว้ที่ด้านข้างของผู้ใช้โดยเพิ่มความลึกให้กับแค่ แกน Z ของตำแหน่งกล้องโดยใช้ 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() เพื่อสร้าง CFrame ที่ตำแหน่งที่ cameraPosition และชี้ไปที่ rootPosition
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
ซิงค์กล้อง
ขั้นตอนสุดท้ายคือการดําเนินการฟังก์ชันนี้ซ้ำๆ เพื่อให้กล้องสอดคล้องกับผู้ใช้ภาพที่ผู้ใช้เห็นจะรีเฟรชอย่างต่อเนื่องการแบ่งวินาทีที่ใช้ในการทำการคำนวณทั้งหมดที่จำเป็นเรียกว่าขั้นตอนการเรนเดอร์ render 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 เพื่อย้ายตัวละครของคุณจากด้านหนึ่งไปยังอีกด้านหนึ่ง
สร้างกล้อง isometric
โครงสร้างพื้นฐานของการรับตำแหน่งของผู้ใช้และอัปเดตตำแหน่งของกล้องในแต่ละเฟรมสามารถปรับเปลี่ยนได้หลายรูปแบบกล้องอื่น ๆ เช่น กล้อง isometric กล้อง isometric เป็นมุมมอง 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 เพื่อให้ได้กล้องแบบข้างบนด้วยสคริปต์เดียวกันลองปรับการตั้งค่าเพื่อรับผลลัพธ์ที่คุณต้องการ!