Roblox में Ragdoll फिजिक्स किरदारों के गिरने और टकराने को रोमांचक और जीवंत बनाती है। लेकिन खराब तरीके से बनाया गया रैगडॉल ग्लिच, रबर-बैंडिंग और जमीन के आर-पार गिरने की समस्या पैदा करता है।
एक स्थिर रैगडॉल सिस्टम के लिए BallSocketConstraints से सही कोण की सीमाएं तय करना, NoCollisionConstraints से अंगों की आपसी टक्कर रोकना और NetworkOwnership का सही प्रबंधन जरूरी है।
1. Motor6D टॉगलिंग और BallSocketConstraint लिमिट्स
एनिमेटेड जोड़ों को फिजिकल जोड़ों में बदलने का सिद्धांत:
- Motor6D बंद करना: Motor6D को नष्ट करने के बजाय Motor6D.Enabled = false करें ताकि किरदार दोबारा उठ सके।
- घूर्णन सीमाएं: LimitsEnabled और TwistLimitsEnabled चालू करके अंगों को अस्वाभाविक 360 डिग्री घूमने से रोकें।
- अटैचमेंट्स की तैयारी: कैरेक्टर स्पॉन के समय ही अटैचमेंट्स बना लें ताकि गेमप्ले के बीच में लैग न आए।
- ह्यूमनॉइड स्टेट: Humanoid:ChangeState(Enum.HumanoidStateType.Physics) सेट करें और गिरने के दौरान GettingUp बंद रखें।
2. कोलिजन ग्रुप्स और NoCollisionConstraints
अंगों के आपस में टकराने से पैदा होने वाले झटकों को रोकने की तकनीक:
- आपसी टक्कर का खतरा: जब दो अंग एक दूसरे में धंसते हैं तो फिजिक्स इंजन उन्हें जोर से हवा में उछाल देता है।
- NoCollisionConstraints: पास-पास वाले अंगों को NoCollisionConstraint से जोड़ें ताकि उनकी आपसी टक्कर का हिसाब न हो।
- CollisionFiltering: रैगडॉल अंगों को एक अलग ग्रुप में डालें जो केवल जमीन से टकराए, अन्य खिलाड़ियों से नहीं।
- CanCollide सेटिंग: HumanoidRootPart का CanCollide बंद रखें और Torso का चालू रखें ताकि शरीर जमीन पर आसानी से फिसल सके।
--!strict
-- Luau Ragdoll Manager with smooth recovery
local PhysicsService = game:GetService("PhysicsService")
3. नेटवर्क ओनरशिप और रेप्लिकेशन
फिजिक्स की गणना कहाँ होती है, यह तय करता है कि मूवमेंट स्मूथ होगा या लैगी:
- लोकल प्लेयर: `SetNetworkOwner(player)` सेट करें ताकि क्लाइंट बिना किसी पिंग लैग के खुद फिजिक्स कैलकुलेट करे।
- NPCs और शव: `SetNetworkOwner(nil)` सेट करें ताकि सर्वर फिजिक्स संभाले और कोई चीटिंग न हो सके।
- बैंडविड्थ की बचत: जब शरीर हिलना बंद कर दे तो अंगों को स्लीप मोड में जाने दें।
- टेलीपोर्ट ग्लिच से बचाव: Motor6D बंद करने और नेटवर्क ओनरशिप बदलने के बीच कम से कम 1 सर्वर टिक का अंतर रखें।
4. स्मूथ उठने की प्रक्रिया (Get-Up Blending)
बिना कैमरे के झटके के जमीन से सामान्य अवस्था में वापस आना:
- जमीन की ढलान: Torso से नीचे रेकास्ट करके HumanoidRootPart को जमीन की सतह के अनुसार सीधा करें।
- स्नैप होने से रोकना: Motor6D चालू करने से ठीक पहले HumanoidRootPart को Torso की वर्तमान जगह पर ले आएं।
- उठने का एनिमेशन: उठने का एनिमेशन चलाते हुए 0.3 सेकंड में धीरे-धीरे जोड़ों को दोबारा सक्रिय करें।
- अस्थायी सुरक्षा: उठते समय थोड़ी देर के लिए इम्युनिटी दें ताकि खिलाड़ी बार-बार गिरने के लूप में न फंसे।
5. मोबाइल ऑप्टिमाइज़ेशन और प्रोडक्शन नियम
मोबाइल फोन पर बिना लैग के फिजिक्स चलाने के दिशानिर्देश:
- सीमित जोड़: केवल मुख्य जोड़ों पर BallSocket लगाएं; टोपियां और कपड़े स्थिर रहने दें।
- फिजिक्स स्लीप: जमीन पर स्थिर पड़े शरीरों की फिजिक्स को अपने आप स्लीप होने दें ताकि CPU बचे।
- मेमरी सफाई: मौत के 10 सेकंड बाद रैगडॉल के सभी अटैचमेंट्स को गेम से हटा दें।
- MicroProfiler टेस्ट: Ctrl+F6 दबाकर चेक करें कि `physics::step` प्रति फ्रेम 3ms से कम रहे।
Frequently Asked Questions
मेरा रैगडॉल अचानक आसमान में क्यों उड़ जाता है?
अंगों के आपस में टकराने (Self-Collision) के कारण। NoCollisionConstraints लगाएं और HumanoidRootPart का CanCollide बंद करें।
रैगडॉल फिजिक्स क्लाइंट पर चलनी चाहिए या सर्वर पर?
जीवित खिलाड़ी के लिए क्लाइंट पर (`SetNetworkOwner(player)`) और मरे हुए खिलाड़ियों या NPCs के लिए सर्वर पर (`SetNetworkOwner(nil)`).
उठते समय किरदार पुरानी जगह पर टेलीपोर्ट क्यों हो जाता है?
क्योंकि HumanoidRootPart वहीं छूट गया था। Motor6D चालू करने से पहले उसे Torso की जगह पर सेट करें।
BallSocketConstraints में TwistLimits क्यों जरूरी है?
ताकि हाथ और पैर 360 डिग्री न घूमें और इंसानी हड्डियों की तरह स्वाभाविक रूप से मुड़ें।