วิธีการใส่เมาส์ล่าช้า?


11

ฉันมีเกมรถและแนวคิดก็คือผู้เล่นนั้นเมา ฉันต้องการอินพุตที่ล่าช้าจากเมาส์ซึ่งคุณเลื่อนเมาส์ไปทางด้านข้างเพื่อเลื่อน

ฉันจะตั้งค่าการหน่วงเวลาคงที่ระหว่างอินพุตที่ผู้ใช้ให้และจำนวนเทิร์นของรถได้อย่างไร?

ตอนนี้ฉันมีสิ่งนี้:

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

สิ่งที่เกิดขึ้นคือการเลี้ยวล่าช้า แต่ช้ามากกล่าวอีกนัยหนึ่งถ้าฉันเลื่อนเมาส์เร็วรถจะหมุนช้ามาก แต่ถ้าฉันหมุนตัวคูณเพื่อTime.deltaTimeให้รถหมุนเร็วขึ้น แต่เอฟเฟกต์ล่าช้าจะลดลง .

ฉันจะทำสิ่งนี้ได้อีก

คำตอบ:


31

ในการจำลองการหน่วงเวลาใช้บัฟเฟอร์วงกลมเพื่อเก็บตำแหน่งเมาส์Nเฟรมล่าสุด จัดเก็บตำแหน่งเมาส์ปัจจุบันแต่ละเฟรม ในการคำนวณการควบคุมของคุณให้ใช้ตำแหน่งเมาส์ที่เก่าแก่ที่สุดจากบัฟเฟอร์แทนตำแหน่งเมาส์ปัจจุบัน


1
ฉันแก้ไขมันจริง ๆ ฉันแค่ใช้ coroutine กับ waitforseconds ฉันจะกังวลเกี่ยวกับประสิทธิภาพด้วยเทคนิคนี้หากคุณมีอุปกรณ์ที่รวดเร็วจริง ๆ มันจะมีเวลาหน่วงที่ต่ำกว่าสิ่งที่คล้ายกับมือถือ
นายแมตต์

2
โปรดทราบว่าการป้อนข้อมูลล่าช้าเช่นนี้จะเปลี่ยนผลลัพธ์ขึ้นอยู่กับอัตราการสำรวจ
Joey

6
Matthew, ฉันรู้สึกสับสนเล็กน้อย ... คุณหมายถึงการแสดงจริงๆเหรอ? โทษประสิทธิภาพในการเขียนไม่กี่ไบต์ต่อหน่วยความจำต่อเฟรมนั้นเล็กน้อยมากและคุณจะได้ตำแหน่งเมาส์ฟรีทุกข้อความ (บน Windows อย่างน้อย) คุณคิดว่าวิธีแก้ปัญหา coroutine ของคุณทำงานอย่างไร ใครเป็นผู้ติดตามว่ามีตัวจับเวลากี่ตัวเมื่อพวกเขาหมดอายุและรหัสใดที่จะทำงาน? มันฟังดูค่อนข้างหนา
Buster

โอ้ไม่ฉันไม่ได้หมายถึงประสิทธิภาพของงานที่แท้จริงของความล่าช้าฉันหมายถึงประสิทธิภาพโดยรวม ตัวอย่างเช่นถ้าฉันใช้ตำแหน่งเมาส์ของ 10 เฟรมสุดท้ายแล้วเปิดใช้งานบนโทรศัพท์และรับ 20 fps ดังนั้นความล่าช้าจะอยู่ที่ 0.5 วินาที อย่างไรก็ตามถ้าฉันรันบนเดสก์ท็อปของฉันและรับ 200 fps ความล่าช้าจะอยู่ที่ 0.05 วินาทีเท่านั้น คุณเห็นสิ่งที่ฉันหมายถึงอะไร
นายแมตต์

คุณจะเลือก N เพื่อหลีกเลี่ยงปัญหานั้น แต่ปัญหาที่ใหญ่กว่าก็คือการทำโพลหนึ่งครั้งต่อเฟรมเช่นนี้จะทำให้ข้อมูลจำนวนมากหมดไป ดีกว่าที่จะจัดการกับเหตุการณ์เมาส์ทุกครั้ง (ดูเหมือนว่าเป็นคำตอบของคุณ)
Buster

3

ฉันลงเอยด้วยการใช้ coroutine เพราะ (จากสิ่งที่ฉันเข้าใจ) ความล่าช้าจะไม่เปลี่ยนแปลงโดยไม่คำนึงถึงประสิทธิภาพของอุปกรณ์ที่ใช้งานเกม

นี่คือรหัสของฉัน:

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 # แต่ดูเหมือนว่าสำหรับฉันบางคนมีบัญชีจำนวนมากที่ต้องทำสำหรับตัวนับทั้งหมด แต่ถ้ามันใช้งานได้ดีและมีความรู้สึกที่คุณต้องการฉันก็ชอบ
Buster

ฉันคิดว่านี่เป็นวิธีที่ดีกว่าที่จะทำฉันไม่คิดว่าตัวจับเวลาจะส่งผลกระทบต่อเกมของคุณมากนักแน่นอนว่าคุณสามารถกลับไปที่คำถามนี้ได้พร้อมกับผลลัพธ์ที่ได้จากประสบการณ์การแสดง (สำหรับการอ้างอิงในอนาคต) อย่างไรก็ตามคุณควรไปข้างหน้าและเลือกสิ่งนี้เป็นคำตอบ (นี่เป็นเพียงการเตือนความจำ)
John Hamilton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.