概要
以前の記事でボタンで音を鳴らす方法を紹介しました。
kiironomidori.hatenablog.com
今回はボタンで音を鳴らし、鳴り終わったら処理を呼び出すということをやりたくなったのでまとめました。
手順
手順1~3は前回の記事と全く同じです。
1. 音源ファイルの準備
鳴らしたいSEを準備します。
私は魔王魂様の「効果音 システム40」を使用しました。
2. AudioSourceの設定
適当なゲームオブジェクトを用意したらaddComponentよりAudioSourceをアタッチします。
分かりやすくするためにゲームオブジェクトは「AudioSource」としました。
3. UIボタンの追加
Hierarchyのプラスボタンのようなものを押してから「UI」⇒「Button」としてシーン上に任意のUIボタンを追加。
4. ボタン用スクリプトの作成
次にボタン用に以下のスクリプトを作成しました。
コルーチンを使うことで音の鳴り終わりを判断しています。
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; } }
5. 呼び出し用スクリプトの作成
呼び出し用のスクリプトを作成します。
今回は鳴り終わった後にボタンを非表示にすることにしました。
using UnityEngine; public class Sample : MonoBehaviour { [SerializeField] GameObject buttonObj; [SerializeField] SoundButton_C1 soundButton; void Start() { //音が鳴り終わったらボタンを非表示にする soundButton.Init(() => buttonObj.SetActive(false), this); } }
6. スクリプトのアタッチなど
適当なゲームオブジェクトを用意したら作成した「Sample.cs」をアタッチします。
変数は次のように設定します。
ButtonObj | 3で作成したボタン |
---|---|
AudioClip | 1で用意した音源ファイル |
AudioSource | 2で作成したAudioSource |
Button | 3で作成したボタン |
動作確認
先ほど作成したボタンを動作させた結果を以下に示します。
分かりやすくするためにマウスのポインタは星型としました。また、ボタンを押している間は星を赤く、そうでない間は青く表示しました。