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

Unity VideoPlayer加载延迟问题:如何让播放器就绪前不可见?

解决Unity VideoPlayer加载URL视频前显示灰色方框的问题

方法一:初始隐藏Renderer,就绪后触发显示

  • 给挂载VideoPlayer的Cube初始设置MeshRenderer.enabled = false,或者直接禁用GameObject(不影响其他组件的前提下)
  • 绑定VideoPlayer的PrepareCompleted事件,等视频加载就绪后再启用Renderer或GameObject
  • 代码示例:
using UnityEngine;
using UnityEngine.Video;

public class VideoLoader : MonoBehaviour
{
    public VideoPlayer videoPlayer;
    public MeshRenderer cubeRenderer;

    void Start()
    {
        // 初始隐藏Cube
        cubeRenderer.enabled = false;
        // 绑定准备完成事件
        videoPlayer.prepareCompleted += OnVideoPrepared;
        // 启动视频准备流程
        videoPlayer.Prepare();
    }

    void OnVideoPrepared(VideoPlayer vp)
    {
        // 视频就绪后显示Cube
        cubeRenderer.enabled = true;
        // 自动开始播放
        vp.Play();
    }
}

方法二:用透明材质替换初始灰色占位

  • 不想禁用Renderer的话,给Cube初始赋值一个完全透明的材质(Alpha通道设为0)
  • 同样通过PrepareCompleted事件,在视频就绪后切换回VideoPlayer的默认材质
  • 代码示例:
using UnityEngine;
using UnityEngine.Video;

public class VideoMaterialSwitcher : MonoBehaviour
{
    public VideoPlayer videoPlayer;
    public Material transparentMaterial;
    private Material originalMaterial;

    void Start()
    {
        originalMaterial = GetComponent<MeshRenderer>().material;
        // 初始替换为透明材质
        GetComponent<MeshRenderer>().material = transparentMaterial;
        videoPlayer.prepareCompleted += OnVideoReady;
        videoPlayer.Prepare();
    }

    void OnVideoReady(VideoPlayer vp)
    {
        // 恢复原材质,VideoPlayer会自动把视频纹理赋值上去
        GetComponent<MeshRenderer>().material = originalMaterial;
        vp.Play();
    }
}

关于Wait for First Frame无效的原因

这个选项只是让VideoPlayer等待第一帧解码完成后再开始播放,但不会控制Cube的Renderer显示状态——哪怕视频没准备好,Cube还是会显示VideoPlayer未就绪时的默认灰色材质,所以必须手动配合准备完成事件控制显示。

内容的提问来源于stack exchange,提问作者CYAD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:24:50