Cách đồng bộ hóa trò chơi với âm nhạc


10

Bạn có thể quen thuộc với các trò chơi ryhtm như Dancing Line , Geometry Dash hoặc thậm chí là Guitar Hero . Họ có một điểm chung: mọi hành động trong trò chơi đều được đồng bộ hóa với âm nhạc. Mục đích của tôi là tạo ra một trò chơi như Geometry Dash, nơi người chơi phải thực hiện một số hành động theo nhịp điệu trong khi nhân vật tự động cuộn theo cấp độ. Tôi có một vài câu hỏi về loại trò chơi này:

  • Tôi có phải giữ FPS của mình liên tục vì nó phải luôn được đồng bộ hóa với âm nhạc không?
  • Làm cách nào tôi có thể xây dựng các cấp độ của mình với âm nhạc trong tâm trí để đảm bảo rằng nó sẽ được đồng bộ hóa?

Tôi đang làm việc trên Unity bằng C #.

Câu trả lời:


18

Tôi không khuyên bạn nên sử dụng Time.deltaTime để theo dõi tiến trình thông qua việc phát bài hát như được mô tả trong câu trả lời khác.

Thật tuyệt vời khi làm mịn và hiệu ứng nội suy để phát trong thời gian thực, nhưng khi bạn muốn khớp với thời gian của bài hát, bạn nên hỏi bài hát.

Trong Unity, bạn có thể đo lường tiến trình của Nguồn âm thanh thông qua việc phát trực tiếp một bản nhạc bằng cách sử dụng AudioSource.timehoặc AudioSource.timeSamplesđể có được vị trí đầu phát chính xác. (Lưu ý rằng các biện pháp sau trong các mẫu, có thể thay đổi tốc độ mỗi giây tùy thuộc vào cách bạn nén bản nhạc của mình)

Bằng cách này, bạn không cần phải chạy bộ đếm thời gian riêng của mình và hy vọng chúng được đồng bộ hóa. Bạn có thể kết nối các trình kích hoạt trò chơi của các hiệu ứng khớp nhịp để chạy theo dòng thời gian của bài hát.

Để phân lớp âm thanh trò chơi trên âm nhạc, bạn có thể sử dụng AudioSource.PlaySchediated để đảm bảo âm thanh của bạn hạ cánh chính xác theo nhịp, vì thậm chí có thể nhận thấy một sự không phù hợp nhỏ


Bạn có ý tưởng nào để đồng bộ hóa đồ họa với AudioSource không? Fe Tôi muốn thể hiện một vụ nổ hoặc va chạm kết nối với âm nhạc. Tôi muốn hiển thị chính xác khi âm thanh phát.
syabro

Đó là những gì tất cả các câu trả lời ở đây là về. Bạn có thấy rắc rối nào khi đưa những gợi ý trong những câu trả lời này vào thực tế không, @syabro?
DMGregory

2

Là một thay thế nếu bạn ổn với việc không làm việc từ đầu.

Đã có sẵn các tài sản (trong Phần mở rộng Trình chỉnh sửa / Âm thanh như https://www.assetstore.unity3d.com/en/#!/content/54639 (đã thanh toán) hoặc https://www.assetstore.unity3d.com/en / #! / content / 39835 (miễn phí)) nơi bạn có thể đồng bộ các bản nhạc với sự kiện. Trong ví dụ đó, vũ khí đang bắn theo nhịp nhạc.

Nếu bạn muốn tìm hiểu cách chúng hoạt động, hãy thử 1-2 trong số những cái miễn phí và xem nguồn.


Tôi đã thấy một bài thuyết trình từ các nhà phát triển Koreogologists một lúc trước - trông giống như một công nghệ tuyệt vời! Tại thời điểm khả năng phân tích âm thanh của nó bị hạn chế, nhưng nếu bạn biết trước bài hát bạn đang làm việc, bạn có thể sử dụng công nghệ để lên lịch rất chính xác các sự kiện trò chơi theo nhịp đập / khoảnh khắc cụ thể trong âm nhạc. Tôi không biết liệu họ đã thêm khả năng phân tích tự động hơn từ bản demo đó chưa.
DMGregory

1

Unity đã tách riêng trò chơi từ tốc độ khung hình. Nếu bạn nhớ luôn luôn sử dụng Time.deltaTimecác chức năng Cập nhật của mình, tốc độ khung hình đồ họa thực tế sẽ không ảnh hưởng đến tốc độ chơi trò chơi. Vì vậy, khi bạn bắt đầu trò chơi và theo dõi âm thanh cùng một lúc, chúng nên được đồng bộ hóa.

Về mức độ thiết kế xung quanh âm nhạc, có hai cách tiếp cận:

  • Cách tiếp cận thủ công. Mức độ thủ công tỉ mỉ xung quanh các bản âm thanh cụ thể. Có bản nhạc gốc trong tay có thể giúp ích, nhưng bạn cũng có thể làm điều đó chỉ bằng tai.
  • Cách tiếp cận thủ tục. Sử dụng thuật toán phân tích âm thanh để tự động tạo các mức xung quanh các rãnh âm thanh. Đơn giản nhất là chỉ cần tìm kiếm đột biến âm lượng. Điều đó đã cho phép bạn xác định tiếng trống trong nhiều bài hát và sinh ra chướng ngại vật tương ứng. Một bước nữa là phát hiện sự thay đổi âm lượng riêng trong các phổ tần số khác nhau. Điều này làm cho việc phát hiện nhịp đáng tin cậy hơn và cho phép bạn sinh ra các chướng ngại vật khác nhau cho các sân khác nhau. Nhưng đó vẫn chỉ là trầy xước bề mặt. Phân tích âm thanh là một lĩnh vực rất rộng và thú vị. Người ta đã viết rất nhiều tài liệu khoa học về nó.

    Làm thế nào sâu bạn cần phải đi sâu vào lĩnh vực này phụ thuộc vào mức độ tham vọng của bạn. Một số trò chơi hài lòng với việc chỉ cần phát hiện các nhịp và tạo ngẫu nhiên tất cả phần còn lại của thiết kế cấp ( Crypt of the Necrodancer ). Những người khác cố gắng đặt càng nhiều khía cạnh của thiết kế cấp dưới sự kiểm soát của âm thanh càng tốt ( Audiosurf ).

Nhiều trò chơi nhịp điệu sử dụng một cách tiếp cận lai. Bạn tạo bản nháp đầu tiên của cấp bằng cách sử dụng trình tạo và sau đó điều chỉnh bằng tay để làm cho nó dễ chơi hơn.


Cảm ơn câu trả lời của bạn, tôi sẽ xem xét nó! Time.deltaTime có thực sự chính xác và sẽ không có bất kỳ độ trễ thời gian nào được tạo ra với các bản nhạc dài?
Shashimee

@Shashimee Nó phải đủ chính xác. Nếu bạn muốn thực sự chắc chắn để không mất bất cứ điều gì để làm tròn sự khác biệt, hãy sử dụng Time.timethay thế.
Philipp

Tôi muốn giới thiệu cách tiếp cận theo thủ tục vì nó mở ra nhiều khả năng hơn cho trò chơi để phát triển. Người chơi có thể thêm các bản nhạc của riêng mình, bạn có thể thay đổi lưới và tất cả các thứ khác theo nhịp, như các hạt. Ngoài ra, bạn sẽ không mất nhiều thời gian cho việc thiết kế các cấp độ.
Mặt trăng thí sinh _Max_

1
@Philipp không may Time.time thậm chí có thể dễ bị thiếu chính xác hơn nếu trò chơi đã chạy được một lúc . Vì nó đo thời gian trò chơi kể từ khi khởi động, thay vì bắt đầu theo dõi hoặc bắt đầu cấp độ, sau khi chơi một hoặc hai bài hát, nó sẽ mất nhiều độ chính xác thấp như một tổng số deltas ngây thơ và lỗi có thể tiếp tục tăng nếu trò chơi bị bỏ chạy / ngủ được khôi phục nhiều lần.
DMGregory

0

Rất phổ biến là cách tiếp cận để có một "bản đồ đánh bại". Bất kỳ loại dữ liệu đại diện cho nhịp đập trong bài hát. Nó có thể là một kết cấu, datafile hoặc bất cứ thứ gì chứa thông tin đó. Hầu hết thời gian nó được tạo thủ công để tạo ra các nhịp và kết hợp khác nhau, các phiên bản tốc độ cho bản đồ âm thanh.

Nó có thể được tạo theo thủ tục từ dữ liệu tệp âm thanh, mặc dù.

Làm thế nào để có được tốc độ phù hợp với "điểm beat"? Khi nào sinh sản một đối tượng?

Speed = Distance / Time.

Distance = Khoảng cách giữa các điểm tạo GameObject và "điểm đánh bại".

Time =Độ dài âm thanh và bản đồ nhịp được xây dựng là đủ. Với thông tin này, bạn có thể phân tích dữ liệu của âm thanh / bản đồ để dự đoán khi nào một đối tượng phải được sinh ra để đạt đến điểm chính xác. Bây giờ tất cả phụ thuộc vào thời điểm bạn muốn sinh ra vật thể đó, nếu bạn muốn nó rất nhanh sau khi sinh sản, thì bạn sẽ sinh ra nó sau với tốc độ rất lớn. Nếu bạn muốn nó ở tốc độ bình thường - thì nó sẽ cần thời gian để đến trình phát và âm thanh cần thời gian để phát đến đúng thời điểm.

Bạn thậm chí có thể tạo một bản đồ mới với dấu thời gian để sinh ra các đối tượng đánh bại cho bản đồ âm thanh cụ thể. Bạn phải đưa ra một số dự đoán tại một số điểm để có thể khớp với nhịp, đối với phong cách phổ biến nhất mà tôi muốn nói, để dự đoán whensẽ sinh ra đối tượng để nó di chuyển một cách chắc chắn speed. Chúng có thể được thực hiện trong thời gian chạy hoặc đọc từ một số tệp được tính toán trước đó hoặc được lưu trong RAM ...

Tôi cho rằng các trò chơi như Osukhông có điều này Distance, chúng chỉ có thời gian các vòng tròn co lại, bpm ... Bản đồ thường được tùy chỉnh. Vì vậy, cách tiếp cận để tính toán hình ảnh phụ thuộc vào phong cách của trò chơi bạn đang làm là tốt.

Vì vậy, để tổng hợp tất cả mọi thứ, các giá trị là phụ thuộc lẫn nhau. Phụ thuộc vào số lượng nhịp bạn có, vào khoảng cách giữa điểm sinh sản và người chơi và đôi khi phụ thuộc vào dữ liệu được cung cấp [một số trò chơi có tốc độ của mỗi nhịp và sự xuất hiện của nó được mã hóa trong một số tệp dữ liệu được tạo thủ công]. Nếu bạn đang thực hiện theo cách thủ tục, thì bạn có thể tính toán mọi thứ về cơ bản bằng cách sử dụng dữ liệu âm thanh.

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.