延迟Vuforia Engine初始化:
禁用Vuforia Engine启动:
VuforiaConfiguration.Instance.Vuforia.LicenseKey = "myLicenseKey";
VuforiaConfiguration.Instance.DeviceTracker.AutoInitAndStartTracker = false;
在程序运行之前,除了在Unity编辑器中覆盖管理Vuforia Engine,也可以在在代码中覆盖管理。
1、在某些情况下,有必要在Vuforia引擎生命周期的某一处执行Vuforia Engine相关代码。比如:
2、VuforiaApplication实例为所有这些生命周期事件提供回调,可以从应用程序级脚本订阅它们:
void Awake()
{
VuforiaApplication.Instance.OnVuforiaInitialized += OnVuforiaInitialized;
}
void OnVuforiaInitialized(VuforiaInitError error)
{
if (error != VuforiaInitError.NONE)
{
// Handle initialization errors
}
}
void Start()
{
//订阅OnVuforiaStarted事件
VuforiaApplication.Instance.OnVuforiaStarted += OnVuforiaStarted;
}
void OnVuforiaStarted()
{
// turn device flashlight on 在Vuforia启动后打开设备手电筒
VuforiaBehaviour.Instance.CameraDevice.SetFlash(true);
}
void Start()
{
VuforiaApplication.Instance.OnVuforiaStopped += OnVuforiaStopped;
}
VuforiaBehaviour.Instance.enabled
不应使用OnVuforiaDeinitialized,因为会破坏包括注册目标在内的存储资源
void Start()
{
VuforiaApplication.Instance.OnVuforiaPaused += OnVuforiaPaused;
}
void OnVuforiaPaused(bool paused)
{
if (!paused)
// set focus to infinity:将焦点设置为无穷大
VuforiaBehaviour.Instance.CameraDevice.SetFocusMode(FocusMode.FOCUS_MODE_INFINITY);
}
void Start()
{
VuforiaApplication.Instance.OnVuforiaDeinitialized += OnVuforiaDeinitialized;
}
void OnVuforiaDeinitialized()
{
FusionProviderOption fusionProviderOption = FusionProviderOption.PREFER_PLATFORM_FUSION_PROVIDER;
/* Set VuforiaFusionProvider */
VuforiaApplication.Instance.Initialize(fusionProviderOption);
}
1、在Unity中,Vuforia Engine会每帧自动更新所有Target和Observer的当前观察状态State。对Unity场景的更改(如目标位置)会自动应用到State。因此,手动检索更新不需要特定的API调用。
2、对于某些需求,在Vuforia Engine每帧更新State后运行你的应用程序逻辑非常重要。如:
3、出于这些目的,请使用OnStateUpdated。
void Start()
{
//订阅OnStateUpdated事件
VuforiaBehaviour.Instance.World.OnStateUpdated += OnStateUpdated;
}
void OnStateUpdated()
{
/* Get IlluminationData when ARKit is used by Vuforia Fusion */
//当Vuforia Fusion使用ARKit来获取照明数据时
float intensity = VuforiaBehaviour.Instance.World.IlluminationData.AmbientIntensity.Value;
float temperature = VuforiaBehaviour.Instance.World.IlluminationData.AmbientColorTemperature.Value;
/* Get IlluminationData when ARCore is used by Vuforia Fusion */
//当Vuforia Fusion使用ARCore来获取照明数据时
Vector4 colorCorrection = VuforiaBehaviour.Instance.World.IlluminationData.ColorCorrection.Value;
float intensityCorrection = VuforiaBehaviour.Instance.World.IlluminationData.IntensityCorrection.Value;
}
1、作为在Unity Editor中使用Vuforia游戏对象设置Target的替代方法,可以使用ObserverFactory类在运行时加载和观察Target。它的成员函数都采用不同数量的重载来创建Target。例如,从设备数据库创建图像目标如下所示:
var mImageTarget = VuforiaBehaviour.Instance.ObserverFactory.CreateImageTarget(
"Vuforia/VuforiaMars_Images.xml ",
"Astronaut");
使用true和false激活和停用Target:
mImageTarget.enabled = true;
4.Target Status(目标状态):可以直接注册特定于Observer的状态更改事件,并直接评估当前状态:
ObserverBehaviour modelTargetBehaviour;
void Start()
{
//注册OnTargetStatusChanged事件
modelTargetBehaviour.OnTargetStatusChanged += OnTargetStatusChanged;
}
//OnTargetStatusChanged:当Target状态发生改变
//需要传递观察这个Target的Observer的ObserverBehaviour组件对象以及这个Target的状态TargetStatus对象
void OnTargetStatusChanged(ObserverBehaviour observerbehavour, TargetStatus status)
{
//当Target状态是“已追踪到”并且状态信息正常,则执行……
if (status.Status == Status.TRACKED && status.StatusInfo == StatusInfo.NORMAL)
{
// ...
}
}
VuforiaBehaviour.Instance.DevicePoseObserver.enabled = true;
3.Device Pose Observer提供附加状态信息,这些信息根据设备平台类型(ARKit、ARCore)和设备类型(手持设备、眼镜)的不同而不同。有关详细信息,请参见 Target Poses and Status Info
VuforiaBehaviour.Instance.DeviceBehaviour.OnTargetStatusChanged += OnDevicePoseStatusChanged;
using UnityEngine;
using Vuforia;
public class MyPrefabInstantiator : DefaultObserverEventHandler
{
ImageTargetBehaviour mImageTarget;//图像目标行为对象
public GameObject myModelPrefab;//附加到图片目标的内容Content
//重写OnTrackingFound方法,当追踪到目标时,执行InstantiateContent方法
protected override void OnTrackingFound()
{
InstantiateContent();
}
//如果myModelPrefab(内容)为空,则实例化内容
//设置myModelPrefab实例化对象为图像目标的子对象
//设置myModelPrefab的位置,方向与大小
//激活myModelPrefab
void InstantiateContent()
{
if (myModelPrefab != null)
{
GameObject myModelTrf = Instantiate(myModelPrefab);
myModelTrf.transform.parent = mImageTarget.transform;
myModelTrf.transform.localPosition = new Vector3(0f, 0f, 0f);
myModelTrf.transform.localRotation = Quaternion.identity;
myModelTrf.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
myModelTrf.transform.gameObject.SetActive(true);
}
}
}
void Start()
{
//注册OnVuforiaInitialized事件
VuforiaApplication.Instance.OnVuforiaInitialized += OnVuforiaInitialized;
}
//当Vuforia引擎实例化时
void OnVuforiaInitialized(VuforiaInitError error)
{
//如果vuforia传递过来的VuforiaInitError--Vuforia实例化错误引用error不为空,说明Vuforia实例化出错,执行错误处理代码
if(error != VuforiaInitError.NONE)
{
// Error handling code
}
}