Unity开发:基于List<VideoClip>实现视频列表切换播放器求助
Unity 视频列表切换播放器问题排查与实现
原代码存在的问题
- 触发逻辑错误:
OnTriggerEnter仅在碰撞体进入触发区域的瞬间执行1次,写在该方法内的Input.GetKeyDown无法持续响应按键输入,玩家进入触发区域后按E不会触发切换逻辑。 - API调用错误:
VideoPlayer.clip是可读写属性而非方法,原代码Videoplayer.clip(Videolist[CurrentVideo])的写法属于语法错误,无法正确赋值视频片段。 - 索引逻辑存在风险:手动定义的
Maxvideos字段为冗余配置,直接读取List<VideoClip>的Count属性能获得准确的列表长度,手动填值极易出现数值不匹配导致的索引越界报错;索引越界判断放在Update中每帧执行无意义,切换视频时单次判断即可。 - 初始状态缺失:
Start生命周期方法中无初始化逻辑,运行后播放器默认无视频源,会出现初始黑屏。 - 切换逻辑不严谨:切换视频片段前未停止当前播放内容,易出现上一帧画面残留、音画不同步的问题。
修正后的完整实现代码
using System.Collections.Generic; using UnityEngine; using UnityEngine.Video; public class TVChange : MonoBehaviour { [Header("组件配置")] public List<VideoClip> VideoList; public VideoPlayer VideoPlayer; public KeyCode ChangeKey = KeyCode.E; private int _currentVideoIndex; private bool _isPlayerInTriggerRange; void Start() { // 初始化播放第一个视频 if (VideoList != null && VideoList.Count > 0 && VideoPlayer != null) { _currentVideoIndex = 0; PlayCurrentVideo(); } else { Debug.LogWarning("请检查VideoPlayer组件和视频列表配置是否完整"); } } void Update() { // 仅当玩家在触发范围内时才响应按键 if (_isPlayerInTriggerRange && Input.GetKeyDown(ChangeKey)) { SwitchToNextVideo(); } } // 切换到下一个视频 void SwitchToNextVideo() { if (VideoList == null || VideoList.Count == 0 || VideoPlayer == null) return; _currentVideoIndex++; // 索引越界时回到第一个视频 if (_currentVideoIndex >= VideoList.Count) { _currentVideoIndex = 0; } PlayCurrentVideo(); } // 播放当前索引对应的视频 void PlayCurrentVideo() { VideoPlayer.Stop(); VideoPlayer.clip = VideoList[_currentVideoIndex]; VideoPlayer.Play(); } // 玩家进入触发范围 private void OnTriggerEnter(Collider other) { // 可根据项目层级、Tag判断是否为玩家对象,示例默认检测所有碰撞体 _isPlayerInTriggerRange = true; } // 玩家离开触发范围 private void OnTriggerExit(Collider other) { _isPlayerInTriggerRange = false; } }
配置注意事项
- TV对象上的Collider组件必须勾选
Is Trigger选项,交互对象(通常是玩家)需要挂载Collider,且两个对象至少有一个挂载Rigidbody组件,否则OnTrigger系列回调不会触发。 - 提前给VideoPlayer组件配置渲染目标:可以选择将视频渲染到TV模型的Renderer上,或者输出到RenderTexture再赋值给材质,否则不会显示画面。
- 如果需要实现视频播完自动切下一个的功能,只要在Start里给
VideoPlayer.loopPointReached事件绑定SwitchToNextVideo方法即可。
内容的提问来源于stack exchange,提问作者Starry
相关产品推荐
相关产品推荐

