イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

サウンド管理の実装についての考察

++サウンドの種類 

・BGMなど距離に関係なくループで流す音 - A

・ボタンなど距離に関係なくワンタイムで流す音 - B

・オブジェクト生成時にそのオブジェクトから流すワンタイムで距離減衰ありで流す音 - C

・生成されたオブジェクトに距離減衰ありでループで流れ続ける音 -D

接触判定時等に流すオブジェクトに付与されない距離減衰ありの音

- E

上からA,B,C,D,Eと呼称する

 

 ++オフラインでのサウンドマネージャーでの動き

A、Bについては距離減衰がないので、Resourcesなどから音をロードしてサウンドマネージャーに音を登録しておき、適当なタイミングでPlayすればいい。

 

C,Dの場合はそのオブジェクトにAudioSourceを付与し、生成時に音が流れる必要がある。そのオブジェクトのprefabに直接AudioSourceを付与しておくのが最も手軽であるが、これだと音量調整等が出来ない。具体的には、AudioSourceコンポーネントを付与し、パラメータを設定して、Playをコールする。

(PlayOnAwakeをオンにしていても、これはコンポーネントがアクティブになったタイミングで音を鳴らすものなので、AddComponentした後にAudioClip等のパラメータを設定するため、Playしないと音がならない)

 

サウンドマネージャーで音を一元管理している場合、その生成したオブジェクトに新たにAudioSourceを付与する必要がある。

Eは接触判定の座標にAudioSourceを付与した空のオブジェクトでも設置して流し終えたら削除する

サウンドマネージャー1 - イラスト、モデリング、Unity、VR関連

 

++オンラインの場合のサウンドマネージャーの動き

オンラインの場合、サーバーでオブジェクトを生成=>それがクライアント側にも同期される、という流れでオブジェクトが生成される。

そのため、C,D,Eのような場合、

単純にオブジェクト生成時,つまりInstantiateするときに音を流しても、サーバー側のみで流れるだけになってしまう。

クライアントからサーバーへとオブジェクト生成の命令を発行するときに流しても、そのクライアントのみでしか流れない。

オブジェクト生成時に全クライアントへとそのオブジェクトに対応する音を流すように命令を発する必要があるが、オブジェクト生成通知と音声通知が分離するので通信量の増加とオブジェクト生成と音声発生のタイミングでラグが起きうる可能性がある。

また、AddComponentしてから音を流すにはPlayをコールする必要があるが、サーバー生成=>クライアントに同期されてクライアントで生成される、ために、クライアント側でPlayをコールする必要があるが、これを実現するには、結局、その生成するオブジェクトにPlayをコールする別のスクリプトが必要になってしまう。

 

オンライン・オフライン共通の問題として、魔法の発射のような同一メソッドで入力内容によって生成するオブジェクトが違う場合、オブジェクトと音を結びつける辞書を新たに作る必要が出てきてしまう。

 

これなら、サウンドマネージャーで一元管理するのではなく、生成する個々のオブジェクトに、スクリプトを付与し、そのクラスでボリュームなど共通のパラメータをstatic変数で管理し、AudioSourceを[SerializeField]に入れ、Start()でその音を流す、という感じにした方がいいのでなかろうか。

サウンドマネージャー2 - イラスト、モデリング、Unity、VR関連