Memulai
Tutorial menengah

Kontrol Kamera Pengguna

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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.

Kamera Sudut Pandang Orang Pertama
Kamera Roblox Klasik

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

  1. Pilih StarterPlayer.

    alt

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

    alt

  3. 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.

alt

Skrip kamera

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

    alt

  2. 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.LocalPlayer
  3. Buat 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.LocalPlayer
    local function updateCamera()
    end
  4. Di dalam fungsi, ambil model karakter pengguna dan periksa apakah itu ada menggunakan pernyataan if.


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

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.

  1. Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan periksa apakah ada menggunakan pernyataan 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. Posisi 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.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

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.
  1. Gunakan RunService:BindToRenderStep() untuk mengikat fungsi updateCamera ke langkah render.


    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. 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.

alt

Modifikasi posisi dan tampilan

  1. Menggunakan kode dari contoh sebelumnya, modifikasi cameraPosition untuk menambahkan jumlah yang sama di semua 3 dimensi.

    alt


    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. 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.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 64
    local HEIGHT_OFFSET = 2
    camera.FieldOfView = 20
    local 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!

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.