Tampilan pengguna terhadap dunia direpresentasikan oleh objek Camera. Anda dapat mengubah perilaku kamera untuk menyesuaikan pengalaman Anda dengan berbagai cara. Misalnya, kamera dapat bereaksi terhadap peristiwa di dunia, seperti goyang saat monster berjalan lewat, atau terkunci di sisi karakter pengguna, seperti dalam game side-scroller.
Buat kamera sudut pandang orang pertama
Kamera sudut pandang orang pertama adalah tampilan dimana kamera tetap terkunci dengan kepala karakter, yang lebih akurat dengan kehidupan nyata. Ini umum dalam pengalaman tembak-menembak dan cerita di mana tujuannya adalah untuk membuat pengguna merasa terbenam dalam dunia.


Di Studio, objek StarterPlayer memiliki sejumlah properti yang memengaruhi kamera pengguna. Properti CameraMode menentukan bagaimana perilaku kamera.
Pilih StarterPlayer.

Ubah CameraMode menjadi LockFirstPerson. Ini memastikan kamera pengguna tidak bergerak menjauh dari kepalanya.

Lakukan pengujian untuk melihat kamera sudut pandang orang pertama beraksi.
Buat kamera geser samping
Tampilan geser samping menjaga kamera pada posisi tetap relatif terhadap sisi karakter, memberikan dunia nuansa dua dimensi.

Skrip kamera
Perluas StarterPlayer, dan di StarterPlayerScripts tambahkan LocalScript yang dinamakan CameraManager.

Di bagian atas skrip, salin dan tempel contoh kode berikut untuk mendapatkan Players service, dan kemudian dalam variabel baru ambil pengguna lokal.
local Players = game:GetService("Players")local player = Players.LocalPlayerBuat fungsi yang disebut updateCamera. Ini menyimpan logika yang diperlukan untuk mendapatkan dan menetapkan posisi baru untuk kamera.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endDi dalam fungsi, ambil model karakter pengguna dan periksa apakah itu ada menggunakan pernyataan if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Arahkan kamera
Semua model karakter memiliki bagian yang dinamakan HumanoidRootPart, yang dapat digunakan untuk mendapatkan posisi karakter di dunia. Ini menetapkan posisi yang dituju oleh kamera.
Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan periksa apakah ada menggunakan pernyataan if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendPosisi HumanoidRootPart sebenarnya 2 stud di bawah kepala pengguna. Untuk memperbaikinya, tambahkan Vector3 baru dengan tinggi 2 stud ke posisi root.
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
Tetapkan posisi kamera
Kamera juga membutuhkan posisi. Untuk memberikan tampilan 2D dengan efek geser samping, kamera perlu melihat langsung ke sisi karakter. Tempatkan kamera di samping pengguna dengan menambahkan kedalaman hanya pada sumbu Z posisi kamera menggunakan 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
Perbarui CurrentCamera
Sekarang bahwa variabel untuk posisi kamera dan target kamera sudah siap, saatnya memperbarui posisi kamera. Anda dapat mengakses kamera pengguna melalui properti CurrentCamera dari Workspace. Kamera memiliki properti CFrame untuk menentukan posisinya.
Anda dapat menggunakan CFrame.lookAt() untuk memperbarui kamera. Ini memerlukan dua posisi dan membuat CFrame yang terletak pada posisi pertama yang mengarah ke posisi kedua. Gunakan CFrame.lookAt() untuk membuat CFrame yang terletak pada cameraPosition dan mengarah ke 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
Sinkronkan kamera
Langkah terakhir adalah menjalankan fungsi ini secara berulang untuk menjaga kamera tetap sinkron dengan pengguna. Gambar yang dilihat pengguna terus-menerus diperbarui. Detik yang dibutuhkan untuk melakukan semua perhitungan yang diperlukan disebut render step.
RunService:BindToRenderStep() membuatnya mudah untuk mengeksekusi fungsi di setiap frame dengan menerima tiga parameter ini:
- name - Nama pengikatan ini, yang harus unik sehingga tidak berbenturan dengan fungsi lain yang memiliki nama yang sama.
- priority - Semakin tinggi angkanya, semakin tinggi prioritasnya. Fungsi ini harus berjalan setelah pembaruan kamera default Roblox, jadi prioritas ditetapkan 1 tingkat lebih tinggi dari RenderPriority internal kamera.
- function - Fungsi yang akan diikat ke langkah render.
Gunakan RunService:BindToRenderStep() untuk mengikat fungsi updateCamera ke langkah render.
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)Lakukan pengujian pada kode Anda. Gunakan tombol A dan D untuk menggerakkan karakter Anda dari sisi ke sisi.
Buat kamera isometrik
Struktur dasar untuk mendapatkan posisi pengguna dan memperbarui posisi kamera setiap frame dapat diterapkan ke banyak gaya kamera lainnya, seperti kamera isometrik. Kamera isometrik adalah tampilan 3D yang sedikit mengarah ke bawah pada sudut tetap menuju karakter pengguna.

Modifikasi posisi dan tampilan
Menggunakan kode dari contoh sebelumnya, modifikasi cameraPosition untuk menambahkan jumlah yang sama di semua 3 dimensi.
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)Mengubah properti FieldOfView kamera mensimulasikan zoom in dan out, yang dapat memberikan tampilan yang lebih datar. Cobalah mengaturnya ke nilai 20 untuk zoom in, dan meningkatkan jarak kamera dari pengguna untuk mengkompensasi.
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()
Dengan mengubah cara kamera berperilaku, Anda dapat mencapai tampilan baru untuk pengalaman Anda. Lihat apakah Anda dapat mengubah cameraPosition untuk mencapai kamera tampak atas dengan skrip yang sama. Cobalah menyesuaikan pengaturan untuk mendapatkan hasil yang Anda suka!