Unity C#响应式视频滑块:拖动时视频帧同步问题求助
视频进度条拖动同步解决方案
你当前的代码只在点击进度条时更新视频时间,拖动滑块过程中没有实时响应,所以才会出现帧不同步的问题。要实现类似YouTube的拖动实时预览效果,需要监听滑块的全流程事件,同时处理播放状态的切换,具体实现如下:
核心思路
- 监听滑块的拖动开始、值变更、拖动结束三个事件,覆盖整个拖动流程
- 拖动时暂停视频,实时同步滑块值到视频时间;拖动结束后恢复播放(如果之前在播放)
- 视频正常播放时,反向同步视频时间到滑块,保证进度条自动前进
完整代码实现
首先定义必要的组件引用和状态变量:
using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; public class VideoProgressController : MonoBehaviour { public Slider videoProgressBar; public VideoPlayer videoPlayer; private bool isDraggingSlider = false; void Start() { // 绑定视频准备完成事件,初始化进度条最大值 videoPlayer.prepareCompleted += OnVideoPrepared; // 绑定滑块相关事件 videoProgressBar.onDragStart.AddListener(OnProgressBarDragStart); videoProgressBar.onValueChanged.AddListener(OnProgressBarValueChanged); videoProgressBar.onDragEnd.AddListener(OnProgressBarDragEnd); } // 视频加载完成后设置进度条最大值为视频总时长 void OnVideoPrepared(VideoPlayer vp) { videoProgressBar.maxValue = (float)vp.length; } // 开始拖动滑块时暂停视频 public void OnProgressBarDragStart() { isDraggingSlider = true; if (videoPlayer.isPlaying) { videoPlayer.Pause(); } } // 滑块值变化时实时更新视频时间 public void OnProgressBarValueChanged(float value) { if (isDraggingSlider) { videoPlayer.time = value; } } // 结束拖动后恢复播放(如果之前在播放) public void OnProgressBarDragEnd() { isDraggingSlider = false; if (!videoPlayer.isPlaying) { videoPlayer.Play(); } } // 视频播放时自动更新进度条 void Update() { if (!isDraggingSlider && videoPlayer.isPlaying) { videoProgressBar.value = (float)videoPlayer.time; } } }
注意事项
- 在Unity Inspector面板中,将
videoProgressBar和videoPlayer拖入对应字段 - 确保VideoPlayer的
WaitForFirstFrame选项开启,避免视频未加载时进度条值异常 - 如果视频是动态加载的,记得在加载完成后重新调用
OnVideoPrepared逻辑更新进度条最大值
内容的提问来源于stack exchange,提问作者Shoot
相关产品推荐
相关产品推荐

