Birden fazla tuşa basıldığında hareket hızının istiflenmesi nasıl önlenir?


17

Fare gerektirmeyen yeni bir oyuna başladım, böylece hareketi klavyeye bıraktım. 8 yön dahil etmeye çalıştım; yukarı, sol, sağ, yukarı-sağ vb. Ancak birden fazla ok tuşuna bastığımda, hareket hızı yığınlanıyor ( http://gfycat.com/CircularBewitchedBarebirdbat ). Buna nasıl karşı koyabilirim?

İşte kodumun ilgili kısmı:

var speed : int = 5;

function Update () {
    if (Input.GetKey(KeyCode.UpArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
        transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
    }
    if (Input.GetKey(KeyCode.DownArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}

3
tanjant: Kodunuzdaki girinti biraz karışık oldu, bu yüzden ilk başta fark etmedim, ancak kodunuzdaki koşullar çoğunun çalışmasını engelleyecektir. Örneğin, (UpArrow) else (UpArrow && RightArrow) 'asla' dalını çalıştırmazsa.
Ağustos'ta

Yanıtlar:


13

Yön seçim kodunuzu gerçek hareket kodundan ayırın.

  1. Seç DirectionHangi tuşlara basıldığını kontrol ederek . Birim (normalleştirilmiş) vektör olarak saklayın.
  2. Çarpın Directionile Speedve ileDeltaTime .
  3. Ortaya çıkan dönüşümü nesnenize / kameranıza uygulayın.

27

Yol tariflerinin toplamını almanız, normalleştirmeniz ve sonra hızla çarpmanız gerekir.

Bunu teğetsel olarak, çapraz hareketi önleme yanıtımın bir parçası olarak cevapladım

özellikle:

velX = 0;
velY = 0;

if(keyLeft) velX += -1;
if(keyRight) velX += 1;
if(keyUp) velY += -1;
if(keyDown) velY += 1;

// Normalize to prevent high speed diagonals
length = sqrt((velX * velX ) + (velY * velY ));
if (length != 0)
{
    velX /= length;
    velY /= length;
}

velX *= speed;
velY *= speed;

3
Heheh, Larry gurur duyardı! Husis
jzx

3
Birlik zaten almak için yöntemler sağlar unutmayın büyüklüğü ve kare büyüklüğünü Vektör.
Selali Adobor

1
Hiçbir tuşa basılmazsa bu NaN üretir
CodesInChaos

1
@jzx Gerçekten de, efsanevi Hobbitler gibi olmaya çalışıyoruz. youtube.com/watch?v=G49RUPv5-NU
Pharap

11

"Normalize edilmiş yön vektörü", bu göreve genellikle nasıl yaklaşıldığı ve sık sık nasıl yaptığımdır, ancak son zamanlarda ortaya çıkan hareket vektörünü sıkıştırıyorum. Genellikle aynı sonuca ulaşır ve kod çok daha basittir:

var moveSpeed = 6.0f;
function Update() {
  var movement = Vector3.zero;
  movement.x = Input.GetAxis("Horizontal") * moveSpeed;
  movement.z = Input.GetAxis("Vertical") * moveSpeed;
  movement = Vector3.ClampMagnitude(movement, moveSpeed);
  movement *= Time.deltaTime;
  transform.Translate(movement);
}

Daha basit kod neredeyse her zaman daha iyidir: E


Ne ClampMagnitudeişe Normalize * Constantyarar, gizlice aynı kod değil mi?
Kromster, Monica

2
Pek değil. Bir değeri "sıkıştırmak", değerin bir maksimumun altında / altında kalmasını sağlarken, normalleştirme değeri sabit olarak ayarlar. En azından Unity ile GetAxis () biraz daha hızlanan değerler döndürerek size daha yumuşak bir hareket sağlar. Vektörün normalleştirilmesi hızlanmayı geçersiz kılarken, sıkıştırma hızlanmanın gerçekleşmesine izin verir. İnce ama güzel görünüyor. Son etki hemen hemen aynıdır.
Ağustos'ta

1
Doğrudan Birlik bağlamında yazılan tek cevap olduğu için +1. API, her türlü yararlı Vector / Quaternion matematik yöntemlerini bu tür bir durum göz önünde bulundurarak kendinize ait bir neden oluşturmaz.
Selali Adobor

1'e kelepçeledim ve sadece moveSpeedkelepçelendikten sonra çarptım ve muhtemelen çarpma ile birleştirdim deltaTime.
CodesInChaos

Bu değişiklik sadece bir çarpma işlemini kaldırmaktan daha fazlasını mı kazanıyor? Mesela, kelepçe 1 kelepçeden 6 farklı çalışıyor mu? değişikliğinizin ne olduğunu merak ediyorum ...
jhocking
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.