Unity视频播放器,支持播放进度拖拽

在这里插入图片描述
在这里插入图片描述

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
/// <summary>
/// 视频播放器
/// </summary>
public class CustomVideoPlayer : MonoBehaviour
{
    [HideInInspector]
    public VideoPlayer mVideoPlayer;
    [HideInInspector]
    public Button mBtnPlay, mBtnPause, mBtnReplay, mBtnClose;
    [HideInInspector]
    public Slider mSlider;
    
    private RawImage mRawImage;
    private bool isTurnOnListen = false;
    private ReferenceCollector rc;
    
    // 当前视频的总时间值和当前播放时间值的参数
    private int currentHour;
    private int currentMinute;
    private int currentSecond;
    private int clipHour;
    private int clipMinute;
    private int clipSecond;
    
    private void Awake()
    {
        mVideoPlayer = GetComponent<VideoPlayer>();
        //mUIView = GetComponentInChildren<UIView>();

        rc = GetComponent<ReferenceCollector>();
        mRawImage = rc.Get<GameObject>("RawImage").GetComponent<RawImage>();
        mBtnPlay = rc.Get<GameObject>("BtnPlay").GetComponent<Button>();
        mBtnPause = rc.Get<GameObject>("BtnPause").GetComponent<Button>();
        mBtnReplay = rc.Get<GameObject>("BtnReplay").GetComponent<Button>();
        mBtnClose = rc.Get<GameObject>("BtnClose").GetComponent<Button>();
        mSlider = rc.Get<GameObject>("Slider").GetComponent<Slider>();
        mBtnPlay?.onClick.AddListener(Play);
        mBtnPause?.onClick.AddListener(Pause);
        mBtnReplay?.onClick.AddListener(Replay);
        mBtnClose?.onClick.AddListener(Close);
    }
    private void Update()
    {
        ShowVideoTime();
        
        if(isTurnOnListen)
        {
            //Debug.Log("--------还未播放完毕:" + mVideoPlayer.time + "      " + mVideoPlayer.clip.length);
            if (mVideoPlayer.clip.length - mVideoPlayer.time <= 0.1f)
            {
                //Debug.Log("--------播放完毕");
                mVideoPlayer.Stop();
                isTurnOnListen = false;
                mBtnPlay.gameObject.SetActive(true);
                mBtnPause.gameObject.SetActive(false);
            }
        }
    }
    
    /// <summary>
    /// 更新进度条
    /// </summary>
    private void ShowVideoTime()
    {
        // 当前的视频播放时间
        currentHour = (int)mVideoPlayer.time / 3600;
        currentMinute = (int)(mVideoPlayer.time - currentHour * 3600) / 60;
        currentSecond = (int)(mVideoPlayer.time - currentHour * 3600 - currentMinute * 60);
        // // 把当前视频播放的时间显示在 Text 上
        // videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2}",
        //     currentHour, currentMinute, currentSecond);
        // 把当前视频播放的时间比例赋值到 Slider 上
        mSlider.value = (float)(mVideoPlayer.time / mVideoPlayer.clip.length);
    }
    
    public void Play(VideoClip clip)
    {
        mBtnPlay.gameObject.SetActive(false);
        mBtnPause.gameObject.SetActive(true);
        mVideoPlayer.clip = clip;
        mVideoPlayer.Play();

        isTurnOnListen = true;
    }
    public void Play()
    {
        mBtnPlay.gameObject.SetActive(false);
        mBtnPause.gameObject.SetActive(true);
        if (mVideoPlayer.isPlaying) return;
        mVideoPlayer.Play();

        isTurnOnListen = true;
    }
    public void Pause()
    {
        mBtnPlay.gameObject.SetActive(true);
        mBtnPause.gameObject.SetActive(false);
        if (mVideoPlayer.isPlaying) mVideoPlayer.Pause();

        isTurnOnListen = false;
    }
    public void Replay()
    {
        mBtnPlay.gameObject.SetActive(false);
        mBtnPause.gameObject.SetActive(true);
        mVideoPlayer.Stop();
        mVideoPlayer.Play();

        isTurnOnListen = true;
    }
    public void Close()
    {
        mVideoPlayer.Stop();
        isTurnOnListen = false;
    }
}

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

/// <summary>
/// 给视频播放器的进度条添加上拖拽功能
/// </summary>
public class VideoPlayerSliderEvent : MonoBehaviour, IDragHandler, IEndDragHandler
{
    [SerializeField]
    public CustomVideoPlayer toPlayVideo;        // 视频播放的脚本
 
    private EventTrigger m_eventTrigger;

    void Start()
    {
        AddTriggersListener(toPlayVideo.mSlider.gameObject, EventTriggerType.Drag, OnSliderDrage);
        AddTriggersListener(toPlayVideo.mSlider.gameObject, EventTriggerType.EndDrag, OnSliderEndDrage);
    }

    /// <summary>
    /// 为obj添加Eventrigger监听事件  
    /// </summary>
    /// <param name="_obj"></param>
    /// <param name="_action"></param>
    /// <param name="_eventType"></param>
    public void AddTriggersListener(GameObject _obj,  EventTriggerType _eventType, UnityAction<BaseEventData> _action)
    {
        m_eventTrigger = _obj.GetComponent<EventTrigger>();
        if (m_eventTrigger == null)
        {
            m_eventTrigger = _obj.AddComponent<EventTrigger>();
        }
        if (m_eventTrigger.triggers.Count == 0)
        {
            m_eventTrigger.triggers = new List<EventTrigger.Entry>();
        }
        //定义所要绑定的事件类型   
        EventTrigger.Entry entry = new EventTrigger.Entry();
        //设置事件类型    
        entry.eventID = _eventType;
        //定义回调函数    
        UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(_action);
        //设置回调函数    
        entry.callback.AddListener(callback);
        //添加事件触发记录到GameObject的事件触发组件    
        m_eventTrigger.triggers.Add(entry);
    }
    
    /// <summary>
    /// 视频进度条开始拖拽
    /// </summary>
    /// <param name="arg0"></param>
    private void OnSliderDrage(BaseEventData arg0)
    {
        toPlayVideo.Pause();
        SetVideoTimeValueChange();
    }
    
    /// <summary>
    /// 视频进度条结束拖拽
    /// </summary>
    /// <param name="arg0"></param>
    private void OnSliderEndDrage(BaseEventData arg0)
    {
        toPlayVideo.Play();
    }

    /// <summary>
    /// 给 Slider 添加开始拖拽事件
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        toPlayVideo.Pause();
        SetVideoTimeValueChange();
    }
 
    /// <summary>
    /// 当前的 Slider 比例值转换为当前的视频播放时间
    /// </summary>
    private void SetVideoTimeValueChange()
    {
        toPlayVideo.mVideoPlayer.time = toPlayVideo.mSlider.value * toPlayVideo.mVideoPlayer.clip.length;
    }
 
    /// <summary>
    /// 给 Slider 添加结束拖拽事件
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        toPlayVideo.Play();
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值