忙しい人向け結論
2DオブジェクトのDestoryと共にSE再生はできない。
常設オブジェクトでSE再生させた。
#UnityでのSE再生の実装
- AudioSourceコンポーネントを付与してAudioClipに再生したい音源を登録する
- 鳴らしたいタイミングで以下のように呼び出す
[SerializeField] AudioSource _audio = null;
void PlaySe()
{
// 該当の音を1回だけ再生する
_audio.PlayOneShot( _audio.clip );
}
これで音が鳴らず、ハマったときに調査した項目です。
※Unity再起動、PCの音量設定は確認済み。
##Mute Audioの設定
Gameウィンドウの「MuteAudio」が押された状態(下記画像参照)だとすべての音が鳴りません。
##AudioSourceのSpatialBlendの設定
今回作成中のゲームは2Dゲームでした。
AudioSourceコンポーネント内の「SpatialBlend」が1=完全に3Dに寄った状態になると
SE再生時にカメラとの距離を考慮した3D空間のような立体的なサウンド再生になるようです。
この設定により、音は鳴るのですが、異常に小さい音で鳴ってました。
Unityリファレンス:AudioSource.spatialBlend
2Dの場合この考慮は不要になるので、常に一定の音量で鳴らせるように0=完全に2Dに寄った状態にします。
##音を鳴らすタイミング
「ブロック崩しゲームのブロックが消えるときにSEを鳴らす」ことを目的としていました。
オブジェクトに任意のスクリプトとAudioSourceコンポーネントが付与されていて、
オブジェクト削除時に自身のAudioSourceコンポーネントを再生しようとします。
[SerializeField] AudioSource _audio = null;
void DestroyObject()
{
// 該当の音を1回だけ再生する
_audio.PlayOneShot( _audio.clip );
// オブジェクトを削除する
Destroy( this.gameObject );
}
この場合、再生した直後にオブジェクト本体が消えてしまうため、SEは再生されません。
###PlayClipAtPointによる再生
PlayClipAtPointを利用すると、AudioSourceコンポーネントを動的にシーンに配置して、
なおかつSE再生が終了すると自滅してくれます。
Unityリファレンス:AudioSource.PlayClipAtPoint
[SerializeField] AudioSource _audio = null;
void DestroyObject()
{
// // 該当の音を1回だけ再生する
// _audio.PlayOneShot( _audio.clip );
// SE再生専用オブジェクトが一時的に作られるので、音が鳴る
AudioSource.PlayClipAtPoint( _audio.clip, transform.position);
// オブジェクトを削除する
Destroy( this.gameObject );
}
3Dゲームなら、この方法で問題ないと思います。
この方法で作成されたAudioSourceの設定がAudioSource.spatialBlend=1になっています。
前述したように、2Dゲームの場合、このパラメータは0であって欲しいのですが、
PlayClipAtPointからこの値を設定する術がありません。(2018.3.2f1利用しています)
PlayClipAtPointにて作成されたオブジェクトにアクセスして~というのもFindで重い検索をするわけにもいかず…
###別のSEオブジェクトを用意して再生した
ここまでの実装はオブジェクトAが自身がDestroyされる直前にSEを再生しようとしていました。
実装を変更して、オブジェクトB(常設)がオブジェクトAのDestroy呼び出し時に、オブジェクトBがSEを再生する形で対応しました。
これで今回のケースは解決しました。
PlayClipAtPointの2D版ないんですかね???