खेल इंजन: स्क्रिप्टिंग समर्थन को लागू करने के लिए एक सभ्य तरीका, वास्तुकला-वार?


17

मैं एक सरल गेम इंजन विकसित कर रहा हूं (C # में, यदि यह मायने रखता है), और मैं वास्तुकला के संदर्भ में स्क्रिप्टिंग को लागू करने के लिए एक पर्याप्त पर्याप्त तरीका नहीं सोच सकता।

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

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

(ईमानदार होना, आदर्श रूप से मैं चाहता हूं कि स्क्रिप्ट खेल के प्रवाह को नियंत्रित करे, केवल कोर यांत्रिकी / ग्राफिक्स को तर्क / दृश्य के लिए छोड़ दे, लेकिन मैं इसके लिए नया हूं, इसलिए मुझे यकीन नहीं है कि मैं इसे अभी कर सकता हूं)

मैं तीन विकल्पों के बारे में सोच रहा हूं:

  • बस स्क्रिप्टिंग को तर्क में रहने दें, लेकिन इसे खेल के चित्रमय पक्ष के बारे में बताएं। लेकिन यह तर्क / दृश्य विभाजन को बहुत अस्पष्ट बना देगा, यह नहीं होगा ...

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

  • स्क्रिप्टिंग को सभी से ऊपर एक मॉड्यूल बनाएं, ताकि यह तर्क / दृश्य के कार्यों को सीधे प्रभावित / कॉल कर सके। यह संपूर्ण ईवेंट एक्सचेंज स्कीम को खराब करने के डर से स्वाभाविक रूप से व्यापक कार्यक्षमता के लिए अनुमति देता है और इस बात से डरता है कि स्क्रिप्ट सामान को तब भी तोड़ सकती है जब वह वास्तव में नहीं होना चाहिए।

इसलिए, मैं न तो इनमें से किसी एक पर निर्णय ले सकता हूं और न ही स्क्रिप्टिंग मॉड्यूल को सम्मिलित करने के बेहतर तरीके के बारे में सोच सकता हूं ... कोई सुझाव या उपयोगी लिंक?

धन्यवाद!

सवाल का पलायन करने के लिए धन्यवाद, पता नहीं gamedev के लिए एक विशेष खंड था


आपको क्या समस्या है कि एक स्क्रिप्टिंग भाषा शुरू करने से हल हो जाएगी?
उदार

जवाबों:


3

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

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

फिर से, मैं इसे उसी कथन के साथ कहता हूं जो मैं हमेशा करता हूं। एक तैयार कार्य उत्पाद हमेशा प्रोग्रामिंग में एक अच्छे सिद्धांत की तुलना में अधिक मूल्यवान होता है :)

उम्मीद है की यह मदद करेगा!


2

कई लोग गतिशील भाषाओं के शक्तिशाली को कम आंकते हैं, यह सोचते हुए कि इस तरह की लचीलापन गति की लागत पर आती है; यह सच है लेकिन अक्सर लागत नगण्य है।

व्यक्तिगत रूप से मैं अभिव्यक्ति का दोहन करने वाली गतिशील भाषाओं का उपयोग करके जितना संभव हो उतना विकसित करना चाहता हूं और फिर मैं यह समझने के लिए प्रोटोटाइप को प्रोफाइल करता हूं कि कहां और क्या अनुकूलन की आवश्यकता है।

आपके मामले में इसका मतलब है कि आपको तीसरे विकल्प की ओर बढ़ने की कोशिश करनी चाहिए, एक उपयुक्त गतिशील भाषा का उपयोग करके "उच्च" भाग को विकसित करना जिसे आप स्क्रिप्टिंग भाषा के रूप में भी उपयोग कर सकते हैं।

डायनामिज्म को सही गहराई पर रखने के बाद बहुत सारे पैटर्न का उपयोग किया जा सकता है। आपकी कस्टम स्क्रिप्ट को कॉलबैक सिस्टम के रूप में एक इवेंट आधारित सिस्टम में एकीकृत किया जा सकता है, जब कोर वापस कॉल करता है तो यह एक उपयुक्त वातावरण प्रदान कर सकता है ताकि स्क्रिप्ट वैश्विक स्थिति या पूरी प्रणाली के सबसेट की स्थिति को बदल सके।

आप उस इंटरफ़ेस को इनकैप्सलेट कर सकते हैं जिसे स्क्रिप्ट फ़ैकडे पैटर्न का उपयोग करके इंटरैक्ट कर सकती है। फ़ेकैड के तरीकों में आप उस तर्क को रख सकते हैं जो परिभाषित करता है कि कैसे , कब , अगर स्क्रिप्ट एक कार्यक्षमता का उपयोग कर सकती है और कोर कार्यान्वयन से स्क्रिप्ट इंटरैक्शन को अमूर्त कर सकती है।

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


1

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


1

Lua एक सामान्य प्रयोजन की पटकथा भाषा के लिए एक लोकप्रिय विकल्प है। आप अपनी खुद की स्क्रिप्टिंग लैक्स और Yacc (गेम प्रोग्रामिंग गम 3 में लेख देखें) का उपयोग कर अपनी भाषा बना सकते हैं, लेकिन मैं कहूंगा कि आपकी ज्यादातर जरूरतों का ध्यान रखा जा सकता है, चाहे वह कितनी भी बड़ी या छोटी क्यों न हो।

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