शायद आप प्रक्रियात्मक स्तर निर्माण से परिचित हों; खैर, इस पोस्ट में, यह सब प्रक्रियात्मक मिशन निर्माण के बारे में है। हम रॉगलाइक गेम के लिए क्लासिक मशीन लर्निंग और आवर्तक तंत्रिका नेटवर्क का उपयोग करके मिशन बनाने की बड़ी तस्वीर के माध्यम से चलेंगे।
नमस्ते सभी! मेरा नाम लेव कोबेलेव है, और मैं MY.GAMES में गेम डिज़ाइनर हूँ। इस लेख में, मैं क्लासिकल ML और सरल न्यूरल नेटवर्क का उपयोग करने के अपने अनुभव को साझा करना चाहता हूँ क्योंकि मैं समझाता हूँ कि कैसे और क्यों हमने प्रक्रियात्मक मिशन निर्माण पर समझौता किया, और हम ज़ोंबी स्टेट में प्रक्रिया के कार्यान्वयन में भी गहराई से उतरेंगे।
अस्वीकरण: यह लेख केवल सूचनात्मक/मनोरंजन उद्देश्यों के लिए है, और किसी विशेष समाधान का उपयोग करते समय, हम आपको सलाह देते हैं कि आप किसी विशेष संसाधन के उपयोग की शर्तों की सावधानीपूर्वक जांच करें और कानूनी कर्मचारियों से परामर्श करें!
☝🏻 सबसे पहले, कुछ शब्दावली: " एरेनास ", " स्तर ", और " स्थान " इस संदर्भ में समानार्थी हैं, साथ ही " क्षेत्र ", " ज़ोन " और " स्पॉन क्षेत्र " भी।
अब, आइए " मिशन " को परिभाषित करें । एक मिशन एक पूर्व निर्धारित क्रम है जिसमें दुश्मन कुछ नियमों के अनुसार किसी स्थान पर दिखाई देते हैं । जैसा कि उल्लेख किया गया है, ज़ोंबी स्टेट में स्थान उत्पन्न होते हैं, इसलिए हम एक "मंचित" अनुभव नहीं बना रहे हैं। यही है, हम दुश्मनों को पूर्व निर्धारित बिंदुओं पर नहीं रखते हैं - वास्तव में, ऐसे कोई बिंदु नहीं हैं। हमारे मामले में, एक दुश्मन किसी खिलाड़ी या किसी विशिष्ट दीवार के पास कहीं दिखाई देता है। इसके अलावा, खेल में सभी क्षेत्र आयताकार हैं, इसलिए उनमें से किसी पर भी कोई भी मिशन खेला जा सकता है।
आइए " स्पॉन " शब्द का परिचय दें । स्पॉनिंग एक निर्दिष्ट क्षेत्र में बिंदुओं पर पूर्व निर्धारित मापदंडों के अनुसार एक ही प्रकार के कई दुश्मनों की उपस्थिति है। एक बिंदु - एक दुश्मन। यदि किसी क्षेत्र के अंदर पर्याप्त बिंदु नहीं हैं, तो इसे विशेष नियमों के अनुसार विस्तारित किया जाता है। यह समझना भी महत्वपूर्ण है कि ज़ोन का निर्धारण केवल तभी किया जाता है जब स्पॉन ट्रिगर होता है। क्षेत्र स्पॉन मापदंडों द्वारा निर्धारित किया जाता है, और हम नीचे दो उदाहरणों पर विचार करेंगे: खिलाड़ी के पास एक स्पॉन और एक दीवार के पास।
स्पॉन का पहला प्रकार खिलाड़ी के पास है। खिलाड़ी के पास उपस्थिति एक सेक्टर के माध्यम से निर्दिष्ट की जाती है, जिसे दो रेडी द्वारा वर्णित किया जाता है: बाहरी और आंतरिक (आर और आर), सेक्टर की चौड़ाई (β), खिलाड़ी के सापेक्ष रोटेशन का कोण (α), और दुश्मन की उपस्थिति की वांछित दृश्यता (या अदृश्यता)। एक सेक्टर के अंदर दुश्मनों के लिए आवश्यक संख्या में अंक होते हैं - और यहीं से वे आते हैं!
दूसरे प्रकार का स्पॉन दीवार के पास होता है । जब कोई स्तर उत्पन्न होता है, तो प्रत्येक पक्ष को एक टैग के साथ चिह्नित किया जाता है - एक कार्डिनल दिशा। निकास वाली दीवार हमेशा उत्तर में होती है। दीवार के पास दुश्मन की उपस्थिति टैग, उससे दूरी (ओ), लंबाई (ए), ज़ोन की चौड़ाई (बी) और दुश्मन की उपस्थिति की वांछित दृश्यता (या अदृश्यता) द्वारा निर्दिष्ट की जाती है। ज़ोन का केंद्र खिलाड़ी की वर्तमान स्थिति के सापेक्ष निर्धारित किया जाता है।
स्पॉन तरंगों में आते हैं। एक लहर वह तरीका है जिससे स्पॉन दिखाई देते हैं, यानी उनके बीच की देरी - हम खिलाड़ियों को एक साथ सभी दुश्मनों से नहीं मारना चाहते। तरंगों को मिशनों में जोड़ा जाता है और एक निश्चित तर्क के अनुसार एक के बाद एक लॉन्च किया जाता है। उदाहरण के लिए, पहली लहर के 20 सेकंड बाद दूसरी लहर लॉन्च की जा सकती है (या अगर उसके अंदर 90% से अधिक ज़ॉम्बी मारे जाते हैं)। तो, एक पूरे मिशन को एक बड़े बॉक्स के रूप में माना जा सकता है, और उस बॉक्स के अंदर, मध्यम आकार के बॉक्स (तरंगें) हैं, और तरंगों के अंदर, और भी छोटे बॉक्स (स्पॉन) हैं।
इसलिए, मिशन पर काम करने से पहले ही हमने कुछ नियम निर्धारित कर लिए हैं:
एक समय पर, हमारे पास लगभग सौ मिशन तैयार थे, लेकिन कुछ समय बाद, हमें और भी ज़्यादा मिशन की ज़रूरत पड़ी। दूसरे डिज़ाइनर और मैं एक और सौ मिशन बनाने में बहुत ज़्यादा समय और मेहनत नहीं लगाना चाहते थे, इसलिए हमने मिशन बनाने के लिए एक तेज़ और सस्ती विधि की तलाश शुरू कर दी।
सभी जनरेटर कुछ नियमों के अनुसार काम करते हैं, और हमारे मैन्युअल रूप से बनाए गए मिशन भी कुछ सिफारिशों के अनुसार किए गए थे। इसलिए, हम मिशनों के भीतर पैटर्न के बारे में एक परिकल्पना के साथ आए, और वे पैटर्न जनरेटर के लिए नियमों के रूप में कार्य करेंगे।
✍🏻 कुछ शब्द जो आपको पाठ में मिलेंगे:
क्लस्टरिंग किसी दिए गए संग्रह को गैर-अतिव्यापी उपसमूहों (क्लस्टर) में विभाजित करने का कार्य है, ताकि समान वस्तुएं एक ही क्लस्टर से संबंधित हों, और विभिन्न क्लस्टरों की वस्तुएं काफी भिन्न हों।
श्रेणीबद्ध विशेषताएँ वे डेटा हैं जो एक परिमित सेट से मान लेते हैं और उनका कोई संख्यात्मक प्रतिनिधित्व नहीं होता है। उदाहरण के लिए, स्पॉन वॉल टैग: उत्तर, दक्षिण, आदि।
श्रेणीबद्ध विशेषताओं का कोडिंग कुछ पूर्व-निर्दिष्ट नियमों के अनुसार श्रेणीबद्ध विशेषताओं को संख्यात्मक प्रतिनिधित्व में परिवर्तित करने की एक प्रक्रिया है। उदाहरण के लिए, उत्तर → 0, दक्षिण → 1, आदि।
सामान्यीकरण संख्यात्मक विशेषताओं को पूर्व-संसाधन करने की एक विधि है ताकि उन्हें श्रेणियों में अंतर के बारे में जानकारी खोए बिना कुछ सामान्य पैमाने पर लाया जा सके। उदाहरण के लिए, उनका उपयोग वस्तुओं की समानता की गणना करने के लिए किया जा सकता है। जैसा कि पहले उल्लेख किया गया है, ऑब्जेक्ट समानता क्लस्टरिंग समस्याओं में एक महत्वपूर्ण भूमिका निभाती है।
इन सभी पैटर्न को मैन्युअल रूप से खोजना बहुत समय लेने वाला होगा, इसलिए हमने क्लस्टरिंग का उपयोग करने का फैसला किया। यहीं पर मशीन लर्निंग काम आती है, क्योंकि यह इस कार्य को अच्छी तरह से संभालती है।
क्लस्टरिंग कुछ N-आयामी अंतरिक्ष में काम करता है, और ML विशेष रूप से संख्याओं के साथ काम करता है। इसलिए सभी स्पॉन वेक्टर बन जाएंगे:
इसलिए, उदाहरण के लिए, स्पॉन जिसे "2 मीटर के इंडेंटेशन, 10 की चौड़ाई और 5 की लंबाई वाले क्षेत्र में उत्तरी दीवार पर 10 ज़ोंबी शूटरों को स्पॉन करें" के रूप में वर्णित किया गया था, वेक्टर [0.5, 0.25, 0.2, 0.8, ..., 0.5] बन गया (←ये संख्याएं अमूर्त हैं)।
इसके अतिरिक्त, विशिष्ट शत्रुओं को अमूर्त प्रकारों में मैप करके शत्रुओं के समूह की शक्ति को कम किया गया। शुरुआत के लिए, इस तरह की मैपिंग ने एक निश्चित क्लस्टर को एक नया शत्रु सौंपना आसान बना दिया। इससे पैटर्न की इष्टतम संख्या को कम करना भी संभव हो गया और परिणामस्वरूप, पीढ़ी की सटीकता में वृद्धि हुई - लेकिन इस पर बाद में और अधिक जानकारी दी जाएगी।
कई क्लस्टरिंग एल्गोरिदम हैं: K-Means, DBSCAN, स्पेक्ट्रल, हाइरार्किकल, इत्यादि। ये सभी अलग-अलग विचारों पर आधारित हैं लेकिन इनका लक्ष्य एक ही है: डेटा में क्लस्टर ढूँढना। नीचे, आप चुने गए एल्गोरिदम के आधार पर एक ही डेटा के लिए क्लस्टर ढूँढने के अलग-अलग तरीके देख सकते हैं।
के-मीन्स एल्गोरिथ्म ने स्पॉन के मामले में सबसे अच्छा प्रदर्शन किया।
अब, उन लोगों के लिए एक छोटा सा विषयांतर जो इस एल्गोरिथ्म के बारे में कुछ नहीं जानते (इसमें कोई सख्त गणितीय तर्क नहीं होगा क्योंकि यह लेख गेम डेवलपमेंट के बारे में है और एमएल की मूल बातों के बारे में नहीं है)। K-Means प्रत्येक फीचर से वर्ग दूरी के योग को उसके निर्दिष्ट क्लस्टर के औसत मूल्य से कम करके डेटा को K क्लस्टर में विभाजित करता है। औसत को वर्ग दूरी के अंतर-क्लस्टर योग द्वारा व्यक्त किया जाता है।
इस विधि के बारे में निम्नलिखित बातें समझना महत्वपूर्ण है:
आइये दूसरे बिन्दु पर थोड़ा और विस्तार से नजर डालें।
कोहनी विधि का उपयोग अक्सर क्लस्टर की इष्टतम संख्या का चयन करने के लिए किया जाता है। विचार बहुत सरल है: हम एल्गोरिथ्म चलाते हैं और 1 से N तक सभी K को आज़माते हैं, जहाँ N कुछ उचित संख्या है। हमारे मामले में, यह 10 था - अधिक क्लस्टर ढूँढना असंभव था। अब, आइए प्रत्येक क्लस्टर के भीतर वर्ग दूरी का योग ज्ञात करें (एक स्कोर जिसे WSS या SS के रूप में जाना जाता है)। हम यह सब एक ग्राफ पर प्रदर्शित करेंगे और एक बिंदु का चयन करेंगे जिसके बाद y-अक्ष पर मान महत्वपूर्ण रूप से बदलना बंद कर देता है।
उदाहरण के लिए, हम एक सुप्रसिद्ध डेटासेट का उपयोग करेंगे।
यदि आप कोहनी नहीं देख पा रहे हैं, तो आप सिल्हूट विधि का उपयोग कर सकते हैं, लेकिन यह लेख के दायरे से बाहर है।
ऊपर और नीचे दी गई सभी गणनाएँ पाइथन में एमएल और डेटा विश्लेषण के लिए मानक पुस्तकालयों का उपयोग करके की गई थीं: पांडा, न्यूमपी, सीबॉर्न और स्केलेर्न। मैं कोड साझा नहीं कर रहा हूँ क्योंकि लेख का मुख्य उद्देश्य तकनीकी विवरणों में जाने के बजाय क्षमताओं को चित्रित करना है।
क्लस्टर की इष्टतम संख्या प्राप्त करने के बाद, उनमें से प्रत्येक का विस्तार से अध्ययन किया जाना चाहिए। हमें यह देखने की ज़रूरत है कि इसमें कौन से स्पॉन शामिल हैं और वे क्या मान लेते हैं। आइए आगे की पीढ़ी के उपयोग के लिए प्रत्येक क्लस्टर के लिए अपनी खुद की सेटिंग्स बनाएँ। मापदंडों में शामिल हैं:
आइए क्लस्टर सेटिंग्स पर विचार करें, जिसे मौखिक रूप से "खिलाड़ी के पास कहीं कम दूरी पर और, सबसे अधिक संभावना है, दृश्य बिंदुओं में सरल दुश्मनों का पैदा होना" के रूप में वर्णित किया जा सकता है।
क्लस्टर 1 तालिका
दुश्मन | प्रकार | आर | आर-डेल्टा | ROTATION | चौड़ाई | दृश्यता |
---|---|---|---|---|---|---|
ज़ॉम्बी_कॉमन_3_5=4, ज़ॉम्बी_भारी=1 | खिलाड़ी | 10-12 | 1-2 | 0-30 | 30-45 | दृश्यमान=9, अदृश्य=1 |
यहां दो उपयोगी तरकीबें दी गई हैं:
यह कार्य प्रत्येक क्लस्टर के साथ किया गया, तथा इनकी संख्या 10 से भी कम थी, इसलिए इसमें अधिक समय नहीं लगा।
हमने इस विषय पर अभी तक बहुत कम चर्चा की है, लेकिन अध्ययन के लिए अभी भी बहुत सारी रोचक चीजें हैं। यहाँ संदर्भ के लिए कुछ लेख दिए गए हैं; वे डेटा के साथ काम करने, क्लस्टरिंग और परिणामों का विश्लेषण करने की प्रक्रियाओं का अच्छा विवरण प्रदान करते हैं।
स्पॉन पैटर्न के अतिरिक्त, हमने एक मिशन के भीतर दुश्मनों के कुल स्वास्थ्य की उसके पूरा होने के अपेक्षित समय पर निर्भरता का अध्ययन करने का निर्णय लिया, ताकि जनरेशन के दौरान इस पैरामीटर का उपयोग किया जा सके।
मैन्युअल मिशन बनाने की प्रक्रिया में, कार्य अध्याय के लिए एक समन्वित गति का निर्माण करना था - मिशनों का एक क्रम: छोटा, लंबा, छोटा, फिर से छोटा, और इसी तरह। यदि आप खिलाड़ी की अपेक्षित DPS और उसका समय जानते हैं तो आप किसी मिशन के भीतर दुश्मनों का कुल स्वास्थ्य कैसे प्राप्त कर सकते हैं?
💡 रैखिक प्रतिगमन एक विधि है जिसमें एक चर की दूसरे या कई अन्य चर पर निर्भरता को एक रैखिक निर्भरता फ़ंक्शन के साथ फिर से बनाया जाता है। नीचे दिए गए उदाहरण केवल एक चर से रैखिक प्रतिगमन पर विचार करेंगे: f(x) = wx + b.
आइये निम्नलिखित शब्दों से परिचय करें:
तो, HP = DPS * कार्रवाई का समय + खाली समय। मैन्युअल चैप्टर बनाते समय, हमने प्रत्येक मिशन का अपेक्षित समय रिकॉर्ड किया; अब, हमें कार्रवाई का समय ढूँढना होगा।
यदि आप अपेक्षित मिशन समय जानते हैं, तो आप कार्रवाई के समय की गणना कर सकते हैं और इसे अपेक्षित समय से घटा कर खाली समय प्राप्त कर सकते हैं: खाली समय = मिशन समय - कार्रवाई का समय = मिशन समय - HP * DPS। इस संख्या को फिर मिशन में दुश्मनों की औसत संख्या से विभाजित किया जा सकता है, और आपको प्रति दुश्मन खाली समय मिलता है। इसलिए, जो कुछ भी बचता है वह केवल अपेक्षित मिशन समय से प्रति दुश्मन खाली समय तक एक रैखिक प्रतिगमन बनाना है।
इसके अतिरिक्त, हम मिशन समय से कार्रवाई समय के हिस्से का प्रतिगमन भी तैयार करेंगे।
आइए गणनाओं का एक उदाहरण देखें और देखें कि इन प्रतिगमनों का उपयोग क्यों किया जाता है:
यहाँ एक सवाल है: हमें दुश्मन के लिए खाली समय जानने की आवश्यकता क्यों है? जैसा कि पहले उल्लेख किया गया है, स्पॉन समय के अनुसार व्यवस्थित होते हैं। इसलिए, i-वें स्पॉन के समय की गणना (i-1)वें स्पॉन के एक्शन समय और उसके भीतर खाली समय के योग के रूप में की जा सकती है।
और यहां एक और प्रश्न उठता है: क्रिया समय और खाली समय का हिस्सा स्थिर क्यों नहीं है?
हमारे खेल में, किसी मिशन की कठिनाई उसकी अवधि से संबंधित होती है। यानी, छोटे मिशन आसान होते हैं, और लंबे मिशन ज़्यादा कठिन होते हैं। कठिनाई मापदंडों में से एक प्रति दुश्मन खाली समय है। ऊपर दिए गए ग्राफ़ में कई सीधी रेखाएँ हैं और उनका ढलान गुणांक (w) समान है, लेकिन ऑफ़सेट (b) अलग है। इस प्रकार, कठिनाई को बदलने के लिए, ऑफ़सेट को बदलना ही काफ़ी है: b को बढ़ाने से खेल आसान हो जाता है, घटाने से यह ज़्यादा कठिन हो जाता है, और नकारात्मक संख्याओं की अनुमति होती है। ये विकल्प आपको अध्याय दर अध्याय कठिनाई बदलने में मदद करते हैं।
मेरा मानना है कि सभी डिजाइनरों को रिग्रेशन की समस्या पर गहराई से विचार करना चाहिए, क्योंकि यह अक्सर अन्य परियोजनाओं को विघटित करने में मदद करता है:
तो, हम जनरेटर के लिए नियमों को खोजने में कामयाब रहे, और अब हम उत्पादन प्रक्रिया पर आगे बढ़ सकते हैं।
यदि आप अमूर्त रूप से सोचते हैं, तो किसी भी मिशन को संख्याओं के अनुक्रम के रूप में दर्शाया जा सकता है, जहाँ प्रत्येक संख्या एक विशिष्ट स्पॉन क्लस्टर को दर्शाती है। उदाहरण के लिए, मिशन: 1, 2, 1, 1, 2, 3, 3, 2, 1, 3। इसका मतलब है कि नए मिशन बनाने का कार्य नए संख्यात्मक अनुक्रम बनाने पर निर्भर करता है। जनरेशन के बाद, आपको क्लस्टर सेटिंग्स के अनुसार प्रत्येक संख्या को व्यक्तिगत रूप से "विस्तारित" करना होगा।
यदि हम अनुक्रम उत्पन्न करने की एक तुच्छ विधि पर विचार करते हैं, तो हम किसी अन्य स्पॉन के बाद किसी विशेष स्पॉन की सांख्यिकीय संभावना की गणना कर सकते हैं। उदाहरण के लिए, हमें निम्नलिखित आरेख मिलता है:
आरेख का शीर्ष वह क्लस्टर है जिसकी ओर यह जाता है, एक शीर्ष है, तथा किनारा भार क्लस्टर के अगले होने की संभावना है।
ऐसे ग्राफ के माध्यम से चलते हुए, हम एक अनुक्रम उत्पन्न कर सकते हैं। हालाँकि, इस दृष्टिकोण में कई नुकसान हैं। इनमें, उदाहरण के लिए, स्मृति की कमी (यह केवल वर्तमान स्थिति को जानता है) और एक स्थिति में "फंसने" की संभावना है यदि इसके अपने आप में बदल जाने की उच्च सांख्यिकीय संभावना है।
✍🏻 यदि हम इस ग्राफ को एक प्रक्रिया के रूप में मानते हैं, तो हमें एक सरल मार्कोव श्रृंखला मिलती है।
आइए हम न्यूरल नेटवर्क की ओर मुड़ें, अर्थात आवर्ती नेटवर्क क्योंकि उनमें मूल दृष्टिकोण के नुकसान नहीं हैं। ये नेटवर्क प्राकृतिक भाषा प्रसंस्करण कार्यों में वर्णों या शब्दों जैसे अनुक्रमों को मॉडलिंग करने में अच्छे हैं। इसे बहुत सरल शब्दों में कहें तो नेटवर्क को पिछले तत्वों के आधार पर अनुक्रम के अगले तत्व की भविष्यवाणी करने के लिए प्रशिक्षित किया जाता है।
ये नेटवर्क कैसे काम करते हैं, इसका विवरण इस लेख के दायरे से बाहर है, क्योंकि यह एक बहुत बड़ा विषय है। इसके बजाय, आइए देखें कि प्रशिक्षण के लिए क्या आवश्यक है:
N=2, L=3, C=5 के साथ एक सरल उदाहरण। आइए अनुक्रम 1, 2, 3, 4, 1 लें और इसके अंदर L+1 लंबाई के उप-अनुक्रमों की तलाश करें: [1, 2, 3, 4], [2, 3, 4, 1]। आइए अनुक्रम को L वर्णों के इनपुट और एक उत्तर (लक्ष्य) - (L+1)वें वर्ण* में विभाजित करें। उदाहरण के लिए, [1, 2, 3, 4] → [1, 2, 3] और [4]। हम उत्तरों को वन-हॉट वेक्टर, [4] → [0, 0, 0, 0, 1] में एनकोड करते हैं।
इसके बाद, आप टेंसरफ्लो या पाइटॉर्च का उपयोग करके पायथन में एक सरल न्यूरल नेटवर्क का स्केच बना सकते हैं। आप नीचे दिए गए लिंक का उपयोग करके देख सकते हैं कि यह कैसे किया जाता है। बस इतना ही बाकी है कि ऊपर वर्णित डेटा पर प्रशिक्षण प्रक्रिया शुरू करें, प्रतीक्षा करें, और... फिर आप उत्पादन में जा सकते हैं!
मशीन लर्निंग मॉडल में कुछ मेट्रिक्स होते हैं, जैसे सटीकता। सटीकता सही तरीके से दिए गए उत्तरों का अनुपात दिखाती है। हालाँकि, इसे सावधानी से देखा जाना चाहिए क्योंकि डेटा में वर्ग असंतुलन हो सकता है। यदि कोई नहीं है (या लगभग कोई नहीं है), तो हम कह सकते हैं कि मॉडल अच्छी तरह से काम करता है यदि यह यादृच्छिक रूप से उत्तरों की तुलना में बेहतर भविष्यवाणी करता है, यानी सटीकता > 1/C; यदि 1 के करीब है, तो यह बहुत अच्छा काम करता है।
हमारे मामले में, मॉडल ने अच्छी सटीकता दिखाई। इन परिणामों का एक कारण क्लस्टरों की छोटी संख्या है जो दुश्मनों को उनके प्रकार और उनके संतुलन के अनुसार मैप करने के कारण प्राप्त हुई थी।
रुचि रखने वालों के लिए RNN पर अधिक सामग्री यहां उपलब्ध है:
प्रशिक्षित मॉडल आसानी से
मॉडल के साथ इंटरैक्ट करने के लिए, यूनिटी में एक कस्टम विंडो बनाई जाती है जहां गेम डिजाइनर सभी आवश्यक मिशन पैरामीटर सेट कर सकते हैं:
सेटिंग्स में जाने के बाद, बस एक बटन दबाना है और एक फ़ाइल प्राप्त करनी है जिसे यदि आवश्यक हो तो संपादित किया जा सकता है। हाँ, मैं पहले से ही मिशन बनाना चाहता था, न कि खेल के दौरान, ताकि उन्हें बदला जा सके।
आइये पीढ़ी प्रक्रिया पर नजर डालें:
तो, यह एक अच्छा उपकरण है जिसने हमें मिशनों के निर्माण को कई गुना तेज़ करने में मदद की। इसके अतिरिक्त, इसने कुछ डिजाइनरों को "लेखक के अवरोध" के डर को दूर करने में मदद की, क्योंकि अब आप कुछ सेकंड में तैयार समाधान प्राप्त कर सकते हैं।
लेख में, मिशन जनरेशन के उदाहरण का उपयोग करते हुए, मैंने यह प्रदर्शित करने का प्रयास किया कि कैसे क्लासिकल मशीन लर्निंग विधियाँ और न्यूरल नेटवर्क गेम डेवलपमेंट में मदद कर सकते हैं। इन दिनों जनरेटिव AI की ओर बहुत ज़्यादा रुझान है - लेकिन मशीन लर्निंग की अन्य शाखाओं के बारे में मत भूलिए, क्योंकि वे भी बहुत कुछ करने में सक्षम हैं।
इस लेख को पढ़ने के लिए समय निकालने के लिए धन्यवाद! मुझे उम्मीद है कि आपको जेनरेट किए गए स्थानों में मिशनों के दृष्टिकोण और मिशनों की पीढ़ी दोनों का विचार मिल गया होगा। नई चीजें सीखने से न डरें, खुद को विकसित करें और अच्छे गेम बनाएं!
चित्रण: shabbyrtist