দেরি মাউস ইনপুট কিভাবে করবেন?


11

আমার একটি গাড়ী খেলা আছে এবং ধারণাটি প্লেয়ারটি মাতাল। আমি মাউস থেকে একটি বিলম্বিত ইনপুট পেতে চাই, যেখানে আপনি মাউসকে পাশাপাশি ঘুরিয়ে ঘুরিয়ে নিন।

ব্যবহারকারী কীভাবে ইনপুট দেয় এবং গাড়ীর পরিবর্তনের পরিমাণের মধ্যে আমি কীভাবে একটি স্থির দেরি সেটআপ করতে পারি?

এই মুহূর্তে আমার কাছে এটি রয়েছে:

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

যা ঘটেছিল তা হ'ল দেরিতে দেরি হলেও খুব ধীর গতিতে অন্য কথায় আমি যদি খুব দ্রুত মাউসটি সরিয়ে নিই, গাড়িটি খুব আস্তে আস্তে আসে তবে আমি যদি এর জন্য গুণকটি ক্র্যাঙ্ক করি Time.deltaTimeতবে গাড়িটি দ্রুত পরিণত হয় তবে বিলম্বের প্রভাব হ্রাস করা হয় ।

আমি আর কীভাবে এটি করতে পারি?

উত্তর:


31

একটি সময় পিছনে অনুকরণ করতে, সর্বশেষ এন ফ্রেমের মাউস অবস্থানগুলি সঞ্চয় করতে একটি বিজ্ঞপ্তি বাফার ব্যবহার করুন । প্রতিটি ফ্রেম বর্তমান মাউস অবস্থান সংরক্ষণ করুন। আপনার নিয়ন্ত্রণের গণনায়, বর্তমান মাউস অবস্থানের পরিবর্তে বাফার থেকে পুরানো মাউস অবস্থানটি ব্যবহার করুন।


1
আমি আসলে এটি সমাধান করেছি, আমি কেবল একটি ওয়েটারফোরসেকেন্ড সহ একটি কর্টিন ব্যবহার করেছি। আমি এই কৌশলটির সাথে পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হব, যদি আপনার সত্যিই একটি দ্রুত ডিভাইস থাকে তবে এটির মতো মোবাইলের মতো কিছুটা বিলম্বের সময়ও থাকতে পারে।
মিঃ-ম্যাট

2
নোট করুন যে এই জাতীয় বিলম্ব ইনপুট ভোটদানের হারের উপর নির্ভর করে ফলাফল পরিবর্তন করবে।
জোয়

6
ম্যাথু, আমি কিছুটা বিস্মিত হই ... তুমি আসলেই কি পারফরম্যান্স বোঝাতে চাইছ? ফ্রেম প্রতি মেমোরিতে কয়েক বাইট লেখার পারফরম্যান্স পেনাল্টি পুরোপুরি নগণ্য, এবং আপনি প্রতিটি বার্তা (উইন্ডোজে অন্তত) এর সাথে মাউস অবস্থান মুক্ত পান। আপনি কীভাবে মনে করেন যে আপনার কর্টিন সমাধানটি ঠিক কাজ করে? কে কত টাইমার উপস্থিত রয়েছে তার ট্র্যাক রাখে, কখন তাদের মেয়াদ শেষ হয় এবং কোন কোডটি কার্যকর করা যায়? এটি বেশ হেভিওয়েট শোনাচ্ছে।
বাস্টার

ওহ না, আমি বিলম্বের প্রকৃত কাজের পারফরম্যান্স বোঝাতে চাইছি না, আমি সামগ্রিক পারফরম্যান্স বোঝাতে চাইছি। উদাহরণস্বরূপ, আমি যদি সর্বশেষ 10 ফ্রেমের মাউস অবস্থান গ্রহণ করি এবং একটি ফোনে এটি চালিত করি এবং 20 fps পাই, তবে বিলম্বটি 0.5 সেকেন্ডের জন্য হবে। তবে, আমি যদি এটি আমার ডেস্কটপে চালাই এবং 200 fps পাই, তবে দেরি কেবল 0.05 সেকেন্ডের জন্যই হবে। আমি কি বলতে চাইছি?
মিঃ-ম্যাট

এটি এড়ানোর জন্য আপনি এন নির্বাচন করবেন, তবে সবচেয়ে বড় সমস্যা হ'ল একবার ফ্রেমে প্রতি ভোটদানের ফলে প্রচুর ডেটা ছুঁড়ে ফেলা হয়। প্রতিটি মাউস ইভেন্ট হ্যান্ডেল করা ভাল (আপনার উত্তর যা করে তা দেখে মনে হচ্ছে)।
বাস্টার

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);
}

সমস্ত ইনপুটতে সাড়া দেওয়ার সুবিধা রয়েছে (প্রতিটি ফ্রেমের পোলিংয়ের আমার ধারণার মতো নয়)। আমি সি # জানি না তবে আমার কাছে মনে হয় কোথাও কোথাও কারও কাছে এই সমস্ত টাইমারদের জন্য প্রচুর বুককিপিং রয়েছে। তবে এটি যদি ঠিকঠাক হয় এবং আপনার যে অনুভূতিটি চান তা যদি থাকে তবে আমি এটি পছন্দ করি।
বাস্টার

আমি মনে করি এটি এটি করার সর্বোত্তম উপায়, আমি মনে করি না টাইমাররা আপনার গেমগুলিকে এত বেশি প্রভাবিত করবে, অবশ্যই আপনি পারফরম্যান্সের সাথে আপনার অভিজ্ঞতার ফলাফলগুলি (ভবিষ্যতের রেফারেন্সের জন্য) এই প্রশ্নটিতে ফিরে আসতে পারেন। যাইহোক, আপনার এগিয়ে যাওয়া উচিত এবং উত্তর হিসাবে এটি বেছে নেওয়া উচিত (এটি কেবলমাত্র একটি অনুস্মারক) is
জন হ্যামিল্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.