Làm thế nào để tránh xếp chồng tốc độ di chuyển khi nhấn nhiều phím?


16

Tôi đã bắt đầu một trò chơi mới không cần chuột, do đó chuyển động lên bàn phím. Tôi đã cố gắng kết hợp 8 hướng; lên, trái, phải, lên phải và vân vân. Tuy nhiên, khi tôi nhấn nhiều hơn một phím mũi tên, ngăn xếp tốc độ di chuyển ( http://gfycat.com/CircularBewitchedBarebirdbat ). Làm thế nào tôi có thể chống lại điều này?

Đây là một phần có liên quan trong mã của tôi:

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
tiếp tuyến: Việc thụt lề trong mã của bạn có một chút lộn xộn nên lúc đầu tôi không nhận thấy, nhưng các điều kiện trong mã của bạn sẽ ngăn không cho nó chạy. Giống như, nếu (UpArrow) khác nếu (UpArrow && RightArrow) sẽ không bao giờ chạy nhánh 'other'.
jhocking

Câu trả lời:


13

Tách mã lựa chọn hướng của bạn khỏi mã di chuyển thực tế.

  1. Chọn Directionbằng cách kiểm tra các phím được nhấn. Lưu trữ nó như một vector đơn vị (chuẩn hóa).
  2. Nhân của bạn Directionvới Speedvà với DeltaTime.
  3. Áp dụng biến đổi kết quả cho đối tượng / máy ảnh của bạn.

27

Bạn cần lấy tổng số chỉ đường, bình thường hóa nó, sau đó nhân với tốc độ.

Tôi đã trả lời một cách hữu hình điều này như là một phần trong phản ứng của tôi về Ngăn chặn chuyển động chéo

Đặc biệt:

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 sẽ tự hào! c2.com/cgi/wiki?LazinessImpatienceHubris
jzx

3
Lưu ý rằng Unity đã cung cấp các phương thức để lấy độ lớnbình phương của Vector.
Selali Adobor

1
Điều này tạo ra NaN nếu không có phím nào được nhấn
CodeInChaos

1
@jzx Thật vậy, chúng tôi cố gắng để giống như người Hobbit huyền thoại. youtube.com/watch?v=G49RUPv5-NU
Pharap

11

"Vectơ chỉ hướng chuẩn hóa" là cách nhiệm vụ này thường được tiếp cận và cách tôi thường thực hiện, nhưng gần đây tôi chỉ đơn giản là kẹp vectơ chuyển động kết quả. Nó thường đạt được kết quả cuối cùng giống nhau và mã đơn giản hơn rất nhiều:

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

Mã đơn giản hầu như luôn luôn tốt hơn: E


Điều gì ClampMagnitudelàm, không phải nó giống như mã bị Normalize * Constantloại?
Kromster nói hỗ trợ Monica

2
Không hẳn. "Kẹp" một giá trị đảm bảo nó nằm trong phạm vi / dưới mức tối đa, trong khi chuẩn hóa đặt giá trị thành một hằng số. Với Unity ít nhất, GetAxis () trả về các giá trị tăng tốc nhẹ, cho bạn chuyển động mượt mà hơn. Bình thường hóa vectơ ghi đè gia tốc đó, trong khi kẹp cho phép tăng tốc xảy ra. Nó tinh tế nhưng trông đẹp hơn. Hiệu ứng cuối cùng là khá nhiều như nhau mặc dù.
jhocking

1
+1 vì là câu trả lời duy nhất được viết trực tiếp trong ngữ cảnh của Unity. API cung cấp tất cả các loại phương pháp toán học Vector / Đệ tứ hữu ích với loại tình huống này trong tâm trí, không có lý do gì để tự mình thực hiện.
Selali Adobor

Tôi kẹp thành 1 và chỉ nhân với moveSpeedsau khi kẹp và có thể hợp nhất nó với phép nhân với deltaTime.
CodeInChaos

Liệu sự thay đổi đó có được nhiều hơn là chỉ loại bỏ một hoạt động nhân? Giống như, kẹp 1 có hoạt động khác với kẹp 6 không? tự hỏi sự thay đổi của bạn làm gì ...
jhocking
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.