एकता में अद्यतन और फिक्स्डडेट के बीच क्या अंतर है, और मुझे परेशान करना चाहिए?


10

मुझे Update()ग्राफिक्स के लिए और FixedUpdate()भौतिकी के लिए उपयोग करने के लिए कहा गया था , लेकिन कभी-कभी जब मैं उपयोग करता हूं तो मेरे इनपुट पंजीकृत नहीं होंगे FixedUpdate()। यह ठीक काम करता है अगर मैं Update()सब कुछ के लिए उपयोग करें ।

क्या मुझे परेशान करना चाहिए FixedUpdate(), या मैं कुछ गलत कर रहा हूं?

जवाबों:


10

FixedUpdateUpdateअपनी सेटिंग्स के आधार पर तेजी से या धीमी गति से चला सकते हैं। यह लोड पर निर्भर करेगा (आप कितनी तेजी Updateसे चल रहे हैं) और आपके द्वारा निर्धारित गति FixedUpdate(संपादन-> परियोजना सेटिंग्स-> समय में) के लिए। आदर्श रूप से, चूंकि Updateप्रति फ्रेम एक बार चलाया जाता है, यह वह जगह है जहां आप इनपुट पर कब्जा करना चाहते हैं। यदि आपको FixedUpdateविधि में इनपुट पर कार्रवाई करने की आवश्यकता है (जैसे भौतिकी निकायों को नियंत्रित करना), Updateतो झंडे सेट करें फिर उन्हें संभालें FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

यह FixedUpdateविधि से भौतिकी को नियंत्रित करने के लिए अभी भी एक अच्छा विचार है , क्योंकि इसकी संभावना नहीं है कि भौतिकी को अक्सर अद्यतन करने की आवश्यकता होती है, और एक निश्चित अद्यतन पर भौतिकी एक चर अद्यतन पर भौतिकी की तुलना में भविष्यवाणी ( निर्धारक ) करना बहुत आसान है ।


अगर एक बूल स्थिति (es.GetMouseButtonDown) के बजाय हमें एक अक्ष से मूल्य पढ़ने की आवश्यकता है (Input.GetAxis ("क्षैतिज"))? यदि अपडेट को अधिक बार निष्पादित किया जाता है तो फिक्स्डअपडेट करें, उस मामले में आपकी क्या सलाह है? क्या हमें अंततः अपडेट में उपभोग करने से पहले कई अपडेट के दौरान प्राप्त अक्ष के औसत मूल्य की गणना करने पर विचार करना चाहिए? (+1 btw)
हेइसेनबग

मुझे कैसे पता चलेगा कि मेरा फिक्स्डअप कितना तेज़ है?
टोकामोचा

1
@Tokamocha फिक्स्ड अपडेट की दर को एडिट-> प्रोजेक्ट सेटिंग्स-> टाइम में सेट किया गया है।
MichaelHouse

@ हेइसेबग निजी तौर पर मैं केवल अंतिम मूल्य का उपयोग करूंगा और देखूंगा कि यह कितना अच्छा काम करता है। यदि मुझे अप्रत्याशित परिणाम मिलते हैं, तो जब तक यह संसाधित नहीं हो जाता, तब तक मैं अक्ष मूल्य के एक औसत औसत की गणना कर सकता हूं FixedUpdate। यह उन चीजों में से एक है जिन्हें वास्तव में "सही" महसूस करने के लिए कुछ खेल परीक्षण की आवश्यकता है।
MichaelHouse

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

7

आपको यह समझने की आवश्यकता है कि प्रत्येक व्यक्ति क्या करता है। Update()जितनी बार संभव हो उतनी बार कॉल किया जाता है (निश्चित नहीं, शायद यह छाया हुआ हो), किसी भी तरह - प्रत्येक फ्रेम। FixedUpdate()समय की प्रत्येक स्थिर राशि कहलाती है (इसलिए "निश्चित")।

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

एल्थाउथ यह कहने योग्य है कि कुछ अनुप्रयोगों में सभी गेम लॉजिक अपडेट हैं FixedUpdate()(यहां तक ​​कि बाहर भी Unity) - इसे "फिक्स्ड स्टेप गेम लूप" कहा जाता है। एक निश्चित चरण फ़ंक्शन में सभी अपडेट कोड होने से आप नियतत्ववाद प्राप्त करते हैं और आपके ऐप को हर बार (और प्रत्येक डिवाइस पर) उसी तरह व्यवहार करने की अधिक संभावना होती है। कुछ फैंसी सुविधाओं के लिए भी अनुमति देता है, जैसे रिप्ले।


इसलिए, अगर मैं सब कुछ फिक्स्डयूटेट () में रख दूं तो मेरा गेम अभी भी सभी इनपुट्स को पंजीकृत करेगा, है ना?
टोकामोचा

1
नहीं, आप सभी गेम लॉजिक अपडेट डाल सकते हैं लेकिन इनपुट चेकिंग नहीं।
एनपीएस

2
यह उत्तर मिस-जानकारी से भरा है। सबसे पहले सभी फिक्स्डडेट को 1 / फिक्स्डडेलटाइम बार प्रति सेकंड कहा जाता है , हर n: वें फिक्स्डडेलटाइम को नहीं। दूसरा, गेम लॉजिक को हमेशा फिक्स्डयूडेट में जाना चाहिए क्योंकि यह आसान ओ कारण बनाता है। अद्यतन केवल प्रयोजनों के लिए है (मैं जानता हूं कि एकता समुदाय में कोई भी इसका अनुसरण नहीं करता है, लेकिन यह वास्तव में है कि इसे कैसे किया जाना चाहिए)। तीसरा, फिक्स्डयूडेट और भौतिकी इंजन के साथ इसके संबंध का नियतत्ववाद से कोई लेना-देना नहीं है।
thr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.