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

Unity+Vuforia返回安卓Activity后,未识别ImageTarget时视频异常播放求助

解决Unity+Vuforia从Android Activity返回后视频自动播放的问题

看起来你遇到的核心问题是:从Android Activity返回Unity场景时,视频没有校验当前ImageTarget的追踪状态,直接恢复了之前的播放状态——哪怕此时目标已经丢失。下面是几个针对性的解决方案,你可以逐步尝试:

1. 打开Activity前先保存追踪状态

在调用Android代码跳转Activity之前,先记录下当前ImageTarget是否处于被追踪的状态,这样返回后就能基于这个状态来修正视频行为。

首先在控制视频的脚本里添加一个状态变量:

private bool _wasTrackingBeforeActivity = false;

然后修改打开Activity的代码,先保存状态再跳转:

// 假设你已经获取了ImageTargetBehaviour的引用,命名为imageTarget
_wasTrackingBeforeActivity = imageTarget.CurrentStatus == TrackableBehaviour.Status.TRACKED;

// 打开Android Activity的原有代码
AndroidJavaObject jo = new AndroidJavaObject("packagename.Activityname"); 
int i = jo.Call<int>("openAndroidActivity");

2. 在Unity恢复焦点时校验状态并修正视频

Unity提供了OnApplicationFocus和OnApplicationResume回调,可以捕获从Android Activity返回的时机。在这些回调里,我们需要结合之前保存的状态和当前的追踪状态,来控制视频的播放:

private void OnApplicationFocus(bool hasFocus)
{
    if (hasFocus)
    {
        // 回到Unity场景,检查当前ImageTarget的追踪状态
        bool isTrackingNow = imageTarget.CurrentStatus == TrackableBehaviour.Status.TRACKED;
        
        // 离开前没追踪,回来也没追踪,强制暂停视频
        if (!_wasTrackingBeforeActivity && !isTrackingNow)
        {
            videoPlayer.Pause();
            // 也可以直接停止:videoPlayer.Stop();
        }
        // 现在没追踪的话,不管之前状态如何都暂停
        else if (!isTrackingNow)
        {
            videoPlayer.Pause();
        }
    }
}

// 额外加上OnApplicationResume,覆盖所有返回场景的情况
private void OnApplicationResume()
{
    bool isTrackingNow = imageTarget.CurrentStatus == TrackableBehaviour.Status.TRACKED;
    if (!_wasTrackingBeforeActivity && !isTrackingNow)
    {
        videoPlayer.Pause();
    }
}

3. 优化视频播放的触发逻辑

你还可以修改视频播放的核心逻辑,确保只有当ImageTarget的状态切换为TRACKED时才主动播放视频,而不是依赖暂停后的自动恢复。在ImageTarget的OnTrackableStateChanged回调里调整逻辑:

public void OnTrackableStateChanged(
    TrackableBehaviour.Status previousStatus,
    TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.TRACKED)
    {
        // 仅当状态变为TRACKED时才启动播放
        videoPlayer.Play();
    }
    else
    {
        // 其他状态(LOST、UNKNOWN等)一律暂停
        videoPlayer.Pause();
    }
}

这样就算返回Unity时视频处于播放状态,只要当前不是TRACKED状态,也会被立即暂停,彻底避免自动播放的问题。

额外注意事项

  • 确保你正确引用了ImageTargetBehaviour和VideoPlayer组件,避免空引用报错
  • 如果使用的是旧版Vuforia,注意TrackableBehaviour.Status的枚举值可能有差异,比如部分版本用STATUS_TRACKED而非TRACKED

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:52:45