MegaBlock_Basic¶
注意
该页面内容将于近期更新。
备注
这个样例支持AR Foundation(没有AR Foundation也可以工作),如需使用AR Foundation请参考 AR Foundation 配置 配置。
演示如何使用Mega的基本功能,通过工具导入Block,摆放3D内容,并最终运行查看跟踪效果。
配置和运行¶
请参考 Mega Unity样例使用说明 进行配置和运行。
运行效果
用法¶
详解¶
这个sample可以是无代码的,但通常不推荐。脚本中的代码只有一个作用:针对特定的系统状态对终端用户进行提示。
场景是如何创建的?¶
Mega Unity从零创建可运行的工程-创建EasyAR Mega场景 这一小结的内容介绍了场景中EasyAR相关功能的创建。
3D模型在哪里?¶
场景中并未提供3D模型。如果不自己创建或添加模型,运行时将只显示相机画面。你需要根据 Mega Unity样例使用说明 的描述,比照工具导入的Block在需要的地方摆放3D模型。
诊断信息是什么?¶
运行时你会发现定位信息是不断更新的,这也意味着运行时应用是不断与服务器进行通信的。这是Mega得以运行的基础,一般情况下你不应该关闭这个连接,使用过程中断开与服务器的连接将极大的影响Mega的效果。
在开发中展示并关注诊断信息是极其有帮助的,它将帮你了解系统的基本运行情况,也能在反馈问题的时候与EasyAR团队建立有效沟通。
重要
请仔细阅读 消息输出 ,仔细斟酌在开发阶段、测试阶段、应用上线之后应该采取何种配置,以及保留何种控制开关。请注意,与EasyAR的沟通通常需要提供这些信息,建议多利用而不是立马关闭。
设备不支持怎么判断¶
在设备不受支持等情况下,session状态会是Broken,你需要处理这个情况并进行合理提示。另外如果需要,你也可以参考 Workflow_ARSession 和 ARSession工作流 , 在ARSession启动前做这个判断。
private void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Broken)
{
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource || Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
ShowMessage(100,
Session.Report.Exception + Environment.NewLine +
$"EasyAR Session Broken with reason {Session.Report.BrokenReason}." + Environment.NewLine +
"Strictly, it means the device is not supported by EasyAR with (and only with) your configurations (features and settings you choose in the session object)." + Environment.NewLine +
$"Configurations you need to examine include but not limited to if there are missing/extra frame source/filter objects under the session, options like {nameof(ARSession)}.{nameof(ARSession.AssembleOptions)} and {nameof(MegaTrackerFrameFilter)}.{nameof(MegaTrackerFrameFilter.MinInputFrameLevel)}, etc.." + Environment.NewLine +
$"You can get detailed availability report from {nameof(ARSession)}.{nameof(ARSession.Report)}." + Environment.NewLine +
$"The session may recover automatically if the device list updated from online data during session start and found device supported." + Environment.NewLine +
$"EasyAR Session 损坏(原因:{Session.Report.BrokenReason})。" + Environment.NewLine +
"严格来说,这意味着你配置(且仅该配置)下的EasyAR无法在该设备上运行。配置指你在session物体中所选择的功能和设置。" + Environment.NewLine +
$"你需要检查的配置包括但不限于,session下是否有缺失或多余的frame source/filter物体,一些选项比如{nameof(ARSession)}.{nameof(ARSession.AssembleOptions)},{nameof(MegaTrackerFrameFilter)}.{nameof(MegaTrackerFrameFilter.MinInputFrameLevel)}等。" + Environment.NewLine +
$"你可以从{nameof(ARSession)}.{nameof(ARSession.Report)}获得详细的可用性报告。" + Environment.NewLine +
$"如果在启动session时联网更新设备列表时发现设备已被支持,session有可能自动恢复。"
,
$"EasyAR Session Broken with reason {Session.Report.BrokenReason}." + Environment.NewLine +
"The EasyAR features selected by the App developer cannot run on your device." + Environment.NewLine +
$"EasyAR Session 损坏(原因:{Session.Report.BrokenReason})。" + Environment.NewLine +
"应用开发者选择的EasyAR功能无法在你的设备上运行。"
);
}
else
{
ShowMessage(100,
Session.Report.Exception + Environment.NewLine +
$"EasyAR Session Broken with reason {Session.Report.BrokenReason}." + Environment.NewLine +
"This is usually device-irrelevant, Please debug your project using exception details." + Environment.NewLine +
$"EasyAR Session 损坏(原因:{Session.Report.BrokenReason})。" + Environment.NewLine +
"这通常是设备无关的,请使用详细异常信息调试你的工程。"
,
$"EasyAR Session Broken with reason {Session.Report.BrokenReason}, please ask the app developer for help." + Environment.NewLine +
$"EasyAR Session 损坏(原因:{Session.Report.BrokenReason}),请向应用开发者寻求帮助。"
);
}
}
}
需要合理处理的正常服务状态¶
这个sample展示了应该如何获取服务状态变化并合理处理。
获取状态变化信息
megaTracker.LocalizationRespond += HandleLocalizationStatusChange;
这个信息是Mega定位服务返回的数据,它并不是每帧更新的,但可以反映服务器的连接情况、定位成功与否等。
处理特定状态变化,提示终端用户
private void HandleLocalizationStatusChange(MegaLocalizationResponse response)
{
var status = response.Status;
wakingUpCount = status == MegaTrackerLocalizationStatus.WakingUp ? wakingUpCount + 1 : 0;
if (wakingUpCount >= 5)
{
ShowMessage(10,
"Service is waking up, you need to let user wait." + Environment.NewLine +
"服务正在唤醒中,你需要让用户等待。"
,
"Service is waking up, please wait patiently." + Environment.NewLine +
"服务正在唤醒中,请耐心等待。"
);
}
if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
{
ShowMessage(10,
"QPS limit exceeded, you can keep random user fail (overall worse tracking quality) or pay for more QPS." + Environment.NewLine +
"QPS超限,你可以保持随机用户失败(总体跟踪质量下降)或付费提升QPS上限。"
,
"Too many users, please wait patiently." + Environment.NewLine +
"用户过多,请耐心等待。"
);
}
if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
{
ShowMessage(10,
"Token expired (may only occurs when you access the service using a Token)." + Environment.NewLine +
"You need to request a Token from your own backend and call MegaTrackerFrameFilter.UpdateToken to update it. Your backend should generate the Token using EasyAR's Token generation method." + Environment.NewLine +
"Token过期(仅在你使用Token访问服务时可能出现)。" + Environment.NewLine +
$"你需要请求你自己的后台获取Token,并调用MegaTrackerFrameFilter.UpdateToken进行更新。你的后台应使用EasyAR的Token生成方式生成Token。"
,
"<Instructions from App developer to user.>" + Environment.NewLine +
"<应用开发者对用户的说明。>"
);
}
}
你需要对QpsLimitExceeded和WakingUp两个状态进行处理,并以合适的方式向终端用户进行提示。sample中的文字是一个参考。
QpsLimitExceeded
如果遇到这个状态,通常来说就是访问服务的设备过多。EasyAR Mega服务是按Qps收费的,需要注意这个数值并不是并发,通常来讲如果按默认配置,设备请求是1FPS,这时Qps数值恰巧与设备并发量相当。由于网络访问存在波动,在设备总数接近上限但未达到上限时出现这个状态也非常正常。
如果有设备出现这个状态,该设备的跟踪效果将受到一定影响,如果持续收到该状态,跟踪将完全由设备进行,效果将大打折扣。
如果有设备出现这个状态,访问服务的其它设备也可能会出现同样的状态,具体设备和出现时间是完全随机的,可以不严谨地类比抢票过程。
Qps超限时服务质量是受保证的,但设备上的跟踪效果不受保证,你需要购买更多Qps以支撑应用使用。如果需要短期提高Qps支持(超过50),需要至少提前 两个工作日 与EasyAR商务沟通并报备。
在Qps超限时,建议提醒用户访问人数过多,建议错峰使用等。
WakingUp
如果长时间(不同服务有所不同,试用期间时间间隔更短)没有请求服务,在恢复请求后有时会出现这个状态,大部分情况下下一个请求就会正常,通常不会超过数秒。
如果出现这个状态,可以让用户等待短暂时间。
ApiTokenExpired
如果使用Token访问服务,还需要处理Token过期的情况。使用APIKey访问不需要处理。
开关MegaBlockTracker¶
MegaTrackerFrameFilter.enabled 可以控制MegaBlockTracker的开关。关闭之后跟踪就停止了,Block会收到丢失信号。如果这时候强制显示内容,会发现内容贴屏。sample中是通过按钮的事件实现的,
MegaTrackerFrameFilter 还有与云服务连接(定位)的开关,如有需要可以根据接口文档说明来使用。一般情况下你不应该关闭定位,使用过程中断开与服务器的连接将极大的影响Mega的效果。