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

