【Unity】代码控制视频的播放(视频播放器-更新)

 结果如上图,之前写过一个使用代码控制视频播放器的Demo,但是好多小伙伴说我附带的链接没法下载,这次我直接做一个完整版的,不用下载,照着一步一步做就能做出来。

之前写了如何设置RawImage进行自动播放,大家可以看一下基础操作这篇文章:,大佬勿怪。

【Unity】在UI界面上显示播放视频_夜梦说开发(VR)的博客-CSDN博客

 

面板结构如上图。

Bg是背景,rawimage是视频播放图片以及播放器

主要组件Rawimage面板展示:

这次的功能有开始,暂停,重播,音量调节,时间显示,面板关闭,面板开启没有做,大家可以自由发挥。

上代码:

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

/// <summary>
/// 视频播放器    对应组件需要创建
/// </summary>
public class VideoCrol : MonoBehaviour
{
    public static VideoCrol instance;

    #region

    /// <summary>
    /// 播放视频的Rawimage
    /// </summary>
    public GameObject videoImage;

    /// <summary>
    /// 视频播放器组件
    /// </summary>
    private VideoPlayer vPlayer;

    /// <summary>
    /// 开始,暂停,重播按钮
    /// </summary>
    public Button BtnPlay, BtnPause, BtnReStart;

    /// <summary>
    /// 视频进度条
    /// </summary>
    public Slider videoSlider;

    /// <summary>
    /// 关闭界面按钮
    /// </summary>
    public Button BtnX;

    /// <summary>
    /// 视频播放时间显示文本
    /// </summary>
    public Text NowTime;
    /// <summary>
    /// 视频总时间显示文本
    /// </summary>
    public Text TotalTime;
    /// <summary>
    /// 视频总时长
    /// </summary>
    private float tt;
    /// <summary>
    /// 进度条计时时间
    /// </summary>
    private float Index_t;

    /// <summary>
    /// 时间的时分秒
    /// </summary>
    private float hour, min, second;

    private bool IsPlay = true;

    /// <summary>
    /// 声音大小进度条
    /// </summary>
    public Slider voiceSlider;
    /// <summary>
    /// 声音百分比显示
    /// </summary>
    public Text audioNum;
    /// <summary>
    /// 声音播放器
    /// </summary>
    public AudioSource audioSource;
    /// <summary>
    /// 声音整体
    /// </summary>
    public GameObject voiceGameObject;
    /// <summary>
    /// 喇叭按钮
    /// </summary>
    public Button voiceBtn;
    /// <summary>
    /// 控制喇叭是否显示
    /// </summary>
    bool a = true;

    #endregion

    /// <summary>
    /// 视频在Resources下的地址
    /// </summary>
    const string VideoClip = "这里是视频地址";

    void Awake()
    {
        instance = this;
        vPlayer = videoImage.GetComponent<VideoPlayer>();

        SetPlayer((VideoClip)Resources.Load(VideoClip));
    }

    /// <summary>
    /// 对外开放的视频播放接口
    /// </summary>
    /// <param name="path">视频所在位置的地址</param>
    public void SetPlayer(VideoClip clip)
    {
        vPlayer.clip = clip;
    }

    /// <summary>
    /// 点击音量按钮,第一次开启,第二次关闭
    /// </summary>
    public void AudioTrue()
    {
        if (a)
        {
            voiceGameObject.SetActive(true);
            a = false;
        }
        else
        {
            voiceGameObject.SetActive(false);
            a = true;
        }

    }

    public void OnEnable()
    {
        voiceGameObject.SetActive(false);
        BtnReStart.onClick.AddListener(ClickReStart);
        BtnReStart.onClick.AddListener(ClickReStart);
        //BtnX.onClick.AddListener(ClickBtnX);
        BtnPlay.onClick.AddListener(ClickKaishi);
        BtnPause.onClick.AddListener(ClickZanting);
        voiceBtn.onClick.AddListener(AudioTrue);
    }

    public void OnDisable()
    {
        BtnReStart.onClick.RemoveListener(ClickReStart);
        BtnReStart.onClick.RemoveListener(ClickReStart);
        //BtnX.onClick.RemoveListener(ClickBtnX);
        BtnPlay.onClick.RemoveListener(ClickKaishi);
        BtnPause.onClick.RemoveListener(ClickZanting);
        voiceBtn.onClick.RemoveListener(AudioTrue);
        voiceGameObject.SetActive(false);
    }
    
    void Start()
    {
        ClickKaishi();//是否自动播放

        InitVideo();

        AudioChange();
    }

    /// <summary>
    /// 初始化音频音量等内容
    /// </summary>
    private void InitVideo()
    {
        tt = (float)vPlayer.clip.length;

        videoSlider.maxValue = tt;

        min = (int)tt / 60;
        second = (int)tt % 60;

        string minstr = min < 10 ? "0" + min.ToString() : min.ToString();

        string secondstr = second < 10 ? "0" + second.ToString() : second.ToString();

        TotalTime.text = string.Format("{0:D2}:{1:D2}", minstr, secondstr);
    }

    void Update()
    {
        PlayVideo();
        ChangeTime((float)vPlayer.time);
        AudioChange();
    }

    /// <summary>
    /// 判断是否播放 同时进度条跟随变换
    /// </summary>
    private void PlayVideo()
    {
        //播放
        if (IsPlay)
        {
            vPlayer.Play();
            Index_t += Time.deltaTime;
            if (Index_t >= 0.1f)
            {
                videoSlider.value += 0.1f;
                Index_t = 0;
            }
        }
        else
        {
            vPlayer.Pause();
        }
        //进度条到底停止播放
        if (videoSlider.maxValue - videoSlider.value <= 0.1f)
        {
            ClickReStart();
        }
    }

    /// <summary>
    /// 更改视频音量,同时赋值给音量文字
    /// </summary>
    private void AudioChange()
    {
        audioSource.volume = voiceSlider.value;
        audioNum.text = ((int)(voiceSlider.value * 100)).ToString() + "%";
    }

    /// <summary>
    /// 开放的改变视频播放进度
    /// </summary>
    /// <param name="value"></param>
    public void ChangeVideo(float value)
    {
        vPlayer.time = value;
    }

    /// <summary>
    /// 播放时间显示
    /// </summary>
    /// <param name="value"></param>
    void ChangeTime(float value)
    {
        min = (int)value / 60;
        second = (int)value % 60;

        string minstr= min < 10 ? "0" + min.ToString() : min.ToString();

        string secondstr = second < 10 ? "0" + second.ToString() : second.ToString();

        NowTime.text = string.Format("{0:D2}:{1:D2}", minstr, secondstr);
    }

    /// <summary>
    /// 重播按钮
    /// </summary>
    public void ClickReStart()
    {
        videoSlider.value = 0;
        vPlayer.time = 0;
    }

    /// <summary>
    /// 点击开始按钮
    /// </summary>
    public void ClickKaishi()
    {
        if (videoSlider.value == videoSlider.maxValue)
        {
            videoSlider.value = 0;
        }
        videoImage.SetActive(true);
        IsPlay = true;
        BtnPause.gameObject.SetActive(true);
        BtnPlay.gameObject.SetActive(false);
    }

    /// <summary>
    /// 点击暂停按钮
    /// </summary>
    public void ClickZanting()
    {
        IsPlay = false;
        BtnPause.gameObject.SetActive(false);
        BtnPlay.gameObject.SetActive(true);
    }
}

 这个是主要功能脚本,挂在外面的panel上。

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

/// <summary>
/// 挂载在进度条上
/// </summary>
public class SliderChange : MonoBehaviour,IDragHandler,IPointerClickHandler
{
    /// <summary>
    /// 拖动改变视频进度
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        VideoCrol.instance.ChangeVideo(VideoCrol.instance.videoSlider.value);
    }

    /// <summary>
    /// 点击改变视频进度
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerClick(PointerEventData eventData)
    {
        VideoCrol.instance.ChangeVideo(VideoCrol.instance.videoSlider.value);
    }
}

 这个是挂载在视频进度条上的slider,主要是为了让slider可以拖拽。

结果如下图:

 

代码有些长,大部分都是直接从外面挂载拖拽的,为了方便阅读,添加了注释,希望小白和想借鉴的朋友借鉴一下,UI自行更换哈。。。后面我会发一个打包链接

第一个链接是2017版的

https://download.csdn.net/download/CSDN_6954/29656145

第二个链接是2019版的,还没上传完成,等后续补充一个。

只需要1积分,给大家的福利哈。

猜你喜欢

转载自blog.csdn.net/CSDN_6954/article/details/131231263