Cave: शुरूआती मार्गदर्शिका

Back to Learn

Cave: परिचय मार्गदर्शिका

Lesson 17 of 19 • 25 XP

Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

जैसे-जैसे आपका गेमप्ले बढ़ता है, आपको अंततः ऐसी वस्तुओं की ज़रूरत होगी जो कि इस पर निर्भर करके अलग-अलग व्यवहार करें कि वे वर्तमान में क्या कर रही हैं। एक दुश्मन शांत, पेट्रोलिंग, पीछा करने, हमला करने, स्टनिंग में या मृत हो सकता है। एक दरवाज़ा बंद, खुल रहा, खुला या ताला लगा हो सकता है। एक बॉस लड़ाई कई चरणों में चल सकती है।

यहां State Machines काम आती हैं।

image.png

ऊपर की छवि में, आप देख सकते हैं कि Crave द्वारा नए प्रोजेक्ट के लिए बनाया गया डिफ़ॉल्ट दुश्मन और उसका State Machine दाईं ओर खुला हुआ है। हम "wander" स्थिति के अंदर हैं जिसमें आंतरिक अवस्थाएं हैं, जैसे "random selector" (प्रारंभिक स्थिति, हरे रंग से प्रदर्शित), "go to random" और "idle"। आप अवस्थाओं के बीच संक्रमण तीरों के द्वारा देख सकते हैं, और हर स्थिति की अपनी लॉजिक हो सकती है, जो या तो पायथन में होती है, जैसा छवि में दिखाया गया है, या लॉजिक ब्रिक्स में।

एक state machine आपको व्यवहार को स्पष्ट अवस्थाओं में व्यवस्थित करने में मदद करता है बजाय एक बड़ी स्क्रिप्ट लिखने के जिसमें असंबंधित कंडीशन्स भरे हों।

इस पाठ में, आप सीखेंगे:

  • एक State क्या है।
  • एक Transition क्या है।
  • हायरार्चिकल स्टेट मशीन क्यों उपयोगी हैं।
  • Cave के State Machine Component का entity में कैसे उपयोग होता है।
  • On Enter, On Update, और On Exit कैसे काम करते हैं।
  • पायथन और लॉजिक ब्रिक्स का स्थिति और संक्रमण के अंदर उपयोग।

लक्ष्य पहले मानसिक मॉडल को समझना है। जब वह समझ में आ जाए, तो संपादक (editor) उपयोग करना बहुत आसान हो जाता है।

एक State क्या है?

एक state यह बताती है कि कोई वस्तु वर्तमान में क्या कर रही है।

image.png

उदाहरण के लिए, एक दुश्मन की ये अवस्थाएं हो सकती हैं:

  • Idle
  • Patrol
  • Chase
  • Attack
  • Dead

अक्सर इनमें से केवल एक स्थिति दुश्मन को नियंत्रित करती है। यदि दुश्मन Patrol में है, तो वह हमला करने वाला व्यवहार नहीं कर रहा होगा। यदि वह Dead में है, तो उसे खिलाड़ी का पीछा नहीं करना चाहिए।

इससे गेमप्ले को समझना आसान होता है क्योंकि प्रत्येक स्थिति का एक स्पष्ट काम होता है।

स्थिति यह क्या कर सकती है
Idle स्थिर खड़ा होना और इंतजार करना।
Patrol बिंदुओं के बीच चलना।
Chase खिलाड़ी की ओर बढ़ना।
Attack हमला एनिमेशन चलाना और नुकसान पहुंचाना।
Dead गति को अक्षम करना और मृत्यु की एनिमेशन चलाना।

"इस फ्रेम में दुश्मन को क्या करना चाहिए?" पूछने के बजाय, आप पूछ सकते हैं "दुश्मन वर्तमान में किस स्थिति में है?"

एक Transition क्या है?

एक transition नियम है जो state machine को एक स्थिति से दूसरी स्थिति में ले जाता है।

image.png

उदाहरण के लिए:

  • दुश्मन को हिलना शुरू करना चाहिए तो Idle से Patrol पर जाना, एक टाइमर के बाद।
  • यदि खिलाड़ी पता चलता है तो Patrol से Chase पर जाना।
  • यदि दुश्मन पर्याप्त पास है तो Chase से Attack पर जाना।
  • हमला खत्म होने पर Attack से Chase पर जाना।
  • जीवन खत्म होने पर किसी भी स्थिति से Dead पर जाना।

ट्रांज़िशन खुद व्यवहार नहीं है। यह निर्णय है जो कहता है, "अब हमें स्थिति बदलनी चाहिए।"

यह अलगाव महत्वपूर्ण है। Attack स्थिति हमला करने पर केंद्रित होती है, जबकि संक्रमण यह तय करता है कि कब उस स्थिति में आना या छोड़ना है।

हायरार्चिकल स्टेट मशीन क्यों मददगार हैं

Cave हायरार्चिकल स्टेट मशीन दृष्टिकोण का उपयोग करता है। इसका अर्थ है कि अवस्थाएं अन्य अवस्थाओं के अंदर व्यवस्थित हो सकती हैं। यह उपयोगी है क्योंकि कई व्यवहार सामान्य पैरेंट आइडिया साझा करते हैं।

उदाहरण के लिए, एक दुश्मन को इस तरह व्यवस्थित किया जा सकता है:

Alive
    Idle
    Patrol
    Chase
    Attack
Dead

Idle, Patrol, Chase, और Attack सभी व्यापक Alive स्थिति के अंतर्गत आते हैं। यह संरचना को समझना आसान बनाता है और आपको कई जगहों पर एक ही लॉजिक दोहराने से बचा सकता है।

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

State Machine Component

किसी दृश्य में State Machine का उपयोग करने के लिए, एक entity को State Machine Component चाहिए।

यह कंपोनेंट entity को एक State Machine asset से जोड़ता है। asset अवस्थाएं, संक्रमण और लॉजिक निर्धारित करता है, जबकि कंपोनेंट गेमप्ले के दौरान उस लॉजिक को entity पर चलाता है।

यह अन्य Cave प्रणालियों के समान है:

Asset Component
Python Script Python Component इसे चलाता है।
Animation Animation Component इसे चलाता है।
State Machine State Machine Component इसे चलाता है।

असल में, इसका मतलब है कि आपके दुश्मन entity में एक State Machine Component हो सकता है, और वह कंपोनेंट दुश्मन AI के state machine को चला सकता है।

एक state machine asset में प्रॉपर्टीज हो सकती हैं, जिन्हें आप properties टैब में देख सकते हैं, और ये प्रॉपर्टीज स्थानीय रूप से state machine component में बदली जा सकती हैं, जिससे आप विभिन्न entity प्रकारों के लिए अलग-अलग सेटिंग्स वाले मॉड्यूलर state machines बना सकते हैं।

State Events

प्रत्येक स्थिति तीन महत्वपूर्ण क्षणों पर प्रतिक्रिया दे सकती है:

इवेंट कब चलता है सामान्य उपयोग
On Enter जब स्थिति शुरू होती है। टाइमर रीसेट करना, वेरिएबल्स इनिशियलाइज़ करना, एनिमेशन चलाना, टारगेट चुनना।
On Update जबकि स्थिति सक्रिय है। चलना, दूरी चेक करना, टाइमर अपडेट करना।
On Exit जब स्थिति छोड़ रहे हैं। प्रभाव रोकना, अस्थायी मान साफ़ करना।

उदाहरण के लिए, Attack स्थिति इस तरह काम कर सकती है:

  • On Enter: हमला एनिमेशन चलाएं।
  • On Update: हिट क्षण या एनिमेशन कॉलबैक का इंतजार करें।
  • On Exit: हमला फ्लैग साफ़ करें।

यह प्रत्येक स्थिति को एक छोटा, स्व-निहित व्यवहार बनाता है।

पायथन स्थितियों के अंदर

State machines लॉजिक के लिए पायथन का उपयोग कर सकते हैं।

प्रत्येक स्थिति के पायथन कोड के अंदर, Cave उपयोगी वेरिएबल्स जैसे entity और scene प्रदान करता है, ताकि स्थिति उस entity को नियंत्रित कर सके जिसके पास State Machine Component है।

उदाहरण के लिए, कोई स्थिति प्रवेश पर एक आवाज़ चला सकती है:

cave.playSound("Enemy Alert", volume=0.8)

या entity से कोई प्रॉपर्टी पढ़ सकती है:

health = entity.properties.get("health", 100)

यह स्थिति के लॉजिक को व्यवहार के करीब रखता है।

पायथन संक्रमण के अंदर

Transitions भी पायथन का उपयोग कर सकते हैं। ट्रांज़िशन पायथन लॉजिक के लिए, Cave एक वेरिएबल result का उपयोग करता है। यदि result True होता है, तो ट्रांज़िशन हो सकता है। उदाहरण के लिए, Dead स्थिति के लिए संक्रमण स्वास्थ्य इस तरह जांच सकता है:

health = entity.properties.get("health", 100)
result = health <= 0

Chase से Attack तक संक्रमण, अगर आपके दुश्मन स्क्रिप्ट या प्रॉपर्टीज वह मान प्रदान करती हैं, दूरी ऐसे जांच सकता है:

player = scene.get("Player")
playerPos = player.getTransform().getWorldPosition()
entityPos = entity.getTransform().getWorldPosition()

distanceToPlayer = (playerPos - entityPos).length()
result = distanceToPlayer < 2.0

सटीक डेटा आपके खेल पर निर्भर करता है, लेकिन विचार हमेशा समान रहता है: संक्रमण तय करता है कि कब एक स्थिति से दूसरी स्थिति में जाना है।

परामर्श: संक्रमण के दौरान, उस स्थिति के स्थानीय सभी वेरिएबल्स जिनसे संक्रमण आ रहा है, उपलब्ध होते हैं। इसलिए पिछला उदाहरण जहां हमने entity और player के बीच दूरी मापी, हम उन ट्रांसफॉर्म्स को ऑन-एंटर स्थिति में स्टोर कर सकते हैं ताकि हर फ्रेम डेटा प्राप्त करने का खर्च बचाया जा सके।

State Machines के अंदर Logic Bricks

State machines लॉजिक ब्रिक्स का भी इस्तेमाल कर सकते हैं।

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

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

आप पायथन और लॉजिक ब्रिक्स को मिलाकर उपयोग कर सकते हैं, इस पर निर्भर करता है कि आप जो व्यवहार बना रहे हैं उसमें क्या स्पष्ट लगता है। यदि किसी स्थिति या संक्रमण के पास दोनों हैं, तो दोनों निष्पादित होंगे और संक्रमण तब होगा यदि कोई भी एक हो जाए।

कब State Machine का उपयोग करें

जब किसी वस्तु के स्पष्ट व्यवहार के मोड हों, तब state machine का उपयोग करें।

अच्छे उदाहरणों में शामिल हैं:

  • Enemy AI।
  • बॉस चरण।
  • दरवाज़े और इंटरैक्टेबल वस्तुएं।
  • मिशन या क्वेस्ट फ्लो।
  • कटसीन प्रगति।
  • पात्र की क्षमता की अवस्थाएं।

आपको छोटे एक-एक्शन वाले ऑब्जेक्ट के लिए state machine की ज़रूरत नहीं हो सकती। अगर एक पिकअप सिर्फ़ एक आवाज़ चलाता है और गायब हो जाता है, तो एक छोटा पायथन स्क्रिप्ट या लॉजिक ब्रिक्स सेटअप पर्याप्त हो सकता है।

आपको क्या याद रखना चाहिए

एक state machine गेमप्ले को अवस्थाओं और संक्रमणों में व्यवस्थित करता है।

अवस्थाएं बताती हैं कि वर्तमान में क्या हो रहा है। संक्रमण यह तय करते हैं कि कब कुछ और पर स्विच करना है। On Enter, On Update, और On Exit प्रत्येक स्थिति को केंद्रित और पठनीय बनाने में मदद करते हैं।

सरल व्यवहार के लिए, एक स्क्रिप्ट पर्याप्त हो सकता है। कई मोड वाले व्यवहार के लिए, एक state machine आमतौर पर लॉजिक को समझना और विस्तारित करना आसान बनाता है।