Unityにはタイムラインの既存のサポートがありますか?


13

私はUnity3Dでのゲームの開発を計画しており、エンジンが既に提供しているものと、自分でコーディングしなければならないものを一致させようとしています。

ゲーム自体はリズムゲームになります。つまり、オーディオイベントとグラフィックイベントを同期させて、予定どおりにプレイできるようにします。私が避けたいのは、オーディオまたはグラフィックの一方が他方よりも速く進行し始める潜在的な遅延のシナリオです。

大学でのゲームデザインクラスでこのタイプの調整システムについて議論したとき、教授はこのタイプのデザインを「タイムライン」クラスと呼びました。これらの1つまたは複数をインスタンス化して、異なる速度で進行させ、将来起こることをスケジュールし、定期的なイベントを同期させることができるという考えです。ただし、特定のAPIが「タイムライン」機能を備えているかどうかをグーグルで調べるのは無益な努力であったため、これを「タイムライン」クラスと呼ぶことは私の教授自身に限定されていたようです。

この種の機能にはもっと一般的な名前がありますか?Unityには、このようなイベントのスケジューリングを調整するための既存のメソッドがありますか、それともエンジンに組み込む必要があるのですか?そして、もしそうなら、私はいくつかのチュートリアルに向けられていることを感謝します!


また、同様のタイムラインクラスを使用しました(同じ名前でもありました)。パターンのより一般的な名前は私にはわかりませんが、おそらく機能的反応型プログラミング、コルーチンまたは他の非同期概念を介して実装される可能性があります。
interphx

回答:


10

この機能はUnityでは使用できませんが、このようなタイムラインの基本的な実装は難しくありません。

私はそれについてどうやって行くのですか?

  • あなたのタイムラインクラスは、内部的に使用していますプライオリティキューをストアイベントにデータ構造として。
  • イベントは、ちょうど時間とコールバックである可能性があります。したがって、タイムラインにイベントを追加するのは次のように簡単ですtimeline.AddEvent(0.25f, MyCallback)
  • ごとUpdateに、タイムラインクラスは次のようになります。

    1. float経過時間で再生ヘッド(単純)をインクリメントします
    2. 優先度キューの先頭を確認し、現在の再生ヘッド以下の優先度(時間など)を持つすべてのイベントのコールバックを削除して呼び出します。

ある種の巻き戻しまたは再生機能が必要な場合、もちろん、キューからすべてのイベントを削除するのは愚かなことです(巻き戻し時にそれらを再度追加する必要があることを意味します)。代わりに、イベントを保持する配列を使用することもできます。イベントは、で構成されますTimeCallback。配列をでソートし続ける必要がありますTime

次に、配列から項目を削除する代わりに、現在のarray-indexを追跡し、更新ごとにそのインデックスから先にシークし、それにPlayhead >= Time応じてインデックスを増やしながらすべてのコールバックを実行します。

より高速な再生速度を実装すると、両方の実装で機能し、次のように簡単になります。

Playhead += Time.deltaTime * playbackSpeed

2
「経過時間で再生ヘッド(単純なフロート)をインクリメントする」 -これを行うと、集約された浮動小数点エラーが発生します。代わりにTime.time (ゲームが開始されてからの時間)を使用する必要があります。
BlueRaja-ダニーPflughoeft 14年

4

いいえ、Unity3DにはそのようなAPIはすぐに使用できません。

ただし、コルーチンをサポートしているので、それらを調べることをお勧めします。通常、コルーチンを使用すると、イベントのスケジューリングと同期が非常に簡単になります。


1

2012年の回答以来、これが新しいものかどうかはわかりませんが、Unityは(Legacy)Animation Editorを介して実際にタイムラインコントロールをサポートしています。

この機能は主に曲線を使用してオブジェクトパラメータをアニメートすることを目的としていますが、アニメーションイベントでスクリプトをトリガーする機能が含まれています。これらのスクリプトは、グラフィックスとオーディオを駆動できます。

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