Làm thế nào để thực hiện một đầu vào chuột bị trì hoãn?


11

Tôi có một trò chơi xe hơi và ý tưởng là người chơi say rượu. Tôi muốn có một đầu vào bị trì hoãn từ chuột, nơi bạn di chuyển chuột sang bên để xoay.

Làm cách nào tôi có thể thiết lập độ trễ liên tục giữa đầu vào mà người dùng đưa ra và số vòng quay của xe?

Ngay bây giờ tôi có cái này:

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

Điều xảy ra là vòng quay bị trì hoãn, nhưng rất chậm, nói cách khác, nếu tôi di chuyển chuột rất nhanh, xe quay rất chậm, nhưng nếu tôi quay số nhân cho Time.deltaTime, xe quay nhanh hơn, nhưng hiệu quả chậm trễ được giảm thiểu .

Làm thế nào khác tôi có thể làm điều này?

Câu trả lời:


31

Để mô phỏng độ trễ thời gian, sử dụng bộ đệm tròn để lưu trữ vị trí chuột của N khung hình cuối cùng . Lưu trữ vị trí chuột hiện tại mỗi khung. Trong tính toán kiểm soát của bạn, sử dụng vị trí chuột cũ nhất từ ​​bộ đệm thay vì vị trí chuột hiện tại.


1
Tôi đã giải quyết nó thực sự, tôi chỉ sử dụng một coroutine với một giây chờ đợi. Tôi sẽ quan tâm đến hiệu suất với kỹ thuật này, nếu bạn có một thiết bị thực sự nhanh, nó sẽ có thời gian trễ thấp hơn nhiều so với một cái gì đó như điện thoại di động.
mr-matt

2
Lưu ý rằng trì hoãn đầu vào như thế này sẽ thay đổi kết quả tùy thuộc vào tỷ lệ bỏ phiếu.
Joey

6
Matthew, tôi hơi hoang mang ... bạn thực sự có nghĩa là hiệu suất? Hình phạt hiệu năng của việc ghi một vài byte vào bộ nhớ trên mỗi khung là hoàn toàn không đáng kể và bạn có được vị trí chuột miễn phí với mọi thông báo (ít nhất là trên Windows). Làm thế nào để bạn nghĩ rằng giải pháp coroutine của bạn hoạt động chính xác? Ai theo dõi có bao nhiêu bộ định thời tồn tại, khi hết hạn và mã nào để thực thi? Nghe có vẻ khá nặng.
Buster

Ồ không, tôi không có nghĩa là hiệu suất của nhiệm vụ thực tế của sự chậm trễ, ý tôi là hiệu suất tổng thể. Ví dụ: nếu tôi lấy vị trí chuột của 10 khung hình cuối cùng và chạy nó trên điện thoại và nhận được 20 khung hình / giây, thì độ trễ sẽ là 0,5 giây. Tuy nhiên, nếu tôi chạy cái này trên máy tính để bàn của mình và nhận được 200 khung hình / giây, thì độ trễ sẽ chỉ trong 0,05 giây. Bạn có biêt tôi đang nghĩ gì?
mr-matt

Bạn sẽ chọn N để tránh điều đó, nhưng vấn đề lớn hơn là việc bỏ phiếu một lần trên mỗi khung hình như thế này sẽ làm mất đi rất nhiều dữ liệu. Tốt hơn để xử lý mọi sự kiện chuột (có vẻ như đó là câu trả lời của bạn).
Buster

3

Tôi đã kết thúc bằng cách sử dụng một coroutine, bởi vì (theo những gì tôi hiểu) độ trễ sẽ không đổi bất kể hiệu suất của thiết bị chạy trò chơi.

Đây là mã của tôi:

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

Điều này có lợi thế là đáp ứng tất cả các đầu vào (không giống như ý tưởng của tôi về việc bỏ phiếu mọi khung hình). Tôi không biết C # nhưng dường như ai đó ở đâu đó có rất nhiều sổ sách kế toán để làm cho tất cả những người hẹn giờ đó. Nhưng nếu nó hoạt động tốt và có cảm giác bạn muốn thì tôi thích nó.
Buster

Tôi nghĩ rằng đây là cách tốt hơn để làm điều đó, tôi không nghĩ rằng bộ hẹn giờ sẽ ảnh hưởng đến trò chơi của bạn nhiều như vậy, tất nhiên bạn có thể quay lại câu hỏi này với kết quả trải nghiệm của bạn với hiệu suất (để tham khảo trong tương lai). Dù sao, bạn nên đi trước và chọn đây là câu trả lời (đây chỉ là một lời nhắc nhở).
John Hamilton
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.