在Unity Vuforia AR项目中如何预加载Plane对象上挂载的视频?
解决方案
- 首先修正变量定义,引入必要命名空间
你当前代码里的videoPlayer存储的是挂载VideoPlayer组件的GameObject,需要先获取对应的VideoPlayer组件才能操作预加载相关逻辑,首先在脚本头部引入命名空间:
using UnityEngine.Video;
同时把videoPlayer的变量类型从GameObject改成VideoPlayer,提前声明加载提示组件:
private VideoPlayer videoPlayer; // 加载spinner可以是提前做好的UI旋转动画对象,在Inspector面板赋值或者通过代码查找 public GameObject loadingSpinner;
- 修改Start逻辑,注册预加载回调
protected virtual void Start() { plane = GameObject.Find("Plane"); // 从子节点获取VideoPlayer组件,而不是GameObject videoPlayer = plane.transform.GetChild(0).GetComponent<VideoPlayer>(); // 注册视频准备完成的回调 videoPlayer.prepareCompleted += OnVideoPrepared; // 可以选择启动时就触发预加载,也可以选择在识别到图像目标时再触发 videoPlayer.Prepare(); // 预加载开始时显示加载提示 loadingSpinner.SetActive(true); mObserverBehaviour = GetComponent<ObserverBehaviour>(); if (mObserverBehaviour) { mObserverBehaviour.OnTargetStatusChanged += OnObserverStatusChanged; mObserverBehaviour.OnBehaviourDestroyed += OnObserverDestroyed; OnObserverStatusChanged(mObserverBehaviour, mObserverBehaviour.TargetStatus); } }
- 实现预加载完成回调和目标识别联动逻辑
private void OnVideoPrepared(VideoPlayer source) { // 视频加载完成,隐藏加载提示 loadingSpinner.SetActive(false); // 如需加载完成自动播放可直接调用source.Play(),也可以等目标识别后再触发播放 } private void OnObserverStatusChanged(ObserverBehaviour behaviour, TargetStatus status) { // 目标被正常识别的状态 if (status.Status == Status.TRACKED || status.Status == Status.EXTENDED_TRACKED) { if (videoPlayer.isPrepared) { // 已完成预加载直接播放 videoPlayer.Play(); loadingSpinner.SetActive(false); } else { // 未完成预加载则显示加载提示并触发预加载 loadingSpinner.SetActive(true); videoPlayer.Prepare(); } } // 目标丢失的状态 else { if (videoPlayer.isPlaying) { videoPlayer.Stop(); } loadingSpinner.SetActive(false); } } private void OnObserverDestroyed(ObserverBehaviour behaviour) { // 组件销毁前解绑事件,避免内存泄漏 if (mObserverBehaviour != null) { mObserverBehaviour.OnTargetStatusChanged -= OnObserverStatusChanged; mObserverBehaviour.OnBehaviourDestroyed -= OnObserverDestroyed; } if (videoPlayer != null) { videoPlayer.prepareCompleted -= OnVideoPrepared; } }
- 补充说明:如果你的MP4视频是直接挂载到VideoPlayer组件的VideoClip字段上,以上逻辑可以直接生效;如果是运行时动态加载的VideoClip,只需要在给
videoPlayer.clip赋值完成后调用videoPlayer.Prepare()即可触发预加载流程。
内容的提问来源于stack exchange,提问作者Pablo Darde
相关产品推荐
相关产品推荐

