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
相关产品推荐
相关产品推荐

