एकत्रीकरण के रूप में इकाई बनाना


10

मैंने हाल ही में उनके व्यवहार से संस्थाओं को अलग करने और इस लेख से जुड़े मुख्य उत्तर के बारे में पूछा : http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

यहाँ के बारे में लिखी गई अंतिम अवधारणा यह है: OBJECT AS A PURE AGGREGATION।

मैं सोच रहा हूं कि मैं C # का उपयोग करके शुद्ध एकत्रीकरण के रूप में गेम इकाइयां बनाने के बारे में कैसे जा सकता हूं। मैं इस अवधारणा को समझ नहीं पाया हूं कि यह कैसे काम कर सकती है। (शायद इकाई एक निश्चित इंटरफ़ेस या आधार प्रकार को लागू करने वाली वस्तुओं की एक सरणी है?)

मेरी वर्तमान सोच में अभी भी प्रत्येक इकाई प्रकार के लिए एक ठोस वर्ग शामिल है जो तब संबंधित इंटरफेस (IMoveable, ICollectable, ISpeakable etc) को लागू करता है।

उस इकाई के लिए कोई ठोस प्रकार न होने से मैं एक इकाई के रूप में शुद्ध रूप से एक इकाई बनाने के बारे में कैसे जा सकता हूं?


यदि आप अभी भी रुचि रखते हैं तो मैं आपको C # में अपनी छोटी इकाई प्रणाली भेज सकता हूं। यह आश्चर्यजनक नहीं है , लेकिन यह काम करता है।
कम्युनिस्ट डक

जवाबों:


6

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

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

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

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

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


3

जिस तरह से एकता यह है कि सभी लिपियों (आपके मामले में, गेम कोड जो एक प्रकार की गेम ऑब्जेक्ट के लिए विशिष्ट है) एक बेस क्लास से प्राप्त होता है MonoBehaviour, जो स्वयं अधिक प्रासंगिक-से-आपके केस से निकलता है।Component क्लास से प्राप्त होता है। GameObject क्लास में आप कभी भी एडिट नहीं करते (और कोड तक पहुँच नहीं है)।

खेल वस्तु उन सभी को शामिल करने के प्रभारी है Component। यह उन (यानी Update) पर संबंधित कार्यों को कॉल करने के प्रभारी के रूप में भी है । एकता इस पृष्ठ पर "कार्यों को देखने के लिए" "ओवररिडबल फ़ंक्शंस" खंड को देखने के लिए क्या करती है, यह निर्धारित करने के लिए एकता का उपयोग करती है ), लेकिन आप शायद उन्हें आभासी बनाना चाहते हैं।

तो एकता में आपके द्वारा उपयोग किए जाने वाले तंत्रों में से एक प्रकार से आपके वर्तमान गेम ऑब्जेक्ट (या उसके बच्चों) पर घटक प्राप्त कर रहा है। कुछ सहायक गुण हैं जो कुछ सामान्य सामान को लपेटते हैं। उदाहरण के लिए, यदि आप गेम ऑब्जेक्ट के Transformघटक (गेम ऑब्जेक्ट की स्थिति / रोटेशन / स्केल को नियंत्रित करने के लिए) का उपयोग करना चाहते हैं, तो आपको सामान्य रूप से कुछ करना होगा this.GetComponent<Transform>().position, लेकिन वे इसे एक सहायक this.transform.positionकॉल में लपेटते हैं। एक अन्य सामान्य पैटर्न वर्तमान गेम ऑब्जेक्ट के Rendererघटक तक पहुंच रहा है । इसलिए यदि आप वर्तमान गेम ऑब्जेक्ट की सामग्री को बदलने की तरह कुछ करना चाहते हैं, तो दूसरी स्क्रिप्ट से आप कुछ ऐसा कर सकते हैं this.renderer.material = someOtherMaterial, और आपका गेम ऑब्जेक्ट अपडेट उचित रूप से हो सकता है।

यूनिटी में काम करने के तरीकों में से एक यह है कि उनके संपादक को ऐसे सेट किया जाता है कि आप अपने दृश्य में गेम ऑब्जेक्ट बना सकते हैं जिसमें पहले से ही हुक अप घटक हैं। एकता के मामले में, सभी गेम ऑब्जेक्ट में एक Transformघटक होता है, लेकिन इसमें बिल्ट-इन प्रकार भी शामिल हो सकते हैं AudioListenerया Renderer, जो आप की अपेक्षा करते हैं। या आप अपने स्वयं के घटकों को जोड़ सकते हैं जो आप करते हैं जो आप चाहते हैं कि वे उन्हें करना चाहते हैं। संपादक आपके घटकों पर सार्वजनिक / धारावाहिक क्षेत्रों को भी उजागर करता है ताकि आपको अलग-अलग स्क्रिप्ट बनाने की ज़रूरत न पड़े, यदि आप एक ही मूल कोड का उपयोग करना चाहते हैं, लेकिन कुछ मैजिक नंबरों को बदल दें।

सब में यह बहुत चालाक है, और मैं एकता के मुफ्त संस्करण को डाउनलोड करने और अपने स्क्रिप्टिंग सिस्टम को कैसे आप प्राप्त करना चाहते हैं की अवधारणा का एक सुंदर सभ्य सबूत के रूप में स्थापित किया गया है के साथ चारों ओर खेलने का सुझाव देता हूं।


0

मुझे टी-मशीन ब्लॉग से एडम के दृष्टिकोण के अधिक निकट दृष्टिकोण पसंद है। घटक केवल डेटा होना चाहिए, और सिस्टम उनके साथ सभी काम करते हैं।

C #: https://github.com/tilinuxlich/artemis_CSharp में ES कार्यान्वयन का एक उदाहरण देखें

और इसका उपयोग करने वाला एक उदाहरण गेम (XNA 4): https://github.com/tilinuxlich/starwarrior_CSharp

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