सैकड़ों 'इन-गेम' वर्णों की संरचना / प्रबंधन के लिए सबसे अच्छा कैसे


10

मैं एक साधारण आरटीएस गेम बना रहा हूं, जिसमें क्रूसर किंग्स 2 जैसे सैकड़ों किरदार एकता में हैं। उन्हें संग्रहित करने के लिए सबसे आसान विकल्प होगा कि वे स्क्रिप्ट योग्य वस्तुओं का उपयोग करें, लेकिन यह एक अच्छा समाधान नहीं है क्योंकि आप रनटाइम में नए नहीं बना सकते हैं।

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

क्या एक सूची मेरे खेल के लिए डेटा को बचाने का सबसे अच्छा तरीका है? या यह एक बार एक चरित्र के 10000s बना रहे हैं समस्या दे देंगे? एक संभावित समाधान एक और सूची बनाने के लिए है जब सूची एक निश्चित राशि तक पहुंच जाती है और उनमें सभी मृत पात्रों को स्थानांतरित कर दिया जाता है।


9
एक चीज जो मैंने अतीत में की है, जब मुझे किसी चरित्र के डेटा के सबसेट की जरूरत होती है, जब उसके निधन के बाद उस चरित्र के लिए "समाधि का पत्थर" ऑब्जेक्ट बनाना होता है। समाधि का पत्थर उन सूचनाओं को ले जा सकता है जिनकी मुझे बाद में देखने की जरूरत है, लेकिन यह छोटी हो सकती है और कम बार पुनरावृत्त हो सकती है क्योंकि इसमें जीवित चरित्र की तरह निरंतर अनुकरण की आवश्यकता नहीं होती है।
DMGregory


2
क्या खेल CK2 की तरह है, या यह केवल बहुत सारे पात्रों के बारे में हिस्सा है? मैं इसे पूरा खेल सीके 2 की तरह समझ रहा था। उस मामले में यहाँ बहुत सारे उत्तर गलत नहीं हैं और इसमें अच्छे जानकार हैं, लेकिन वे प्रश्न के बिंदु को याद करते हैं। यह मदद नहीं करता है कि आपने CK2 को एक वास्तविक समय रणनीति गेम कहा है जब यह वास्तव में एक भव्य रणनीति गेम है । यह मुश्किल लग सकता है, लेकिन यह उन मुद्दों के लिए बहुत प्रासंगिक है जो आप सामना कर रहे हैं।
राफेल शमित्ज़

1
उदाहरण के लिए, जब आप वर्णों का उल्लेख करते हैं ", तो लोग एक ही समय में स्क्रीन पर 3 डी मॉडल या स्प्राइट के बारे में सोच रहे हैं - इसलिए, एकता में, का अधिकतम GameObjects। CK2 में, मैंने एक ही समय में जितने पात्रों को देखा, जब मैंने अपने न्यायालय को देखा और वहां 10-15 लोगों को देखा (हालांकि मैं बहुत दूर तक नहीं खेल पाया)। साथ ही, 3000 सैनिकों वाली एक सेना केवल एक है GameObject, जो "3000" संख्या प्रदर्शित करती है।
राफेल शमित्ज़

1
@ R.Schmitz हाँ मुझे उस हिस्से को स्पष्ट करना चाहिए था कि हर कैरेक्टर में गेमबोक नहीं है। जब भी आवश्यक हो तो एक बिंदु से दूसरे बिंदु पर चलते चरित्र की तरह। एक अलग इकाई बनाई जाती है जिसमें एआई तर्क के साथ उस चरित्र की सभी जानकारी होती है।
पॉल पी।

जवाबों:


24

ऐसी तीन बातें हैं जिन पर आपको विचार करना चाहिए:

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

  2. वर्तमान में कम से कम सक्रिय पात्रों की निष्ठा। शुरुआती गेमर गेमर की लगातार गलती ऑन-स्क्रीन वाले लोगों की तरह ही ऑफ-स्क्रीन पात्रों को ठीक से अपडेट करने का है। यह एक गलती है, कोई भी परवाह नहीं करता है। इसके बजाय आपको यह धारणा बनाने की जरूरत है कि ऑफ-स्क्रीन पात्र अभी भी अभिनय कर रहे हैं। ऑफ-स्क्रीन प्राप्त होने वाले अद्यतन वर्णों की मात्रा को कम करके आप प्रसंस्करण समय में नाटकीय रूप से कमी कर सकते हैं।

  3. डेटा-ओरिएंटेड-डिज़ाइन पर विचार करें। 1000 वर्ण ऑब्जेक्ट होने और प्रत्येक के लिए एक ही फ़ंक्शन को कॉल करने के बजाय, 1000 वर्णों के लिए डेटा की एक सरणी है और प्रत्येक फ़ंक्शन को 1000 से अधिक वर्णों को बारी-बारी से अपडेट कर रहा है। इस तरह का अनुकूलन नाटकीय रूप से प्रदर्शन में सुधार कर सकता है।


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

1
ऑफ-स्क्रीन प्राप्त होने वाले अपडेट पात्रों की मात्रा को कम करके आप नाटकीय रूप से प्रसंस्करण समय बढ़ा सकते हैं। क्या आपका मतलब घटता है?
तेजस काले

1
@TejasKale: हाँ, सही किया।
जैक एडली

2
एक हजार वर्ण बहुत अधिक नहीं हैं, लेकिन जब उनमें से प्रत्येक यह देखने के लिए लगातार जाँच कर रहा है कि क्या वे प्रत्येक में से प्रत्येक को अलग कर सकते हैं तो इसका समग्र प्रदर्शन पर व्यापक प्रभाव पड़ने लगता है ...
curiousdannii

1
हमेशा वास्तव में जांच करने के लिए सबसे अच्छा है, लेकिन यह आम तौर पर एक सुरक्षित कार्य धारणा है कि रोमन एक-दूसरे को अलग करना चाहते हैं;)
जिज्ञासु

11

इस स्थिति में, मुझे सुझाव है कि संरचना का उपयोग करें :

सिद्धांत जो वर्गों को बहुरूप व्यवहार और उनकी संरचना द्वारा कोड पुन: उपयोग करना चाहिए (वांछित कार्यक्षमता को लागू करने वाले अन्य वर्गों के उदाहरणों को शामिल करके)


इस मामले में, ऐसा लगता है कि आपकी Characterकक्षा ईश्वर के समान हो गई है , और इसमें सभी विवरण शामिल हैं कि एक चरित्र जीवन रेखा के सभी चरणों में कैसे संचालित होता है ।

उदाहरण के लिए, आप ध्यान दें कि मृत वर्ण अभी भी आवश्यक हैं - जैसा कि वे परिवार के पेड़ों में उपयोग किया जाता है। हालांकि, यह संभावना नहीं है कि आपके जीवित पात्रों की सभी जानकारी और कार्यक्षमता अभी भी आवश्यक है, केवल उन्हें एक परिवार के पेड़ में प्रदर्शित करने के लिए। उदाहरण के लिए, उन्हें केवल नाम, जन्म तिथि और एक चित्र आइकन की आवश्यकता हो सकती है।


समाधान, अपने अलग-अलग हिस्सों Characterको उप-वर्गों में विभाजित करना है , जिसका Characterमालिक है। उदाहरण के लिए:

  • CharacterInfo नाम, जन्मतिथि, मृत्यु की तारीख और गुट के साथ एक सरल डेटा संरचना हो सकती है।

  • Equipmentहो सकता है कि आपके चरित्र में सभी वस्तुएं हों या उनकी वर्तमान संपत्ति हो। यह भी तर्क हो सकता है कि इन कार्यों में प्रबंधन करता है।

  • CharacterAIया CharacterControllerचरित्र के वर्तमान लक्ष्य, उनके उपयोगिता कार्यों आदि के बारे में आवश्यक सभी जानकारी हो सकती है और इसमें वास्तविक अद्यतन-तर्क भी हो सकते हैं जो व्यक्तिगत भागों के बीच निर्णय लेने / बातचीत करने का समन्वय करता है।

एक बार जब आप चरित्र को विभाजित कर लेते हैं, तो आपको अपडेट लूप में एक जीवित / मृत ध्वज की जांच करने की आवश्यकता नहीं है।

इसके बजाय, आप बस एक बनाना चाहते हैं AliveCharacterObjectहै CharacterController, CharacterEquipmentऔर CharacterInfoस्क्रिप्ट संलग्न। चरित्र को "मार" करने के लिए, आप बस उन हिस्सों को हटा देते हैं जो अब प्रासंगिक नहीं हैं (जैसे कि CharacterController) - यह अब स्मृति, या प्रसंस्करण समय बर्बाद नहीं करेगा।

ध्यान दें, CharacterInfoपरिवार के पेड़ के लिए वास्तव में आवश्यक एकमात्र डेटा कैसे संभव है। अपनी कक्षाओं को कार्यक्षमता के छोटे टुकड़ों में विघटित करके - आप मृत्यु के बाद डेटा की उस छोटी सी वस्तु को आसानी से रख सकते हैं, बिना पूरे एआई-संचालित चरित्र को रखने की आवश्यकता के बिना।


यह ध्यान देने योग्य है कि यह प्रतिमान एक एकता है जिसे उपयोग करने के लिए बनाया गया था - और यही कारण है कि यह बहुत सारी अलग-अलग लिपियों वाली चीजों को संभालती है। एकता में अपने डेटा को संभालने के लिए बड़ी देव-वस्तुओं का निर्माण शायद ही सबसे अच्छा तरीका है।


8

जब आपके पास संभालने के लिए बड़ी मात्रा में डेटा होता है और प्रत्येक डेटा-पॉइंट को वास्तविक गेम ऑब्जेक्ट द्वारा दर्शाया नहीं जाता है, तो यह आमतौर पर एकता-विशिष्ट वर्गों को त्यागने के लिए एक बुरा विचार नहीं है और बस सादे पुराने सी # ऑब्जेक्ट्स के साथ चलते हैं। इस तरह आप ओवरहेड को कम से कम करते हैं। तो आप यहाँ सही रास्ते पर हैं।

जीवित या मृत सभी पात्रों को एक सूची ( या सरणी ) में संग्रहीत करना उपयोगी हो सकता है क्योंकि उस सूची में अनुक्रमणिका एक विहित वर्ण आईडी के रूप में काम कर सकती है। इंडेक्स द्वारा सूची की स्थिति तक पहुंच बनाना एक बहुत तेज ऑपरेशन है। लेकिन यह सभी जीवित पात्रों की आईडी की एक अलग सूची रखने के लिए उपयोगी हो सकता है, क्योंकि आपको संभवतः उन पात्रों को दूर करने की आवश्यकता होगी जो आपको मृत पात्रों की आवश्यकता होगी।

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

CKII " आलूबुखारा " अपने डेटाबेस से पात्रों जब यह उनके संसाधनों को बचाने के लिए महत्वहीन के रूप में समझे। यदि आपके मृत पात्रों का ढेर लंबे समय तक चलने वाले खेल में बहुत सारे संसाधनों का उपभोग करता है, तो आप ऐसा ही कुछ करना चाह सकते हैं (मैं इस "कचरा संग्रह" को कॉल नहीं करना चाहता हूं। हो सकता है कि "सम्मानजनक अवतार"?)।

यदि आपके पास वास्तव में गेम के प्रत्येक चरित्र के लिए एक गेम ऑब्जेक्ट है, तो नया यूनिटी ईसीएस और जॉब्स सिस्टम आपके लिए उपयोगी हो सकता है। यह एक समान तरीके से बड़ी संख्या में समान गेम ऑब्जेक्ट्स को संभालने के लिए अनुकूलित है। लेकिन यह आपके सॉफ़्टवेयर आर्किटेक्चर को कुछ बहुत ही कठोर पैटर्न में मजबूर करता है।

वैसे, मैं वास्तव में सीकेआईआई को पसंद करता हूं और जिस तरह से यह हजारों अद्वितीय एआई-नियंत्रित पात्रों के साथ एक दुनिया का अनुकरण करता है, इसलिए मैं आपकी शैली पर अपनी भूमिका निभाने के लिए उत्सुक हूं।


नमस्ते, उत्तर के लिए धन्यवाद। सभी गणना एक एकल GameObject प्रबंधक द्वारा की जाती हैं। जब आवश्यक हो तो मैं केवल व्यक्तिगत अभिनेताओं को गेम ऑब्जेक्ट सौंप रहा हूं (जैसे कि चरित्र की सेना एक स्थिति से दूसरे स्थान पर जाने के लिए)।
पॉल पी।

1
Like "all living characters in a specific location" or "all living or dead ancestors of a specific character". It might be beneficial to create some more secondary data-structures optimized for these kinds of queries.CK2 मोडिंग के साथ मेरे अनुभव से, यह करीब है कि CK2 डेटा को कैसे संभालता है। CK2 उन इंडेक्सों का उपयोग करने लगता है जो मूल रूप से मूल डेटाबेस इंडेक्स होते हैं, जो किसी विशिष्ट स्थिति के लिए वर्ण खोजने के लिए तेज़ी से बनाते हैं। पात्रों की सूची होने के बजाय, यह लगता है कि पात्रों की एक आंतरिक डेटाबेस है, जिसमें सभी कमियां और लाभ हैं।
मोरफिल्डर

1

खिलाड़ी के पास केवल कुछ होने पर आपको हजारों वर्णों का अनुकरण / अद्यतन करने की आवश्यकता नहीं है। आपको केवल यह अपडेट करने की आवश्यकता है कि खिलाड़ी वास्तव में वर्तमान समय में क्या देख सकता है, इसलिए खिलाड़ी से दूर होने वाले पात्रों को तब तक निलंबित कर दिया जाना चाहिए जब तक कि खिलाड़ी उनके करीब न हो।

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


यह एक आरटीएस है। हमें यह मान लेना चाहिए कि किसी भी समय, वास्तव में स्क्रीन पर काफी संख्या में इकाइयाँ होती हैं।
टॉम

आरटीएस में दुनिया को जारी रखने की जरूरत है जबकि खिलाड़ी नहीं दिख रहा है। एक बड़ा अपडेट बस के रूप में लंबे समय तक ले जाएगा, लेकिन जब आप कैमरे को स्थानांतरित करते हैं तो एक बड़ा विस्फोट होगा।
पीएसटीएजी

1

प्रश्न का स्पष्टीकरण

मैं एक सरल आरटीएस गेम बना रहा हूं, जिसमें एक किरदार में क्रूसेडर किंग्स 2 जैसे सैकड़ों किरदार हैं।

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

नो-फंक्शनल Characterक्लासेस

इसलिए मैंने "चरित्र" नामक एक सी # क्लास बनाई जिसमें सभी डेटा शामिल हैं।

अच्छा है, क्योंकि अपने खेल में एक चरित्र है सिर्फ डेटा। आप स्क्रीन पर जो देखते हैं, वह केवल उस डेटा का प्रतिनिधित्व है। ये Characterकक्षाएं खेल का बहुत दिल हैं और जैसे कि " देव वस्तुएं " बनने का खतरा है । इसलिए मैं इसके खिलाफ अत्यधिक उपायों की सलाह दूंगा: उन कक्षाओं से सभी कार्यक्षमता को हटा दें। एक विधि GetFullName()जो पहले और अंतिम नाम को जोड़ती है, ठीक है, लेकिन कोई कोड नहीं जो वास्तव में "कुछ करता है"। उस कोड को समर्पित वर्गों में रखें जो एक क्रिया करते हैं; उदाहरण के लिए एक Birtherविधि वाली एक कक्षा कक्षा Character CreateCharacter(Character father, Character mother)में उस कार्यक्षमता की तुलना में बहुत अधिक साफ हो जाएगी Character

डेटा को कोड में संग्रहित न करें

उन्हें संग्रहीत करने के लिए सबसे आसान विकल्प स्क्रिप्ट योग्य वस्तुओं का उपयोग करना होगा

एकता की JsonUtility का उपयोग करते हुए, उन्हें JSON प्रारूप में संग्रहीत करें। उन नो-फंक्शनल Characterक्लासेस के साथ, यह करने के लिए तुच्छ होना चाहिए। यह गेम के शुरुआती सेटअप के साथ-साथ savegames में इसे स्टोर करने के लिए भी काम करेगा। हालांकि, यह अभी भी एक उबाऊ बात है, इसलिए मैंने आपकी स्थिति में सबसे आसान विकल्प दिया। आप XML या YAML या किसी भी प्रारूप का उपयोग वास्तव में कर सकते हैं, जब तक कि इसे अभी भी मनुष्यों द्वारा पढ़ा जा सकता है जब इसे पाठ फ़ाइल में संग्रहीत किया जाता है। CK2 वही करता है, जो वास्तव में ज्यादातर खेल करते हैं। यह लोगों को आपके गेम को मॉड करने की अनुमति देने के लिए भी उत्कृष्ट सेटअप है, लेकिन यह बहुत बाद के लिए सोचा गया है।

अमूर्त सोचो

मैंने यह सुनिश्चित करने के लिए एक साधारण चेक जोड़ा कि चरित्र को संसाधित करते समय "जिंदा" है [...] लेकिन मैं "चरित्र" को नहीं हटा सकता यदि वह मर चुका है क्योंकि मुझे परिवार के पेड़ को बनाते समय उसकी जानकारी की आवश्यकता है।

यह एक आसान काम है, क्योंकि यह अक्सर सोच के प्राकृतिक तरीके से टकरा जाता है। आप एक "चरित्र" के "प्राकृतिक" तरीके से सोच रहे हैं। हालांकि, आपके खेल के संदर्भ में, ऐसा लगता है कि कम से कम 2 अलग-अलग प्रकार के डेटा हैं जो "एक चरित्र है": मैं इसे कॉल करूंगा ActingCharacterऔर FamilyTreeEntry। एक मृत चरित्र FamilyTreeEntryको अद्यतन करने की आवश्यकता नहीं है और शायद एक सक्रिय की तुलना में पूरे बहुत कम डेटा की आवश्यकता है ActingCharacter


0

मैं एक छोटे से अनुभव से बात करने जा रहा हूं, एक कठोर OO- डिजाइन से एक इकाई-घटक-प्रणाली (ECS) डिजाइन पर जा रहा हूं।

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

अब, ईसीएस एक बड़ी अवधारणा है, और सही होने के लिए यह कठिन है। इसमें बहुत सारे काम हैं जो इसमें जाते हैं, ठीक से संस्थाओं, घटकों और प्रणालियों का निर्माण करते हैं। इससे पहले कि हम ऐसा कर सकें, हालांकि, हमें शर्तों को परिभाषित करने की आवश्यकता है।

  1. इकाई : यह चीज है , खिलाड़ी, पशु, एनपीसी, जो भी हो । यह एक ऐसी चीज है जिसे इसके साथ जुड़े घटकों की आवश्यकता होती है।
  2. घटक : यह विशेषता या संपत्ति है , जैसे "नाम" या "आयु", या "माता-पिता", आपके मामले में।
  3. सिस्टम : यह एक घटक, या एक व्यवहार के पीछे का तर्क है । आमतौर पर, आप प्रति घटक एक सिस्टम बनाते हैं, लेकिन यह हमेशा संभव नहीं होता है। इसके अतिरिक्त, कभी-कभी सिस्टम को अन्य प्रणालियों को प्रभावित करने की आवश्यकता होती है ।

तो, यहाँ मैं इस के साथ जाना होगा:

सबसे पहले और सबसे महत्वपूर्ण, IDअपने पात्रों के लिए बनाएं । एक int, Guidजो भी आपको पसंद है। यह "इकाई" है।

दूसरा, आपके द्वारा किए जा रहे विभिन्न व्यवहारों के बारे में सोचना शुरू करें। "फैमिली ट्री" जैसी चीजें - यह एक व्यवहार है। मॉडलिंग के बजाय इकाई पर विशेषता के रूप में, एक ऐसी प्रणाली का निर्माण करें जो सभी जानकारी रखती है । सिस्टम तब तय कर सकता है कि इसके साथ क्या करना है।

इसी तरह, हम "चरित्र जीवित है या मृत?" यह आपके डिजाइन में सबसे महत्वपूर्ण प्रणालियों में से एक है, क्योंकि यह अन्य सभी को प्रभावित करता है। कुछ सिस्टम "मृत" अक्षर (जैसे "स्प्राइट" सिस्टम) को हटा सकते हैं, अन्य सिस्टम आंतरिक रूप से नई स्थिति का बेहतर समर्थन करने के लिए चीजों को फिर से व्यवस्थित कर सकते हैं।

आप एक "स्प्राइट" या "ड्राइंग" या "रेंडरिंग" प्रणाली का निर्माण करेंगे, उदाहरण के लिए। इस प्रणाली में यह निर्धारित करने की जिम्मेदारी होगी कि चरित्र को किस अंक के साथ प्रदर्शित किया जाना चाहिए और इसे कैसे प्रदर्शित किया जाए। फिर, जब कोई पात्र मर जाता है, तो उन्हें हटा दें।

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

आपके "नाम" प्रणाली और "परिवार के पेड़" प्रणाली को संभवतः चरित्र (जीवित या मृत) को स्मृति में रखना चाहिए। इस प्रणाली को उस जानकारी को याद करने की आवश्यकता है, चाहे चरित्र की स्थिति क्या हो। (जिम अभी भी जिम है, हम उसे दफनाने के बाद भी।)

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

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

आप सिस्टम के कुछ हिस्सों को बाहर की ओर उजागर करना चाहते हैं। अपने Pathfinderसिस्टम में आप शायद एक चाहते हैं Vector2 NextPosition(int entity)। इस तरह, आप उन तत्वों को कसकर नियंत्रित सरणियों या सूचियों में रख सकते हैं। आप छोटे, structप्रकारों का उपयोग कर सकते हैं , जो आपको छोटे, सन्निहित मेमोरी ब्लॉकों में घटकों को रखने में मदद कर सकते हैं, जो सिस्टम अपडेट को बहुत तेज कर सकते हैं । (विशेषकर यदि किसी सिस्टम पर बाहरी प्रभाव कम से कम हो, तो अब उसे केवल आंतरिक स्थिति की देखभाल करने की आवश्यकता है, जैसे कि Name।)

लेकिन, और मैं इस पर जोर नहीं दे सकता, अब एक Entityसिर्फ एक है ID, जिसमें टाइल, ऑब्जेक्ट्स आदि शामिल हैं। यदि कोई इकाई किसी सिस्टम से संबंधित नहीं है, तो सिस्टम इसे ट्रैक नहीं करेगा। इसका मतलब है कि हम अपनी "ट्री" ऑब्जेक्ट बना सकते हैं, उन्हें Spriteऔर Movementसिस्टम में स्टोर कर सकते हैं (पेड़ हिलेंगे नहीं, लेकिन उनके पास "स्थिति" घटक है), और उन्हें अन्य सिस्टम से बाहर रखें। हमें अब पेड़ों के लिए एक विशेष सूची की आवश्यकता नहीं है, क्योंकि एक पेड़ को प्रदान करना एक चरित्र से अलग नहीं है, एक तरफ पेपरडॉलिंग से अलग है। (जिसे Spriteसिस्टम नियंत्रित कर सकता है, या Paperdollसिस्टम नियंत्रित NextPositionकर सकता है ।) अब हमारा थोड़ा फिर से लिखा जा सकता है: Vector2? NextPosition(int entity)और यह उन nullसंस्थाओं के लिए एक स्थिति वापस कर सकता है जिनके बारे में परवाह नहीं है। हम NameSystem.GetName(int entity)इसे हमारे लिए भी लागू करते हैं , यह nullपेड़ों और चट्टानों के लिए लौटता है ।


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


हैलो, इस तरह की एक विस्तृत प्रतिक्रिया के लिए धन्यवाद। मैं केवल एक गेमऑबजेक्ट मैनेजर का उपयोग कर रहा हूं जिसमें अन्य सभी इन-गेम कैरेक्टर का संदर्भ है।
पॉल पी।

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

-1

जैसा कि आप एकता में कर रहे हैं, सबसे आसान तरीका यह है:

  • प्रति वर्ण या इकाई प्रकार का एक गेम ऑब्जेक्ट बनाएं
  • इन्हें प्रीफ़ैब्स के रूप में सहेजें
  • तब आप जब भी जरूरत हो एक प्रीफैब को इंस्टेंट कर सकते हैं
  • जब कोई पात्र मारा जाता है, तो गेमबजेक्ट को नष्ट कर दें और यह किसी भी सीपीयू या मेमोरी को नहीं लेगा

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

जैसा कि आप अपने खेल के माध्यम से प्रगति करते हैं, आप पाएंगे कि अलग-अलग गेम ऑब्जेक्ट होने से आपको नेविगेशन और एआई सहित कई फायदे मिलते हैं।

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