Unity có hỗ trợ hiện tại cho Timelines không?


13

Tôi đang lên kế hoạch phát triển một trò chơi trong Unity3D và cố gắng đi đến thỏa thuận với những gì công cụ đã cung cấp và những gì tôi phải tự viết mã.

Bản thân trò chơi sẽ là một trò chơi nhịp điệu, có nghĩa là đồng bộ hóa các sự kiện âm thanh và đồ họa để chúng luôn chơi khi chúng được yêu cầu. Điều tôi muốn tránh là một kịch bản tiềm ẩn về độ trễ khi âm thanh hoặc đồ họa bắt đầu phát triển nhanh hơn các kịch bản khác.

Khi chúng tôi thảo luận về loại hệ thống phối hợp này trong lớp thiết kế trò chơi của tôi ở trường đại học, giáo sư của tôi đã gọi loại thiết kế này là lớp "Dòng thời gian". Ý tưởng là bạn có thể khởi tạo một hoặc nhiều trong số này để tiến triển ở các mức độ khác nhau, lên lịch cho những điều sẽ xảy ra trong tương lai và đồng bộ hóa các sự kiện định kỳ. Tuy nhiên, việc gọi đây là lớp "Dòng thời gian" dường như chỉ giới hạn ở chính giáo sư của tôi, vì cho rằng một API nhất định có chức năng "Dòng thời gian" có phải là một nỗ lực không có kết quả hay không.

Có một số tên phổ biến hơn cho loại chức năng này? Liệu Unity có bất kỳ phương pháp có sẵn nào để phối hợp lên lịch cho các sự kiện như thế này không, hay đây là loại điều cần được xây dựng trên động cơ? Và nếu có, tôi đánh giá cao việc được hướng tới một số hướng dẫn!


Tôi cũng đã sử dụng các lớp Timeline tương tự (chúng thậm chí có cùng tên). Một tên phổ biến hơn cho mẫu không được biết đến với tôi, nhưng có lẽ nó thường được thực hiện thông qua lập trình phản ứng chức năng, coroutines hoặc các khái niệm không đồng bộ khác.
interphx 7/11/2016

Câu trả lời:


10

Mặc dù chức năng này không có sẵn trong Unity, nhưng việc triển khai cơ bản dòng thời gian như vậy không quá khó để thực hiện.

Đây là cách tôi sẽ đi về điều đó:

  • Lớp Timeline của bạn bên trong sử dụng hàng đợi ưu tiên làm cấu trúc dữ liệu để lưu trữ các sự kiện.
  • Một sự kiện có thể chỉ là một thời gian và một cuộc gọi lại. Vì vậy, việc thêm các sự kiện vào dòng thời gian sẽ đơn giản như : timeline.AddEvent(0.25f, MyCallback).
  • Với mỗi Update, lớp dòng thời gian sẽ:

    1. Tăng thời gian chơi (đơn giản float) trong thời gian trôi qua
    2. Kiểm tra phần đầu của hàng đợi ưu tiên và loại bỏ và gọi lại cuộc gọi của tất cả các sự kiện có mức độ ưu tiên (ví dụ: thời gian) nhỏ hơn hoặc bằng với đầu phát hiện tại.

Nếu bạn cần một số chức năng tua lại hoặc phát lại , tất nhiên sẽ thật ngu ngốc khi xóa tất cả các sự kiện khỏi hàng đợi (có nghĩa là bạn sẽ phải thêm lại chúng khi tua lại). Thay vào đó, bạn cũng có thể sử dụng một mảng chứa các sự kiện của bạn . Một sự kiện sẽ bao gồm một TimeCallback. Bạn sẽ phải giữ mảng của bạn được sắp xếp theo Time.

Sau đó, thay vì xóa các mục khỏi mảng, bạn sẽ theo dõi chỉ mục mảng hiện tại và với mỗi bản cập nhật tìm kiếm trước chỉ mục đó và thực hiện tất cả các cuộc gọi lại Playhead >= Timetrong khi cũng tăng chỉ số tương ứng.

Việc triển khai tốc độ phát lại nhanh hơn hoạt động với cả hai lần triển khai và sẽ đơn giản như:

Playhead += Time.deltaTime * playbackSpeed

2
"Tăng đầu phát (một số float đơn giản) trong khoảng thời gian đã trôi qua" - Nếu bạn làm điều này, bạn sẽ nhận được các lỗi dấu phẩy động tổng hợp. Thay vào đó, bạn nên sử dụng Time.time (thời gian kể từ khi trò chơi bắt đầu) .
BlueRaja - Daniel Pflughoeft

4

Không, Unity3D không có API như vậy.

Mặc dù vậy, nó hỗ trợ các coroutines và tôi khuyên bạn nên xem xét chúng. Coroutines thường làm cho việc lên lịch và đồng bộ hóa các sự kiện thực sự dễ dàng.


1

Tôi không chắc đây có phải là mới kể từ câu trả lời năm 2012 hay không, nhưng Unity thực sự có hỗ trợ kiểm soát dòng thời gian thông qua Trình chỉnh sửa hoạt hình (Di sản) .

Mặc dù tính năng này chủ yếu dành cho hoạt hình các tham số đối tượng với các đường cong, nhưng nó bao gồm khả năng kích hoạt các tập lệnh trên Animation Events . Những kịch bản này có thể lái đồ họa và âm thanh của bạn.

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.