IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity VideoPlayer 滑动条控制播放进度,滑动过程可显示滑动画面 -> 正文阅读

[游戏开发]Unity VideoPlayer 滑动条控制播放进度,滑动过程可显示滑动画面

unity的VideoPlayer其实足够了,不用插件也可以很好的干活。

按照我的步骤来一趟即可。本文主要给一个可以实现滑动的基础逻辑,可在此基础上做扩展。

先看看效果

代码块:

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

/// <summary>
/// 滑动条控制视频播放进度,可静帧或者滑动播放
/// </summary>
public class PlayVideo : MonoBehaviour
{
    public VideoClip videoClip;         // 视频的文件 参数

    public MySlider videoTimeSlider;      // 视频的时间 Slider

    //定义参数获取VideoPlayer组件和RawImage组件

    internal VideoPlayer videoPlayer;

    private RawImage rawImage;

    // Use this for initialization

    void Start()
    {

        //获取场景中对应的组件

        videoPlayer = this.GetComponent<VideoPlayer>();

        rawImage = this.GetComponent<RawImage>();

        videoPlayer.clip = videoClip;

        //videoNameText.text = videoClip.name;

        clipHour = (int)videoPlayer.clip.length / 3600;

        clipMinute = (int)(videoPlayer.clip.length - clipHour * 3600) / 60;

        clipSecond = (int)(videoPlayer.clip.length - clipHour * 3600 - clipMinute * 60);

        videoPlayer.Play();


       

        videoTimeSlider.OnChangeValue += OnChangeValue;

        videoPlayer.sendFrameReadyEvents = true;//激活frameReady的必要选项
        videoPlayer.frameReady += VideoPlayer_frameReady;
    }

    private bool _isRead = false;

    private bool _isDrag = false;
    private void VideoPlayer_frameReady(VideoPlayer source, long frameIdx)
    {
        _isRead = true;
    }


    private void OnChangeValue(float value,bool isDrag)
    {
        _isRead = false;
        _isDrag = isDrag;
        float oldVal;
        if (isDrag)
        {
            oldVal = (float)videoPlayer.time / (float)videoPlayer.clip.length;

           // Debug.Log("oldVal is:" + oldVal + "    value is:" + value);
            if (Math.Abs(oldVal - value) < 0.055f) return;
        }
      
        videoPlayer.time = value * (float)videoPlayer.clip.length;

        //以下两种方法可二选一
        
        //滑动的时候定帧
        if (_isDrag)
            videoPlayer.Pause();
        else videoPlayer.Play();


        //滑动的时候,自动播放
        //videoPlayer.Play();
    }

    // Update is called once per frame

    void Update()
    {
        
        if (videoPlayer.texture == null)
        {
            return;
        }
        if(videoPlayer.texture!=rawImage.texture)
          rawImage.texture = videoPlayer.texture;

        ShowVideoTime();

    }

    /// <summary>
    /// 显示当前视频的时间
    /// </summary>

    private void ShowVideoTime()
    {
        // 当前的视频播放时间

        currentHour = (int)videoPlayer.time / 3600;

        currentMinute = (int)(videoPlayer.time - currentHour * 3600) / 60;

        currentSecond = (int)(videoPlayer.time - currentHour * 3600 - currentMinute * 60);

        // 把当前视频播放的时间显示在 Text 上

        //videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2} / {3:D2}:{4:D2}:{5:D2}", currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond);

        // 把当前视频播放的时间比例赋值到 Slider 上
        if (_isRead && !_isDrag)
        {
           
            videoTimeSlider.SetValue((float)(videoPlayer.time / videoPlayer.clip.length));
        }

    }

   

    // 当前视频的总时间值和当前播放时间值的参数

    private int currentHour;

    private int currentMinute;

    private int currentSecond;

    private int clipHour;

    private int clipMinute;

    private int clipSecond;

}
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;


/// <summary>
/// 滑动位置,预览该位置的视频定帧
/// </summary>
public class MySlider : Slider
{

    public Action<float,bool> OnChangeValue;

    private bool _isDrag = false;

    private Coroutine _coroutine;

    private WaitForSeconds _waitForSeconds;

    protected override void Awake()
    {
        base.Awake();
        _waitForSeconds=new WaitForSeconds(0.2f);
    }
    
    public override void OnPointerDown(PointerEventData eventData)
    {
        base.OnPointerUp(eventData);

        _coroutine = StartCoroutine(Wait());
        _isDrag = true;
    }

    public override void OnPointerUp(PointerEventData eventData)
    {

        base.OnPointerUp(eventData);
        _isDrag = false;
        if (_coroutine != null) StopCoroutine(_coroutine);
        _coroutine = null;
        if (OnChangeValue != null)
            OnChangeValue(this.value, _isDrag);
    }
   
    public void SetValue(float newValue)
    {
        if (_isDrag) return;
        this.value = newValue;
    }

    private IEnumerator Wait()
    {
        while (true)
        {
            yield return _waitForSeconds;
            if (OnChangeValue != null)
                OnChangeValue(this.value, _isDrag);

        }
    }
}

步骤一:

?步骤二:

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:21:42  更:2021-10-03 17:23:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:47:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码