CRI ADX(Unreal Engine) v1
中級編21 キューシートについて知ろう

これまでのレッスンでキューシートという言葉が度々出てきましたが、キューシートとは一体何なのでしょうか?

用語

キューシート

複数のキューをまとめるオブジェクトです。
キューシート単位で音声ファイル群が1つのファイルとして出力されます。 例えば、ゲーム内の1シーンや1キャラクタなどの単位で使用されることを想定しています。

ACBファイル

CRI Atom Craftで出力するファイル。キューシート1つに対して1つ出力されます。

Atom Cue Sheet アセット

ACBファイルをインポートすると生成されるアセットです。
ACBファイルの内容が保存されています。

Sound Atom CueSheetオブジェクト

C++オブジェクトです。
Raw ACB Data(詳細は後述)を内包します。
キューシート情報を取り扱うための関数を備えています。
このオブジェクトをuassetファイルとして保存したものがAtom Cue Sheet アセットとなります。

Raw ACB Data

ACB ファイルの内容のコピーです。

Atom Cue アセット

キューシート内のキューと一対一になっているアセットです。
どのキューを鳴らすのか指示するときにこのアセットを使います。

キューの再生にはキューシートが必要

キューを再生するには、それに紐づくキューシートがロード済みの状態である必要があります。
具体的には、次の両方の条件を満たしている必要があります。

キューシートがロード済みでない状態でキューの再生命令が出された場合、弊社プラグイン内部で下記の1もしくは2が暗黙的に行われます。
この仕組みによって、キューシートを意識することなくキューを再生することが可能となっています。
しかし品質の高いサウンド制御にはキューシートについての知識が必須となります。

※本ページの内容を1度に全て理解する必要はありません。少しずつ身に着けていきましょう。

1.Atom Cue Sheet アセットをロード済みの状態にする

ハード参照による暗黙的なロード

何らかのアセットのロード時、そのアセットとハード参照関係にあるアセットは芋づる式にロードされます。
Atom Cue Sheet アセットが暗黙的にロードされる具体例を挙げます。

  • Atom Cue アセットロード時にそれに紐づく Atom Cue Sheet アセットもロードされます
  • UE5エディタ上で Atom Cue Sheet アセットをレベル上にドラッグ&ドロップで配置すると、ゲーム実行時にレベルロードと共に Atom Cue Sheet アセットもロードされます

明示的なロード

もちろん、UE5が提供するアセットロードシステムを用いて明示的にロードすることもできます。 詳しくはUE5公式ドキュメントをご覧ください。

2.Atom Cue Sheet アセット内の Raw ACB Data をロード済みの状態にする

暗黙的なロード

  • キューの再生命令が出されたとき Raw ACB Data が暗黙的にロードされます。
  • UE5エディタ上で Atom Cue Sheet アセットをレベル上にドラッグ&ドロップで配置すると、ゲーム実行時にレベルロードと共に Atom Cue Sheet アセット, Raw ACB Data が暗黙的にロードされます。

明示的なロード

  • C++の場合
    USoundAtomCueSheet::LoadAtomCueSheet 関数を実行
  • ブループリントの場合
    LoadAtomCueSheet ノードを実行

上記の操作を行うことで Raw ACB Data を明示的にロードすることが可能です。

暗黙的なロードの詳細

デフォルト状態では、キューシートは必要になった時にロードされ、不要になった時に破棄される仕組みになっています。

キューシートが必要になったと判定されるのはどんなときですか?

キューの再生命令が出されたときです。
必要に応じて Atom Cue Sheet アセット, Raw ACB Data のロードが行われます。

キューシートが不要になったと判定されるのはどんなときですか?

Atom Cue Sheet アセットがどこからも参照されなくなったときです。
正確には Atom Cue Sheet アセットがどこからも参照されていない状態でGCのタイミングが来たとき Atom Cue Sheet アセット, Raw ACB Data のアンロードと破棄が行われます。

メリット

  • ブループリントを使う必要がありません
  • 管理をする必要がありません
  • ロード・アンロードを忘れる心配がありません

デメリット

ただし暗黙的なロードには次のようなデメリットがあります。

  • キューの再生命令を出してから実際に音が鳴るまでに時間がかかるケースがあります。
    キューシートがロードされていない状態でキューの再生命令を出すと、自動的にキューシートのロードが開始され、ロードが完了した後にキューが再生されます。
  • 効率の悪い処理になってしまうケースがあります。
    キューシートの必要/不要が目まぐるしく移り変わる状況ではキューシートを一度も破棄しないのが最善ですが、システムがそれを事前に知ることはできないため、不要になる度に破棄されてしまいます。
    例えば爆発音を鳴らすシチュエーションを考えます。
    1. SpawnSoundAtLocationで爆発キューを再生開始(暗黙的ロードが行われたこととします)
    2. 爆発キュー再生終了
    3. GCのタイミングで、下記オブジェクトが不要と判断され破棄されます
      • SpawnSoundAtLocationによって生成されたAtomComponent
      • 爆発キューアセット(※上記AtomComponent以外にこのアセットを参照しているオブジェクトは無いものとします)
      • 爆発系キューシートアセット(※爆発キューアセット以外にこのアセットを参照しているオブジェクトは無いものとします)

        爆発→GC→爆発→GCとなると暗黙的なロードと破棄が繰り返されてしまいます。

        暗黙的なロードと明示的なロードの使い分け

        暗黙的なロードが向いているシチュエーション

        • そのキューシートを使用する期間と暗黙的なロード・アンロードの期間が一致する場合
        • 再生開始が遅延しても問題ない場合
          例:マップに紐づくBGMや環境音のキューシート

        明示的なロードが向いているシチュエーション

        • 一つのパーシスタントレベルの中でそのキューシートを使用する期間が限定的な場合
          例:オープンワールドのゲーム, パーシスタントレベルの中に膨大なサブレベルがある場合
        • 再生開始が遅延してはならない場合
          例:SE全般

        品質の高いサウンド制御を目指して、暗黙的なロードと明示的なロードの使い分けに少しずつ挑戦していきましょう。