घटक आधारित वास्तुकला में परिमित राज्य मशीन को कैसे तार करें? [बन्द है]


23

राज्य मशीनों को घटक-आधारित आर्किटेक्चर में हानिकारक निर्भरता का कारण लगता है।

कैसे, विशेष रूप से, संचार एक राज्य मशीन और घटकों से जुड़ा होता है जो राज्य से संबंधित व्यवहार करते हैं?

मैं यहाँ कहाँ हूँ:

  • मैं घटक-आधारित आर्किटेक्चर के लिए नया हूं।
  • मैं एक लड़ाई का खेल बना रहा हूं, हालांकि मुझे नहीं लगता कि इसे मायने नहीं रखना चाहिए। मैं कल्पना करता हूं कि मेरी राज्य मशीन का उपयोग "क्राउचिंग", "डैशिंग", "ब्लॉकिंग" आदि जैसे राज्यों को टॉगल करने के लिए किया जा रहा है।
  • मैंने इस राज्य-प्रबंधन तकनीक को एक घटक-आधारित वास्तुकला के लिए सबसे प्राकृतिक प्रणाली के रूप में पाया है, लेकिन यह उन तकनीकों के साथ संघर्ष करता है, जिनके बारे में मैंने पढ़ा है: गतिशील व्यवहार ऑब्जेक्ट वर्णनीय व्यवहार योग्य वर्णों के लिए सिस्टम यह सुझाव देता है कि सभी घटक सक्रिय / निष्क्रिय करें लगातार सक्रियता के लिए एक शर्त की जाँच करके।
  • मुझे लगता है कि "चल रहा है" या "चलना" जैसी क्रियाएं राज्यों के रूप में समझ में आती हैं, जो यहां स्वीकृत प्रतिक्रिया से असहमत हैं: /gamedev//a/7934
  • मैंने इसे उपयोगी, लेकिन अस्पष्ट पाया है: घटक-आधारित गेम आर्किटेक्चर में व्यवहार को कैसे लागू किया जाए? यह बताता है कि एक अलग घटक है जिसमें एक राज्य मशीन के अलावा कुछ भी नहीं है। लेकिन, यह राज्य मशीन घटक और लगभग सभी अन्य घटकों के बीच कुछ प्रकार के युग्मन की आवश्यकता है। मुझे समझ नहीं आया कि इस कपलिंग को कैसे संभाला जाए। ये कुछ अनुमान हैं:

    A. अवयव राज्य मशीन पर निर्भर करते हैं:
    घटक राज्य मशीन घटक के संदर्भ को प्राप्त करते हैं getState(), जो एक निरंतरता देता है। घटक खुद को नियमित रूप से अपडेट करते हैं और आवश्यकतानुसार इसकी जांच करते हैं।

    B. राज्य मशीन घटकों पर निर्भर करती है:
    राज्य मशीन घटक उन सभी घटकों के संदर्भ प्राप्त करता है जिनकी वह निगरानी कर रहा है। यह उनके getState()तरीकों पर सवाल उठाता है कि वे कहां हैं।

    C. उनके बीच कुछ अमूर्तता
    एक इवेंट हब का उपयोग करें? कमांड पैटर्न?

    डी। अलग राज्य वस्तुओं है कि संदर्भ घटक
    राज्य पैटर्न का उपयोग किया जाता है। अलग-अलग राज्य ऑब्जेक्ट बनाए जाते हैं, जो घटकों के एक सेट को सक्रिय / निष्क्रिय करते हैं। राज्य मशीन राज्य वस्तुओं के बीच स्विच करती है।

  • मैं घटकों को पहलुओं के कार्यान्वयन के रूप में देख रहा हूं । वे उस पहलू को बनाने के लिए आंतरिक रूप से आवश्यक सभी कुछ करते हैं। ऐसा लगता है जैसे अन्य घटकों पर भरोसा किए बिना, घटकों को अपने दम पर कार्य करना चाहिए। मुझे पता है कि कुछ निर्भरताएं आवश्यक हैं, लेकिन राज्य मशीनें मेरे सभी घटकों को नियंत्रित करना चाहती हैं।

जवाबों:


7

अवलोकन काफी हल्का है, लेकिन पिछले साल न्यू गेम कॉन्फिडेंस के लिए एक प्रस्तुति से इन स्लाइड्स को देखें:

https://docs.google.com/presentation/d/110MxOqut_y7KOW1pNwIdcccisIA3ooJwVR-xm-ecuc4/view

(नीचे चित्र देखें)

तकनीक का सार है एक्शन लिस्ट पैटर्न को जोड़ना (समझाया गया है - कुछ हद तक खराब - स्लाइड में) एक व्यवहार-आधारित मशीन के साथ जो एक घटक-आधारित गेम इकाई पर कार्य करती है।

यह संक्षेप में एआई व्यवहार के लिए एक विशेष रचना प्रणाली बनाने के समान है, सरल एआई सिस्टम के लिए आवश्यक अंतर-व्यवहार एकीकरण के प्रकार के लिए तैयार है।

उस विशेष खेल का मेरा पसंदीदा हिस्सा था कि हम पूर्व लिखित व्यवहारों की एक सूची से चयन करके पूरी तरह से नए प्रकार के दुश्मन कैसे बना सकते थे, उन्हें वांछित के क्रम में गेम ऑब्जेक्ट (ब्रेनकम्पोनेंट में रहने वाले) के लिए एक्शन सूची में डाल दिया। प्राथमिकता, और सब कुछ बस काम किया। एक एक्शन लिस्ट के साथ जो ब्लॉकिंग / नॉनब्लॉकिंग क्रियाओं के लिए अनुमति देता है, यह वास्तव में कुछ आसान चीजें कर सकता है, बावजूद इसके इसे लागू करना कितना सरल है।

यहां तक ​​कि "अचेत" जैसे व्यवहार जहां वास्तव में सिर्फ एक StunBehaviorAction कार्रवाई सूची स्टैक के शीर्ष पर धकेल दिया गया; यदि अचेत व्यवहार सक्रिय हो जाता है (यह देखने के बाद कि गेम ऑब्जेक्ट के EarsComponent ने एक आश्चर्यजनक चौंकाने वाला हमला सुना) तो उसने Stunned को अपना आंतरिक राज्य सेट कर दिया, Stun एनीमेशन को चलाने के लिए AnimComponent को बताया, और अपने एक्शन स्टेट को ब्लॉकिंग और उसके टाइमर पर सेट कर दिया खेल वस्तु के EnemyParametersComponent से खींचा गया एक अचेत समय। चूंकि यह ब्लॉक कर रहा था और एक्शन लिस्ट में सबसे ऊपर है, एक्शन लिस्ट में मौजूद अन्य बिहेवियरऑक्शन में से किसी को भी अपने अपडेट का तरीका नहीं मिलेगा, इसलिए वे अनिवार्य रूप से स्विच ऑफ हो जाएंगे। जब समय-सीमा समाप्त हो गई, तो StunBehaviorAction ने अपने राज्य को वापस Idle और अपनी कार्रवाई स्थिति को NonBlocking पर सेट कर दिया।

हमारे द्वारा लागू किए गए अन्य व्यवहार लगभग सभी एक ही आंतरिक राज्य मशीन के साथ लागू किए गए थे। केवल दो मशीनों में राज्य की मशीनें नहीं थीं, वास्तव में, पैट्रोलपैथबहेवियरऑक्शन थे (यह निष्क्रिय होने पर एक्शन लिस्ट पर PathAction की एक श्रृंखला को धक्का देगा, जो बदले में MoveAction के) और GuardHomeBehaviorAction (हमेशा नीचे की ओर धकेल दिया गया) कार्रवाई की सूची, और हमेशा दुश्मन के घर के स्थान पर एक PathAction को वापस धकेलेगा)। हर दूसरा व्यवहार एक राज्य मशीन था।

स्लाइड 10 स्लाइड 25 स्लाइड 26


"व्यवहार" और "कार्य" के बीच मूलभूत अंतर क्या है?
पिल्ला

1
@Pup: एक कोड के नजरिए से, जैसा कि मैंने इसे बनाया है, एक व्यवहार एक क्रिया है। एक वैचारिक बिंदु से, क्रियाएं आम तौर पर क्षणभंगुर होती हैं - वे केवल "पूर्ण" तक मौजूद होती हैं - जबकि व्यवहार हमेशा के लिए होते हैं और सूची से कभी भी हटाए नहीं जाते हैं। मैंने एक और टीम को एक समान प्रणाली का निर्माण करते देखा है, लेकिन दो सूचियों के साथ, एक एक्शन के लिए और एक बिहेवियर के लिए, जो काफी अच्छी तरह से काम करती है। मुझे कुछ व्यवहारों को अवरुद्ध करने के लिए एक्शन की क्षमता होना पसंद है, हालांकि, बिटकॉम्स और ग्रुपिंग (गलियों का उपयोग करते हुए, मेरा मानना ​​है कि मैंने उन्हें स्लाइड्स में बुलाया)। क्षमा करें कि मध्य स्लाइड का ग्राफ़िक इतना खराब है। :)
सीन मिडिलिचच

3

पिछली कंपनी में मैंने काम किया था, हमारे पास राज्य-आधारित AI के साथ एक घटक-आधारित प्रणाली थी। हमारे पास एक एआई घटक था जो उस वस्तु / इकाई के लिए सभी व्यवहार को नियंत्रित करता था। जब एआई सक्रिय था, जैसे भटकना, हमला करना, आदि, तो इसे किसी भी तर्क को करने के लिए प्रत्येक फ्रेम को एक अद्यतन प्राप्त होगा जिसकी आवश्यकता थी। जब AI निष्क्रिय हो रहा था या नहीं चल रहा था तो घटक को निष्क्रिय कर दिया गया था और प्रत्येक फ्रेम को अपडेट नहीं किया गया था। घटक, जबकि निष्क्रिय, अभी भी ईवेंट-आधारित संदेश प्राप्त कर सकता है, इसलिए उसे एग्रो त्रिज्या में प्रवेश करने वाले खिलाड़ी की तरह कुछ के लिए एक संदेश प्राप्त होगा, और एआई घटक को पुन: सक्रिय करके इसका जवाब दे सकता है ताकि यह फ़्रेम-आधारित अपडेट कर सके।

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


तो, एआई उप-घटक वास्तव में काम कर रहे हैं? क्या वे एआई घटक के समान स्तर पर इकाई घटकों के रूप में मौजूद थे?
पिल्ला

हमारे इंजन में उप-घटक आधार घटक वर्ग का हिस्सा थे। तो कोई भी Component, जो इससे प्राप्त होता है BaseComponent, उस पर कोई भी संख्या हो सकती है SubComponentUpdate()में विधि BaseComponentउप घटकों की सूची की जांच, और कहेंगे Update()उन पर। Subcomponentsपूरी तरह से वैकल्पिक थे इसलिए BaseComponentकोई भी नहीं हो सकता है। इसके अलावा, कोई भी संदेश जो किसी घटक पर गया था, उसे उप-प्राधिकारियों तक भी भेजा गया था।
निक फोस्टर

1

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

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