Gecikmeli fare girişi nasıl yapılır?


11

Bir araba oyunum var ve fikir oyuncunun sarhoş olması. Fareyi, geciktirmek için fareyi yan yana hareket ettirdiğiniz gecikmeli bir giriş yapmak istiyorum.

Kullanıcının verdiği giriş ile aracın dönüş miktarı arasında nasıl sabit bir gecikme ayarlayabilirim?

Şu anda bu var:

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

Olan şey dönüşün ertelenmesidir, ancak çok yavaştır, başka bir deyişle, fareyi çok hızlı hareket ettirirsem, araba çok yavaş döner, ancak çarpanı kranklarsam Time.deltaTime, araba daha hızlı döner, ancak gecikme etkisi en aza indirilir .

Bunu başka nasıl yapabilirim?

Yanıtlar:


31

Bir gecikmeyi simüle etmek için, son N çerçevenin fare konumlarını saklamak üzere dairesel bir tampon kullanın . Geçerli fare konumunu her karede saklayın. Kontrol hesaplamalarınızda, geçerli fare konumu yerine tampondaki en eski fare konumunu kullanın.


1
Aslında çözdüm, sadece bir bekleme süresi ile bir coroutine kullandım. Bu teknikle performanstan endişe ediyorum, eğer gerçekten hızlı bir cihazınız varsa, mobil gibi bir şeyden çok daha düşük bir gecikme süresine sahip olacaktır.
mr-matt

2
Bunun gibi gecikmeli girişin, sorgulama oranına bağlı olarak sonucu değiştireceğini unutmayın.
Joey

6
Matthew, biraz şaşkınım ... Gerçekten performans mı demek istiyorsun? Çerçeve başına belleğe birkaç bayt yazmanın performans cezası mükemmel bir şekilde ihmal edilebilir ve her mesajda (en azından Windows'ta) fare konumunu ücretsiz alırsınız. Coroutine çözümünüzün tam olarak nasıl çalıştığını düşünüyorsunuz? Kaç tane zamanlayıcı bulunduğunu, ne zaman sona erdiğini ve hangi kodun yürütüleceğini izler? Kulağa oldukça ağır geliyor.
Buster

Oh hayır, gecikmenin asıl görevinin performansı değil, genel performans demek istiyorum. Örneğin, son 10 karenin fare konumunu alıp bir telefonda çalıştırıp 20 fps alırsam, gecikme 0,5 saniye olacaktır. Ancak, bunu masaüstümde çalıştırır ve 200 fps alırsam, gecikme sadece 0.05 saniye olacaktır. Ne demek istediğimi anlıyor musun?
mr-matt

Bundan kaçınmak için N'yi seçersiniz, ancak daha büyük sorun, böyle bir kare başına bir yoklamanın çok fazla veri atmasıdır. Her fare olayını işlemek daha iyidir (cevabınızın yaptığı budur).
Buster

3

Bir koroutin kullandım, çünkü (anladığım kadarıyla) gecikme, oyunu çalıştıran cihazın performansından bağımsız olarak sabit olacak.

Bu benim kodum:

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

Bu, tüm girdilere yanıt verme avantajına sahiptir (her çerçeveyi yoklama fikrim gibi değil). C # bilmiyorum ama bir yerlerde bana tüm bu zamanlayıcılar için yapacak bir sürü defter tutma gibi görünüyor. Ama eğer iyi bir performans sergiliyor ve istediğiniz hissi veriyorsa hoşuma gidiyor.
Buster

Bunu yapmanın daha iyi bir yol olduğunu düşünüyorum, zamanlayıcıların oyununuzu çok fazla etkileyeceğini düşünmüyorum, elbette bu soruya performans deneyiminizin sonuçlarıyla (gelecekteki referans için) geri dönebilirsiniz. Her neyse, devam etmeli ve bunu cevap olarak seçmelisiniz (bu sadece bir hatırlatmadır).
John Hamilton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.