【Unity入門】汎用サウンドマネージャー(Sound Manager)の作り方 後編

Unity入門講座


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

あると便利なサウンドマネージャー(SoundManager)

前回は

  • 手軽に効果音が管理・再生できる
  • 再生する効果音の指定にわかりやすい別名がつけられる

まで作りました。

前回の記事:

【Unity入門】汎用サウンドマネージャー(Sound Manager)の作り方 前編
ゲームを作るに当たって、最後に手を入れがちですが、とても重要なのが「サウンド」です。 Unityには標準のサウンド機能(AudioClip,AudioSource,AudioListener)があるのですが、これをそのまま使うのはちょ...

今回は

  • 同じ音源が同一・または近辺フレームで鳴って音割れするのを避ける

を実装して完成を目指します。

また、作ったマネージャーオブジェクトをどのようにして他オブジェクトからアクセスさせるか、も詳しく解説していきます。

ではやっていきましょう。

音割れ対策機能をSoundManagerに追加する

さて、音割れ対策ですが、「そもそも本当に音割れなんてするの?」という方もいらっしゃるかもしれませんね。
というより、音割れした状態を作ってからじゃないと音割れ対策ができているかどうかはよくわからないですよね。

音割れさせるのは簡単です。 同じ音を同時に重ねて再生すれば良いです。

前回作った SoundTestスクリプトを一部修正(改悪)しましょう。

元はこの状態ですが、Cキーの箇所だけ改悪してしまいましょう。 InputGetKeyDownDown を消して InputGetKey にしてしまいます。

これでCキーのみ「押した時」ではなく、「押している間」になるので、Cキーを押し続けると、毎フレーム同じ効果音が再生されることになります。

では、スクリプトの保存をしてUnityEditor側で確認をしてみましょう。

※注意!! 音量が大きく、または音割れをする可能性が高いです。 パソコンからの音声出力をだいぶ下げてから確認することをおすすめします。

では、Cキーを押しっぱなしにしてみるとどうでしょう? 音割れに違い状態になったんじゃないでしょうか(割り当てている音によってはあまり実感出来ないかもしれません、ちょっと再生時間の長めの効果音をセットしておくとわかりやすいです)

再生時間の管理

さて、この「音割れ」を対策するために、音源(SoundClicp)毎に再生タイミングを覚えておき、前回再生タイミング と 現在時間 を比較して、ある程度の間隔が開いてない場合は再生しない。というようにスクリプトを修正します。

SoundManagerスクリプトの、音源を管理しているSoundData

  • 前回音源再生時間→ float playedTime;

をメンバ変数に追加します。

次に、SoundManager自体に

  • 一度再生してから、次再生出来るまでの間隔(秒)→float playableDistance;

を[SerializeField]付きでメンバ変数として追加します。

そして、Playメソッドで、再生時間の保持と、前回再生時間今回時間を比較するように修正をします。

なお、この「現在時間」を取得するのに Time.realtimeSinceStartup を使用しています。

これは、ゲームが起動してからの実経過時間が入っており、この「実」経過時間を使うことにより、超高速で動くPC(1000fps)と、低速で動くPC(15fps)でも 同じ挙動になるようにしています(逆に言うとフレームで管理してしまうとPCの性能によっては音割れが発生したり、しなかったりしてしまいます)

修正後のSoundManagerスクリプト全体は以下のようになります。

では、スクリプトを保存してUnityEdtiorでプレイボタンを押して確認をしてみましょう。

再生間隔はInspectorで指定出来ます

Cキーを押しても、ある程度の間隔(PlayableDistance秒)で再生されるようになったのでは無いでしょうか。

とりあえず、本講座ではこれでSoundManagerに関しては一旦の完成ということになります。(非常にシンプルではありますが)

前回の冒頭にも書きましたが、便利オブジェクト(Manager)は、その時々で要件が変わってきます。

  • ループ再生出来るようにしたい
  • 外から好きなタイミングで停止出来るようにしたい
  • 全効果音を停止出来るようにしたい
  • フェードイン・フェードアウトでBGMを鳴らしたい

などなど。
あなたが思う最強のSoundManagerはぜひ、あなた自身で作ってみてください。

SoundManager 作り方のおさらい

SoundManagerの基本機能が完成しました。

今回はUnity上で動くものとして作りましたが、作り方・考え方は別のゲームエンジン等にも転用が可能な汎用的なものばかりになっているので、無駄になりにくいと思います。

また、SoundManagerに限らず、自分用(またはチーム用)の各種Manageクラス・便利処理は作っておくと、ゲームジャムやプロトタイプ作成等の時、開発速度をグンと上げることが出来て効果を発揮するので、色々と用意しておくのも良いのではないでしょうか。

また、SoundManagerへのアクセス方法としてさらに実用的な方法に関しても次の記事で解説しました。

Unityに元々あるインスペクターからではなく、シングルトン、サービスロケータなどを用いたManagerオブジェクトへのアクセス方法を身に付けたい方は次の記事も読んでみてください。

次の記事:

【Unity入門】特定ゲームオブジェクトへスクリプトからアクセスする方法まとめ
この記事では、Unityプログラミングをしているとよく発生する問題 「別ゲームオブジェクトにスクリプトからアクセスしたい」 に対する解決策をまとめて解説していきます。 通常のUnity機能はもちろん、シングルトンやサービス...

コメント

タイトルとURLをコピーしました