音もコンポーネント
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();
}