Unity视频播放器:如何区分Slider值的手动与自动变更?
解决Unity Slider自动更新触发Seek函数的问题
你可以通过添加一个状态标记变量来区分Slider值的变化是代码自动更新还是用户手动操作触发的,这样就能避免Update里更新Slider时频繁调用SeekVideo函数。
具体实现步骤:
- 新增一个私有布尔变量,用来标记当前是否是代码在更新Slider
- 在Update方法更新Slider前后,切换这个标记的状态
- 在SeekVideo函数开头判断标记,只有非自动更新时才执行跳转逻辑
修改后的代码如下:
// 新增标记变量,标记是否正在通过代码自动更新Slider private bool _isUpdatingSlider; public void SeekVideo() { // 如果是代码自动更新Slider导致的触发,直接返回 if (_isUpdatingSlider) return; Debug.Log("仅在用户手动拖动时触发"); float value = slider.value; long miliseconds = (long)(GetVideoDuration(videoIndex) * value); Seek(0, miliseconds); } public void Update() { if (isVideoPlayerReady && slider != null) { // 更新Slider前标记为自动更新状态 _isUpdatingSlider = true; slider.value = (float)GetVideoPosition(videoIndex) / GetVideoDuration(videoIndex); // 更新完成后取消标记 _isUpdatingSlider = false; } }
原理很直接:当代码在Update里更新Slider值时,先把_isUpdatingSlider设为true,此时Slider的OnValueChange事件触发SeekVideo,函数检测到标记为true就直接跳过跳转逻辑;只有用户手动拖动Slider时,这个标记是false,才会执行视频跳转操作。
这样就能彻底解决每帧调用SeekVideo的资源浪费问题,同时保留用户手动跳转的功能。
内容的提问来源于stack exchange,提问作者Óscar Fernández
相关产品推荐
相关产品推荐

