Mengontrol Kamera Pengguna

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

Penggunaan pengguna tentang dunia diwakili oleh objek Camera. Anda dapat mengubah perilaku kamera untuk menyesuaikan pengalaman Anda dalam berbagai cara. Misalnya, kamera dapat bereaksi terhadap acara di dunia, seperti berjabat saat monster berjalan, atau terkunci di sisi karakter pengguna, seperti dalam side-scroller.

Membuat Kamera Orang Pertama

Kamera orang pertama adalah pandangan di mana kamera tetap terkunci dengan kepala karakter, yang lebih akurat untuk kehidupan nyata. Ini umum dalam shooter dan pengalaman cerita di mana tujuan adalah membuat pengguna merasa terlibat dalam dunia.

Kamera Orang Pertama
Kamera Roblox Klasik

Di Studio, objek StarterPlayer berisi beberapa propperti yang mengubah kamera pengguna. Propperti CameraMode menentukan bagaimana kamera bertindak.

  1. Pilih StarterPlayer .

  2. Ubah Mode Kamera menjadi Tahan Orang Pertama . Ini menjamin agar kamera pengguna tidak pindah dari kepala mereka.

  3. Mainkan untuk melihat kamera orang pertama dalam action.

Membuat Kamera Gulir Sisi

Tampilan side-scrolling menjaga kamera tetap dalam posisi tetap relatif terhadap sisi karakter, memberikan dunia perasaan dua dimensi.

Menggunakan Kamera

  1. Jadilah StarterPlayer, dan dalam StarterPlayerScripts tambahkan Skrip Lokal bernama CameraManager .

  2. Pada bagian atas skrip, salinan dan pasta contoh kode berikut untuk mendapatkan layanan pemain , dan kemudian dalam variabel baru mendapatkan pengguna lokal.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Buat fungsi bernama updateCamera . Ini menyimpan logika yang dibutuhkan 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, dapatkan model karakter pengguna dan periksa apakah itu ada dengan menggunakan if statement.


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

Mengarahkan Kamera

Semua model karakter mengandung bagian bernama HumanoidRootPart , yang dapat digunakan untuk mendapatkan posisi karakter di dunia. Ini menetapkan posisi titik kamera.

  1. Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan memeriksa apakah ada menggunakan if statement.


    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 adalah 2 stud di bawah kepala pengguna. Untuk memperbaikinya, tambahkan Vector3 baru dengan ketinggian 2 stud ke posisi akar.


    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

Mengatur Posisi Kamera

Kamera juga memerlukan posisi. Untuk memberikan tampilan 2D side-scrolling pada pengguna, kamera perlu menatap langsung ke sisi karakter. Tempatkan kamera di sisi pengguna dengan menambahkan kedalaman hanya pada <a href="/reference/engine/datatypes">Datatype.Vector3</a> 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 Kamera Saat Ini

Sekarang bahwa variabel untuk posisi kamera dan target kamera siap, saatnya untuk memperbarui posisi kamera. Anda dapat mengakses kamera melalui properti CurrentCamera dari Workspace. Kamera memiliki properti CFrame untuk menentukan posisinya.

Anda dapat menggunakan CFrame.lookAt() untuk menyetujui kamera. Ini mengambil dua posisi dan menciptakan CFrame yang berlokasi di posisi pertama yang menunjuk ke arah kedua. Gunakan CFrame.lookAt() untuk menciptakan CFrame yang berlokasi di posisi cameraPosition dan menunj


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

Sinkronisasi Kamera

Langkah terakhir adalah mengeksekusi fungsi ini berulang kali untuk menjaga kamera tetap sinkron dengan pengguna. Gambar yang dilihat pengguna selalu diperbarui. Tahap pembagian yang dibutuhkan untuk melakukan semua kalkulasi yang diperlukan disebut langkah render .

RunService:BindToRenderStep() membuatnya mudah untuk mengeksekusi fungsi di setiap frame dengan menerima tiga parameter ini:

  • name - Nama binding ini, yang harus unik sehingga tidak bertabrakan dengan fungsi lain dengan nama yang sama.
  • priority - Semakin tinggi nomornya, semakin tinggi prioritasnya. Fungsi ini harus dijalankan setelah updatekamera default Roblox, sehingga prioritas ditetapkan sebesar 1 tingkat di atas RenderPrice internal kamera.
  • function - Fungsi untuk dibindung ke langkah render.
  1. Gunakan RunService:BindToRenderStep() untuk menyambungkan 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. Uji kode Anda. Gunakan tombol A dan D untuk menggerakkan karakter Anda dari sisi ke sisi.

Membuat Kamera Iometris

Struktur dasar mendapatkan posisi pengguna dan menyetel posisi kamera setiap frame dapat diadaptasi ke banyak gaya kamera lainnya, seperti kamera isometrica . Kamera isometrica adalah pandangan 3D menunjuk sedikit ke bawah ke sudut tetap ke karakter pengguna.

Mengubah Posisi dan Tampilan

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


    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 propperti FieldOfView kamera mengubah zoom-nya, yang dapat memberikan tampilan yang lebih miring. Coba tetapkan ke nilai 20 untuk mengekskesnya, dan meningkatkan jarak kamera dari pengguna untuk men компенセン.


    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 kameranya bertingkah, Anda dapat mencapai tampilan baru untuk pengalaman Anda. Lihat apakah Anda dapat mengubah cameraPosition untuk mencapai kamera top-down dengan skrip yang sama. Coba mengubah pengaturan untuk mendapatkan hasil yang Anda sukai!