こんちわ。昨日は雷がすごかったようですね・ω・。
今日はUnityのサウンドについてのちょっとした話です。
ふと、個人開発をしている時にサウンドの再生をどうしようか悩みました。
わざわざサウンドライブラリ的なものを導入するまでもない状況だったので、
AudioSourceコンポーネントが付いた GameObject を Instantiate する方法で音を出すことにしました。
その時に問題となるのが、サウンドを削除するタイミングです。
Destroy()の第二引数でサウンドの長さを指定する方法
まずは下記のようなコードにしました。
生成したサウンドプレハブからサウンドの長さを取得して、その長さ後にサウンドを削除するという方法です。
GameObject sound = Instantiate( soundPrefab ); float endTime = sound.GetComponent().clip.length; Destroy( sound , endTime );
しかし、この書き方は問題があります。
Unityの再生速度をn倍速にした場合に、サウンドだけが通常再生されるので、削除タイミングとサウンドの終了時間が合わなくなります。
例えば2倍速でゲームが進行している場合に、サウンドの再生途中でサウンドプレハブが削除されてしまい、音が途切れる感じに終わってしまうのです。
Time.timeScale を乗算する
最終的には下記の書き方にしました。
Time.timeScale を乗算することにより、再生中にDestroyされてしまうのを回避します。
GameObject sound = Instantiate( soundPrefab ); float endTime = sound.GetComponent().clip.length * Time.timeScale; Destroy( sound , endTime );
残ってるけど解決しない問題
上の書き方でも、サウンド再生中にUnityの再生速度を上げた場合は、先に削除されてしまいます。
→ 再生速度を遅くする分には問題ないと思いますが・・
とりあえず今回は上記書き方で目の前の問題は解決したので、このままで進めていきます・・・
何かいい方法がありましたらコメントください٩(๑❛ᴗ❛๑)۶
※追記
とりあえず、削除する時間を眺めにとっとけば良いのかな(笑)