You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:33:11