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.
Di Studio, objek StarterPlayer berisi beberapa propperti yang mengubah kamera pengguna. Propperti CameraMode menentukan bagaimana kamera bertindak.
Pilih StarterPlayer .
Ubah Mode Kamera menjadi Tahan Orang Pertama . Ini menjamin agar kamera pengguna tidak pindah dari kepala mereka.
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
Jadilah StarterPlayer, dan dalam StarterPlayerScripts tambahkan Skrip Lokal bernama CameraManager .
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.LocalPlayerBuat fungsi bernama updateCamera . Ini menyimpan logika yang dibutuhkan 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 itu ada dengan menggunakan if statement.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Mengarahkan Kamera
Semua model karakter mengandung bagian bernama HumanoidRootPart , yang dapat digunakan untuk mendapatkan posisi karakter di dunia. Ini menetapkan posisi titik kamera.
Gunakan FindFirstChild untuk mendapatkan HumanoidRootPart dan memeriksa apakah ada menggunakan if statement.
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 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.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
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.
Gunakan RunService:BindToRenderStep() untuk menyambungkan 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 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
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 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.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local 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!