गेमप्ले की क्रियाओं को विशिष्ट एनीमेशन टाइमिंग में सिंक करने की अच्छी तकनीक?


10

इसलिए मैं खेल में एक ऐसे मुद्दे पर आया हूं जिस पर मैं काम कर रहा हूं, लेकिन यह एक बहुत ही मौलिक चीज है जो शायद बहुत सारे गेम में आता है।

मेरे गेम के लिए आवश्यक है कि कुछ गेमप्ले फंक्शन किसी कैरेक्टर एनिमेशन के दौरान बहुत ही खास समय पर होता है। और इसलिए, जैसा कि शीर्षक कहता है, मैं सोच रहा हूं कि गेमप्ले से संबंधित घटनाओं / कार्यों / कार्यों को एक चरित्र के एनीमेशन में विशिष्ट बिंदुओं को सिंक्रनाइज़ करने के लिए कुछ अच्छी तकनीक और मौलिक रणनीति क्या हैं।

यहाँ विभिन्न प्रकार के खेलों के बारे में कुछ सरल उदाहरण दिए जा रहे हैं:

  • आपका चरित्र एक शूटर में उनकी बंदूक को फिर से लोड करता है । आपका चरित्र उसके / उसके 'पुनः लोड' एनीमेशन को निभाता है, लेकिन यह महत्वपूर्ण है कि फ़ंक्शन जो currentAmmo वैरिएबल सेट करता है, केवल पत्रिका की अदला-बदली होने के बाद सटीक समय पर कॉल किया जाता है और बंदूक को कॉक किया जाता है। यह पुनः लोड एनीमेशन के बीच में कुछ बिंदु हो सकता है।

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

  • एक स्टील्थ गेम में , आपका चरित्र दुनिया में कंप्यूटर और बटन के साथ चुपके और बातचीत कर सकता है। हो सकता है कि एक बटन है जो बिजली की आपूर्ति को चौकी की रोशनी में बंद कर देता है जिसे आप घुसपैठ कर रहे हैं। जब कार्रवाई बटन दबाया जाता है, तो आपका चरित्र बाहर पहुंचता है और बटन को धक्का देता है और फिर अपने निष्क्रिय रुख पर लौटता है। आप चाहते हैं कि बटन 'पुश_बटन' एनीमेशन में सटीक बिंदु पर बंद हो जाए जब बटन अंदर धकेल दिया जाए।

निश्चित रूप से , मेरा विशेष मामला दूसरे उदाहरण की तरह है , जिसमें मैंने एक एनीमेशन बनाया है, जहां एक हमले के दौरान मेरा टर्न-आधारित चरित्र फेफड़े को आगे बढ़ाता है और मैं चाहता हूं कि क्षति को ठीक उसी क्षण लागू किया जाए जिससे एनीमेशन संपर्क बनाता हुआ प्रतीत होता है । क्योंकि मेरा गेम टर्न-आधारित प्रणाली का उपयोग कर रहा है (अंतिम काल्पनिक या अग्नि प्रतीक की तरह कुछ कल्पना करें) मैं क्षति / उपचार / जादू / आदि चाहता हूं। भले ही मैं वास्तव में टकराव / हिटबॉक्स का उपयोग नहीं कर रहा हूं, प्रत्येक चरित्र एनीमेशन के दौरान सही समय पर लागू होने के लिए।

मुझे यह उल्लेख करना चाहिए कि मैं एक लोकप्रिय गेम इंजन में अपना गेम बना रहा हूं, और अभी मैं अपने एनिमेशन इवेंट्स का उपयोग करके इसे संभाल रहा हूं या वांछित परिणामों के करीब कुछ हासिल करने के लिए सूचित करता हूं - मेरा चरित्र एक निश्चित कमांड करता है और एक को ट्रिगर करता है आदेश-विशिष्ट एनीमेशन (यानी: 'attack_command') और मेरे प्रत्येक आदेश के लिए ऐनिमेशन संपत्तियों में मेरे ईवेंट ExecuteCommand फ़ंक्शन में एक एनीमेशन ईवेंट / सूचित 'कॉलबैक' शामिल होना चाहिए। दूसरे शब्दों में - चरित्र हमले के एनीमेशन को खेलने के लिए कहता है, और फिर हमले के एनीमेशन से एक घटना होती है / क्षति के निपटाए जाने पर एनीमेशन के दौरान सटीक क्षण में चरित्र में कॉलबैक को सूचित करता है।

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

तो मैं यहाँ क्या देख रहा हूँ? इस प्रकार की परिस्थितियों को संभालने के लिए कुछ अच्छी सामान्य तकनीकें हैं जिनमें आप कुछ महत्वपूर्ण गेमप्ले क्रियाओं को एनिमेशन के दौरान विशिष्ट समय पर करना चाहते हैं?

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


1
मैं उलझन में हूं। आप कहते हैं कि आप गेमप्ले को एनीमेशन टाइमिंग पर निर्भर करना चाहते हैं, लेकिन फिर कहते हैं कि आप नहीं चाहते कि आपका गेमप्ले आपकी संपत्ति पर निर्भर हो, और एनिमेशन एक प्रकार की संपत्ति हैं। आप उन इच्छाओं के अनुकूल होने की उम्मीद कैसे करते हैं?
एको

मैं कुछ गेमप्ले तत्वों को एनीमेशन के साथ सिंक्रनाइज़ करना चाहता हूं। हालाँकि, दो चीजों के बीच तालमेल हमेशा एक निर्भरता नहीं है, है ना? मुझे कुछ तकनीकों में दिलचस्पी है जो लोग अपने एनिमेशन को अपने गेमप्ले के साथ सिंक्रनाइज़ करने के लिए उपयोग करते हैं। मैंने कहा कि मैंने क्या हासिल किया है और मैं इसे हासिल करने के लिए वर्तमान में क्या कर रहा हूं - और इसलिए मेरा सवाल है, क्या एक अलग / बेहतर / वैकल्पिक तकनीक है जिसे कोई भी उपयोग कर सकता है या यह है (एनीमेशन घटनाओं / सूचित / कॉलबैक में बेक किया गया है) संपत्ति) मानक तरीका? क्या आप अपनी परियोजनाओं में इसका उपयोग करते हैं?
MrKatSwordfish

जवाबों:


5

सिंक्रोनाइज़ेशन के लिए, आपको यह तय करने की आवश्यकता है कि कौन (आपका कोड, एनिमेशन, या न ही) टाइमिंग अथॉरिटी है- "बीट" जो बाकी सभी "नाचते हैं"।

अलग व्यवस्था अलग खेल के अनुरूप है:

  • एनिमेशन टाइमिंग अथॉरिटी हैं (आपका वर्तमान सेटअप)

    गेम कोड एनिमेशन को ट्रिगर कर सकता है। जब एनिमेशन कुछ बिंदुओं तक पहुंचते हैं, तो वे घटनाओं को बढ़ाते हैं (उदाहरण के लिए पुनः लोड किया जाता है) जो गेम कोड पर प्रतिक्रिया कर सकता है (उदाहरण के लिए उपलब्ध बारूद रीसेट करें)।

    यदि एनिमेशन का सटीक समय (स्वतंत्र रूप से गेम स्टेट) आपके खेल का एक महत्वपूर्ण हिस्सा है, या आप विशेष रूप से अपने एनिमेटरों को समय को नियंत्रित करना चाहते हैं, तो इस दृष्टिकोण पर विचार करें।

    एनिमेशन उपकरण ब्लेंडर (3 डी) और स्पाइन (2 डी) एनिमेटर को उन घटनाओं को परिभाषित करने की अनुमति देते हैं जो गेम कोड की सदस्यता ले सकते हैं।

  • कोड टाइमिंग अथॉरिटी है

    उपरोक्त का उलटा: खेल की दुनिया में होने वाली घटनाओं (जैसे कि खिलाड़ी अपने हथियार को फिर से लोड करने के लिए चुनते हैं) के कारण एनिमेशन चलते हैं और पैरामीटर पारित किए जाते हैं (उदाहरण के लिए जब तक रील को समाप्त नहीं किया जाना चाहिए)। प्रत्येक एनीमेशन आपूर्ति किए गए मापदंडों को संशोधित करने के लिए उपयोग करता है कि यह कैसा दिखता है (उदाहरण के लिए एक उपयुक्त गति से एनीमेशन चलाना जैसे कि "पुनः लोड किया गया भाग" उस निर्दिष्ट के रूप में होता है)।

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

    यदि आपके एनिमेशन समय के बारे में लचीले होने का जोखिम उठा सकते हैं, तो आपका खेल प्रक्रियात्मक रूप से उत्पन्न सामग्री पर बहुत निर्भर करता है, या आप विशेष रूप से अपने प्रोग्रामर को समय को नियंत्रित करना चाहते हैं, इस दृष्टिकोण पर विचार करें।

    अतिवृद्धि के चरित्र एनिमेशन को काफी हद तक इस तरह से संरचित किया गया है: डेविड रोसेन ने अपने जीडीसी 14 चर्चा (विशेष रूप से आंदोलन और आंदोलन निरंतर क्षेत्रों को देखें) में इसे समझाया है

  • अंतर्निहित समय (बाहरी प्राधिकरण)

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

    यदि आपका गेम स्टेट और एनिमेशन काफी हद तक बाहरी टाइमिंग अथॉरिटी पर निर्भर हैं, तो इस दृष्टिकोण पर विचार करें।

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


0

मैंने कहीं पढ़ा है कि लगभग सभी गणना समस्याओं को एक अतिरिक्त अमूर्त परत के साथ हल किया जा सकता है, और मैं आपके मामले को अलग नहीं देखता।

इस आवश्यकता के लिए मैं आमतौर पर चरित्र की स्थिति को नियंत्रित करने के लिए एक परत देखता हूं। इस तरह चरित्र में एक वर्तमान एनीमेशन और एक वर्तमान स्थिति होगी। हर एक अपनी जिम्मेदारी के साथ।

एनीमेशन केवल दृश्य के लिए जिम्मेदार है, और राज्य उस कार्रवाई के लिए खेल विशिष्ट तर्क को संभालता है।

मेरी लड़ाई के खेल में, राज्य एक ऑब्जेक्ट है जो बेसस्टेट क्लास से विरासत में मिला है और इसमें अपडेट () विधि है। प्रत्येक वर्ण में राज्यों का संग्रह है, लेकिन एक समय में केवल एक को सौंपा जा सकता है। और वर्तमान स्थिति के अद्यतन () विधि को प्रति फ्रेम एक बार कहा जाता है।

यह उस राज्य के अपडेट () के अंदर है जहां मैं वह सभी तर्क करता हूं: एक विशिष्ट फ्रेम, वेतन वृद्धि / वृद्धि स्वास्थ्य आदि पर चरित्र का वेग निर्धारित करें।

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