unityで音をならす手順を勉強したのでメモしておきます。
参考にしたのは以下のサイト
https://increment-log.com/unity-sound-se-play/
https://qiita.com/2dgames_jp/items/b3d7d204895d67742d0c
unityでは
- 音の発信源であるAudio Source
- 音を聞く場所であるAudio Listener
を両方セットすれば音が出るようになります。
3Dの場合はAudio ListenerとAudio Sourceが遠いと音が小さく聞こえるといった演出ができるようになっているようです。2Dの場合は関係ないけど両方要るのは同じ。
ボタンに取り付けてクリックしたら音がなるようにしようと思います。
1. Buttonを配置する
HierarchyのCreateからUIのButtonを選択するとButtonが出てきます。実行してマウスオーバーやクリックで色が変わるのを確認しておきます。
2. Sound Sourceを配置する
使用する音声データを用意します。今回は効果音ラボさんの音源をお借りしました。ダウンロードしたらdrag & dropでAssetに置きます。
https://soundeffect-lab.info/sound/button/
ButtonのInspectorを開き、Add ComponentからAudioのSound Sourceを追加したら、Assetに置いた音声ファイルをdrag & dropでInspectorのAudio Clipに置きます。decision7となってるところが今回置いた音声ファイルです。デフォルトではplay on awakeが有効になっているので試しに実行すると貼った音が鳴ります。なるのを確認したらplay on awakeを無効にしておきます。
Sound Sourceを置くと自動でSound Listenerも追加されます。Main Cameraをハイライトすると追加されてるのが確認できます。
3. コードで音を鳴らす
再度ButtonをハイライトしてAdd ComponentからNew Scriptを追加して以下のコードを書き込みます。同じオブジェクトにあるSound Sourceを取得してsound01に代入し、Buttonが押されたら1回鳴らすと書いてます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyButton : MonoBehaviour
{
private AudioSource sound01;
void Start()
{
sound01 = GetComponent<AudioSource>();
}
public void OnClick()
{
sound01.PlayOneShot(sound01.clip);
}
}
4. Buttonのクリックイベントを伝える先を指定する
Buttonは押したときに誰に情報を伝えるかが選べるようになっている為にこれだけではクリックに反応できません。
Buttonを押したときに上で書いたScriptのOnClick()を呼べるようにします。項目を増やす為にButtonのInspectorのOnClick()の+を押します。出てきた項目の左下が伝える対象ですので、HierarchyからButtonをdrag & dropします。次いで、呼ぶ関数を指定する為に右の選択肢からMyButton.OnClick()を選びます。
これで実行するとクリックする度に音が鳴る筈です。
複数の音源を鳴らす場合
Inspectorに複数の音源を登録します。
複数のGetComponent<>ではなくGetComponents<>と複数形にすると複数あるAudioSourceをまとめて読み込めます。取り込んだAudioSourcesの1番目は[0]、2番目は[1]を付けると呼んでこれます。
以下のコードではOnClick()を呼べば1番目の音源、OnClick2()を呼べば2番目の音源が再生されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyButton : MonoBehaviour
{
private AudioSource sound01;
private AudioSource sound02;
void Start()
{
AudioSource[] audioSources = GetComponents<AudioSource>();
sound01 = audioSources[0];
sound02 = audioSources[1];
}
public void OnClick()
{
sound01.PlayOneShot(sound01.clip);
}
public void OnClick2()
{
sound02.PlayOneShot(sound02.clip);
}
}
レッツエンジョイ!