मैं इसे एक टिप्पणी के रूप में लिखने जा रहा था, लेकिन यह लंबे समय तक समाप्त हो रहा था इसलिए मैंने इसे एक उत्तर में बदल दिया है।
वर्तमान उत्तर ज्यादातर सही हैं, लेकिन कुछ बातों का उल्लेख गलत / गलत है।
सामान्य तौर पर, अधिकांश गेम-प्ले संबंधित कार्य अंदर जाएंगे Update
।
उदाहरण के लिए, आप इनपुट के लिए मतदान नहीं करना चाहते FixedUpdate
(प्रदर्शन के कारण नहीं, बल्कि इसलिए कि कॉल केवल सही तरीके से काम नहीं करेंगे)। एआई उसी नाव में गिरता है।
निरंतर अद्यतन भौतिकी एकमात्र गेमप्ले से संबंधित कार्य है FixedUpdate
जिसका उपयोग किया जाना चाहिए। गैर-निरंतर / एक बार में चीजों को कॉल करना जैसे कि Physics.Raycast
, या यहां तक Rigidbody.AddForce
कि अंदर भी Update
। मेरा उल्लेख इस बात के Rigidbody.AddForce
विपरीत है कि दस्तावेज़ीकरण द्वारा क्या निहित हो सकता है, लेकिन कुंजी निरंतर बनाम गैर-निरंतर है।
एक बहुत बड़ा कारण केवल निरंतर भौतिकी FixedUpdate
का वास्तविक स्वरूप है FixedUpdate
। अन्य उत्तरों में उल्लेख किया गया है कि फिक्स्डयूडेट को एक निश्चित interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
/ Time.fixedDeltaTime
* पर कैसे कॉल किया जाता है, जो कॉल के बीच वास्तविक समय से सीधे मेल नहीं खाता है, बल्कि कॉल के बीच सिम्युलेटेड समय।
(* Time.deltaTime
और Time.fixedDeltaTime
समान मूल्य हैं जब में कहा जाता है FixedUpdate
[एकता यह बताने में सक्षम है कि क्या वर्तमान कॉल के Time.deltaTime
दौरान FixedUpdate
और रिटर्न की उत्पत्ति होती है Time.fixedDeltaTime
])
स्वाभाविक रूप से एक ही Update
तरीके को अलग-अलग प्रदर्शन के कारण निरंतर तरीके से नहीं बुलाया जा सकता है, न ही कर सकते हैं FixedUpdate
। मुख्य अंतर यह है कि, प्रत्येक फ्रेम, यदि FixedUpdate
कॉल के बीच सही अंतराल को औसत करने के लिए अक्सर पर्याप्त नहीं कहा जा रहा है, तो इसे कई बार कहा जाता है (या औसत नहीं कहा जाता है) बहुत अधिक है। निष्पादन आदेश पर यह डॉक्स यह कहते हुए संदर्भित करता है कि फिक्स्डयूडेट को कई बार फ्रेम कहा जा सकता है:
... FixedUpdate: FixedUpdate को अक्सर अद्यतन से अधिक बार कहा जाता है। इसे फ्रेम प्रति कई बार कहा जा सकता है, यदि फ्रेम दर कम है और फ्रेम फ्रेम बहुत अधिक है तो इसे फ्रेम के बीच नहीं कहा जा सकता है ...
यह बाकी निष्पादन क्रम और इंजन की प्रकृति के कारण भौतिकी को प्रभावित नहीं करता है, लेकिन आपके द्वारा डाली गई किसी भी चीज़ के बारे में बस FixedUpdate
प्रभावित होगा, और यह मुद्दों का कारण होगा।
उदाहरण के लिए, यदि आप AI प्रसंस्करण को अंदर रखते हैं, तो FixedUpdate
यह मानने का कोई कारण नहीं है कि AI पंक्ति में कई फ़्रेमों के लिए अपडेट को छोड़ देगा। इसके अतिरिक्त, हर बार `फिक्स्डअपडेट पीछे छूट जाता है, आपके एआई को एक ही फ्रेम में कई बार अपडेट किया जाएगा, इससे पहले कि फिजिक्स और प्लेयर इनपुट / मूवमेंट जैसी चीज़ों को प्रोसेस किया जाता है, जो बहुत कम से कम प्रोसेसिंग की बर्बादी है, लेकिन यह भी बहुत मुश्किल होने की संभावना है बग और अनिश्चित व्यवहार को ट्रैक करने के लिए।
यदि आपको एक निश्चित अंतराल पर कुछ करने की आवश्यकता है तो अन्य तरीके जैसे एकता प्रदान करता है Coroutines
और उपयोग करता है InvokeRepeating
।
और एक छोटे नोट पर Time.deltaTime
और इसका उपयोग कब करना है:
Time.deltaTime के प्रभाव का वर्णन करने का सबसे आसान तरीका यह है कि यह इकाई प्रति फ्रेम से संख्या, इकाई प्रति सेकंड बदल जाती है । उदाहरण के लिए, यदि आपके पास transform.Translate(Vector3.up * 5)
अपडेट जैसी कोई स्क्रिप्ट है, तो आप अनिवार्य रूप से 5 मीटर प्रति फ्रेम की दर से परिवर्तन को आगे बढ़ा रहे हैं । इसका मतलब है कि अगर फ्रैमरेट कम है तो मूवमेंट धीमा है, और अगर फ्रैमरेट ज्यादा है, तो मूवमेंट तेज है।
यदि आप उसी कोड को लेते हैं और इसे बदल देते हैं transform.Translate(Vector3.up * 5 * Time.deltaTime)
, तो ऑब्जेक्ट को 5 मीटर प्रति सेकंड की दर से स्थानांतरित किया जा रहा है । इसका मतलब यह है कि कोई फर्क नहीं पड़ता है, वस्तु हर सेकंड 5 मीटर आगे बढ़ जाएगी (लेकिन फ्रैमर्ट को धीमा कर देगा, कूदनेवाला ऑब्जेक्ट की गति दिखाई देगा क्योंकि यह अभी भी उसी राशि को हर X सेकंड में स्थानांतरित करता है)
सामान्य तौर पर, आप चाहते हैं कि आपका आंदोलन प्रति सेकंड हो। इस तरह से कोई फर्क नहीं पड़ता कि कंप्यूटर किस गति से चल रहा है, आपका भौतिकी / आंदोलन उसी तरह का व्यवहार करेगा, और आपके पास धीमे उपकरणों पर पॉपिंग अजीब कीड़े नहीं होंगे।
और इसका उपयोग करने का कोई मतलब नहीं है FixedUpdate
। जैसा कि मैंने ऊपर उल्लेख किया है, आपको प्रत्येक कॉल (फिक्स्ड अपडेट टाइमस्टेप मान) के समान मूल्य मिलेगा, और यह आपके मूल्यों के लिए कुछ भी नहीं करेगा। आंदोलन / भौतिकी FixedUpdate
को पहले से ही प्रति सेकंड इकाइयों में होने जा रहा है, इसलिए आपको इसकी आवश्यकता नहीं है।