Unity中的Vuforia发动机生命周期

Vuforia Engine提供了一个API,该API使用VuforiaEngine对象和脚本类扩展Unity Editor。使用Vuforia Engine创建AR体验的大多数创作任务都可以直接在Unity Editor中使用Vuforia Engine GameObjects完成。脚本API提供了对AR应用程序的扩展选项和控制

介绍

在本指南中,我们简要介绍了如何使用Vuforia应用程序,使用配置VuforiaVuforia行为、创建观察者、检索跟踪目标的信息以及其他常见管理任务。

管理Vuforia引擎生命周期

在Unity中,默认情况下自动管理Vuforia引擎生命周期:

  • 启动应用程序时,Vuforia引擎会自动初始化一次。
  • 退出应用程序时,它将被取消初始化。
  • 加载带有任何Vuforia Engine游戏对象(如目标观测者或ARCamera)的Unity场景将启动VuforiaEngine,卸载场景将再次停止。

此功能与Vuforia行为主摄像头上的组件。如果使用Vuforia游戏对象的场景不包含Vuforia行为,将自动创建一个并附加到主摄影机对象,启动Vuforia并负责摄影机控制和视频背景渲染。

有几种方法可以覆盖此默认行为:

  • Vuforia引擎初始化可以通过检查延迟初始化中的复选框Vuforia配置

    例如,如果您的应用程序中有一个特殊的AR模式,而不是每个最终用户都使用该模式,那么这就有意义了。其他用例包括使用自定义驱动程序或特定的Fusion提供程序.

    在这些情况下,可以在加载包含Vuforia引擎功能的第一个场景之前,从脚本API手动初始化Vuforia引擎:Vuforia应用程序。实例。初始化();.

  • 加载包含Vuforia Engine游戏对象(如Targets或ARCamera)的场景时,可以通过禁用Vuforia行为ARCamera上的组件。

    稍后可以从脚本启用它,以在此场景中启动Vuforia引擎。

在某些情况下,有必要在Vuforia引擎生命周期的某个时间点执行代码。一些例子包括:

  • Vuforia引擎尝试初始化后检查初始化错误。
  • 在运行时创建观察者以跟踪目标,或在Vuforia引擎启动后访问观察者的属性。
  • 启动Vuforia引擎后设置特定的相机对焦模式。
  • 在Vuforia引擎停止或完全取消初始化后删除应用程序级资源。

这个Vuforia应用程序实例为所有这些生命周期事件提供回调。可以从应用程序级脚本订阅它们:

Vuforia引擎已初始化

订阅Vuforia应用程序。实例。OnVuforia已初始化运行需要初始化Vuforia引擎的代码。应在启动Vuforia引擎之前完成设置文件驱动程序或融合提供程序等事件,并使用延迟初始化启用。

void唤醒(){FusionProviderOption fusionProducrOption=FusionProfilerOption。首选平台应用程序;/*设置VuforiaFusionProvider*/Vuforia应用程序。实例。初始化(fusionProviderOption);Vuforia应用程序。实例。OnVuforiaInitialized+=OnVuforiaInitialize;}void OnVuforiaInitialized(Vuforia初始化错误){if(错误!=VuforiaInitError.NONE){//处理初始化错误}}

Vuforia引擎已启动

订阅OnVuforia已启动在Vuforia启动后运行事件:

无效开始(){Vuforia应用程序。实例。OnVuforiaStarted+=OnVuforiaStarted;}VuforiaStarted()上无效{//打开设备手电筒Vuforia行为。实例。摄像头设备。SetFlash(真);}

Vuforia引擎已停止

订阅OnVuforia已停止要在Vuforia停止后运行事件:

无效开始(){Vuforia应用程序。实例。OnVuforiaStopped+=OnVuforiaStopped;}

Vuforia引擎已暂停或恢复

通过设置暂停Vuforia引擎和跟踪活动Vuforia行为禁用并通过将其设置为启用来恢复AR跟踪体验。OnVuforia取消初始化不应使用,因为这将破坏存储的资源,包括注册的目标。

Vuforia行为。实例已启用

订阅OnVuforia暂停要在Vuforia暂停或恢复后运行事件,例如为了在应用程序暂停后再次设置特定的焦点模式:

无效开始(){Vuforia应用程序。实例。OnVuforiaPaused+=OnVuforiaPaused;}void OnVuforiaPaused(布尔暂停){if(!暂停)//将焦点设置为无穷大:Vuforia行为。实例。摄像头设备。设置焦点模式(FocusMode.FOCUS_MODE_INFINITY);}

Vuforia引擎已取消初始化

订阅OnVuforia取消初始化使用订户方法终止Vuforia行为以及所有跟踪操作。

无效开始(){Vuforia应用程序。实例。OnVuforiaDeinitialized+=OnVuForiaDeinitalized;}无效OnVuforiaDeinitialized(){//销毁对象,更改Vuforia配置设置}

Vuforia配置

其他Vuforia配置选项可以在Vuforia配置检查器,可从ARCamera游戏对象或来自窗口->Vuforia配置在Unity中(CMD+Shift+V pr Ctrl+Shift+V)。

  • 单击添加许可证导航到“许可证”选项卡并为项目生成新的许可证密钥。

编辑器菜单:

初始化Vuforia引擎时会使用一些设置,如应用程序许可证密钥。还可以设置摄像头、错误和警告日志级别,如果你的应用程序应该同时跟踪多个图像(模型目标一次只能跟踪一个,这同样适用于区域目标)。

此外,在配置设置中Android设置,是构建Unity应用程序时应用的构建时设置。
最后,在Unity场景中启动Vuforia引擎之前,会评估一些设置,如跟踪设备姿势。

这些设置也可以在运行时访问,例如从一些密钥存储中设置许可证密钥,或禁用某些场景的设备跟踪。在加载第一个场景和启动Vuforia之前添加许可证密钥,即在唤醒()方法:

void唤醒()VuforiaConfiguration(Vuforia配置)。实例。Vuforia.LicenseKey=“myLicenseKey”;VuforiaConfiguration(Vuforia配置)。实例。DeviceTracker。AutoInitAndStartTracker=false;}

统一Vuforia发动机状态

在Unity中,Vuforia引擎将在每一帧自动更新所有目标和观察员的当前观察状态。对统一场景的更改,如目标的位置将自动应用。因此,不需要特定的API调用来手动检索更新。

对于某些操作,在Vuforia引擎更新帧中的状态后运行应用程序逻辑很重要。这包括:

  • 根据最近的位置计算两个目标之间的距离。
  • 从访问照明数据Vuforia行为。实例。世界。照明数据
  • 从访问最新的相机图像Vuforia行为。实例。摄像头设备。获取摄像头图像(…)

>使用OnState已更新出于这些目的。另请参见环境光管理器.cs用于处理照度值或参考API.

无效开始(){Vuforia行为。实例。世界。OnStateUpdated+=OnStateUplated;}无效OnStateUpdate(){/*Vuforia Fusion使用ARKit时获取照明数据*/浮动强度=VuforiaBehaviour。实例。世界。照明数据。环境强度。价值;浮子温度=VuforiaBehaviour。实例。世界。照明数据。环境颜色温度。价值;/*Vuforia Fusion使用ARCore时获取照明数据*/Vector4 colorCorrection=VuforiaBehaviour。实例。世界。照明数据。颜色校正。价值;浮点强度校正=VuforiaBehaviour。实例。世界。照明数据。强度校正。价值;}

创建观察者

除了使用Unity Editor中的Vuforia游戏对象设置目标之外,还可以使用观察员工厂类。它的每个成员函数都使用不同数量的重载来创建目标。例如,从设备数据库创建图像目标如下所示:

var mImageTarget=VuforiaBehaviour。实例。观察员工厂。创建图像目标(“Vuforia/VuforiaMars_Images.xml”,“宇航员”);

使用true和false激活和停用目标:

mImageTarget.enabled=真;

检索目标状态和状态信息

默认情况下,跟踪目标时会渲染增强。这个默认观察者事件处理程序是Vuforia提供的组件,它提供了一个用于向添加操作的接口找到目标时目标丢失时。

您甚至可以实现自己的自定义事件处理程序脚本,并更改这些事件以实现您的自定义行为。

在Vuforia目标上EXTENDED_TRACKED和TRACKED之间的大型姿势跳跃上启用姿势平滑。姿势跳跃有时出现在延伸跟踪目标漂移,然后再次检测到目标时捕捉回目标的情况下。启用该设置可以在目标状态更改时平滑目标位置之间的转换。这个Vuforia行为世界中心模式必须设置为DEVICE。

目标状态

还可以直接注册特定于观察员的状态更改事件,并直接评估当前状态:

观察者行为模型TargetBehaviour;无效开始(){模型目标行为。OnTargetStatusChanged+=OnTargetStatesChanged;}void OnTargetStatusChanged(观察者行为观察者行为,目标状态){if(status.status==status.TRACKED&&status.SstatusInfo==status Info.NORMAL){// ...}}

设备跟踪管理

设备姿势观测器用于跟踪设备在环境中的运动,并提供扩展跟踪用于观察到的目标。在Vuforia Configuration中启用设备姿势跟踪,或在运行时使用启用重置()功能:

Vuforia行为。实例。DevicePoseBehaviour.enabled=真;

设备姿势观测器提供其他状态信息,这些信息因设备平台类型(ARKit、ARCore)和设备类型(手持、护目镜)而异。有关详细信息,请参阅目标姿势和状态信息.

Vuforia行为。实例。设备位置行为。OnTargetStatusChanged+=OnTargetStatusChanged;

将内容附加到目标

启动Vuforia引擎,加载并观察目标后,可以在运行时将内容作为子级添加到目标GameObject。下面的脚本演示了一种简单的方法,用于在运行时将预先设置的游戏对象添加到通过继承默认观察者事件处理程序脚本。

  1. 在Unity项目中,创建一个名为MyPrefab实例化程序.
  2. 复制下面的代码并保存文件。
  3. 在场景中,从菜单中添加Vuforia目标游戏对象游戏对象->Vuforia引擎->.
  4. 删除现有的默认观察者事件处理程序来自游戏对象的组件
  5. 添加MyPrefab实例化程序到目标游戏对象。
  6. 创建预制或使用现有预制并将其提交给myModelPrefab(我的模型预置)字段。
  7. 在设备上或中测试目标播放模式.
使用UnityEngine;使用Vuforia;公共类MyPrefabInstantiator:DefaultObserverEventHandler{ImageTargetBehaviour mImageTarget;公共游戏对象myModelPrefab;受保护的覆盖void OnTrackingFound(){实例化内容();}void InstantiateContent(){if(myModelPrefab!=空){游戏对象myModelTrf=实例化(myModelPrefab);myModelTrf.transform.parent=m图像目标转换;myModelTrf.transform.localPosition=新矢量3(0f、0f和0f);myModelTrf.transform.localRotation=四元数标识;myModelTrf.transform.localScale=新矢量3(0.1f,0.1f,0.1 f);myModelTrf.transform.game对象。设置活动(true);}}}

错误处理

使用VuforiaInit错误确保Vuforia引擎已正确初始化,如默认初始化处理程序脚本:

无效开始(){Vuforia应用程序。实例。OnVuforiaInitialized+=OnVuforiaInitialize;}void OnVuforiaInitialized(Vuforia初始化错误){if(错误!=VuforiaInitError.NONE){//错误处理代码}}

请参见应用程序疑难解答用于调试方法。