unity 视频 播放

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
using DG.Tweening;

public class UIVedioPanel_Ctrl : MonoBehaviour
{
    public VideoPlayer videoPlayer = null;
    public Button btn_play;   //开始 结束
    public Button btn_pause;  //暂停 继续
    public Button btn_pre;   //上一个按钮
    public Button btn_next;  //下一个按钮

    public Text text_time;   //显示视频的长度
    public Slider slider_progress;//显示视频的 进度

    public Button btn_mute;   // 静音
    public Slider slider_volume;// 音量
    public RectTransform panelCtrl;
    private Vector3 stPos, endPos;

    [SerializeField]
    private bool isDrag;
    private int hour, minute, second;  // 时  分  秒 
    private bool IsPause, IsPlay;

    private string curmusicPath;
    private List<string> musicList = new List<string>();
    private int musicIndex = 0;


    private void Awake()
    {
        musicList.Add(@"E:\webserver\laozhi_server\wwwroot\Vedio\login.mp4");
        musicList.Add(@"E:\webserver\laozhi_server\wwwroot\Vedio\被盗妄想.mp4");
        curmusicPath = musicList[musicIndex];

        videoPlayer = transform.Find("Vedio_BG/mask/Vedio").GetComponent<VideoPlayer>();

        panelCtrl = transform.Find("Vedio_BG/mask/panel_Ctrl").GetComponent<RectTransform>();
        stPos = endPos = panelCtrl.transform.localPosition;
        endPos.y -= panelCtrl.rect.height;
        endPos.y -= 10;

        btn_play = panelCtrl.Find("Btn_Play")?.GetComponent<Button>();
        btn_pause = panelCtrl.Find("Btn_Pause")?.GetComponent<Button>();
        btn_pre = panelCtrl.Find("Btn_Pre")?.GetComponent<Button>();
        btn_next = panelCtrl.Find("Btn_Next")?.GetComponent<Button>();

        text_time = panelCtrl.Find("time")?.GetComponent<Text>();
        slider_progress = panelCtrl.Find("Slider")?.GetComponent<Slider>();

        btn_mute = panelCtrl.Find("Btn_Mute")?.GetComponent<Button>();
        slider_volume = panelCtrl.Find("Slider_Volume")?.GetComponent<Slider>();
        btn_mute?.onClick.AddListener(OnMenu);
        slider_volume?.onValueChanged.AddListener(OnVolumeChange);
        if (slider_volume)
            slider_volume.value = videoPlayer.GetDirectAudioVolume(0);


        btn_play?.onClick.AddListener(OnPlayer);
        btn_pause?.onClick.AddListener(OnPause);
        btn_pre?.onClick.AddListener(() => { SwichVedio(false); });
        btn_next?.onClick.AddListener(() => { SwichVedio(true); });

        slider_progress.onValueChanged.AddListener(OnVedio_Progress);

        EventTriggerLinstener_All.Get(slider_progress.gameObject).onBeginDrag = (o) => { BeginDrag(); };
        EventTriggerLinstener_All.Get(slider_progress.gameObject).onDrag = (o) => { OnDrag(); };
        EventTriggerLinstener_All.Get(slider_progress.gameObject).onEndDrag = (o) => { OnEndDrag(); };
        //EventTriggerLinstener.Get(videoPlayer.gameObject).onClick = (o) => { OnClickVedio(); };

        transform.Find("returnBtn").GetComponent<Button>().onClick.AddListener(OnReturnBtn);

        SetUIPlay(false);
    }

    public void SetConcent(string curmusicPath, bool isAutoPlay = true, System.Action<bool> OnShowVedioCtrlHandle = null)
    {
        musicList.Clear();
        musicList.Add(curmusicPath);
        SetConcent(musicList, isAutoPlay, OnShowVedioCtrlHandle);
    }

    public void SetConcent(List<string> musicList, bool isAutoPlay = true, System.Action<bool> OnShowVedioCtrlHandle = null)
    {
        this.musicList = musicList;
        this.onShowVedioCtrlHandle = OnShowVedioCtrlHandle;


        if (musicList.Count < 1)
            return;

        musicIndex = 0;
        curmusicPath = musicList[musicIndex];

        if (isAutoPlay)
            OpenVedio(curmusicPath);

        OnClickVedio();
    }



    private void OnDestroy()
    {
        CancleInvokPanelMove();
    }

    #region event
    private System.Action<bool> onShowVedioCtrlHandle;
    private Tween tween;
    private void OnClickVedio()
    {
        CancleInvokPanelMove();
        tween = panelCtrl.transform.DOLocalMove(stPos, 1);
        Invoke("OnClickVedioOver", 10);
        onShowVedioCtrlHandle?.Invoke(true);
    }
    private void OnClickVedioOver()
    {
        tween = panelCtrl.transform.DOLocalMove(endPos, 1);
        onShowVedioCtrlHandle?.Invoke(false);
    }
    private void CancleInvokPanelMove()
    {
        if (IsInvoking("OnClickVedioOver"))
        {
            CancelInvoke("OnClickVedioOver");
        }
        if (tween != null)
        {
            tween.Kill(false);
            tween = null;
        }
    }


    protected virtual void OnReturnBtn()
    {
        gameObject.SetActive(false);
        CancleInvokPanelMove();
    }


    private void OnPlayer()
    {
        IsPlay = !IsPlay;
        if (IsPlay)
        {
            OpenVedio(curmusicPath);
        }
        else
        {
            VideoEnd();
        }
    }

    private void OnPause()
    {
        SetVedioPause(!IsPause);
    }

    private void OnMenu()
    {
        bool isMenu = videoPlayer.GetDirectAudioMute(0);
        videoPlayer.SetDirectAudioMute(0, !isMenu);
    }

    private void OnVolumeChange(float value)
    {
        videoPlayer.SetDirectAudioVolume(0, value);
    }

    private void OnVedio_Progress(float value)
    {
        SetVedioTime2();
    }

    private void BeginDrag()
    {
        isDrag = true;
    }
    private void OnDrag()
    {

    }
    private void OnEndDrag()
    {
        SetVedioTime();
        isDrag = false;
    }
    #endregion

    #region vedio

    private void SwichVedio(bool next = true)
    {
        if (next)
        {
            musicIndex++;
            musicIndex %= musicList.Count;
        }
        else
        {
            musicIndex--;
            if (musicIndex < 0)
            {
                musicIndex = musicList.Count - 1;
            }
        }

        curmusicPath = musicList[musicIndex];
        VideoEnd();
        OpenVedio(curmusicPath);
    }

    private void OpenVedio(string musicPath)
    {
        videoPlayer.gameObject.SetActive(true);

        videoPlayer.url = musicPath;

        //videoPlayer.started += StartVedio;
        videoPlayer.prepareCompleted -= StartVedio;
        videoPlayer.loopPointReached -= OnVideoEnd;

        videoPlayer.prepareCompleted += StartVedio;//加载资源
        videoPlayer.loopPointReached += OnVideoEnd;//视频播放结束

        videoPlayer.Prepare();
        SetUIPlay(true);
    }

    private void StartVedio(VideoPlayer source)
    {
        source.Play();

        videoPlayer.prepareCompleted -= StartVedio;
        //videoPlayer.started -= StartVedio;
    }

    private void SetVedioPause(bool pause)
    {
        if (pause)
        {
            videoPlayer.Pause();
        }
        else
        {
            videoPlayer.Play();
        }

        IsPause = pause;

        SetUIPause(pause);
    }

    private void OnVideoEnd(VideoPlayer vp)
    {
        videoPlayer.Stop();
        SetUIPlay(false);
    }
    private void VideoEnd()
    {
        videoPlayer.Stop();
        videoPlayer.time = 0;
        slider_progress.value = 0;
        SetVedioTimeText();
        SetUIPlay(false);
    }


    private void SetUIPlay(bool IsStart)
    {
        if (btn_play)
        {
            //play_button.gameObject.SetActive(!IsStart);
            //btn_play.GetComponent<Image>().color = IsStart ? Color.green : Color.white;
            //btn_play.GetComponentInChildren<Text>().text = IsStart ? "结束" : "开始";
            btn_play.transform.Find("play")?.gameObject.SetActive(!IsStart);
            btn_play.transform.Find("stop")?.gameObject.SetActive(IsStart);
        }

        if (slider_progress)
            slider_progress.interactable = IsStart;

        IsPlay = IsStart;

        btn_pause.gameObject.SetActive(IsStart);

        IsPause = false;
        SetUIPause(IsPause);
    }
    private void SetUIPause(bool isPause)
    {
        if (btn_pause)
        {
            //btn_pause.GetComponent<Image>().color = isPause ? Color.red : Color.white;
            //btn_pause.GetComponentInChildren<Text>().text = isPause ? "继续" : "暂停";
            btn_pause.transform.Find("pause")?.gameObject.SetActive(isPause);
            btn_pause.transform.Find("continue")?.gameObject.SetActive(!isPause);
        }
    }

    private void SetVedioTime2()
    {
        if (!videoPlayer.isPlaying)
        {
            videoPlayer.time = slider_progress.value * videoPlayer.length;
            SetVedioTimeText();
        }  
    } 
    private void SetVedioTime()
    {
        if (isDrag)
            videoPlayer.time = slider_progress.value * videoPlayer.length;
    }
    private void SetVedioSlider()
    {
        if (!isDrag) 
            slider_progress.value = (float)(videoPlayer.time / videoPlayer.length);
    }
    private void SetVedioTimeText()
    {
        hour = (int)videoPlayer.time / 3600;
        minute = ((int)videoPlayer.time - hour * 3600) / 60;
        second = (int)videoPlayer.time - hour * 3600 - minute * 60;
        text_time.text = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, minute, second);
    }

    private void Update()
    {
        if (videoPlayer.isPlaying || isDrag)
        {
            SetVedioTime();
            SetVedioSlider();
            SetVedioTimeText();
        }
        if (Input.anyKeyDown || Input.touchCount > 0)
        {
            OnClickVedio();
        }
    }

    #endregion

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值