Unity接入Huawei AR Engine

说在前面 

 

使用Unity进行AR开发的开发者基本都会遇到华为手机的坎:由于谷歌的制裁,ARCore并不能覆盖华为的新机型导致新的机型已经不能使用ARFoundation方案;使用第三方通用的ARsdk也并不能完美兼容常用的华为机型,毕竟官方原生的sdk才是最适配自身机型的。最近我也在学习接入HuaweiAREngine与ARFoundation兼容使用的项目,搜集了一些解决方案并进行了总结,由于unity相关的方案官方迟迟还没有更新(官方也关闭了旧的2.0版本的下载入口 ),下面提供的sdk版本也是测试版本,仅供学习使用。

一、简介

Huawei AR Engine 是⼀个在 Android 智能⼿机上构建增强现实应用程序的平台。目前支持的功能包括:

  • 运动跟踪

  • 平面检测

  • 光照估计和命中测试

  • 手势识别和骨骼跟踪

  • 人体骨骼跟踪

  • 人体蒙版

  • 图像跟踪

  • 场景网格

  • 面部表情

以下是官方给出的支持列表:

服务

设备类型

设备型号

AR Engine服务

华为P系列

P50 Pro、P40 系列、P30、P30Lite、P30 Pro、P20、P20 Pro

华为Mate系列

Mate 40 系列、Mate 30 系列、Mate X、Mate Xs、Mate 20 X (5G)、Mate RS、Mate 20 X、Mate 20、Mate 20 Pro、Mate 20 RS、Mate X 2 (TET)

华为Nova系列

nova 8、nova 8 Pro、nova 7、nova 7 Pro、nova 6、nova 6 (5G)、nova 5、nova 5 Pro、nova 5i Pro、nova 5z、nova 4、nova 4e、nova 3

华为畅想系列

畅享9 Plus

华为麦芒系列

麦芒7

荣耀手机

荣耀30、荣耀30 Pro、荣耀30 Pro+、荣耀30S、荣耀V30、荣耀V30 Pro、荣耀20、荣耀20 Pro、荣耀V20、荣耀10、荣耀9x、荣耀9X Pro、荣耀8X、荣耀Magic2、荣耀 Play

平板系列

M6、MatePad、MatePad Pro

但并不是列表上的机型都支持Huawei Engine的所有功能,以下是部分机型支持的功能介绍:

AR类型

是否启动深度

手机型号

WorldAR

不支持

Mate20系列,P20系列,Nova3,麦芒5,荣耀V20系列

BodyAR

不启动

Mate20系列,P20系列,Nova3,麦芒5,荣耀V20系列

BodyAR

启动

荣耀V20系列

HandAR

不启动

Mate20系列,P20系列,Nova3,麦芒5 ,荣耀V20系列

HandAR

启动

Mate20 Pro

FaceAR

启动

Mate20 Pro

WorldBodyAR

不启动

Mate20系列,P20系列,Nova3,麦芒5,荣耀V20系列

WorldBodyAR

启动(world不支持,body启动)

荣耀V20系列

二、Huawei AR Engine的unitypackage介绍

目前华为官网上是找不到unity相关的sdk,但目前华为论坛上还是存在内测版的Huawei AR Engine的unitypackage,我这边有两个unitypackage的版本,分别对应不同的unity版本使用

其中:

1.arenginesdk-sample-unity-2.0.0.5

环境要求:

  • 手机EMUI版本9.0以上
  • 在应用市场下载并安装AREngine
  • Unity 2017.4LTS 以上 Unity2019.4LTS以下的版本

2.arenginesdk-sample-unity-3.0.0.11

环境要求:

  • 手机EMUI版本9.0以上
  • 在应用市场下载并安装AREngine
  • Unity2020LTS以上的版本

因为Huawei AREngine需要用到一个ARBackgroundRenderer的类来渲染AR场景,这个类在2020以上的版本已经被其他的类取代,但AREngine找不到引用所以导致报错

所以建议Unity2019LTS以下的版本使用2.0的版本,Unity2020以上的版本只能使用3.0以上的版本,开发者需要根据自己的unity版本来使用sdk。

三、SDK的接入与使用

因为2.0与3.0除了一些细节部分外使用的流程基本一致,所以这里就不分开直接一起说明。导入sdk后,在Example文件夹可以查看官方提供的所有demo

每个demo文件夹下有对应的功能配置,每个场景都需要加载对应的配置才能正常使用, 这里只挑一个demo作简单介绍。 

 WorldARSample这个demo主要是演示AR模型识别真实环境的地面并放置

配置文件的属性介绍如下:

        /**\if english
         * Lighting mode of an configuration object. Default value is AMBIENT_INTENSITY。
         * \else
         * 配置项的光照模式。默认启动环境光。
         * \endif
         */
        public ARConfigLightingMode LightingMode = ARConfigLightingMode.AMBIENT_INTENSITY;

        /**\if english
         * Update mode of an configuration object. Default value is BLOCKING。
         * \else
         * 配置项的更新模式。默认阻塞模式。
         * \endif
         */
        public ARConfigUpdateMode UpdateMode = ARConfigUpdateMode.BLOCKING;

        /**\if english
         * Power mode of an configuration object. Default value is NORMAL。
         * \else
         * 配置项的功耗模式。默认不使用低功耗。
         * \endif
         */
        public ARConfigPowerMode PowerMode = ARConfigPowerMode.NORMAL;

        /**\if english
         * Item of depth switch of an configuration object. Default value is \c true。
         * \else
         * 配置项的深度开关。默认打开深度流。
         * \endif
         */
        public bool EnableDepth = true;
        /**\if english
         * Item of mask switch an configuration object. Default value is \c false.
         * \else
         * 配置项的遮罩开关。默认关闭遮罩功能。
         * \endif
         */
        public bool EnableMask = false;
		/**\if english
         * Item of scenemesh switch an configuration object. Default value is \c false.
         * \else
         * 配置项的环境Mesh开关。默认关闭环境Mesh。
         * \endif
         */
        public bool EnableMesh = false;

        /**\if english
         * Enable semantic plane mode. Default value is \c false.
         * \else
         * 配置使能语义识别平面模式。默认关闭。
         * \endif
         */
        public bool SemanticPlaneMode = false;

        /**\if english
         * The way the configuration item is opened by the camera. The camera is turned on internally by default.
         * \else
         * 配置项的相机打开方式。默认内部打开相机。
         * \endif
         */
        public int ImageInputMode = 0;
        /**
         * \if english
         * Focus mode of this configuratioin. Default is FIXED_FOCUS.
         * \else
         * 对焦模式,默认是锁定对焦到无穷远。
         * \endif
         */
        public ARConfigFocusMode FocusMode = ARConfigFocusMode.FIXED_FOCUS;

        /**
         * \if english
         * Select the behavior of the plane detection subsystem. Default is Enable.
         * \else
         * 设置平面检测的行为,默认使能。
         * \endif
         */
        public ARConfigPlaneFindingMode PlaneFindingMode =ARConfigPlaneFindingMode.ENABLE;

        ///@cond ContainImageAR
        /**
         * \if english
         * Set the database of image tracking. Default is null.
         * \else
         * 设置图像跟踪的数据库。
         * \endif
         */
        public ARAugmentedImageDatabase AugmentedImageDatabase = null;

 开发者可以根据自己需要的功能对配置表进行配置。

使用Huawei AREngine sdk开发时有些需要注意的细节:

1.判断设备是否可用AR,可以查阅sdk中的AREnginesSelector.cs类

AREnginesAvaliblity aREnginesAvaliblity = AREnginesSelector.Instance.CheckDeviceExecuteAbility();  
if ((AREnginesAvaliblity.HUAWEI_AR_ENGINE&&aREnginesAvaliblity) != 0)  
{    
    AREnginesSelector.Instance.SetAREngine(AREnginesType.HUAWEI_AR_ENGINE);  
}}

2.检测设置是否已经安装AR的依赖(AREngine.apk),可以查阅sdk中的AREnginesApk.cs类

        /**
         * \if english
         * @brief Request to insatll the <em>HUAWEI AR Engine.apk</em> synchronously.
         * 
         * We recommand you to call this method in 
         * <a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationPause.html">OnApplictionPause(bool)</a>. 
         * When the application starts, set \c userRequestedInstall=true.
         * If <em>HUAWEI AR Engine.apk</em> is installed and compatiable, this method will return 
         * \link ARInstallStatus.INSTALLED\endlink immediately.
         * Otherwise, this function will firstly check current device availability. If the device is supported, this function 
         * show a window to prompt user. If user agree, it will jump to huawei application store. And then this function returns
         * \link ARInstallStatus.INSTALL_REQUESTED\endlink.
         * 
         * When your application resume, you should call this method again with \c userRequestedInstall=false. 
         * This will either return INSTALLED or throw an exception indicating the reason that installation could not be completed.
         * @param userRequestedInstall If set \c true, override the previous installation failure message and perform the installation again.
         * @return The Install status of HUAWEI AR Engine.
         * \else
         * @brief 同步请求安装<em>HAUWEI AR Engine.apk</em>。
         * 
         * 推荐在<a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationPause.html">OnApplictionPause(bool)</a>
         * 中调用该方法。
         * 
         * 当应用启动时,设置 \c userRequestedInstall=true。如果已经安装<em>HUAWEI AR Engine.apk</em>并且与SDK版本兼容,该方法将直接
         * 返回\link ARInstallStatus.INSTALLED\endlink。否则,该方法将首先检查设备的兼容性。如果设备支持,该方法将弹出一个提示框,提示用户跳转
         * 到华为应用市场下载。
         * 
         * 当下载完成后,应用恢复,应用应该用\c userRequestedInstall=false 调用该方法。该方法将返回INSATLLED或者抛出异常。
         * @param userRequestedInstall 如果为\c true,将清除之前请求安装的错误信息,重新请求。
         * @return HUAWEI AR Engine的安装状态。
         * \endif
         * @exception ARUnavailableDeviceNotCompatibleException \copybrief ARUnavailableDeviceNotCompatibleException
         * @exception ARUnavailableEmuiNotCompatibleException \copybrief ARUnavailableEmuiNotCompatibleException
         * @exception ARUnavailableUserDeclinedInstallationException \copybrief ARUnavailableUserDeclinedInstallationException
         * @exception ARUnavailableConnectServerTimeOutException \copybrief ARUnavailableConnectServerTimeOutException
         */
bool installRequested = false;
switch (AREnginesApk.Instance.RequestInstall(!installRequested))
{    
    case ARInstallStatus.INSTALL_REQUESTED:      
        installRequested = true;    
        return;    
    case ARInstallStatus.INSTALLED:    
        break;
}

3.AR功能的启用,可以查阅ARSession.cs类

        /**
         * \if english
         * @brief Create a new ARSession.
         * 
         * Before calling this method, application must firstly confirm that HUAWEI AR Engine is installed 
         * and compatiable on current device. Otherwise, exceptions may throwed.
         * \else
         * @brief 创建一个新的会话。
         * 
         * 调用该方法前,应用应该首先保证引擎已经安装并且兼容,否则,将抛出异常。
         * \endif
         * @exception ARUnavailableServiceNotInstalledException \copybrief ARUnavailableServiceNotInstalledException
         * @exception ARUnavailableServiceApkTooOldException \copybrief ARUnavailableServiceApkTooOldException
         * @exception ARUnavailableDeviceNotCompatibleException \copybrief ARUnavailableDeviceNotCompatibleException
         * @exception ARUnavailableEmuiNotCompatibleException \copybrief ARUnavailableEmuiNotCompatibleException
         */
        public static void CreateSession()
        {
            ARSessionManager.Instance.CreateSession();
        }

四、应用的导出与使用

输出版本是建议是选择android 24以上的版本

在使用2.0版本的sdk时,输出sdk前需要在project setting->huawei AR ,把Huawei AR Required勾选上,不然输出的版本可能会黑屏

 如果设置了上面的选项还是出现黑屏的情况,那还需要检查是否有开启Camera的权限,可以修改工程的AndroidManifest.xml来增加camera权限,或者直接在脚本上增加权限检测的代码

    public void CheckAndroidPermission()
    {

#if UNITY_ANDROID && !UNITY_EDITOR
        Debug.Log("====申请安卓的摄像机权限");
        permissionList.Add(Permission.Camera);
        foreach (string permission in permissionList)
        {
            if (Permission.HasUserAuthorizedPermission(permission))
            {

            }
            else
            {
                Permission.RequestUserPermission(permission);
            }
        }
#endif
    }

如果以上都设置了还是使用不了AR功能的话,就需要检查下机型是否支持AR,是否已经安装AREngine的apk等等。

五、小结

华为AREngine sdk输出的工程能在华为的机型(本人测试的设备是mate pad)下流畅运行,基本与同等硬件的ARCore机型的效果差不多,甚至会更好一点。而且作为兼容方案与ARFoundation一起输出也并不会冲突,可以用作华为机型与ARCore机型的解决方案(启动前先做设备支持性的检测),期待官方正式版的发布!

附件

最后附上两个版本的Huawei Engine SDK

2.0版本:arenginesdk-sample-unity-2.0.0.5.zip

链接:https://pan.baidu.com/s/1mi2-dASmvfgxIQ-ahb8wHQ 
提取码:6fgl

3.0版本:arenginesdk-sample-unity-3.0.0.11.zip

链接:https://pan.baidu.com/s/1xIHjwnzloS2LcZYCeGhXHQ 
提取码:h6su

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值