VRC_AudioBank
AudioClip のリストを保持し、それらを指定された方法で AudioSource で鳴らすコンポーネント
参考:Unity マニュアル AudioClip 、 AudioSource

使用方法
公式ドキュメント を参照。
VRChat 技術メモ帳 | VRC_AudioBank に日本語での基本的な設定手順もあります。
設定項目の大まかな意味
Conditions
Playback Order
クリップのリストから次に再生するクリップをどうのように決めるかを指定する。
InOrder: クリップを登録した順番通りに鳴らすInOrderReversing: 実装未完Shuffle: クリップの順をシャッフルしてから再生するRandom: 次に再生するクリップをランダムに選択する
Playback Style
再生の進め方の指定。
OneShot: 一つのクリップだけを鳴らす。Continuous: 連続して再生する。クリップの演奏が終わったら、次のクリップを自動的に再生し始める
Source
再生に用いる AudioSource
Pitch Range
Min Pitch Range を下限 Max Pitch Range を上限として、再生するたびにランダムに pitch が選択される
(おそらく AudioSource の pitch の指定)
1 の場合にクリップの元の速度になる。(変えたくない場合は Min, Max 両方を 1 にする)
Clips
再生対象 AudioClip
Triggers
VRC_AudioBank が動作に伴って呼び出す Custom trigger を設定する。
OnPlay: 再生を開始する際に呼ぶOnStop: 再生が停止されると呼ぶOnChange: 再生するクリップを VRC_AudioBank が変更すると呼ぶ
RPCs
Play: 指定したクリップを再生し始めるStop: 再生をやめるPlayNext: 次のクリップを再生するShuffle: 再生リストの項目をランダムに入れ替える
詳細仕様(分析結果)
公式ドキュメントの説明は詳細についてきわめて不足している。 実際の動作を観察して、実態を書き出した。
(動作確認環境 Client 2018.3.1 build 625, SDK 2018.08.28.13.02)
データ
公式文書には存在しないが、 説明をしやすくするために以下のデータに名前を付ける。
ClipList
- VRC_AudioBank に登録した Clip のリスト
- この内容は変化することなく保持され続ける
Playlist
- シャッフル操作が要素を入れ替えるリスト
- 初期状態では
PlaylistはClipListと同じ並びになっている
CurrentIndex
- 現在演奏している(あるいは演奏が終わった)クリップを
Playlistで何番目であるかを指し示す。 - RCP
PlayNextが次に鳴らすクリップを特定するのに、このCurrentIndexが用いられる - 初期状態ではゼロになっている
- これは奇妙。初期状態から
PlayNextをすると二番目を鳴らす事になってしまう。 不具合とみなすべきだろう。特例的に -1 とした方が自然だ。
- これは奇妙。初期状態から
操作・振る舞い
RPC を実行した時の振る舞いを述べる。 設定によって異なる部分があるので、理解しやいと思われる順番に述べる。
RPC: Play
- 指定したクリップを再生する
- クリップの指定は、
ClipListでのゼロ始まりのインデックスでおこなう。 - 再生に先立ち
OnStopを実行する- 実際に再生していなくとも実行する
- 再生を開始するとともに
OnPlayを実行する- 無効なインデックスで再生できなかった場合には実行しない
CurrentIndexが変更される。- 少し奇妙な仕様だが次のようになっている。
Playで指定したクリップがPlaylist中で位置しているインデックスの値になる。- 例えば
ClipListにクリップが [a, b, c] と入っていてPlaylistはシャッフルされていて [c, a, b] となっている時に Play(0) は clip a を再生し、CurrentIndexは 1 になる。
Trigger: OnStop
- クリップの再生が最後に達して終了すると
OnStopを実行する - (補足:他のタイミングでも
OnStopは呼ばれる)
RPC: Stop
- 再生を停止する
OnStopを実行する。実際に再生していないくても実行する。- 例えば再生中に RPC
Stopが二回連続して実行されると(二回目には既に再生はしていないが)OnStopを二回実行する。
- 例えば再生中に RPC
Playback Style
再生がクリップの最後に達した時の振る舞いが Playback Style の設定により変化する。
(RPC Stop ではなく、再生して最後に達した場合の扱い)
OneShot- 何もしない
- (既述のように
OnStopは実行される)
Continuous- RPC
PlayNextが呼ばれたかのように動作する
- RPC
RPC: PlayNext
- 次のクリップを再生しようとする
- (補足:前述のように
Playback StyleがContinuousの場合でクリップの最後に達した時、ここで記述する動作が起きる) - クリップの選択(何が再生されるか、あるいはされないか)は
Playback Orderの設定に依存する。別記のそれぞれの項目を参照。 - 再生中か否かにかかわらず再生に先立ち
OnStopが実行される。 OnChangeを実行する。- 再生された場合
OnPlayを実行する。
RPC: Shuffle
Playlistの内容をシャッフルするShuffleはCurrentIndexを変えないPlaylistをシャッフルされていない初期状態にリセットする手段は用意されていない- シャッフル結果は、ワールドに置いてある同じ個数の clip を収めた VRC_AudioBank で同じになる。
- 疑似乱数のシード値が同じになるのだろう。
Playback Order: InOrder
- Playlist を順番に再生する基本となる動作モード。
- 初期状態で Playlist は ClipList の順と等しいので、シャッフルしていない場合、クリップを登録した順番に再生する
InOrderでのPlayNextの振る舞いCurrentIndexを先にひとつ進めて、進めたインデックスでPlaylistに格納されているクリップを再生する- 直前のクリップ再生停止時にクリップの最後まで再生したかは問わずに、次のクリップが再生対象になる。
- RPC
Stopにより再生停止したクリップから再び再生する直接的な方法は無い。
CurrentIndexが既に最後のクリップを指していた場合、再生は行われない。 先頭に戻るループ動作はしない。OnStop,OnChangeは実行される。- もう一度 PlayNext を実行すると
Playlistの先頭を再生する。CurrentIndexは 0 になる。
最後での PlayNext の振る舞い
ログを見ると例外が発生している。意図した実装とは思えない。 (InOrder_OneShot_AudioBank は GameObject に付けた名前)
Error - User code has thrown an exception, when calling PlayNext on InOrder_OneShot_AudioBank
Error - Exception has been thrown by the target of an invocation.
Exception - Array index is out of range.
Playback Order: InOrderReversing
- 実装されていない
Playback Order: Shuffle
Playlistをあらかじめシャッフルする。他の振る舞いはInOrderと同じ。CurrentIndexの初期値は、シャッフルの結果Playlist中で clip 0 が置かれているインデックスになる- 言い方を変えると初期状態が RPC を
Shuffle, Play(0), Stopと連続して呼び出しした後の状態と同じになっている - (この振る舞いは OneShot, Continuous で共通。)
- 言い方を変えると初期状態が RPC を
Playback StyleがContinuousの場合連続再生になるのだが、CurrentIndexの扱いがこのようになっているためにPlayNextで全てのクリップが再生されることは無い。 (特に、clip 0 は再生されることは無い)- 不自然なので不具合だと言っていいだろう。
Playback Order: Random
PlayNextが呼ばれると、 VRC_AudioBank は新たに再生するクリップをランダムに選択し、再生する- 補足:これまでの記述で必要なことは全て述べているが、実用性を踏まえたリファレンスとして補足説明をする
PlayかPlayNextで再生を開始する。Playの場合まず再生されるものは指定したクリップである。(これはランダム対象ではない)PlayNextの場合はランダムに選択される
Playback StyleがContinuousの場合は、クリップの再生が終わり次第、次のクリップがランダムに選択され、再生が継続する。
参考: Trigger まとめ
OnPlay- 実際に再生開始できた時に実行する
- きっかけには次がある
- RPC
Playの呼び出し - RPC
PlayNextの呼び出し Playback StyleがContinuousであることによる連続再生
- RPC
OnStop- 停止したあるいは停止しようとした時に実行する
- 実際には再生していなくても実行する
- 従って次の状況がありうる
- クリップの最後に達して自動的に実行
- RPC
Stopの呼び出しによって実行 - RPC
Playおよび RPCPlayNextによる再生に先立って実行
OnChange- RPC
PlayNextによってクリップを変更した時に実行する - RPC
Playでクリップが変わる時には(意味が不明だが)呼ばれない
- RPC
準正常系 および 異常系
RPC Play の指すインデックスが範囲外
OnStopは実行される- (ログに例外発生が報告される)
- 範囲外の
Play後に範囲内のPlayが呼ばれれば、正しく動作する。 - ゆえに、範囲外の
Playを呼び次にPlayNextを呼ぶと、Playlistの先頭を再生できる。- これで任意の状態から
Shuffle後にPlaylistの先頭からの再生することが可能になる。意図している動作かは不明だが。
- これで任意の状態から
VRC_AudioBank コンポーネントが disenabled の場合
- 通常どおり動作する
GameObject が inactive の場合
- 再生されない
OnPlayは実行されないOnStop,OnChangeは実行される
WTF : 要調査
- OnInteract Local から RPC target All で、全員の元で再生されないだと?
- Local で再生されるにとどまる。
- 以前は鳴っていたように思うのだが??
- シャッフルはそれぞれのマシンで行う(ようだ)。
- 同期する手段は(コンポーネントには)無い(ですよね?)