Unity 使用VideoPlayer播放视频,实现播放,暂停,快进的效果
1. 首先先创建一个Render TexTure 在创建一个RawImage,
再把创建好的Render TexTure (我是随意起的名字,你们自己看着起) ,挂载到 RawImage 的Texture的地方 如下图所示
2.在创建Video Player组件 把Render Texture 挂上去(挂在Target Texture上面),Video Clip (可以直接把视频拖上去,也可以写脚本控制) 如下图
3.在给滑动条加上Event Trigger 组件,用一个开始拖拽的方法,一个结束拖拽的方法即可
两个方法在脚本里写的有,拖拽在上面即可
下面上代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; public class ShuiWenZhiShiButton : MonoBehaviour { public GameObject mv_obj; public VideoClip shipin1,shipin2; public VideoPlayer videoPlayer; public Button play_button; //播放按钮 public Button pause_button; //暂停按钮 public Text mv_length_text; //显示视频的长度 public Slider slider_kuajin; private bool isDrag; private int hour, minute, second; // 时 分 秒 // Start is called before the first frame update void Start() { Debug.Log (shipin1.length); //按钮1 button[0].onClick.AddListener(delegate { Photoenlable(0); if (mv_obj.activeSelf==false) { OnorOff_MVjiemian(true); } videoPlayer.clip = shipin1; }); //按钮2 button[1].onClick.AddListener(delegate { Photoenlable(1); if (mv_obj.activeSelf == false) { OnorOff_MVjiemian(true); } videoPlayer.clip = shipin2; }); //按钮3 button[2].onClick.AddListener(delegate { Photoenlable(2); }); } //打开或者关闭视频界面 public void OnorOff_MVjiemian(bool tra) { mv_obj.SetActive(tra); } //视频播放 public void MV_Play() { play_button.gameObject.SetActive(false); pause_button.gameObject.SetActive(true); videoPlayer.Play(); } //视频暂停 public void MV_Pause() { play_button.gameObject.SetActive(true); pause_button.gameObject.SetActive(false); videoPlayer.Pause(); } //显示视频的时间 public void ShiPin_Length() { hour = (int)videoPlayer.time / 3600; minute = ((int)videoPlayer.time - hour * 3600) / 60; second = (int)videoPlayer.time - hour * 3600 - minute * 60; mv_length_text.text = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, minute, second); } /// 修改视频播放进度 private void ChangeVideoPlayTime() { if (isDrag == true) { videoPlayer.time = slider_kuajin.value*videoPlayer.clip.length; } } //修改进度条 public void XiuGaiJinDuTiao() { if (!isDrag) { slider_kuajin.value = (float)(videoPlayer.time / videoPlayer.clip.length); } } //开始拖拽 public void OnDragdrop() { isDrag = true; } //结束拖拽 public void OnEndDrag() { isDrag = false; videoPlayer .time = slider_kuajin.value* videoPlayer.clip.length; } // Update is called once per frame void Update() { if (videoPlayer.clip !=null) { ChangeVideoPlayTime(); XiuGaiJinDuTiao(); ShiPin_Length(); } } }
2.UI摆放结构
脚本挂在父物体上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
public class Video_Player : MonoBehaviour
{
public GameObject mv_obj;
public VideoClip shipin1;
public VideoPlayer videoPlayer;
public Button play_button; //播放按钮
public Button pause_button; //暂停按钮
public Button exit_button; //关闭界面
public Text mv_length_text; //显示视频的长度
public Slider slider_kuajin;
private bool isDrag;
private int hour, minute, second; // 时 分 秒
// Start is called before the first frame update
void Start()
{
//videoPlayer = this.GetComponent<VideoPlayer>();
Debug.Log(shipin1.length);
videoPlayer.clip = shipin1;
videoPlayer.Play();
play_button.onClick.AddListener(MV_Play);
pause_button.onClick.AddListener(MV_Pause);
exit_button.onClick.AddListener(delegate {
OnorOff_MVjiemian(false);
});
}
//打开或者关闭视频界面
public void OnorOff_MVjiemian(bool tra)
{
mv_obj.SetActive(tra);
}
//视频播放
public void MV_Play()
{
play_button.gameObject.SetActive(false);
pause_button.gameObject.SetActive(true);
videoPlayer.Play();
}
//视频暂停
public void MV_Pause()
{
play_button.gameObject.SetActive(true);
pause_button.gameObject.SetActive(false);
videoPlayer.Pause();
}
//显示视频的时间
public void ShiPin_Length()
{
hour = (int)videoPlayer.time / 3600;
minute = ((int)videoPlayer.time - hour * 3600) / 60;
second = (int)videoPlayer.time - hour * 3600 - minute * 60;
//mv_length_text.text = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, minute, second);
}
/// 修改视频播放进度
private void ChangeVideoPlayTime()
{
if (isDrag == true)
{
videoPlayer.time = slider_kuajin.value * videoPlayer.clip.length;
}
}
//修改进度条
public void XiuGaiJinDuTiao()
{
if (!isDrag)
{
slider_kuajin.value = (float)(videoPlayer.time / videoPlayer.clip.length);
}
}
//开始拖拽
public void OnDragdrop()
{
isDrag = true;
}
//结束拖拽
public void OnEndDrag()
{
isDrag = false;
videoPlayer.time = slider_kuajin.value * videoPlayer.clip.length;
}
// Update is called once per frame
void Update()
{
if (videoPlayer.clip != null)
{
ChangeVideoPlayTime();
XiuGaiJinDuTiao();
//ShiPin_Length();
}
}
}
根据自己需要修改即可,感谢阅读
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南