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();
}
}