विलंबित माउस इनपुट कैसे करें?


11

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

उपयोगकर्ता द्वारा दिए गए इनपुट और कार की टर्न राशि के बीच मैं लगातार देरी कैसे कर सकता हूं?

अभी मेरे पास यह है:

h = Mathf.Lerp(h, (((Input.mousePosition.x / Screen.width) * 2) - 1), Time.deltaTime * 2);

क्या होता है मोड़ में देरी हो रही है, लेकिन बहुत धीमी गति से, दूसरे शब्दों में, अगर मैं माउस को बहुत तेजी से ले जाता हूं, तो कार बहुत धीमी हो जाती है, लेकिन अगर मैं गुणक के लिए क्रैंक करता हूं Time.deltaTime, तो कार तेजी से मुड़ती है, लेकिन देरी का प्रभाव कम से कम होता है ।

मैं यह कैसे कर सकता था?

जवाबों:


31

एक समय अंतराल अनुकरण करने के लिए, अंतिम एन फ्रेम 'माउस पोजीशन को स्टोर करने के लिए एक परिपत्र बफर का उपयोग करें । प्रत्येक फ्रेम में वर्तमान माउस की स्थिति को स्टोर करें। अपने नियंत्रण गणना में, वर्तमान माउस स्थिति के बजाय बफर से सबसे पुराने माउस पोजीशन का उपयोग करें।


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

2
ध्यान दें कि इस तरह इनपुट में देरी करने से मतदान दर के आधार पर परिणाम बदल जाएगा।
जॉय

6
मैथ्यू, मैं थोड़ा हतप्रभ हूँ ... क्या आप वास्तव में प्रदर्शन का मतलब है? प्रति फ्रेम मेमोरी में कुछ बाइट्स लिखने का प्रदर्शन दंड पूरी तरह से नगण्य है, और आपको हर संदेश (विंडोज पर कम से कम) के साथ माउस की स्थिति मुफ्त मिलती है। आपको क्या लगता है कि आपका कोरटाइन समाधान ठीक काम करता है? कौन कितने टाइमर मौजूद है, कब समाप्त होता है और किस कोड को निष्पादित करना है, इसका ट्रैक कौन रखता है? यह बहुत भारी लगता है।
बस्टर

अरे नहीं, मेरा मतलब देरी के वास्तविक कार्य के प्रदर्शन से नहीं है, मेरा मतलब है समग्र प्रदर्शन। उदाहरण के लिए, यदि मैं अंतिम 10 फ़्रेमों की माउस स्थिति लेता हूं और इसे फोन पर चलाता हूं और 20 एफपीएस प्राप्त करता हूं, तो देरी 0.5 सेकंड के लिए होगी। हालांकि, अगर मैं इसे अपने डेस्कटॉप पर चलाता हूं और 200 एफपीएस प्राप्त करता हूं, तो देरी केवल 0.05 सेकंड के लिए होगी। क्या तुमने देखा कि मेरा क्या मतलब है?
mr-

आप उससे बचने के लिए N चुनेंगे, लेकिन इससे भी बड़ी समस्या यह है कि प्रति फ्रेम एक बार इस तरह से मतदान करना बहुत सारा डेटा फेंक रहा है। हर माउस घटना को संभालने के लिए बेहतर है (ऐसा लगता है कि आपका उत्तर क्या करता है)।
बस्टर

3

मैंने एक कोरटाइन का उपयोग करना समाप्त कर दिया, क्योंकि (जो मैं समझता हूं) गेम चलाने वाले डिवाइस के प्रदर्शन की परवाह किए बिना विलंब निरंतर होगा।

यह मेरा कोड है:

private IEnumerator DelayedInput()
{
    Vector3 a = Input.acceleration;
    Vector2 m = Input.mousePosition;

    yield return new WaitForSeconds(delay);

    accelerometer = Vector3.Lerp(accelerometer, a, Time.deltaTime * turnSpeed);
    mouse = Vector2.Lerp(mouse, m, Time.deltaTime * turnSpeed);
}

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

मुझे लगता है कि यह ऐसा करने का सबसे अच्छा तरीका है, मुझे नहीं लगता कि टाइमर आपके खेल को इतना प्रभावित करेगा कि निश्चित रूप से आप प्रदर्शन के साथ अपने अनुभव के परिणामों (भविष्य के संदर्भ के लिए) के साथ इस सवाल पर वापस आ सकते हैं। वैसे भी, आपको आगे बढ़ना चाहिए और इसे उत्तर के रूप में चुनना चाहिए (यह सिर्फ एक अनुस्मारक है)।
जॉन हैमिल्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.