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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:15:01