एक इकाई प्रणाली में टकराव का पता लगाने और प्रतिक्रिया


12

एक ES के साथ और अधिक मज़ा ...

वर्तमान में, मेरे पास कुछ सिस्टम हैं:

  • रेंडरर (रेंडर करने योग्य विशेषता, रूपांतरण विशेषता)
  • गति (चल विशेषता, ट्रांसफ़ॉर्म विशेषता, रेंडर करने योग्य विशेषता [बाउंडिंग बॉक्स आदि के लिए))
  • इनपुट (InputReceiver विशेषता)
  • आदि।

मैं टक्कर का पता लगा रहा हूं। मेरा पहला विचार एक नई प्रणाली को जोड़ना था जो टकराव करता है। यह मुझे इस Motionप्रणाली से अलग-थलग रखने के लिए समझ में आता है क्योंकि सभी चीजें जो चलती हैं या एनिमेटेड नहीं हैं वे आवश्यक रूप से टकराव का पता लगाने में भाग लेते हैं - कैमरा, कोहरा, आदि - लेकिन ऐसा लगता है कि Collisionऔर Motionअन्योन्याश्रित हैं।

जब Motionएक इकाई चलती है, तो परिवर्तन को मान्य किया जाना चाहिए Collision, और आंदोलन को या तो रद्द कर दिया गया, या समायोजित किया गया (उछल, दीवार पर रोकना, आदि)।

एक Collidable विशेषता बनाने के लिए एक विकल्प होगा जो टकराव की वस्तु के संदर्भ को बनाए रखता है - kd-tree, octree, इत्यादि जो उन संस्थाओं के बीच साझा किए जाते हैं जो एक दूसरे से टकरा सकते हैं। Motionप्रणाली तो उस विशेषता के लिए चेक करें, और जाँच करें या आंदोलन को समायोजित करने के लिए इसका इस्तेमाल करते हैं।

एक कोड परिप्रेक्ष्य से, यह एक स्वीकार्य समाधान है। हालांकि, ECS वास्तुकला के दृष्टिकोण से, ऐसा लगता है कि यह Motionसिस्टम में तर्क को आगे बढ़ा रहा है जो उन सभी संस्थाओं पर लागू नहीं होता है जिनके पास एक Movableविशेषता है।

मैं भी में एक प्रस्ताव वेक्टर संग्रहीत कर सकती है Movableविशेषता है, और है Colliderप्रणाली को समायोजित Transformके रूप में की जरूरत है, लेकिन यह है कि बीच कार्यक्षमता डुप्लिकेट को शामिल करेंगे Motionऔर Collider, या से एक कॉलबैक Colliderकरने के लिए Motionउछाल / प्रतिबिंब, आदि के लिए टक्कर स्थान और सतह का डेटा बारे में कुछ डेटा के साथ ।

यह "विशेष मामला हैक" के शीर्षक के अंतर्गत आ सकता है, लेकिन मैं उन लोगों से कुछ इनपुट प्राप्त करना चाहता हूं, जिन्होंने एक टन एज केस कोड बनाए बिना इसे संभाला है।

प्रश्न जब गति और टक्कर सिस्टम के बीच तंग युग्मन से बचने का एक अच्छा तरीका है जब ऐसा लगता है कि उन्हें एक दूसरे के ज्ञान की आवश्यकता है?


1
प्रश्न क्या है?
jcora

@ कोई भी टकराव का पता लगाने वाले तर्क को रखने के लिए एक अच्छी जगह है, टकराव + आंदोलन को यथासंभव अलग रखना और प्रणालियों के बीच अंतर निर्भरता को न्यूनतम रखना। मेरी पोस्ट थोड़ी
टेढ़ी

1
महान, अब अपने सवाल में, बोल्ड कर दिया । :)
जेकोरा

जवाबों:


7

आप इसे खत्म कर रहे हैं। मेरे इंजन में, जो एक इकाई-घटक प्रणाली का भी उपयोग करता है, हर GameObjectएक के लिए एक सूचक हो सकता है ModuleCollision

गेम अपडेट होने पर क्या होता है:

  • दृश्य अपने पास मौजूद सभी वस्तुओं को अपडेट करता है। यह Updateप्रत्येक के लिए फ़ंक्शन को कॉल करता है GameObject
  • Updateफ़ंक्शन के अंदर , प्रत्येक GameObject केवल अपनी गति और दिशा को अपडेट करता है, अपनी स्थिति को नहीं
  • GameObjectModuleCollisionयदि कोई उपलब्ध है, तो इसकी वर्तमान स्थिति, गति और दिशा को अपलोड करता है।
  • दृश्य एक ModuleCollisionआधार पर टकराव की जाँच करता है ।
  • दृश्य UpdatePostप्रत्येक पर फ़ंक्शन को कॉल करता है GameObject। यदि ऑब्जेक्ट में एक टक्कर मॉड्यूल है, तो यह टक्कर मॉड्यूल से अद्यतन स्थिति, गति और दिशा प्राप्त करता है। स्थिति को गति और दिशा के साथ अद्यतन किया जाता है।
  • GameObjectअपनी स्थिति और शीर्षक से अंतिम 3x3 मैट्रिक्स का निर्माण करता है।

हां, राज्य का कुछ दोहराव है, लेकिन यह ठीक है। एक पर टकराव की हैंडलिंग करना ModuleCollisionइसके बारे में जाने का सबसे अच्छा तरीका है, क्योंकि अन्यथा आपको यह देखने के लिए प्रत्येक GameObjectको देखना होगा कि क्या यह एक ModuleCollisionहैंडल है।


2
इसलिए टकराव की स्थिति में पीछे हटने की स्थिति के बारे में चिंता करने के बजाय, आप अनुवाद से वेग / त्वरण को विभाजित कर रहे हैं, जो किसी भी टकराव का पता लगाने के आधार पर बदल रहे हैं, और फिर उन परिवर्तनों को उसी फ्रेम के भीतर एक दूसरे विशेष अपडेट में प्रचारित किया जाता है? बहुत साफ लगता है। धन्यवाद।
3Dave

3

मैं इसे इस तरह से करूँगा ...

तीन सिस्टम हैं:

  1. आंदोलन प्रणाली
  2. त्वरण प्रणाली
  3. टक्कर प्रणाली

आंदोलन प्रणाली पदों पर वेग लागू करती है। त्वरण प्रणाली वेगों पर बल लागू करती है। टकराव प्रणाली टकरावों का पता लगाती है और सही दिशाओं में बलों को लागू करती है, या, यदि आप क्रूड टकराव चाहते हैं, तो सीधे वेग को बदल देता है।

उदाहरण के लिए, आप atan2 का उपयोग करके टकरावों के बीच के कोण की गणना कर सकते हैं , और उसके बाद निकायों के सही बलों / वेगों को लागू करने के लिए इसका उपयोग कर सकते हैं।

यदि आवश्यक हो तो टकराव का पता लगाने वाला सिस्टम प्रसारण संदेश भी दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.