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


Di Studio, objek StarterPlayer berisi sejumlah properti yang mempengaruhi kamera pengguna. Properti CameraMode menentukan bagaimana kamera berperilaku.
Pilih StarterPlayer.

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

Uji coba untuk melihat kamera sudut pandang pertama dalam aksi.
Buat kamera side-scrolling
Tampilan side-scrolling menjaga kamera pada posisi tetap relatif terhadap sisi karakter, memberikan dunia nuansa dua dimensi.

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

Di bagian atas skrip, salin dan tempel contoh kode berikut untuk mendapatkan layanan Players, dan kemudian dalam variabel baru dapatkan pengguna lokal.
local Players = game:GetService("Players")local player = Players.LocalPlayerBuat fungsi bernama updateCamera. Ini menyimpan logika yang diperlukan untuk mendapatkan dan mengatur posisi baru untuk kamera.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endDi dalam fungsi, dapatkan model karakter pengguna dan periksa apakah itu ada dengan 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 mengandung bagian bernama HumanoidRootPart, yang dapat digunakan untuk mendapatkan posisi karakter di dunia. Ini mengatur posisi yang dituju kamera.
Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan periksa apakah itu 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
Atur posisi kamera
Kamera juga memerlukan posisi. Untuk memberikan tampilan pengguna nuansa side-scrolling 2D, kamera perlu melihat langsung ke samping karakter. Tempatkan kamera di samping pengguna dengan menambahkan kedalaman hanya pada sumbu Z dari 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
endPerbarui CurrentCamera
Sekarang bahwa variabel untuk posisi kamera dan target kamera sudah siap, saatnya untuk 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 mengambil dua posisi dan membuat CFrame yang terletak di posisi pertama yang mengarah ke posisi kedua. Gunakan CFrame.lookAt() untuk membuat CFrame yang diposisikan di 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
endSinkronkan kamera
Langkah terakhir adalah menjalankan fungsi ini berulang kali untuk menjaga kamera tetap sinkron dengan pengguna. Gambar yang dilihat pengguna terus-menerus diperbarui. Detik terpisah yang dibutuhkan untuk melakukan semua perhitungan yang diperlukan disebut render step.
RunService:BindToRenderStep() memudahkan untuk mengeksekusi fungsi di setiap frame dengan menerima tiga parameter ini:
- name - Nama pengikatan ini, yang harus unik sehingga tidak bertabrakan dengan fungsi lain dengan nama yang sama.
- priority - Semakin tinggi angkanya, semakin tinggi prioritasnya. Fungsi ini harus dijalankan setelah pembaruan kamera default Roblox, jadi prioritas diatur satu 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)Uji coba 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 diadaptasi untuk banyak gaya kamera lainnya, seperti kamera isometrik. Kamera isometrik adalah tampilan 3D yang mengarah sedikit ke bawah pada sudut tetap menuju karakter pengguna.

Modifikasi posisi dan tampilan
Menggunakan kode dari contoh sebelumnya, modifikasi cameraPosition untuk menambahkan jumlah yang sama ke 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 mengatur nilainya menjadi 20 untuk memperbesar, dan meningkatkan jarak kamera dari pengguna untuk mengimbangi.
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 permainan Anda. Lihat apakah Anda dapat mengubah cameraPosition untuk mencapai kamera top-down dengan skrip yang sama. Cobalah menyesuaikan pengaturan untuk mendapatkan hasil yang Anda suka!