ミドリ黄のプログラミングメモノート

主にUnity(C#)を中心としたプログラムの備忘録

Unity 音楽再生アプリの改善(スライダーから再生位置の変更)





はじめに

以前の記事で作成した下の音楽再生アプリもどきでは再生位置をスライダーにより変更ができなかったので本記事でその方法を紹介します。






解決案

具体的には

  • TimeSliderのスライダーの値を変更している間は、その値により音楽の再生位置を変更する。

という処理をできるようにすればよさそうです。




プログラムの書き換え

以前の記事で紹介した「TimeLineController.cs」を次のように書き換えればよいです。
Pointer Downが呼び出し~Pointer Upが呼び出されるまでの間がスライダーの値を変更している時間なのでこれを利用しています。
EventTriggerの追加や設定の方法についてはこの記事を参考にしてください。
kiironomidori.hatenablog.com


using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;//追加

public class TimeLineController : MonoBehaviour
{
    [SerializeField] Text text;
    [SerializeField] Slider slider;
    float length;

    //追加
    bool isTouching = false;//タッチしているかどうか
    bool isPlaying = false;//タッチする直前に再生されていたかどうか

    string Str(float length)
    {
        int min = (int)length / 60;
        int sec = (int)length % 60;
        return $"{min}:{sec.ToString("D2")}";
    }

    //追加
    void EditSlider()
    {
        //add EventTrigger
        EventTrigger eventTrigger = slider.gameObject.AddComponent<EventTrigger>();

        //Pointer Downの追加
        EventTrigger.Entry entry = new EventTrigger.Entry() 
        { 
            eventID = EventTriggerType.PointerDown 
        };
        entry.callback.AddListener((data) => 
        { 
            isTouching = true;
            if (MusicController.I.audioSource.isPlaying)//再生されていたら停止
            {
                isPlaying = true;
                MusicController.I.audioSource.Pause();
            }
        });
        eventTrigger.triggers.Add(entry);

        //PointerUpの追加
        EventTrigger.Entry entry2 = new EventTrigger.Entry()
        {
            eventID = EventTriggerType.PointerUp
        };
        entry2.callback.AddListener((data) => 
        { 
            isTouching = false;
            if (isPlaying)//スライダーを操作する直前が再生状態なら再開する
            {
                MusicController.I.audioSource.Play();
            }
            isPlaying = false;
        });
        eventTrigger.triggers.Add(entry2);
    }

    private void Start()
    {
        //曲の全体の長さを取得
        length = MusicController.I.audioSource.clip.length;

        //追加
        EditSlider();
    }

    void Update()
    {
        //現在の再生個所を表示
        float nowTime = MusicController.I.audioSource.time;

        //テキスト表示
        text.text = $"{Str(nowTime)}/{Str(length)}";

        if (!isTouching)
        {
            //スライダーの設定
            slider.value = nowTime / length;
        }

        else
        {
            MusicController.I.audioSource.time = length * slider.value;
        }
    }
}





実行

今回の変更を加えると挙動が改善されていることが確認できる。