Kontrol kamera pengguna

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

Pandangan pengguna terhadap dunia diwakili oleh objek Camera .Anda dapat mengubah perilaku kamera untuk sesuai dengan pengalaman Anda dengan berbagai cara.Sebagai contoh, kamera dapat bereaksi terhadap peristiwa di dunia, seperti bergetar saat monster berjalan, atau terkunci di sisi karakter pengguna, seperti di side-scroller.

Buat kamera orang pertama

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

Kamera Orang Pertama
Kamera Roblox Klasik

Di Studio, objek StarterPlayer berisi beberapa properti yang mempengaruhi kamera pengguna.Properti Mode Kamera menentukan bagaimana kamera berperilaku.

  1. Pilih Pemain Pemula .

  2. Ubah Mode Kamera ke LockFirstPerson . Ini memastikan kamera pengguna tidak bergerak jauh dari kepala mereka.

  3. Playtest untuk melihat kamera orang pertama dalam action.

Buat kamera gulir samping

Tampilan gulir samping menjaga kamera pada posisi tetap relatif terhadap sisi karakter, memberi dunia perasaan dua dimensi.

Memprogram kamera

  1. Perluas StarterPlayer, dan di StarterPlayerScripts tambahkan LocalScript bernama CameraManager .

  2. Di bagian atas skrip, salin dan tempel sampel kode berikut untuk mendapatkan layanan Pemain , dan kemudian di variabel baru dapatkan 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, dapatkan model karakter pengguna dan periksa apakah ada dengan menggunakan pernyataan if.


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

Tunjukkan kamera

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

  1. Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan memeriksa 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 kancing di bawah kepala pengguna.Untuk memperbaikinya, tambahkan baru Vector3 dengan ketinggian 2 kancing 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

Tetapkan posisi kamera

Kamera juga membutuhkan posisi.Untuk memberikan tampilan pandangan pengguna 2D side-scrolling, kamera perlu melihat langsung ke sisi karakter.Tempatkan kamera di samping pengguna dengan menambahkan kedalaman hanya pada sumbu Z dari posisi kamera menggunakan .


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 Aktual

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

Anda dapat menggunakan CFrame.lookAt() untuk memperbarui kamera.Ini membutuhkan dua posisi dan membuat CFrame yang terletak di posisi pertama menunjuk ke posisi kedua.Gunakan CFrame.lookAt() untuk membuat CFrame yang berada di cameraPosition dan ditujukan 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

Sinkronisasi kamera

Langkah terakhir adalah menjalankan fungsi ini berulang kali untuk menjaga kamera sinkron dengan pengguna.Gambar yang dilihat pengguna terus-menerus diperbarui.Pembagian detik yang diperlukan untuk melakukan semua perhitungan yang diperlukan disebut langkah render .

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

  • name - Nama pengikatan ini, yang harus unik sehingga tidak akan bertabrakan dengan fungsi lain dengan nama yang sama.
  • priority - Semakin tinggi nomornya, prioritasnya semakin tinggi.Fungsi ini harus dijalankan setelah updatekamera default Roblox, jadi prioritas diatur ke 1 tingkat lebih tinggi dari Prioritas Render kamera internal.
  • function - Fungsi yang harus 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. Tes kode Anda. Gunakan tombol A dan D untuk memindahkan karakter Anda dari sisi ke sisi.

Buat kamera isometrik

Struktur dasar untuk mendapatkan posisi pengguna dan memperbarui posisi kamera setiap frame dapat disesuaikan dengan banyak gaya kamera lain, seperti kamera isometrik .Kamera isometrik adalah pandangan 3D yang sedikit menunjuk ke bawah pada sudut tetap terhadap karakter pengguna.

Modifikasi 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 properti kamera FieldOfView mengubah zoom masuk dan keluar, yang dapat memberikan pandangan tampak lebih datar.Coba atur ke nilai 20 untuk memperbesar, dan meningkatkan jarak kamera dari pengguna untuk menebusnya.


    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 keseluruhan untuk pengalaman Anda.Lihat apakah Anda dapat mengubah cameraPosition untuk mencapai kamera top-down dengan skrip yang sama.Coba menyesuaikan pengaturan untuk mendapatkan hasil yang Anda suka!