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.
जैसे-जैसे आपका गेमप्ले बढ़ता है, आपको अंततः ऐसे ऑब्जेक्ट्स की आवश्यकता होगी जो इस बात पर निर्भर करते हुए अलग-अलग व्यवहार करें कि वे वर्तमान में क्या कर रहे हैं। एक दुश्मन निष्क्रिय, गश्त, पीछा करने, हमला करने, Stunning, या मृत हो सकता है। एक दरवाजा बंद, खुलने वाला, खुला, या बंद हो सकता है। एक बॉस लड़ाई कई चरणों के माध्यम से चली जा सकती है।
यही वह स्थान है जहाँ State Machines उपयोगी हो जाते हैं।

उपरोक्त चित्र में, आप देख सकते हैं कि 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 यह वर्णन करती है कि एक ऑब्जेक्ट वर्तमान में क्या कर रहा है।

उदाहरण के लिए, एक दुश्मन के ये राज्य हो सकते हैं:
IdlePatrolChaseAttackDead
सामान्यतः इन राज्यों में से केवल एक को ही दुश्मन पर नियंत्रण रखना चाहिए। यदि दुश्मन Patrol में है, तो उसे हमला करने का व्यवहार चलाना चाहिए। यदि यह Dead में है, तो इसे खिलाड़ी का पीछा नहीं करना चाहिए।
यह गेमप्ले को अच्छा समझने में मदद करता है क्योंकि प्रत्येक स्थिति का एक स्पष्ट काम होता है।
| State | यह क्या कर सकता है |
|---|---|
Idle |
स्थिर खड़ा रहना और इंतज़ार करना। |
Patrol |
बिंदुओं के बीच चलना। |
Chase |
खिलाड़ी की ओर बढ़ना। |
Attack |
एक हमला एनिमेशन चलाना और नुकसान पहुंचाना। |
Dead |
आंदोलन बंद करना और एक मृत्यु एनिमेशन चलाना। |
एक बड़े स्क्रिप्ट से यह पूछने के बजाय "इस फ्रेम में दुश्मन को क्या करना चाहिए?", आप पूछ सकते हैं "दुश्मन वर्तमान में किस स्थिति में है?"
Transition क्या है?
एक transition वह नियम है जो स्टेट मशीन को एक स्थिति से दूसरी स्थिति में ले जाता है।

उदाहरण के लिए:
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 प्रत्येक स्थिति को केंद्रित और पढ़ने योग्य बनाते हैं।
सरल व्यवहार के लिए, एक स्क्रिप्ट पर्याप्त हो सकती है। एक से अधिक मोड वाले व्यवहार के लिए, एक स्टेट मशीन आमतौर पर तर्क को समझने में आसान और विस्तार करने में आसान बनाती है।