ARFoundation集成SenseAR(二)

       隔了好久又用上了senseAR,上一篇说到senseAR的文章也只是个调研,也没有多深入进使用这个插件。在这里不得不吐槽一下ARFoundation。。。对于用ARFoundation进行跨平台AR开发,ios往往会比android省事。因为ios所需要做的事情arkit都帮开发者做好了;但andriod的ar开发简直是个噩梦,因为ARCore的适配原因,我都不记得向产品解释过多少次为啥xx机型用不了AR,再加上后面的制裁事件,新的支持ARCore的安卓机型也越来越少,到后面基本都放弃安卓AR的开发了。总总原因使用对机型硬件没有限制的senseAR简直是安卓开发的明灯,一是使用的ARFoundation开发框架不需要重构可以直接使用,二是可以接替ARCore直接适配所有安卓机型,让安卓AR的开发跟ios一样轻松。这么一说的话senseAR简直是AR的业界明灯啊。。。在深入使用之前本人是这么想的,但实际用起来却又是一坑接一坑。因为网上的文章大多数都是基于Unity2018的,虽然有些博主说了能支持Unity2019的版本,但都是一笔带过,并没有可以参考的文章与工程,这次又是着实地踩了个大坑。但好歹还在是多次尝试后把这个坑给填上了,在这里进行一下SenseAR的使用总结。

1.版本要求

senseAR不仅对Unity有版本要求,自身的版本也对其他依赖插件的版本有要求。

在PackageManager是不能直接搜索到SenseAR XR Plugin的,需要勾选到show preview packages,senseAR里面显示的插件都是preview版本。

其中preview3.1.1.0以下的版本可以在所有的Unity2018.4.x的版本号里运行,这里建议还是使用unity2018的长期维护版里使用(即后缀带LTS的版本),同时,在PackageManager里也可以看到SenseAR对依赖插件的版本需求:

它需要ARFoundation1.5.0-preview.6与ARSubsysytem2.20-preview.3这两个插件的依赖,当AR运行不正常的话可以检查这两个插件的版本号。同时要注意的是SenseAR的这个版本必需要安装对应的这两个依赖插件,当你使用的Unity版本是2018.4.x的话就只能使用preview3.1.1.0,不可以使用更高的版本了。如果你使用Unity2019的版本可以继续往下看。

截止到现在为止,SenseAR最新的版本是preview.1 -3.1.0,文档上说明是可以在Unity2019以上的版本使用,但其实这是个坑的!准确来说最新版本的SenseAR XR Plugin preview.1 -3.1.0只能在指定的unity版本中运行,当使用unity过高或者过低的版本时,senseAR虽然能运行,但会导致其他的报错:例如跳转场景会闪退、显示会黑屏、禁用摄像机会闪退等等问题。

在preview.1 -3.1.0的版本中可以看到它的相关依赖

可以看到它依赖的ARFoundation与ARSubsystems版本是3.1.0- preview.8,Android JNI是1.0.0。这三个插件都是有对应的版本安装的,没多大问题。但要求的XRManagement使用版本是是3.0.4(这里我安装了3.0.5,也可以正常运行),在2019以上的unity版本中senseAR报错大多是因为这个XRManager。我使用的unity版本是2019.3.0,在PackageManager面板上可以看到XRManagement的最低版本就是3.0.5,但senseAR要求的是3.0.4

查了unity的官方资料,3.0.4版本只存在2019.2的版本里面,而且只有一个preview版本。

在最后我使用了Unity2019.3.0版本运行senseAR,虽然没有出现闪退黑屏的现象,但在安装的logcat界面还是有看到senseAR的报错信息的,估计并不是致命的错误所以并没有影响app的运行。所以当需要用到senseAR时,有三种选择

1.使用旧的preview3.1.1.0版本,配合unity2018.4.x的unity版本进行开发

2.使用最新的preview1.3.1.0版本,配合unity2019.2.x的unity版本进行开发

3.使用最新的preview1.3.1.0版本,并配合存在版本号是3.0.5的XRManagement的unity版本进行开发

至于版本号过高的unity版本运行senseAR会报错,这里说一下个人的猜测:

打开ProjectSetting界面,当安装了XRManagement后可以找到XR Plugin Management这一选项:

就是因为上面的Plugin Provider选项中无法添加SenseAR Loader,导致senseAR无法启动或者闪退,估计因为新版本的unity中ARSubsystem已经把senseAR移除之类的。

2.渲染管线

unity使用AR时可以使用默认的渲染管线,也可以配合使用LWRP或者URP:

当使用unity2018.4.x的版本时,可以使用LWRP,当使用2019的版本时,可以使用URP,同时有一点要注意的是,当使用了这两个渲染管线时,需要检查管线的配置文件

这两个文件是在创建urp或者lwrp后自动生成的。选择_Render后缀的这个文件

我们需要在Renderer Features中添加对AR的一个background进行配置,点击+号就可以添加。这也是使用senseAR能成功运行但项目黑屏的一个原因:因为摄像头显示压根就没有添加到渲染队列中。

3.兼容设置

senseAR是ARCore的一种替代方案,unity在安卓的版本中只能使用其中一种(两种插件共存的情况暂时还没有测试过,不过也没必要这样做)。对于在哪个平台使用哪种AR插件,这个在上面说到的XR Plugins Management面板中可以通过设置plugin providers来确定

在一个工程项目中当需要打包出android跟ios两种app时,可以兼容设置来防止打包的报错

因为senseAR还需要一个启动脚本SenseARModeSet

可以在脚本的awake中进行判断,如果是android版本才激活脚本,如果下所示:

void Awake()
{
#if UNITY_ANDROID
senseARModeSet.enable=true;
#end 
}

同时,因为senseAR跟ARCore一样需要依赖AR运行库才能启动,可以在场景的激活前进行检测:

 Promise<SessionAvailability> promise = new SenseARSessionSubsystem().GetAvailabilityAsync();
            yield return promise;
            Debug.Log("senseAR的状态" + promise.result);
            if (promise.result == SessionAvailability.None)
            {
                //不支持
                unSupportUI.SetActive(true);
            }
            else if (promise.result == SessionAvailability.Supported)//支持但未安装
            {
                 //跳转到下载界面
                 Application.OpenURL("https://openar.sensetime.com/platform/api/file-manager/v1/files/4/download?contentSHA256=6c99675adea48510a1de6fec9f8b7a5a4479ca9757a51d0e3d0e3e6999331b02");
            }
            else
            {
                //进入AR场景
                SceneManager.LoadScene("Root");
            }

在代码中,对senseAR的引用会在xcode中报错,所以需要用#if UNITY_UNITY这个宏来进行控制。

这样基本可以在最少代码的改动下,使用senseAR来代替ARCore作为安卓版本的AR依赖,功能跟稳定性基本是看硬件的性能,虽然说跟ios相比还是差距挺大的,但跟ARCore相比基本AR效果差不多。

暂时总结到这里:)

      

猜你喜欢

转载自blog.csdn.net/ssssssilver/article/details/112672099
今日推荐