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.


Di Studio, objek StarterPlayer berisi beberapa properti yang mempengaruhi kamera pengguna.Properti Mode Kamera menentukan bagaimana kamera berperilaku.
Pilih Pemain Pemula .
Ubah Mode Kamera ke LockFirstPerson . Ini memastikan kamera pengguna tidak bergerak jauh dari kepala mereka.
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
Perluas StarterPlayer, dan di StarterPlayerScripts tambahkan LocalScript bernama CameraManager .
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.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, dapatkan model karakter pengguna dan periksa apakah ada dengan menggunakan pernyataan if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
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.
Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan memeriksa 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 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.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 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.
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)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
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 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.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local 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!