今回はボタンを押したときや何かにぶつかった時などのSEや、BGMの再生の仕方について書いていきます。
音を鳴らすための準備
まず、Unityでは音を再生するには、音を発生させるオブジェクトと、その音を聞くためのオブジェクトが必要になります。音を再生するためのコンポーネントはAudio Sourceコンポーネント、音を聞き取るためのコンポーネントはAudio Listenerコンポーネントです。
ちなみにAudio Listenerコンポーネントはプロジェクトを最初に作った時に生成されるMain Cameraに初めからついています。
音が聞こえる範囲
Unityでは音が聞こえる範囲というのを調整できます。音が聞こえる範囲は、Audio SourceにあるMax Distanceで設定できます。この範囲の中にAudio Listenerがいれば音が再生されます。
厳密には音は再生されているのですが、音が聞こえる範囲にいないので再生されないといった感じです。
また、これにより三次元的に音が再生されるので、どこで音がなったかといったことがわかるようになります。ちなみにAudio SourceとAudioListenerを同じGameObjectにつけると常に同じ音量で音が再生されます。
BGMの再生
BGMの場合は、はじめから音が再生されループする音楽が用いられることが多いです。そのような音の場合、Audio SourceコンポーネントをAudio ListenerコンポーネントがついたGameObjectに追加し、Audio SourceのAudioClipに再生したいBGMを指定し、Play On AwakeとLoopにチェックを入れます。これだけで初めから音が再生されるようになります。
もし、任意のタイミングから鳴らしたい場合は、Play On Awakeのチェックをオフにし、再生したいタイミングで
1 |
gameObject.GetComponent<AudioSource> ().Play (); |
とすれば再生できます。
SEの再生
SEの場合、BGMと違い任意のタイミングで鳴らしつつ、同じSEを重ねて再生しなければならない場合があります。その場合、Play()メソッドではなく、PlayOneShot()メソッドを使用します。PlayOneShot()メソッドを使う場合はこのように書く必要があります。
1 2 |
AudioClip clip = gameObject.GetComponent<AudioSource> ().clip; gameObject.GetComponent<AudioSource> ().PlayOneShot (clip); |
AudioClipはAudio Sourceに追加せずに、スクリプトから直接指定しても大丈夫です。
Scene間をまたいでBGMを再生する
画面構成の問題でSceneを分けて作成する場合がありますが、Audio SourceコンポーネントはGameObjectに紐づくので、SceneをまたいでしまうとGameObjectが破棄されBGMが止まってしまいます。これを防ぐためには、GameObjectごとSceneをまたぐ必要があります。
Scene間をまたぐためには、SceneをまたぐGameObjectに対して以下のスクリプトが記述されたものをアタッチすれば、Sceneの遷移でGameObjectが破棄されずにBGMが鳴り続けます。
1 |
DontDestroyOnLoad (this.gameObject); |
これで明示的に破棄するまでゲーム上に残り続けます。破棄するには、Destroy()メソッドを使用すれば破棄されます。
終わりに
今回は基本的なサウンドの使用方法について書きました。サウンドを使うとした場合はだいたいがBGMを流すか特定のタイミングで1回鳴らすの場合が多いので今回書いた内容でほぼできると思います。
地味によくやることが、AudioClipをちゃんと取得できていないのに再生しようとして「音がならない!」といってハマることだったりします。
次回はボタンのようなGUIを作成するために、uGUIの使い方について書いていきます。
では、また。