196の日記

完全に開発メモと雑談、その他忘れそうな計算式などを書き溜める場所になっています!

Unity 再生中のAudioSourceのclipを上書きして放置

 タイトル通りです。
 
 今までは音が流れればいいや確認できればいいやの流れであまり気にせずやってきましたが、実際にスマートフォンなどで動かす場合、なるべく消費するメモリは少なくしたいと思いました。なので、Awake時にまとめてリソースをとりあえず読み込んでおく実装をやめ、BGMを変更するたびにそれを毎回読み込むことに!(これくらい初めからやっておけよ!)

 この時一つ気になったのは、AudioSourceのclipを変更した時、元のclipはどうなっているのか。


実験1

 まずは下のようなコードで実験。nowPlayBGMは常に今流れているBGMを指しています。



実行初期
f:id:thinline196:20170105003738p:plain



一曲目を再生すると、、
f:id:thinline196:20170105003809p:plain



二曲目を再生
f:id:thinline196:20170105003834p:plain



もう一度1曲目を再生してもメモリは変わらず。なので、上書きしただけでは消えませんね。


実験2

 実は今回再生に使用しているクラスはシングルトンなクラスなのですが、これはモンスターとエンカウントしたらシーンが切り替わる前から戦闘BGMを流し始めたいからです。つまり、一つのBGMは再生されたら次のシーンでもそのまま流れ続けます。では、シーンを遷移させた場合、使われていない方のBGMのリソースは解放されたりはしないのでしょうか?やってみます。


まずこちらが先ほど通り、2曲目を再生させた状態
f:id:thinline196:20170105004419p:plain



で、こちらが2曲目を流したまま別のシーンへ遷移した後の状況(2曲目は流れ続けています)
f:id:thinline196:20170105004727p:plain



使われていないBGMはしっかりリリースされていますね!さすがUnity!



実験3

 無事、使われていないものはリリースされましたが、自分の手で管理するのがやはり一番安全。同じシーン内でもBGMを変更する場面があるかもしれません。なので以下のように書き換えてみました。



まず一曲目を再生した状態
f:id:thinline196:20170105010137p:plain



お次は二曲目を再生した状態
f:id:thinline196:20170105010222p:plain



しっかりリリースされています!今回の場面では、gameObject.Destory()を使用するとエラーが出てしまいましたが、これを使ってリリースする場面もおそらくあると思います。



まとめ

 BGMは一つ一つのデータが大きいから、ボトルネックになりやすいかなと思いとりあえずやって見ました。シーンを跨げば一応解放されますが、自分の手で管理するぶんに越したことはありませんね!
 あと、今までコードをブログに直接貼り付けていましたが、今回からgistを使用させてもらいました。バックグラウンドが黒にならないのが気になって、今まで使用していなかったのですが、やはり色付き具合が前より少しマシで、何よりコードとして見やすいかなと思ったので、これからgistを使用することにしました。


以上お疲れです。