ゲームと音楽を同期する方法


10

ダンシングラインジオメトリダッシュ、またはギターヒーローなどのryhtmゲームに精通しているかもしれません。それらには共通点があります。ゲーム内のすべてのアクションは音楽と同期されます。私の目的は、Geometry Dashのようなゲームを作成することです。プレイヤーは、キャラクターがレベルを自動的にスクロールする間に、リズムでいくつかのアクションを実行する必要があります。このタイプのゲームについていくつか質問があります。

  • FPSは常に音楽と同期する必要があるため、FPSを一定に保つ必要がありますか?
  • 音楽を念頭に置いてレベルを構築し、同期されるようにするにはどうすればよいですか?

UnityでC#を使用しています。

回答:


18

別の回答で説明されているように、Time.deltaTimeを使用して曲の再生の進行状況を追跡することはお勧めしません。

エフェクトをスムージングおよび補間してリアルタイムで再生するのに最適ですが、曲の時間を一致させたい場合は、曲に質問する必要があります。

Unityでは、直接またはを使用してトラックを再生し、正確な再生ヘッド位置を取得することにより、オーディオソースの進行状況を測定できます。(後者のサンプルはサンプルで測定されることに注意してください。これは、トラックの圧縮方法に応じて、1秒あたりのレートが異なる場合があります)AudioSource.timeAudioSource.timeSamples

このように、独自のタイマーを実行する必要がなく、それらが同期し続けることを望みます。ビートマッチングエフェクトのゲームトリガーを配線して、曲自体のタイムラインから実行することができます。

音楽にゲームプレイサウンドを重ねる場合は、AudioSource.PlayScheduledを使用して、サウンドがビートに正確に収まるようにすることができます。


グラフィックをオーディオソースに同期する方法はありますか?Fe音楽に関連した爆発や衝突を見せたい。音が鳴ったときに正確に表示したい。
syabro

それが、ここでのすべての答えです。これらの回答の提案を実際に実行するのに問題がありましたか、@ syabro?
DMGregory

2

ゼロから作業しなくても問題ない場合の代替として。

すでに既製のアセットがあります(Editor Extensions / Audio under https://www.assetstore.unity3d.com/en/#!/content/54639(paid)またはhttps://www.assetstore.unity3d.com/en。 /#!/ content / 39835(無料))音楽トラックをイベントに同期できます。その例では、武器は音楽のビートで発砲しています。

それらがどのように機能するかを学びたい場合は、無料のものを1〜2個試し、ソースを確認してください。


しばらくの間、Koreographerの開発者からのプレゼンテーションを見ました-素晴らしい技術のように見えました!当時、そのオーディオ分析機能は制限されていましたが、作業しているトラックを事前に知っていれば、テクノロジーを使用して、音楽の特定のビート/瞬間にゲームイベントを非常に正確にスケジュールできます。そのデモ以降、彼らがより多くの分析を自動的に実行する機能を追加したかどうかはわかりません。
DMGregory

1

Unityはすでにゲームプレイをフレームレートから切り離しています。常にTime.deltaTimeUpdate関数で使用することを覚えている場合、実際のグラフィックフレームレートはゲームプレイの速度に影響を与えません。したがって、ゲームとオーディオトラックを同時に開始しても、同期は維持されます。

音楽を中心としたレベルの設計に関しては、2つのアプローチがあります。

  • 手動によるアプローチ。特定のオーディオトラックのレベルを細かく手作りします。オリジナルの楽譜を手元に置いておくと役立ちますが、耳だけで行うこともできます。
  • 手続き型アプローチ。オーディオ分析アルゴリズムを使用して、オーディオトラックの周囲にレベルを自動生成します。最も単純なのは、ボリュームのスパイクを探すことです。これにより、すでに多くの曲のドラムビートを識別し、それに応じて障害物を生成できるはずです。さらに、異なる周波数スペクトルでボリュームシフトを個別に検出します。これにより、ビート検出の信頼性が高まり、ピッチごとに異なる障害物を生成できます。しかし、それはまだ表面を引っ掻いているだけです。オーディオ分析は非常に広く興味深い分野です。人々はそれについて多くの科学文献を書きました。

    この分野にどのくらい深く入り込む必要があるかは、どれだけ野心的であるかに依存します。一部のゲームは、ビートを検出するだけで満足し、レベルデザインの残りすべてをランダムに生成します(ネクロダンサーのクリプト)。オーディオの制御下にできる限り多くのレベルデザインの側面を配置しようとする人もいます(Audiosurf)。

多くのリズムゲームはハイブリッドアプローチを使用しています。ジェネレーターを使用してレベルの最初のドラフトを生成し、それを手で微調整して、よりプレイしやすくします。


回答ありがとうございます。詳しく調べます。Time.deltaTimeは本当に正確で、長い音楽で作成されるタイムラグはありませんか?
Shashimee 2017

@Shashimee十分正確である必要があります。丸めの違いで何も失わないようにしたい場合は、Time.time代わりに使用してください。
フィリップ2017

ゲームを開発するためのより多くの可能性を開くので、私は手続き型アプローチをお勧めします。プレイヤーは独自のトラックを追加できます。メッシュなど、パーティクルのようなものすべてをビートに変更できます。また、レベルの設計にかなりの時間を費やすことはありません。
率直な月_Max_ 2017

1
@Philipp残念ながら、ゲームがしばらく実行されている場合、Time.timeは不正確さをさらに受けやすくなります。トラックの開始時またはレベルの開始時ではなく、起動時からのゲーム時間を測定するため、1曲または2曲を再生した後、単純なデルタの合計と同じ数の低精度ビットが失われ、エラーが発生する可能性があります。ゲームを実行したままにしたり、スリープ/復元を繰り返したりすると、増加し続けます。
DMGregory

0

非常に一般的なのは、「ビートマップ」を作成するアプローチです。曲のビートを表すあらゆる種類のデータ。これは、テクスチャ、データファイル、またはその情報を保持するその他のものにすることができます。ほとんどの場合、手動で作成して、さまざまなビートや組み合わせ、オーディオマップの速度のバージョンを作成します。

ただし、オーディオファイルデータから手続き的に生成できます。

「ビートポイント」に一致する速度を取得するにはどうすればよいですか?いつオブジェクトをスポーンするのですか?

Speed = Distance / Time

Distance = GameObjectの作成ポイントと「ビートポイント」のポイント間の距離。

Time =オーディオの長さと構築されたビートマップで十分です。この情報を使用すると、オーディオ/マップのデータを分析して、正確なポイントに到達するためにオブジェクトをいつ生成する必要があるかを予測できます。これはすべて、そのオブジェクトをいつスポーンするかによって異なります。スポーン後に非常に高速にしたい場合は、後で非常に高速にスポーンします。通常の速度にしたい場合は、プレーヤーに到達するまでの時間が必要で、音声が適切なタイミングで再生されるまでの時間が必要です。

特定のオーディオマップのビートオブジェクトのスポーンのタイムスタンプを含む新しいマップを生成することもできます。ビートに合わせるには、ある時点でいくつかの予測を行う必要があります。最も一般的なスタイルではwhen、オブジェクトが特定ので動くようにスポーンすると予測するためspeedです。これらはランタイムで作成するか、以前に計算されたファイルから読み取るか、RAMに保存できます...

Osuはこれがないようなゲームを想定していますDistance、彼らは円が縮小する時間を持っています、bpm ...マップは一般的にカスタムメイドです。したがって、ビジュアルを計算する方法は、作成しているゲームのスタイルによっても異なります。

したがって、すべてをまとめると、値は相互に依存しています。あなたが持っているビートの数、スポーンポイントとプレーヤーの間の距離に依存し、提供されたデータに依存する場合もあります[一部のゲームは、すべてのビートの速度とその外観が手動で作成されたデータファイルにエンコードされています]。手続き的な方法で行う場合は、基本的にオーディオデータを使用してすべてを計算できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.