Roblox का डिफॉल्ट कैमरा साधारण खेलों के लिए ठीक है, लेकिन एक्शन गेम्स में दीवारों से टकराने पर झटके देने लगता है।
CameraType.Scriptable का उपयोग करके और RenderStepped पर कैमरा नियंत्रित करके बेहतरीन सिनेमाई अनुभव दिया जा सकता है। स्प्रिंग डैम्पिंग और स्फीयरकास्ट से स्मूथ कैमरा तैयार होता है।
1. डिफॉल्ट कैमरे की सीमाएं और कस्टम कैमरे की जरूरत
फास्ट-पेस्ड गेम्स में डिफॉल्ट कैमरे की कमियां:
- अचानक झटके: दीवारों से टकराने पर कैमरा तेजी से कटता है।
- वजन की कमी: मुड़ने पर स्वाभाविक इनर्शिया का न होना।
- नजर में रुकावट: बीच में खड़ा कैरेक्टर शूटिंग में बाधा बनता है।
- स्क्रिप्टेबल कंट्रोल: कैमरा मैट्रिक्स पर पूरा नियंत्रण हासिल करना।
2. सेकंड-ऑर्डर स्प्रिंग फिजिक्स और डैम्पिंग
बिना किसी अवांछित कंपन के स्वाभाविक कैमरा गति:
- क्रिटिकल डैम्पिंग: 1.0 डैम्पिंग रेशियो से कैमरा बिना हिले तुरंत स्थिर होता है।
- गति इनर्शिया: दौड़ने और कूदने पर वजनदार अहसास।
- स्वतंत्र घूर्णन: माउस का नियंत्रण तेज और सटीक बना रहता है।
- फ्रेमरेट स्वतंत्रता: dt का उपयोग करके सभी उपकरणों पर समान गति।
--!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. स्फीयरकास्ट द्वारा दीवार पार करने की रोकथाम
दीवारों के आर-पार देखने की समस्या का समाधान:
- वॉल्यूमेट्रिक जांच: स्फीयरकास्ट 3D गोले के रूप में दीवारों को पहचानता है।
- सुरक्षा दायरा: दीवार छूने से पहले सुरक्षित दूरी बनाए रखना।
- स्मूथ वापसी: संकरी जगह से बाहर आने पर धीरे-धीरे सामान्य होना।
- कोनों पर सटीक: तेज मोड़ों पर भी कैमरा नहीं अटकता।
4. डायनामिक शोल्डर शिफ्ट और निशाना साधना (ADS)
लड़ाई के दौरान दृश्य को बेहतर बनाना:
- शोल्डर शिफ्ट: जरूरत के अनुसार बाएं या दाएं कंधे से देखना।
- निशाना ज़ूम: गोली चलाते समय व्यू एंगल को छोटा करना।
- पैरालेक्स सुधार: क्रॉसहेयर को स्क्रीन के केंद्र से मिलाना।
- स्प्रिंट प्रभाव: तेजी से दौड़ते समय हल्का पीछे हटना।
5. मोबाइल टच जेस्चर और रिस्पॉन्सिव कंट्रोल
मोबाइल और कंसोल पर बेहतरीन गेमप्ले अनुभव:
- पिंच ज़ूम: दो उंगलियों से कैमरा दूरी आसानी से बदलना।
- राइट-स्क्रीन स्वाइप: स्क्रीन के दाएं हिस्से से कैमरा घुमाना।
- कंट्रोलर कर्व्स: जॉयस्टिक से सटीक निशाना साधने की सुविधा।
- लोकल कैलकुलेशन: सभी गणनाएं फोन पर ही पूरी करना।
Frequently Asked Questions
कैमरे के लिए रेकास्ट के बजाय स्फीयरकास्ट क्यों चुनें?
स्फीयरकास्ट एक 3D क्षेत्र की जांच करता है, जिससे कैमरा दीवारों के अंदर नहीं घुसता।
दीवार के पास कैमरे के कंपन को कैसे रोकें?
दूरी में बदलाव को तुरंत न करके धीरे-धीरे स्मूथ करने से कंपन दूर होता है।
क्या इससे मोबाइल फोन पर गेम लैग होगा?
यह गणना प्रति फ्रेम 0.05ms से भी कम समय लेती है, जिससे गेम 60 FPS पर चलता रहता है।