Kamera bawaan Roblox kurang memadai untuk game aksi cepat karena sering menyentak saat terbentur tembok sempit.
Dengan memanfaatkan CameraType.Scriptable pada RenderStepped, pengembang dapat membangun kamera sinematik dengan inersia pegas yang realistis dan perlindungan benturan volumetrik Spherecast.
1. Keterbatasan Kamera Bawaan di Game Kompetitif
Kelemahan sistem kamera standar saat pertempuran intens:
- Sentakan Kasar: Kamera langsung memotong jarak saat menyentuh sudut dinding.
- Tanpa Inersia: Gerakan kaku tanpa sensasi bobot fisik.
- Karakter Menghalangi: Posisi tengah menghalangi pandangan saat menembak.
- Kendali Penuh Scriptable: Kebebasan mutlak mengatur koordinat CFrame.
2. Fisika Pegas Derajat Kedua & Damping Kritis
Menciptakan inersia alami tanpa pantulan liar:
- Damping Kritis: Rasio 1.0 menghentikan kamera di target tanpa osilasi bolak-balik.
- Simulasi Bobot: Memberikan sensasi hentakan saat melompat atau berlari.
- Rotasi Terpisah: Bidikan mouse tetap responsif sementara posisi mengikuti dengan mulus.
- Bebas Framerate: Menggunakan perkalian dt agar konsisten di berbagai refresh rate layar.
--!strict
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local CameraController = {}
local camera = Workspace.CurrentCamera
local player = Players.LocalPlayer
local yaw, pitch = 0, 0
local targetDistance, currentDistance = 12, 12
local springPos, springVel = Vector3.zero, Vector3.zero
local SPHERE_RADIUS = 0.6
local RAY_PARAMS = RaycastParams.new()
RAY_PARAMS.FilterType = RaycastFilterType.Exclude
function CameraController.Init()
camera.CameraType = Enum.CameraType.Scriptable
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
RunService.RenderStepped:Connect(CameraController.Update)
end
function CameraController.Update(dt: number)
local char = player.Character
if not char or not char:FindFirstChild("Head") then return end
local head = char.Head :: BasePart
RAY_PARAMS.FilterDescendantsInstances = { char }
local focus = CFrame.new(head.Position) * CFrame.Angles(0, yaw, 0) * CFrame.Angles(pitch, 0, 0)
local force = (Vector3.new(2.2, 1.0, 0) - springPos) * 140 - (springVel * 22)
springVel += force * dt
springPos += springVel * dt
local targetPos = (focus * CFrame.new(springPos)).Position - (focus.LookVector * targetDistance)
local hit = Workspace:Spherecast(head.Position, SPHERE_RADIUS, targetPos - head.Position, RAY_PARAMS)
local adjDist = targetDistance
if hit and hit.Instance and hit.Instance.CanCollide then
adjDist = math.max(1.5, (hit.Position - head.Position).Magnitude - SPHERE_RADIUS)
end
currentDistance += (adjDist - currentDistance) * math.min(1, dt * 25)
camera.CFrame = focus * CFrame.new(springPos) * CFrame.new(0, 0, currentDistance)
end
return CameraController
3. Pencegahan Tembus Tembok Menggunakan Spherecast
Menghindari lensa kamera menembus geometri objek padat:
- Pemeriksaan Volumetrik: Spherecast memindai bola 3D di sekeliling posisi kamera.
- Bantalan Keamanan: Menghentikan kamera sebelum menyentuh permukaan dinding.
- Pemulihan Halus: Memperlebar kembali jarak kamera secara bertahap saat keluar ruangan.
- Deteksi Sudut Tajam: Mencegah bug visual di sudut sempit.
4. Pergantian Bahu Dinamis & Mode Membidik (ADS)
Memperluas sudut pandang dalam pertempuran taktis:
- Tukar Bahu Kanan-Kiri: Beralih sudut pandang untuk mengintip di balik tikungan.
- Zoom Bidik: Menurunkan FOV saat menembak agar target lebih jelas.
- Koreksi Paralaks: Menyelaraskan peluru dengan titik tengah layar.
- Efek Lari Cepat: Menarik kamera sedikit ke belakang saat sprint.
5. Gestur Sentuh Ponsel dan Kontrol Multipapan
Pengalaman bermain optimal di layar sentuh ponsel dan stik game:
- Cubit untuk Zoom: Mengatur jarak kamera dengan mudah menggunakan dua jari.
- Area Putar Kanan: Mengkhususkan layar kanan untuk rotasi kamera.
- Kurva Responsif Stik: Memudahkan bidikan akurat dengan stik analog.
- Kalkulasi Lokal: Memproses semua perhitungan di sisi klien tanpa membebani server.
Frequently Asked Questions
Mengapa memilih Spherecast dibanding Raycast biasa?
Spherecast memiliki volume fisik sehingga mencegah lensa kamera menembus sudut tembok.
Bagaimana cara menghilangkan getaran kamera saat dekat tembok?
Gunakan interpolasi jarak secara bertahap daripada memindahkan posisi secara instan.
Apakah pemrosesan per frame ini membuat ponsel lag?
Perhitungan ini memakan waktu kurang dari 0.05 ms per frame sehingga tetap lancar pada 60 FPS.