当前位置:   article > 正文

Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等_unity video player ugui

unity video player ugui

 

 

Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等

 

目录

Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码


 

一、简单介绍

Unity中的一些基础知识点。

本节介绍,在 Unity 中,简单实现在 UGUI 上播放视频的简单功能,可以额简单的显示视频名称,显示视频播放时长,拖拽进度等操作,便于后期使用,有不对,欢迎指正。

 

二、实现原理

1、VideoPlayer 播放后,把 rawImage.texture = videoPlayer.texture 渲染在UGUI上

2、VideoPlayer .time 和 VideoPlayer .clip.length 得到当前播放的事件和总时长,之间的比值得到播放进度

3、VideoPlayer 暂停播放 VideoPlayer.Play()/ VideoPlayer.Pause()

 

三、注意事项

1、这里使用 Slider 显示播放进度,但是 Slider 点击已经不能控制手动设置进度了,使用 SliderDragEvent 拖拽控制进度

2、SliderDragEvent  的事件必须写在本脚本内,不能委托事件显示(这里好奇怪啊,指导的同学,不吝赐教哈)

 

四、效果预览

 

五、实现步骤

1、打开Unity,新建空工程

 

2、在场景中,搭建UI,播放视频,和各个显示或者操作

 

3、在工程中新建脚本,VideoPlayerModule 实现播放视频,显示时间、进度、视频播放暂停等功能,SliderDragEvent 实现视频拖拽进度的功能

 

4、把 VideoPlayerModule 脚本挂载到 场景中,并对应赋值

5、把 SliderDragEvent 脚本挂载到 VideoTime_Slider 上实现拖拽进度,并对应赋值

 

6、运行场景(或打包到移动设备上),效果如上

 

六、关键代码

1、VideoPlayerModule

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. using UnityEngine.Video;
  7. [RequireComponent(typeof(VideoPlayer))]
  8. public class VideoPlayerModule : MonoBehaviour
  9. {
  10. [Header("视频")]
  11. public VideoClip videoClip; // 视频的文件 参数
  12. [Header("视频播放的RawImage")]
  13. public RawImage rawImage;
  14. [Header("视频时间条相关")]
  15. public Text videoTimeText; // 视频的时间 Text
  16. public Text videoNameText; // 视频的名字 Text
  17. public Slider videoTimeSlider; // 视频的时间 Slider
  18. [Header("视频播放和暂停")]
  19. public Text text_PlayOrPause;
  20. public Button button_PlayOrPause;
  21. // Use this for initialization
  22. void Start()
  23. {
  24. Init();
  25. videoPlayer.Play();
  26. SetVideoPlayEndAction(()=> { Debug.Log("视频播放结束"); });
  27. }
  28. /// <summary>
  29. /// 设置视频结束事件
  30. /// </summary>
  31. /// <param name="VideoPlayEndListener"></param>
  32. public void SetVideoPlayEndAction(Action VideoPlayEndListener) {
  33. VideoPlayEndAction = VideoPlayEndListener;
  34. }
  35. /// <summary>
  36. /// 初始化一些数据
  37. /// </summary>
  38. void Init() {
  39. videoPlayer = GetComponent<VideoPlayer>();
  40. videoPlayer.clip = videoClip;
  41. videoNameText.text = videoClip.name;
  42. clipHour = (int)videoPlayer.clip.length / 3600;
  43. clipMinute = (int)(videoPlayer.clip.length - clipHour * 3600) / 60;
  44. clipSecond = (int)(videoPlayer.clip.length - clipHour * 3600 - clipMinute * 60);
  45. isVideoPlayeEnd = false;
  46. }
  47. // Update is called once per frame
  48. void Update()
  49. {
  50. UpdateVideoFrame();
  51. if (Input.GetKeyDown(KeyCode.P)) {
  52. videoPlayer.Play();
  53. }
  54. }
  55. /// <summary>
  56. /// 每帧刷新视频
  57. /// </summary>
  58. void UpdateVideoFrame() {
  59. //如果videoPlayer没有对应的视频texture,则返回
  60. if (videoPlayer.texture == null)
  61. {
  62. return;
  63. }
  64. if (videoPlayer.isPlaying ==true) {
  65. //把VideoPlayerd的视频渲染到UGUI的RawImage
  66. rawImage.texture = videoPlayer.texture;
  67. ShowVideoTime();
  68. }
  69. if (isVideoPlayeEnd ==false && videoPlayer.time>= videoClip.length) {
  70. isVideoPlayeEnd = true;
  71. videoPlayer.Stop();
  72. text_PlayOrPause.text = "重新播放";
  73. if (VideoPlayEndAction != null) {
  74. VideoPlayEndAction();
  75. }
  76. }
  77. Debug.Log("videoPlayer.isPlaying :"+ videoPlayer.isPlaying);
  78. }
  79. /// <summary>
  80. /// 显示当前视频的时间
  81. /// </summary>
  82. private void ShowVideoTime()
  83. {
  84. // 当前的视频播放时间
  85. currentHour = (int)videoPlayer.time / 3600;
  86. currentMinute = (int)(videoPlayer.time - currentHour * 3600) / 60;
  87. currentSecond = (int)(videoPlayer.time - currentHour * 3600 - currentMinute * 60);
  88. // 把当前视频播放的时间显示在 Text 上
  89. videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2} / {3:D2}:{4:D2}:{5:D2}",
  90. currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond);
  91. // 把当前视频播放的时间比例赋值到 Slider 上
  92. videoTimeSlider.value = (float)(videoPlayer.time / videoPlayer.clip.length);
  93. //设置相关按钮监听事件
  94. button_PlayOrPause.onClick.AddListener(OnPlayOrPauseVideo);
  95. }
  96. /// <summary>
  97. /// 当前的 Slider 比例值转换为当前的视频播放时间
  98. /// </summary>
  99. private void SetVideoTimeValueChange()
  100. {
  101. videoPlayer.time = videoTimeSlider.value * videoPlayer.clip.length;
  102. }
  103. /// <summary>
  104. /// 播放和暂停当前视频
  105. /// </summary>
  106. private void OnPlayOrPauseVideo()
  107. {
  108. //判断视频播放情况,播放则暂停,暂停就播放,并更新相关文本
  109. if (videoPlayer.isPlaying == true)
  110. {
  111. videoPlayer.Pause();
  112. text_PlayOrPause.text = "播放";
  113. }
  114. else {
  115. videoPlayer.Play();
  116. isVideoPlayeEnd = false;
  117. text_PlayOrPause.text = "暂停";
  118. }
  119. }
  120. #region 私有参数
  121. //定义参数获取VideoPlayer组件和RawImage组件
  122. internal VideoPlayer videoPlayer;
  123. // 当前视频的总时间值和当前播放时间值的参数
  124. private int currentHour;
  125. private int currentMinute;
  126. private int currentSecond;
  127. private int clipHour;
  128. private int clipMinute;
  129. private int clipSecond;
  130. // 视频播放结束事件
  131. Action VideoPlayEndAction;
  132. bool isVideoPlayeEnd = false;
  133. #endregion
  134. }

 

2、SliderDragEvent

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. public class SliderDragEvent : MonoBehaviour, IDragHandler
  7. {
  8. [SerializeField]
  9. private VideoPlayerModule videoPlayerModule; // 视频播放的脚本
  10. private void Start()
  11. {
  12. }
  13. /// <summary>
  14. /// 给 Slider 添加 拖拽事件
  15. /// </summary>
  16. /// <param name="eventData"></param>
  17. public void OnDrag(PointerEventData eventData)
  18. {
  19. SetVideoTimeValueChange();
  20. }
  21. /// <summary>
  22. /// 当前的 Slider 比例值转换为当前的视频播放时间
  23. /// </summary>
  24. private void SetVideoTimeValueChange()
  25. {
  26. videoPlayerModule.videoPlayer.time = videoPlayerModule.videoTimeSlider.value * videoPlayerModule.videoPlayer.clip.length;
  27. }
  28. }

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/102336
推荐阅读
相关标签
  

闽ICP备14008679号