パハットノート

※当サイトではGoogleアドセンス広告を利用しています

Unity 音が出るボタン&鳴らした直後に処理


ボタンから音を鳴らす方法(スクリプト無し)

離した瞬間に鳴らす場合

1. 音源ファイルの準備

  • 鳴らしたいSEをプロジェクトに追加。
  • 私は魔王魂様の「効果音 システム40」を使用しました。


2. AudioSourceの設定

  • 適当なゲームオブジェクトを用意したらaddComponentよりAudioSourceをアタッチ。

AudioSourceの追加

3. UIボタンの追加

Hierarchyのプラスボタンのようなものを押してから「UI」⇒「Button」としてシーン上に任意のUIボタンを追加。

4. ボタンの設定

  • OnClickの「+」を押す。

OnClickの追加

OnClickの各項目に次の処理を施す。

None (Object) 「2. AudioSourceの設定」で作成したオブジェクトをアタッチ
No Function AudioSource⇒PlayOneShot (AudioClip)
AudioClip 「1. 音源ファイルの準備」で用意した音源ファイルを設定

OnClickへの設定



ボタンを押した瞬間に鳴らす場合

先ほどの「4. ボタンの設定」の手順を以下の様に少し変えるだけです。

  1. Buttonに対してaddComponentから「EventTrigger」を追加。
  2. 「Add New Event Type」から「Poiner Down」を追加。
  3. 先ほどと同様の設定を行う。

EventTriggerへの設定


動作確認

  • 先ほど作成したボタンを動作させた結果を以下に示します。
  • 分かりやすくするためにマウスのポインタは星型としました。また、ボタンを押している間は星を赤く、そうでない間は青く表示しました。


離した瞬間に鳴らす場合

デモ(離した瞬間)

押した瞬間に鳴らす場合

デモ(押した瞬間)




音を鳴り終わった後に処理を行う場合

準備

先程と同様に「3. UIボタンの追加」までを完了させます。


ボタン用スクリプトの作成

次にボタン用に以下のスクリプトを作成しました。
コルーチンを使うことで音の鳴り終わりを判断しています。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System;

[Serializable]
public class SoundButton_C1
{
    bool isInited = false; //初期化されたか
    [SerializeField] AudioClip _audioClip; //音源
    [SerializeField] AudioSource _audioSource; //AudioSource
    [SerializeField] Button _button; //ボタン

    //初期化(AudioSourceに音源を設定)
    public void Init(Action action, MonoBehaviour monoBehaviour)
    {
        isInited = true;

        //音源を割り当てる
        _audioSource.clip = _audioClip;

        //OnClickに処理を割り当てる
        _button.onClick.AddListener(() => monoBehaviour.StartCoroutine(Play(action)));
    }

    //鳴り終わったことを通知するコルーチン
    IEnumerator Play(Action action)
    {
        //初期化されていなかったらエラー
        if (!isInited)
        {
            Debug.LogError("AudioSourceに音源を設定していない");
            yield break;
        }

        //ボタンが入力を受け付けないようにする
        _button.enabled = false;

        //効果音を鳴らす
        _audioSource.PlayOneShot(_audioClip);

        //終了まで待機
        yield return new WaitWhile(() => _audioSource.isPlaying);

        //処理
        action();

        //ボタンが入力を受け付けるようにする
        _button.enabled = true;
    }
}



呼び出し用スクリプトの作成

  • 呼び出し用のスクリプトを作成します。
  • 今回は鳴り終わった後にボタンを非表示にすることにしました。

using UnityEngine;

public class Sample : MonoBehaviour
{
    [SerializeField] GameObject buttonObj;
    [SerializeField] SoundButton_C1 soundButton;

    void Start()
    {
        //音が鳴り終わったらボタンを非表示にする
        soundButton.Init(() => buttonObj.SetActive(false), this);
    }
}



  • スクリプトのアタッチなど

適当なゲームオブジェクトを用意したら作成した「Sample.cs」をアタッチして、変数は次のように設定します。

ButtonObj Button(ゲームオブジェクト)
AudioClip 音源ファイル
AudioSource AudioSource
Button Button


スクリプトへの変数設定




動作確認

  • 先ほど作成したボタンを動作させた結果を以下に示します。
  • 分かりやすくするためにマウスのポインタは星型としました。また、ボタンを押している間は星を赤く、そうでない間は青く表示しました。

鳴り終わった後に非表示