क्या एकता के पास टाइमलाइन के लिए मौजूदा समर्थन है?


13

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

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

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

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


मैंने भी इसी तरह की टाइमलाइन कक्षाओं का इस्तेमाल किया है (उनका भी यही नाम था)। पैटर्न के लिए एक अधिक सामान्य नाम मेरे लिए अज्ञात है, लेकिन इसे अक्सर कार्यात्मक-प्रतिक्रियाशील प्रोग्रामिंग, कॉरआउट या अन्य अतुल्यकालिक अवधारणाओं के माध्यम से लागू किया जाता है।
इंटरफैक्स

जवाबों:


10

हालांकि यह कार्यक्षमता यूनिटी में उपलब्ध नहीं है, लेकिन इस तरह की टाइमलाइन का एक बुनियादी कार्यान्वयन बहुत कठिन नहीं होना चाहिए।

यहां बताया गया है कि मैं इसके बारे में कैसे जाऊंगा:

  • आपका टाइमलाइन वर्ग आंतरिक रूप से घटनाओं को संग्रहीत करने के लिए डेटा-संरचना के रूप में प्राथमिकता-कतार का उपयोग करता है ।
  • एक घटना बस एक समय और एक कॉलबैक हो सकती है। : तो समय को जोड़ने की घटनाओं के रूप में सरल रूप में किया जाएगा timeline.AddEvent(0.25f, MyCallback)
  • प्रत्येक के साथ Update, समयरेखा वर्ग होगा:

    1. floatबीते हुए समय द्वारा प्लेहेड (एक सरल ) बढ़ाएँ
    2. प्राथमिकता कतार के प्रमुख की जांच करें और उन सभी घटनाओं के कॉलबैक को हटा दें और प्राथमिकता है (जैसे समय) वर्तमान प्लेहेड से छोटा या बराबर।

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

फिर एरे से आइटम हटाने के बजाय, आप वर्तमान एरे-इंडेक्स का ट्रैक रखेंगे , और हर अपडेट के साथ उस इंडेक्स से आगे की तलाश करेंगे और इंडेक्स को Playhead >= Timeबढ़ाते हुए सभी कॉलबैक भी निष्पादित करेंगे ।

तेजी से प्लेबैक गति को लागू करना दोनों कार्यान्वयन के साथ काम करता है और यह उतना ही सरल होगा:

Playhead += Time.deltaTime * playbackSpeed

2
"बीते हुए समय द्वारा प्लेहेड (एक साधारण फ्लोट) बढ़ाना" - यदि आप ऐसा करते हैं तो आपको एकत्रित फ्लोटिंग-पॉइंट त्रुटियां मिलेंगी। आपको इसके बजाय Time.time (खेल शुरू होने के बाद का समय) का उपयोग करना चाहिए ।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

4

नहीं, Unity3D के पास बॉक्स से बाहर ऐसी API नहीं है।

यह कोरटाइन का समर्थन करता है, हालांकि, और मेरा सुझाव है कि आप उन पर गौर करें। कॉरटुइन्स आमतौर पर शेड्यूलिंग और सिंकिंग घटनाओं को वास्तव में आसान बनाते हैं।


1

मुझे यकीन नहीं है कि यह 2012 में जवाब के बाद से नया है, लेकिन एकता वास्तव में (लिगेसी) एनीमेशन संपादक के माध्यम से समय पर नियंत्रण के लिए समर्थन करती है ।

यद्यपि यह सुविधा मुख्य रूप से घटता के साथ ऑब्जेक्ट पैरामीटर को एनिमेट करने के लिए है, इसमें एनिमेशन इवेंट्स पर स्क्रिप्ट को ट्रिगर करने की क्षमता शामिल है । ये स्क्रिप्ट आपके ग्राफिक्स और ऑडियो को चला सकती हैं।

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