स्क्रिप्ट के बाहर इकाई कॉन्‍फ़िगरेशन क्‍यों?


11

मैंने बहुत सारे गेम देखे हैं जो स्क्रिप्ट फ़ाइलों में इकाई घटकों को परिभाषित करते हैं, लेकिन जब वे प्रत्येक इकाई को कॉन्फ़िगर करते हैं और इसमें क्या घटक होते हैं, तो वे कुछ अन्य फ़ाइल प्रारूप (जैसे एक्सएमएल) का उपयोग करते हैं। वे ऐसा क्यों करते हैं?

मैं ज्यादातर यह देखने के लिए कह रहा हूं कि दूसरों का औचित्य इसके लिए क्या था। मैं भी स्क्रिप्ट के बाहर मेरी संस्थाओं कॉन्फ़िगर (हालांकि मैं JSON नहीं एक्सएमएल चुना है)। ऐसा करने के लिए मेरे कारणों से मुझे बचाने के खेल को लागू करना आसान हो गया है और यह भी क्योंकि मुझे लगता है कि इस तरह के कॉन्फ़िगरेशन को XML या JSON जैसी किसी चीज़ में बेहतर रूप से व्यवस्थित किया गया है।


@ क्रिस्टोफर लार्सन का जवाब: एक टिप्पणी के रूप में पोस्ट करने के लिए बहुत लंबा है

मुझे डर है कि आप प्रश्न के विषय से थोड़ा विचलित हो गए होंगे। आप जिन समस्याओं का वर्णन कर रहे हैं, वे पदानुक्रम-आधारित संस्थाओं से अधिक संबंधित हैं; मेरे प्रश्न में ध्यान दें मैंने उल्लेख किया था कि मैं घटक-आधारित संस्थाओं के बारे में बात कर रहा था।

यहाँ एक उदाहरण है जो मैं पूछना चाहता था। एक इकाई को कॉन्फ़िगर करने के लिए नीचे दो वैकल्पिक तरीके हैं: स्क्रिप्ट के माध्यम से और एक बाहरी JSON फ़ाइल के माध्यम से। मेरा सवाल था, इतने सारे लोग स्क्रिप्ट के बाहर इकाई को कॉन्फ़िगर करना क्यों पसंद करते हैं?

एक आधार इकाई वर्ग:

class Entity:
    def __init__(self, name):
        pass
    def addComponent(self, comp):
        pass

स्क्रिप्ट दृष्टिकोण:

orc = Entity('Orc')
orc.addComponent(PositionComponent(3.4, 7.9))

JSON दृष्टिकोण:

{
    "name" : "Orc",
    "components":
    {
        "PositionComponent": {
            "x" : 3.4,
            "y" : 7.9
        }
    }
}

मैंने पहले से ही इस दृष्टिकोण का उपयोग करने के लिए अपने कारणों को बताया, जो तकनीकी और संगठनात्मक हैं। मैं जानना चाहता था कि इतने सारे लोग (जो मैंने देखा है) इसका उपयोग क्यों करते हैं।

जवाबों:


13

मेरे दिमाग में आने वाला प्रमुख लाभ यह है कि यह किसी भी गेम स्क्रिप्ट को छूने की आवश्यकता के बिना कॉन्फ़िगरेशन को एक गैर-प्रोग्रामर द्वारा संपादित / प्रबंधित करने की अनुमति देता है।


यह केवल दो फ़ाइलों (.h और फिर एक। Cpp के समकक्ष) होने से प्राप्त किया जा सकता है। मुझे आश्चर्य है कि कौन ऐसा व्यक्ति होगा जो एक वस्तु बनाना चाहेगा (यह कहने के अलावा कि कुछ भी नहीं एक फूलदान की तरह दिखता है और यह कि कुछ भी मक्खन की तरह नहीं दिखता है) जो इसे कुछ तर्क में जोड़ना नहीं चाहेगा (जैसे अगर फूलदान में फूलों से पराग में ढका हुआ व्यक्ति, तितली को आकर्षित करता है)। मानव पठनीय महान है और यह क्यों है, इस पर मेरे एक विचार है, लेकिन वहाँ फिर से मैं चलता हूं कि JSON, Lua तालिकाओं, और XML सभी में गैर-प्रोग्रामर द्वारा मानव पठनीयता के समान स्तर हैं।
जेम्स

2
Glest एक गेम है जो xml के साथ modded है। कई गैर-प्रोग्रामर इसके लिए मॉड बनाते हैं। स्क्रिप्ट की तुलना में xml / json होना निश्चित रूप से अधिक स्वीकार्य है।
विल

6

एक कारण यह है कि मैं आमतौर पर स्क्रिप्ट के बजाय एक कॉन्फिग फाइल का उपयोग करता हूं:

शुद्धता के लिए एक स्क्रिप्ट की जांच करने का एकमात्र तरीका जैसे कि सभी मूल्यों को निर्दिष्ट करना और इस तरह इसे चलाना है।

स्क्रिप्ट को मानों को कॉन्फ़िगर करने की अनुमति देने के लिए कोड लिखने का मतलब है कि स्क्रिप्ट को मानों को भरने के लिए कंकाल ऑब्जेक्ट बनाने के लिए कोड लिखना और फिर यह पुष्टि करना कि स्क्रिप्ट ने ऐसा किया था और इस तरह। फ्लैट कॉन्फ़िगरेशन फ़ाइल से लोड करने की तुलना में इसका अधिक कोड और Buggier कोड, अक्सर एक पुस्तकालय का उपयोग करता है जो किसी प्रकार के सत्यापन तंत्र का समर्थन करता है।


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

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

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

2

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


1

आपके द्वारा वर्णित पैटर्न डेटा ड्रिवेन सिस्टम का कार्यान्वयन है।

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

एक बार जब डेटा बाहरी रूप से परिभाषित किया जाता है, तो आपके पास सभी प्रकार की संभावनाएं होती हैं कि कैसे डिजाइनर सीधे संपादन पाठ (ugh!) से लेकर परिष्कृत UI तक एक तार्किक, सुसंगत और यहां तक ​​कि शुद्धता के लिए सत्यापित किए गए डिज़ाइनर की पसंद को देखते हैं। खेल संतुलन का तरीका)।

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

आइए एक स्टीरियोटाइपिकल इकाई "orc" का उदाहरण लें ...

हमारे orc के लिए लागू करने का एक तरीका यह होगा कि orc के लिए सभी विशेषताओं और तर्क के कोड में एक पूरा विवरण लिखें।

  • maxhealth = 10
  • क्षति = प्रति सेकंड 3 क्षति
  • भगोड़ा = true
  • runawaywhen = स्वास्थ्य <10
  • आक्रामक = true

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

महान, अब आपको एक अलग वर्ग की आवश्यकता है या (शायद हम आगे देख रहे थे) उन मूल्यों को समायोजित करें जिन्हें हम "फ़ैक्टरी" में खिलाते हैं जो "नौसिखिया" क्षेत्र में बनाते समय orcs बनाते हैं। इसलिए हम बदलाव करते हैं, नए बायनेरिज़ की तैनाती करते हैं। केवल खेलने वाले ही वापस आए हैं और कहते हैं कि नए स्वास्थ्य मूल्य बहुत कम हैं क्योंकि हम एक हिट में orcs को मारते हैं।

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

डेटा संचालित सिस्टमों को चरम सीमा तक ले जाने से खेल के स्तर, मंत्र और यहां तक ​​कि आपके डेटा में साधारण परिवर्तनों द्वारा लागू किए जाने वाले quests की अनुमति मिलती है, जिसमें कोड परिवर्तन की आवश्यकता नहीं होती है। अंत में, यह गेम सामग्री पर बनाना, ट्विस्ट करना और पुनरावृति करना आसान बनाता है।


2
लिपियों में भी अधिकांश परिभाषाओं के आंकड़े हैं
विल

1
-1। सवाल डेटा द्वारा संचालित बनाम हार्ड-कोडिंग के बारे में नहीं है, लेकिन गतिशील स्क्रिप्टिंग बनाम स्थिर घोषणाओं के बारे में है।

@ क्रिस्टोफर मैंने अपने ओपी में एक लंबा उत्तर जोड़ा। कृपया यह देखें।
पॉल मंटा

0

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

यह जानने के लिए कि लोग इसे आमतौर पर XML में क्यों चुनते हैं और फिर तर्क में स्क्रिप्ट करते हैं, यह है कि जब आप इसे कहते हैं तो यह समझ में आता है। यहां डेटा में ऑब्जेक्ट की मेरी परिभाषा है, एक अच्छा डेटा स्टोरेज प्रारूप क्या है? यह लगभग हमेशा XML है (हालांकि मैं JSON के साथ भी जाता हूं;)। और फिर जब वे तर्क में जोड़ना चाहते हैं, तो यह अच्छी तरह से कोडित है या स्क्रिप्ट फ़ाइल में डाल दिया गया है।

इसकी गलत सोच नहीं है, लेकिन मेरी नजर में लोग सिर्फ अगले कदम पर नहीं जा रहे हैं। किसी भी पूर्ण भाषा को देखें, c / c ++ / c #,। आप सभी वस्तुओं और उनके तर्क को एक भाषा में परिभाषित कर सकते हैं, अपने स्क्रिप्टिंग इंटरफ़ेस में समान क्यों नहीं करते ... यह लगभग ऐसा ही है जैसे हमें XML में अपनी कक्षाओं को परिभाषित करना चाहिए और जब आप इसके बारे में सोचते हैं तो हमारे तरीके #। हो सकता है कि पुरानी गेम स्क्रिप्टिंग भाषाएं अधिक शक्तिशाली नहीं थीं और यह अभी भी उसी तरह से चल रही है जिस तरह से किया गया था।

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