Cave: शुरुआत गाइड

Back to Learn

Keep your place in this quest

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

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

यही वह स्थान है जहाँ State Machines उपयोगी हो जाते हैं।

image.png

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

एक स्टेट मशीन आपको व्यवहार को स्पष्ट अवस्थाओं में व्यवस्थित करने में मदद करती है, न कि एक बड़े स्क्रिप्ट में अप्रासंगिक स्थितियों से भरी हुई है।

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

  • State क्या है।
  • Transition क्या है।
  • क्यों हाइरार्किकल स्टेट मशीनें उपयोगी हैं।
  • Cave के State Machine Component का एक Entity में कैसे फिट बैठता है।
  • On Enter, On Update, और On Exit कैसे काम करते हैं।
  • कैसे Python और Logic Bricks का उपयोग स्टेट्स और ट्रांजिशन्स के अंदर किया जा सकता है।

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

State क्या है?

एक state यह वर्णन करती है कि एक ऑब्जेक्ट वर्तमान में क्या कर रहा है।

image.png

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

  • Idle
  • Patrol
  • Chase
  • Attack
  • Dead

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

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

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

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

Transition क्या है?

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

image.png

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

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

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

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

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

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

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

Alive
    Idle
    Patrol
    Chase
    Attack
Dead

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

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

State Machine Component

एक दृश्य में स्टेट मशीन का उपयोग करने के लिए, एक एंटिटी को एक State Machine Component की आवश्यकता होती है।

यह घटक एंटिटी को एक State Machine संपत्ति से जोड़ता है। संपत्ति राज्यों, संक्रमणों और तर्क को परिभाषित करती है, जबकि घटक गेमप्ले के दौरान उस तर्क को एंटिटी पर चलाता है।

यह अन्य Cave सिस्टम के समान है:

संपत्ति घटक
Python Script Python Component इसे चलाता है।
Animation Animation Component इसे चलाता है।
State Machine State Machine Component इसे चलाता है।

व्यवहार में, इसका मतलब है कि आपका दुश्मन एंटिटी एक State Machine Component हो सकता है, और वह घटक एक दुश्मन एआई स्टेट मशीन चला सकता है।

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

State Events

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

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

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

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

यह प्रत्येक स्थिति को एक छोटे आत्म-नियंत्रित व्यवहार की तरह महसूस कराता है।

States के अंदर Python

State मशीनें तर्क के लिए Python का उपयोग कर सकती हैं।

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

उदाहरण के लिए, एक स्थिति प्रवेश करते समय एक ध्वनि चला सकती है:

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

या यह एंटिटी से एक संपत्ति पढ़ सकती है:

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

यह स्थिति तर्क को उस व्यवहार के करीब रखता है जिस पर यह संबंधित है।

ट्रांजिशन्स के अंदर Python

ट्रांजिशन्स भी Python का उपयोग कर सकते हैं। ट्रांजिशन Python तर्क के लिए, 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

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

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

लॉजिक ब्रिक्स के अंदर State Machines

State machines भी Logic Bricks का उपयोग कर सकते हैं।

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

वे ठीक उसी तरह काम करते हैं जैसे उपयुक्तता में ऊपर Python कोड के लिए या एक ट्रांजिशन के लिए समझाया गया। स्थिति के Logic Bricks और ट्रांजिशन के Logic Bricks पहले से ही उन ब्रिक्स के साथ प्रारंभिक होते हैं जिन्हें शुरू करने के लिए आपको आवश्यकता होती है।

आप व्यवहार को बनाने के लिए जो स्पष्ट लगता है उसके आधार पर Python और Logic Bricks को मिलाकर उपयोग कर सकते हैं। यदि एक स्थिति या ट्रांजिशन दोनों है, तो दोनों कार्यान्वित किए जाएंगे और संक्रमण तब होगा जब एक या दूसरा हो।

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

एक स्टेट मशीन का उपयोग करें जब एक ऑब्जेक्ट के व्यवहार के स्पष्ट मोड होते हैं।

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

  • दुश्मन एआई।
  • बॉस चरण।
  • दरवाजे और इंटरैक्टेबल ऑब्जेक्ट्स।
  • मिशन या क्वेस्ट प्रवाह।
  • कटसीन प्रगति।
  • कैरेक्टर क्षमता स्थिति।

आपको बहुत छोटे एक-एक क्रिया वाले ऑब्जेक्ट्स के लिए स्टेट मशीन की आवश्यकता नहीं हो सकती है। यदि एक पिकअप केवल एक ध्वनि चलाता है और गायब हो जाता है, तो एक छोटा Python स्क्रिप्ट या Logic Brick सेटअप पर्याप्त हो सकता है।

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

एक स्टेट मशीन गेमप्ले को राज्यों और संक्रमणों में व्यवस्थित करती है।

राज्य वर्तमान में क्या हो रहा है, इसे वर्णित करता है। ट्रांजिशन यह तय करते हैं कि कब कुछ और में स्विच करना है। On Enter, On Update, और On Exit प्रत्येक स्थिति को केंद्रित और पढ़ने योग्य बनाते हैं।

सरल व्यवहार के लिए, एक स्क्रिप्ट पर्याप्त हो सकती है। एक से अधिक मोड वाले व्यवहार के लिए, एक स्टेट मशीन आमतौर पर तर्क को समझने में आसान और विस्तार करने में आसान बनाती है।