एक इकाई प्रणाली में आंदोलन के कई स्रोत


9

मैं इकाई प्रणालियों के विचार के लिए काफी नया हूं, सामान का एक गुच्छा (सबसे उपयोगी, इस महान ब्लॉग और इस उत्तर ) को पढ़कर ।

यद्यपि मुझे यह समझने में थोड़ी परेशानी हो रही है कि किसी स्रोत की अपरिभाषित संख्या द्वारा किसी वस्तु की स्थिति को सरल बनाने में सक्षम होने के नाते कितना सरल है।

यही है, मेरे पास मेरी इकाई है, जिसमें एक स्थिति घटक है। मेरे पास खेल में कुछ घटना है जो इस इकाई को एक निश्चित समय में एक निश्चित दूरी तय करने के लिए कहती है।

ये घटनाएं किसी भी समय हो सकती हैं, और स्थिति और समय के लिए अलग-अलग मूल्य होंगे। परिणाम यह है कि उन्हें एक साथ जोड़ा जाएगा।

एक पारंपरिक OO समाधान में, मेरे पास कुछ प्रकार की MoveByकक्षा होगी, जिसमें दूरी / समय और मेरे गेम ऑब्जेक्ट क्लास के अंदर की एक सरणी होती है। प्रत्येक फ्रेम, मैं सभी के माध्यम से पुनरावृति करना चाहता हूं MoveBy, और इसे स्थिति पर लागू करता हूं । यदि कोई MoveByअपने अंतिम समय पर पहुंच गया है, तो उसे सरणी से हटा दें।

इकाई प्रणाली के साथ, मैं थोड़ा भ्रमित हूं कि मुझे इस तरह के व्यवहार को कैसे दोहराया जाना चाहिए।

अगर एक समय में इनमें से एक था, तो उन्हें एक साथ संयोजित करने में सक्षम होने के बजाय, यह काफी सीधा होगा (मुझे विश्वास है) और कुछ इस तरह दिखेंगे:

PositionComponent युक्त x, y

MoveByComponent युक्त x, y, time

Entityजिसमें ए PositionComponentऔर ए दोनों हैंMoveByComponent

MoveBySystemजो इन दोनों घटकों के साथ एक इकाई की तलाश करता है, और का मान जोड़ता MoveByComponentहै PositionComponent। जब timeपहुँच जाता है, तो यह उस निकाय से घटक को निकाल देता है।

मैं थोड़ा उलझन में हूँ कि मैं एक ही चीज़ को कई चालों के साथ कैसे करूँगा।

मेरे शुरुआती विचार हैं कि मेरे पास होगा:

PositionComponent, MoveByComponentऊपर जैसा ही

MoveByCollectionComponentजिसमें MoveByComponentएस की एक सरणी है

MoveByCollectionSystemएक PositionComponentऔर ए के साथ एक इकाई के लिए लग रहा है MoveByCollectionComponent, MoveByComponentइसके अंदर एस के माध्यम से पुनरावृत्ति , आवश्यक के रूप में लागू / हटाने।

मुझे लगता है कि यह एक अधिक सामान्य समस्या है, एक ही घटक के कई होने, और हर एक पर कार्य करने के लिए इसी प्रणाली को चाहते हैं। मेरी संस्थाओं में घटक प्रकार -> घटक के हैश के अंदर उनके घटक होते हैं, इसलिए कड़ाई से प्रति इकाई एक विशेष प्रकार के केवल 1 घटक होते हैं।

  1. क्या यह देखने का सही तरीका है?

  2. क्या किसी इकाई के पास कभी भी किसी प्रकार का एक घटक होना चाहिए?


1
की तरह की तरह ध्वनि MoveByकार्यक्षमता सिर्फ एक वेग की तरह है? ऐसा लगता है कि आप सही रास्ते पर हैं। आपके दूसरे प्रश्न के लिए, इकाई / घटक प्रणालियों के विभिन्न कार्यान्वयन बहुत सारे हैं। मेरे द्वारा दिए गए उत्तर में वर्णित एक लिंक का केवल एक घटक होगा।
MichaelHouse

क्रमबद्ध करें, लेकिन अंतर यह है कि यह वेग केवल एक समय से दूसरे समय के लिए वैध है, और उनमें से कई को एक साथ एक साथ संयोजित किया जा सकता है। मुझे लगता है कि मुझे बस कुछ आश्वासन की आवश्यकता थी, मैं अतीत में अपने खेल के लिए सख्त (गुदा, लगभग) ऊ रहा हूं - जो एक ही परियोजना पर वर्षों बाद, हमारी उत्पादन गति को अपंग कर दिया है - और यह बहुत अपरिचित क्षेत्र है;) । रास्ते में अन्य पोस्ट पर शानदार जवाब, कुछ चीजों को स्पष्ट करने में मदद की
स्टिकी

मैं इसे इस तरह से करता हूं: मेरे पास PlayerInputComponent और AIInputComponent (या सिस्टम) है जो MobileBehaviorComponent को बताएगा कि कीबोर्ड पर क्लिक करें या AI पर सोचें कि मोबाइल कहीं चलना चाहिए, MobileBehaviorComponent स्टोर करेगा कि यह कहीं स्थानांतरित हो जाए (इसमें मोबाइल कार्यों के लिए FSM है) और कुछ प्रणाली इसे स्थानांतरित करेगी। आपकी ग्रैन्युलैरिटी बस बहुत अधिक है, उच्च स्तर के घटकों के साथ, जैसे ट्रांसफ़ॉर्म, मॉडल, लाइट, मॉब सब कुछ बस काम करता है। इसके अलावा, मुझे घटकों को हटाने की कभी जरूरत नहीं पड़ी - मुझे लगता है कि उनमें से कुछ ऐसा है जो गेम ऑब्जेक्ट का वर्णन करता है ताकि यह गायब न हो सके।
काइकिमारु

यह विशेष रूप से MoveBy उदाहरण केवल एक उदाहरण था। सवाल यह था कि आप चीजों को एक साथ कैसे जोड़ते हैं। अगर मुझे विशेष रूप से 'x = 5 और y = 6 से 5 सेकंड में' को 'x = 10 y = 2 से 10 सेकंड में' स्थानांतरित करने की आवश्यकता है, तो एक ही समय में, यह है कि मैं यह कैसे करूंगा?
स्टिकी

"एक साथ मिश्रित" से आपका क्या मतलब है? वेग जोड़ने की तरह? तो अगर आप कंपाउंड हो गए move x by 10 in 2 secondsऔर move x by -10 in 2 secondsइकाई पूरी तरह से स्थिर हो जाएगी?
टॉम डॉलिंग

जवाबों:


6

आपके परिदृश्य के लिए, हम आम तौर पर एक गेम ऑब्जेक्ट में तीन घटक जोड़ते हैं:

  1. TransformComponent (स्थिति, अभिविन्यास, स्केल)
  2. वेग गतिमान (गति, दिशा)
  3. ControllerComponent

जब गेम ऑब्जेक्ट्स को किसी प्रकार की AI कार्यक्षमता की आवश्यकता होती है जैसे कि आपके द्वारा बताए गए रास्ते पर चलती है, तो हम इसे घटकों की सूची के लिए AIController असाइन करते हैं। AIControllers वास्तव में एक आवरण से परे कुछ भी नहीं है जो एक व्यवहार ट्री को बढ़ाता है। व्यवहार ट्री वह जगह है जहाँ हम उस वास्तविक कार्यक्षमता को डिज़ाइन करते हैं जो हम चाहते हैं कि गेम ऑब्जेक्ट का प्रदर्शन इस प्रकार हो:

BehaviorTree* tree(new SequentialNode());
tree->addChild(new MoveToNode(x,y,z));
tree->addChild(new WaitNode(30));
tree->addChild(new MoveToNode(a,b,c));
tree->addChild(new WaitNode(30));
gameObject->addComponent(new AIController(tree));

AI सबसिस्टम AIControllers का प्रबंधन करता है और इसलिए कि सबसिस्टम नियंत्रक को नियंत्रित करता है जो बदले में व्यवहार ट्री को चरणबद्ध करता है। MoveToNode () वर्तमान स्थिति / अभिविन्यास को देखता है, एक दिशा सदिश और गति की गणना करता है जहां आप इसके निर्माण संबंधी तर्कों पर आधारित होना चाहते हैं और वेग घटक पर मान सेट करते हैं। मूवमेंट सिस्टम मूल्‍यों के साथ मूवमेंट कंपोनेंट्स को पढ़ने और फिजिक्स को लागू करने के लिए जिम्‍मेदार होता है और इस तरह पोजीशन / ओरिएंटेशन को अपडेट करता है।

उपर्युक्त कोड विश्व अंतरिक्ष में बस एक गेम ऑब्जेक्ट को स्पॉन लोकेशन से x, y, z तक ले जाता है, फिर न्यूनतम 30 सेकंड प्रतीक्षा करता है, फिर गेम ऑब्जेक्ट को a, b, c स्थान पर ले जाता है और फिर अन्य 30 सेकंड प्रतीक्षा करता है। एक बार इंतजार खत्म होने के बाद, व्यवहार अनुक्रम समाप्त हो गया है, इसलिए यह शुरू से दोहराता है।

यह आपको आसानी से परिभाषित करने की अनुमति देता है कि एआई सबसिस्टम में निहित सभी एआई कार्यक्षमता को आपके एंटिटी सबसिस्टम पर न्यूनतम प्रभाव के साथ स्वयं की आवश्यकता है। यह आपको अपनी इकाई प्रणाली घटक सूची को बहुत अधिक ग्रैन्युलैरिटी के बिना भी दुबला रखने की अनुमति देता है।


1

एक विकल्प अपने डिजाइन में नियंत्रकों को जोड़ना है। एंटिटीज स्थिति का प्रतिनिधित्व करने के लिए डेटा का उपयोग करती हैं (मेरे इंजन के मामले में उनके पास ऐसे डेटा हैं जो पिछली स्थितियों को भी याद करते हैं, इसलिए मैं वेग वेक्टर को जान सकता हूं और यदि उन्हें स्थानांतरित या टेलीपोर्ट किया जा रहा है), लेकिन वे भौतिकी के बारे में कुछ नहीं जानते या ऐ। नियंत्रकों संस्थाओं को स्थानांतरित करते हैं और आपके पास एक ही इकाई या एक नियंत्रक को प्रभावित करने वाले कई नियंत्रक हो सकते हैं जो विभिन्न संस्थाओं को प्रभावित करते हैं।

उदाहरण के लिए: एक रन () विधि के साथ एक आधार नियंत्रक वर्ग बनाएं, या यदि आपको नाम नहीं लगता है तो ऐसा लगता है (), अपडेट () या टिक ()। फिर आप इसे विरासत में लेते हैं और एक मूव कांट कंट्रोलर, NPCController, PlayerInputController (खिलाड़ी इकाई के लिए), PhysicController बनाते हैं; तब आप रन () विधि को लागू करते हैं। मैं आपके MoveByComponent को MoveController में रखूंगा और Entity में नहीं।

यदि किसी एंटिटी का डेटा विशिष्ट हो तो ये कंट्रोलर प्रत्येक एंटिटी द्वारा तत्काल किए जा सकते हैं। बाद में पुन: उपयोग के लिए उन्हें नष्ट या रीसेट किया जा सकता है। इसके अलावा, आप एक आरटीई गेम में संस्थाओं के एक समूह को स्थानांतरित करने के लिए एक नियंत्रक का उपयोग कर सकते हैं, उदाहरण के लिए, यदि आपको समूह के रूप में विभिन्न इकाइयों को स्थानांतरित करने की आवश्यकता है, तो प्रत्येक इकाई द्वारा एक नियंत्रक को खेल प्रदर्शन को चोट पहुंच सकती है, तो आप बस सभी इकाइयों को असाइन कर सकते हैं एक GroupController या LegionController के लिए और यह एक संगठित समूह के हिस्से के रूप में इकाइयों को स्थानांतरित करने दें। लड़ते समय, यदि खेल व्यक्तिगत इकाई व्यवहार की अनुमति देता है, और शायद अधिकांश गेम करते हैं, तो आपको एक UnitController पर स्विच करना होगा लेकिन यह केवल तभी करना बेहतर है जब शुरुआत से ही आवश्यक हो।

मेरे विकासशील खेल में मेरे पास एक मूवमेंट कंट्रोलर है जो एक पथ के बाद संस्थाओं को स्थानांतरित करता है, प्रत्येक एनपीसी और खिलाड़ी चरित्र के लिए एक मूव कांट्रोलर मौजूद है। कभी-कभी एक बॉक्स या रॉक के लिए बनाया जाता है जिसे खिलाड़ी धक्का दे सकता है। PhysicController, केवल एक उदाहरण है, जो इसे सौंपे गए सभी संस्थाओं के पदों की जांच करेगा, अगर कोई इकाई किसी अन्य असाइन की गई इकाई को टकरा रही है, तो दोनों की परिणामी स्थिति की गणना की जाती है (यह वास्तव में इससे अधिक है लेकिन आपको विचार मिलता है)। NPCController AI है, प्रति NPC एक उदाहरण है। यह NPC की स्थिति की जाँच करता है और यह तय करता है कि कहाँ जाना है, फिर एक MoveController के लिए पथ को धक्का दें, जो वास्तव में NPC को स्थानांतरित करता है। नियंत्रकों की प्राथमिकता होती है, इसलिए मैं उनके आदेश को अग्रिम रूप से निर्धारित कर सकता हूं, फिजिक कंट्रोलर निष्पादित करने के लिए अंतिम है।

मैं नियंत्रकों की वकालत करता हूं लेकिन केवल "सही" विकल्प नहीं है। उदाहरण के लिए, मुझे कैफू इंजन में एक एंटिटी इंटरफ़ेस याद है जिसमें एंटिटी में ही () विधि है, क्लास के उपयोगकर्ता को एंटिटी से इनहेरिट करना चाहिए और सोच को लागू करना चाहिए (), मुझे कंपनीबोट नामक एक व्युत्पन्न वर्ग याद है (जो उदाहरण के साथ आता है) खेल) जो उस पद्धति में कुछ टकराव की जाँच करते हैं, क्योंकि इसे "सोचना" कहा जाता है, हम मान सकते हैं कि AI कोड वहाँ भी होने की उम्मीद है। जबकि NeoAxis इंजन (पिछली बार जब मैंने इसे देखा था) में AI और भौतिकी संस्थाओं से अलग हो गए हैं।

एक नियंत्रक पैटर्न मौजूद है जिसके बारे में मैंने सुना है। हो सकता है कि आपको इसकी खोज करनी चाहिए, और शायद यह बिल्कुल वैसा नहीं है जैसा मैं यहां बता रहा हूं, बल्कि एक अच्छा समाधान भी लगता है।


यह मूल रूप से OO डिज़ाइन है जो हमारे पास पहले से ही है। डेरिवेटिव (चरित्र, राक्षस) आदि के साथ एक एंटिटी, मैं हम में से एक टीम का नेतृत्व कर रहा हूं जो लगभग 2 वर्षों से इस खेल पर काम कर रही है, और हर कोई इच्छाशक्ति में चीजों को बदल रहा है, यह एक भयानक, भयानक बन गया है कोडबेस - और नई सुविधाओं को शिप करने के लिए एक शर्मनाक समय लेना शुरू कर रहा है। एंटिटी सिस्टम का विचार मुझे वही लग रहा है जो मैं ढूंढ रहा हूं, इसलिए जब तक आपका उत्तर काफी प्रासंगिक नहीं होता है, आपको स्वयं प्रश्न के शीर्ष पर लिंक पर पढ़ना चाहिए, देखें कि क्या वे आपकी मदद कर सकते हैं :)
स्टिकी

@ स्टिकी मुझे स्वीकार करना है कि घटकों से बना नोड सिस्टम प्लस एंटिटी मेरे सुझाए गए नियंत्रकों दृष्टिकोण की तुलना में विभिन्न आवश्यक प्रणालियों का प्रतिनिधित्व करने का एक चतुर तरीका है जो एक कम विकसित संस्करण की तरह है। आपको वास्तव में मेरे उत्तर की आवश्यकता नहीं है।
हाटरू हांसौ

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