[Unity] Unityで音を再生する


音もコンポーネント

Unityは音も非常に手軽に使うことが出来ます。
Unityのその他の概念と同様、音もコンポーネントとして扱われます。

音(AudioClip)は、AudioSource(音源)から再生されます。
どういうことかと言うと、Unityの世界は3Dのため、音が鳴った位置も大事になります。
現実世界でも、近くのものほど音が大きく、遠くなるにつれて音が小さくなりますよね。
それをシミュレートしてくれる、というわけです。

AudioListenerで音を聴く

そのため必然的に、音は音源だけではなく「 その音をどこで聞くか 」という設定も必要になります。
その音を聞く対象もGameObjectとして配置してやる必要があるわけです。
このGameObjectにアタッチするコンポーネントはAudioListenerと呼ばれます。
(そして大抵の場合、音を拾うのはカメラのため、デフォルトでMain CameraにはこのAudioListenerコンポーネントがアタッチされています)

まとめると、

  • GameObjectに音源コンポーネントを追加する
  • 再生したい音(AudioClip)をコンポーネントに紐付ける
  • 音を拾うコンポーネント(AudioListener)をアタッチしたオブジェクトを配置する

BGMは2D音源で

3Dでの音は、その音を聴くAudioListenerの位置によって音の大きさなどが変わります。
しかし、BGMは通常、そうした3D空間にあるものではなく、一定の音量で流れているものだと思います。
こうした音源の場合は、3D音源として扱うのではなく、2D音源として扱います。

設定は簡単で、BGMなど2D音源として扱いたい音のリソース(AudioClip)を、Projectペインから選択肢、Inspectorで3D Soundのチェックボックスを外すだけです。

変更後は、右下にある「Apply」ボタンを押して変更を確定しておきます。

SEをトリガー駆動で鳴らす

SEは通常、なにかしらのイベントがトリガーとなって鳴るのが普通でしょう。
(例えば弾が当たって爆発した、とか)

なので、イベント発生時に音を再生します。
そして音の再生は、前述の通りAudioSourceが担当します。
ということで、シンプルなコード例を載せておきます。(備忘録的に)

// AudioSourceがアタッチされたGameObject

void OnCollisionEnter(Collision collision) {
    AudioSource audioSource = gameObject.GetComponent<AudioSource>();
    audioSource.PlayOneShot(anySE);
}

// あるいは、audioSourceのclipプロパティに設定して再生
void OnCollisionEnter(Collision collision) {
    AudioSource audioSource = gameObject.GetComponent<AudioSource>();
    audioSource.clip = anySE;
    auidoSource.Play();
}