मैं अपने खेल में, स्मार्ट स्क्रिप्टिंग को कैसे लागू कर सकता हूं?


18

मैं एक गेम इंजन विकसित कर रहा हूं। यह एक इकाई / घटकों पर आधारित माना जाता है। अपने खेल को विकसित करने के लिए, मैंने सोचा कि वास्तव में संस्थाओं को बनाने के लिए कुछ स्क्रिप्टिंग भाषा का उपयोग किया जाए।

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

क्या मुझे इस इकाई का वर्णन करने के लिए एक स्क्रिप्टिंग भाषा का उपयोग करना चाहिए, घटकों की अवधि में या कुछ और है जो बेहतर काम करेगा? अधिक सामान्यतः, मुझे अपने खेल में स्क्रिप्टिंग का उपयोग कैसे करना चाहिए?


केवल इकाई विवरण के लिए, आप केवल xml या कुछ समान का उपयोग कर सकते हैं, स्क्रिप्टिंग की कोई आवश्यकता नहीं है। स्क्रिप्टिंग के लिए मैं C # का उपयोग करता हूं, लेकिन केवल तभी जब आपका इंजन .NET में हो ...
Kikaimaru

@ किकरमारु सी # एक स्क्रिप्टिंग भाषा नहीं है। लुआ का उपयोग करना एक बेहतर विचार होगा, या कुछ अन्य भाषा जो आपके इंजन में एम्बेड की जा सकती हैं।
JDSweetBeat

@DJMethaneMan "C # स्क्रिप्टिंग भाषा नहीं है" का अर्थ कुछ भी नहीं है, C # में लिखे गए गेम में C # में स्क्रिप्ट लिखने और संकलन के लिए Roselyn जैसी किसी चीज का उपयोग करने में कोई समस्या नहीं है ... लेकिन 4 साल बाद, मैं json का उपयोग करूँगा। xml और C # :) की जगह जावास्क्रिप्ट
Kikaimaru

जवाबों:


17

मेरा खेल एक इकाई घटक ढांचे का उपयोग करता है और संस्थाओं को परिभाषित करने के लिए स्क्रिप्ट का उपयोग करता है (यह सीधे व्यवहार को परिभाषित नहीं करता है, मैं अंत में इसके बारे में अधिक बात करूंगा)। स्क्रिप्ट प्रत्येक इकाई बनाने के लिए उपयोग किए जाने वाले वास्तविक घटकों को परिभाषित करते हैं। यह मेरे द्वारा बनाई गई एक सरल स्क्रिप्टिंग भाषा का उपयोग करता है। यहाँ मेरी एक स्क्रिप्ट का सरलीकृत संस्करण है:

ENTITY:"Goblin"
{
    description="It's currently their age."
    commonname="goblin"
    pluralCommonName="goblins"
    childname="gob'in"
    pluralChildName="gob'ins"
    active=Nocturnal
    tags=Mobile
    baseAttributes="OrganicMobileCreature"

    [Model]{
            meshname="Goblin"
            texturename="GoblinTexture"
    }

    [Motion]{
            maxvelocity=0.01:0.015
            locomotion=Walk,Swim
    }

    [Skills]{
            ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
    }

    [Inventory]{
            maxItems=2
            Allow=ALL
            Disallow=NONE
    }
}

इसमें से बहुत कुछ स्वयं का वर्णन है, लेकिन यहाँ कुछ हाइलाइट हैं:

  • पहला खंड इकाई के लिए सामान्य जानकारी का वर्णन करता है। इसमें इकाई के विभिन्न पहलुओं के लिए विवरण और प्रदर्शन नाम शामिल हैं।
  • baseAttributesटैग संदर्भ एक और स्क्रिप्ट फ़ाइल है कि आम घटकों को परिभाषित करता है कि मैं नहीं चाहता कि कई बार फिर से परिभाषित करने के लिए। ऐसा लगता है कि घटक शामिल हैं position, liferequirementsऔर इतने पर। यदि किसी भी घटक को यहां फिर से परिभाषित किया गया है, तो यह घटक आम को अधिलेखित कर देगा।
  • प्रत्येक [NAME] { }सेट एक नया घटक परिभाषित करता है जिसे इन संस्थाओं में जोड़ा जाएगा।
  • यह विवरण केवल एक इकाई के लिए नहीं है , यह बनाए गए सभी goblins के लिए है। आप देखेंगे कि कुछ मानों की श्रेणियाँ (यानी 0.01:0.015) हैं, जब एक नया भूत बनाया जाता है तो यह उस घटक के साथ निर्मित होता है जिसका उस श्रेणी में यादृच्छिक मान होता है। इसलिए प्रत्येक गोबल में थोड़ा अलग कौशल और थोड़ा अलग गति होगी। यह सेटअप परिभाषित करता है कि सभी goblins क्यूब्स और खनन रखने में वास्तव में अच्छे कौशल के साथ शुरू होंगे, जो कि वास्तव में मेरे अपने परीक्षण उद्देश्यों के लिए है। लेकिन जैसा कि मुझे यकीन है कि आप अनुमान लगा सकते हैं, जो कुछ भी मैं चाहता हूं उसे मूल्यों को बदलना बहुत आसान है।

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

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

  • वे कैसे रास्ता खोजते हैं (सरल लाइन-ऑफ-विज़न मूवमेंट, सरल ए *, प्रेडिक्टिव ए *, आदि)
  • वे कितने आक्रामक / रक्षात्मक हैं। संस्थाओं के होम ज़ोन हो सकते हैं जिनका बचाव किया जाएगा, लेकिन शायद उन ज़ोन के बाहर आक्रामक नहीं।
  • प्रौद्योगिकी जागरूकता (खुले दरवाजे, गैजेट का उपयोग करें, जाल से बचें, आदि)
  • और अधिक...

हालाँकि आपका परिभाषित किया गया है, यह आपका सिस्टम है जो उस घटक में डेटा को चलाएगा, जो बदले में आपके प्रवेश के व्यवहार को प्रभावित करता है।


साझा करने के लिए धन्यवाद। मैं वास्तव में सोचता हूं कि मैं XML प्रारूप का उपयोग करके इसे करने की कोशिश कर रहा हूं। मैं उस बारे में बहुत सोचता हूं (एब्सट्रैक्ट बीडब्ल्यूटी के लिए धन्यवाद) और इसे मेरी ज़रूरतों के लिए (कम से कम इकाई विवरण के लिए) पैर चाहिए।
नथन

1
@nathan मैं मानता हूं कि आपको XML के साथ जाना चाहिए। मेरे पोस्ट का कारण अधिक था कि आपके XML में क्या डेटा शामिल किया जाए और इसका उपयोग कैसे किया जाए। डेटा का प्रारूप आपको जो भी पसंद हो सकता है। आप जिस डेटा को शामिल करना चुनते हैं और आप इसके उपयोग को कैसे लागू करते हैं वह कहीं अधिक महत्वपूर्ण है।
MichaelHouse

@ Byte56 मुझे पता है कि यह पोस्ट पुरानी है, लेकिन आप माता-पिता के बच्चे के रिश्तों को कैसे संभाल सकते हैं? मान लीजिए कि हमारे पास एक स्किल ट्री है और आपको A [1] को एनेबल करने के लिए स्किल A [0] में 10 पॉइंट्स और A [2] को इनेबल करने के लिए 10 पॉइंट्स चाहिए, आदि। क्या मुझे ये घोंसले बनाने चाहिए, या इन्हें फाल्ट कर देना चाहिए और a मूल आईडी? जाहिर है कि वे तार्किक रूप से समकक्ष हैं, लेकिन मुझे आशा है कि आपके पास कुछ वास्तविक दुनिया की अंतर्दृष्टि थी।
Superstringcheese

@ सपरस्ट्रिंगीज़ if player.hasPoints(10) then i++ end skillTree[i]कुछ स्यूडोकोड होगा। मुझे पता नहीं है कि यह प्रश्न पोस्ट के लिए प्रासंगिक कैसे है, हालांकि।
JDSweetBeat

4

अगर आपको वास्तव में किसी मॉन्स्टर के घटकों को परिभाषित करने का एक तरीका है, तो XML अच्छी तरह से काम करेगा C # और java दोनों में इसका तेजी से कार्यान्वयन होता है।

आपका xml हो सकता है

<?xml version="1.0" encoding="UTF-8"?>
<mobs>
  <mob>
    <personality>Aggressive</personality>
    <intelligence>20</intelligence>
  </mob>
</mobs>

तब आपका Mob क्लास लग सकता है। (जावा)

public class Mob {
  private IPersonality personality;
  private Integer intelligence

  //**  Getters & Setters **//
}

जहाँ IPersonality एक इंटरफ़ेस है।

फिर आप अपने xml को लोड कर सकते हैं और एक कारखाने के माध्यम से प्रत्येक मान को पार्स कर सकते हैं।

उदाहरण के लिए पर्सनैलिटी वैल्यू पर्सन इन पर्सनैलिटीफैक्ट्री जो कि बस है:

public IPersonality getPersonality(String personalityName) {
  if(personalityName.equals("Aggressive")) {
    return new AggressivePersonality();
  }
  else if(personalityName.equals("Passive")) {
    return new PassivePersonality();
  }
  else {
     //Maybe allow for no personality (We all know monster like that ;) )
     return null; 
  }
}

तब आप इस तरह एक भीड़ को स्थापित कर सकते थे

Mob mob = new Mob();
mob.setPersonality(getPersonality(xmlValue));
mobList.add(mob);

कुंजी यह है कि आप इंजन xml के प्रारूप को जानते हैं और इसकी सभी जरूरतों के लिए एक कारखाना है।

Xml का एक फायदा यह है कि आप यह सुनिश्चित करने के लिए अपने स्वयं के स्कीमा को परिभाषित कर सकते हैं कि प्रारूप हमेशा सही है

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


वास्तव में मुझे खेल विकास प्रक्रिया के खेल पर आसानी से नई इकाई बनाने का एक तरीका खोजने की आवश्यकता है। क्या xml पर्याप्त लचीला होगा? मुझे आंतरिक खेल तर्क के लिए वैसे भी स्क्रिप्टिंग जोड़ने की आवश्यकता होगी।
नथन

यदि आप Mob वर्ग को इकाई के रूप में पढ़ते हैं तो आप XML का उपयोग विभिन्न घटकों (IPersonality, Intelligence [उस भीड़ के लिए डेटा का उदाहरण]) के साथ एक नया Enitity (Mob) बना रहे हैं। और दुर्भाग्य से मैं जवाब नहीं दे सकता अगर यह पर्याप्त रूप से लचीला होगा क्योंकि मुझे नहीं पता कि आप इसके अलावा क्या करना चाहते हैं जो आपने निर्दिष्ट किया है, हालांकि एक्सएमएल एक प्रारूप है जहां केवल सीमाएं हैं कि आप प्रत्येक अनुभाग की व्याख्या कैसे करें। आप एक विस्तृत उदाहरण के साथ प्रश्न को अपडेट करें और मैं एक xml दिखाऊंगा जो इसे संभाल सकता है। आंतरिक खेल तर्क लगता है जैसे यह आंतरिक होना चाहिए?
एब्सट्रैक्टोस

0

अजगर ठीक है मुझे लगता है। यदि आप अपने कार्यक्रमों में स्क्रिप्टिंग क्षमताओं को जोड़ना चाहते हैं, तो अक्सर LUA भी एक अच्छा विकल्प है।

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

यदि आप एक Scriptengine (जैसे LUA) का उपयोग करते हैं, तो आप इस कोड को अपने प्री-कम्पाइल किए गए प्रोग्राम से स्क्रिप्टफ़ाइल्स में स्थानांतरित कर सकते हैं जो रनटाइम के दौरान लोड किए गए हैं। ऐसा करने के लिए आपको अपने "राक्षसों" के एपीआई को स्क्रिप्टेंगाइन के सामने लाना होगा। यह आपको बाहर से राक्षस-गेम कोड के तरीकों को कॉल करने की अनुमति देता है।


मेरे राक्षस का एपीआई? मेरा मतलब है, मुझे स्क्रिप्ट (इंस्टालेशन) से नए घटक बनाने में सक्षम होना पड़ेगा। क्या यह संभव है?
नथन

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

गंभीरता से हो? यह वास्तव में एक बहुत बड़ा फायदा है। इसके अलावा मैं "खेल समय" के लिए LUA (या अन्य पटकथा भाषा) का है। मेरा मतलब है, कुछ सुंदर दृश्यों को बनाने के लिए जहां खिलाड़ी को ब्लॉक करना पड़ता है, इस स्प्राइट को इधर उधर जाना पड़ता है, उधर प्रकाश पड़ता है ... तो शायद मैं भी यूनिट लोडिंग के लिए स्क्रिप्ट भाषा का उपयोग कर सकता हूं? इसके अलावा, मैं एक और सवाल पोस्ट करने जा रहा हूं कि मैं इकाई / घटकों को प्रबंधित करने के लिए अपने वर्तमान तरीके को उजागर करने के लिए क्या मैं "प्रबंधक" कहता हूं यह देखने के लिए कि क्या मैं अच्छा कर रहा हूं।
नथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.