Unity-AudioSource组件利用UGUI搭建简易音乐播放器

实现功能主要4个脚本:音乐源管理资源加载,进度条SliderUI,音乐信息显示UI(prefab)

音乐源管理脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using System;

public class Sound_demo : MonoBehaviour
{
    AudioSource source;
    RectTransform content;
    SliderUI slider;//进度控制
    Slider volume;//音量控制

    int currentIndex = 0;//当前音频索引
                         // Use this for initialization
    void Start()
    {
        source = this.GetComponent<AudioSource>();//获该脚本下的音频源组件
        content = GameObject.Find("Content").GetComponent<RectTransform>();//找到Scroll View 下的Content 用来存放预设体
        slider = GameObject.Find("Slider").GetComponent<SliderUI>();//获取进度条下的自定义SliderUI:Slider组件
        volume = GameObject.Find("Volume").GetComponent<Slider>();//获取音量进度条
        InitSoundList();//初始化播放列表
    }

    // Update is called once per frame
    void Update()
    {
        //if (slider!=null&& source.isPlaying) {
        //    slider.value = source.time / Date_demo.Instance.clips[currentIndex].length;
        //}


        if (source == null || source.clip == null) return;
        if (source.isPlaying && SliderUI.State == SliderState.Normal)
        {

            print("当前歌曲下标:" + currentIndex);
            slider.value = source.time / source.clip.length;//进度条实时更新
            //判断歌曲是否播放完毕,开始播放下一首
            if (source.time>=source.clip.length*0.99f) {
                OnPlayNext();
            }
            source.volume = volume.value;//音量实时更新
        }
        //拖拽滑块播放
        if (SliderUI.State == SliderState.Up)
        {
            source.time = slider.value * source.clip.length;
            slider.Reset();
        }
    }
    void InitSoundList()
    {
        //根据加载的歌曲资源将其添加到播放列表中
        for (var i = 0; i < Date_demo.Instance.clips.Length; i++)
        {
            AudioClip clip = Date_demo.Instance.clips[i];
            GameObject Amusic = GameObject.Instantiate(Date_demo.Instance.prefabs, content);


            //动态添加脚本
            SoundItem item = Amusic.AddComponent<SoundItem>();
            item.InitItemInfo(clip.name, clip.length, i);
            item.AddListener(ToPlay);
        }
    }

    //点击播放
    private void ToPlay(int obj)
    {
        source.time = 0;
        if (source.isPlaying)
        {
            source.Stop();
        }
        currentIndex = obj;
        source.clip = Date_demo.Instance.clips[obj];
        source.Play();
    }

    //播放暂停按钮
    public void OnPlayPause()
    {

        if (source.isPlaying)
        {
            source.Pause();
            return;
        }
        if (source.clip == null)
        {
            source.clip = Date_demo.Instance.clips[currentIndex];
        }
        source.Play();
    }
    //播放下一曲
    public void OnPlayNext()
    {
        source.time = 0;
        currentIndex++;
        if (currentIndex >= Date_demo.Instance.clips.Length) 
        {
            currentIndex = 0;

        }
        source.clip = Date_demo.Instance.clips[currentIndex];
        source.Play();

    }
    //播放上一曲
    public void OnPlayLast()
    {
        source.time = 0;
        currentIndex--;
        if (currentIndex<0) {
            currentIndex = Date_demo.Instance.clips.Length - 1;
        }
        source.clip = Date_demo.Instance.clips[currentIndex];
        source.Play();
      
    }
}

 

 

资源加载脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Date_demo : MonoBehaviour {

    public static Date_demo Instance;
    [HideInInspector]
    public AudioClip[] clips;
    [HideInInspector]
    public GameObject prefabs;

    private void Awake()
    {
        
        Instance = this;
        //加载Resources/Musics目录下的音频
        clips = Resources.LoadAll<AudioClip>("Musics");
        //加载Resources/Amusic目录下的预制体
        prefabs = Resources.Load<GameObject>("Prefabs/Amusic");

    }
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

 

 

进度条SliderUI:(重写Slider组件)

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

public enum SliderState
{
    Normal, Down, Up
}
public class SliderUI :Slider{
    public static SliderState State = SliderState.Normal;//默认状态2,按下时候1,松开时候0
    public override void OnPointerDown(UnityEngine.EventSystems.PointerEventData eventData)
    {
        base.OnPointerDown(eventData);
        State = SliderState.Down;
        print("按下");

    }
    public override void OnPointerUp(UnityEngine.EventSystems.PointerEventData eventData)
    {
        base.OnPointerUp(eventData);
        State = SliderState.Up;
        print("松开");
    }
    public void Reset() {
        State = SliderState.Normal;
    }

}

 

 

音乐信息显示UI:(挂载在Prefab上)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//挂载每个音乐信息显示UI
public class SoundItem : MonoBehaviour {

	//歌曲委托,index歌曲索引
    public event System.Action<int> SOUNDPLAY;
    //保存索引
    private int index=-1;
    private Text nameUI;
    private Text timerUI;
    private void Awake()
    {
        nameUI = transform.Find("name").GetComponent<Text>();
        timerUI = transform.Find("time").GetComponent<Text>();
    }
    void Start () {
        Button but = this.GetComponent<Button>();
        but.onClick.AddListener(OnClick);
	}
    public void InitItemInfo(string soundName,float seconds,int index)
    {

        nameUI.text = soundName;
        timerUI.text = getTime(seconds);
        this.index = index;
    }
    //时间格式
    private string getTime(float len) {
        int f =(int) len/60;
        int h = f / 60;
        int s = (int)len % 60;
        return /*(h < 10 ? "0" + h : h.ToString()) + ":" +*/ (f < 10 ? "0" + f : f.ToString()) + ":" + (s<10?"0"+s:s.ToString());
    }
    /// <summary>
    /// 点击歌曲应该播放这首歌,触发歌曲播放事件
    /// </summary>
    private void OnClick() {
        if(SOUNDPLAY!=null&&index!=-1)
        SOUNDPLAY(index);
    }
    public void AddListener(System.Action<int> method) {
        SOUNDPLAY += method;
    }
}

End...

猜你喜欢

转载自blog.csdn.net/qq_42485607/article/details/82454569