当前位置:   article > 正文

flutter-unity互通原理详解_flutter unity

flutter unity

整体思路

这篇主要介绍了一个flutter-unity互通的开源框架原理,地址github,使用过程仓库里说得很明白了,我们这片主要来看如何将一个unity场景快速优秀的显示在flutter开发的app中。

ok,先过一下总体的设计思路。
从结果论倒推,我们是要将一个unity场景转换为一个flutter的widget,想要得到一个flutter的widget,最优方案自然是创造出一个原生native层面的view或者UIView转换为flutter的widget。所以我们就要把native层面的unityPlayerActivity或者viewController转换为native层的view或者UIView。而unityPlayerActivity和viewController是由unity工程中export Android和export iOS分别导出对应生成的。这里就有一个难点在于我们如何把本来unity中原生是只有export android apk和export ios bundle两个按钮选项的,正常要被flutter所用的话,就得转成module或者一个pod库。

整体思路就是这样,很简单,为了搞清楚其中的难点是如何实现的,我们先来梳理下unity打包Android和iOS的结构。

tips:本篇untiy版本为2019.4.3f1,建议最好使用该版本,2020版本我试过会出现各种打包问题。
原理这里主要讲解Android了,iOS基本流程类同。

unity打包

在这里插入图片描述
我们直接build出android apk然后反编译来看结构,附上一些关键点的图。
在这里插入图片描述
这是反编译apk出来的目录结构,assets下放的对应场景的unity资源,里面包含了unity场景中大部分资源都会集成进去的data.unity3d二进制文件,lib下放的是unity相关的so文件。很明显到时候我们以module形式引用的话这些文件我们都是需要的,我们再来看AndroidManifest.xml里,很明显正常一个unity场景的apk加载unity场景在这个UnityPlayerActivity里,我们再来看UnityPlayerActivity.smali的代码
在这里插入图片描述
在这里插入图片描述
这里我们可以看到,相当于新建了一个UnityPlayer对象,然后直接setContentView进去了,所以就很简单了,我们可以把这个UnityPlayer理解成一个view了。

unity场景在flutter中显示原理

导出

首先第一步,我们要解决如何把unity export apk转换成android module的问题。
查阅unity 官方文档我们发现,打包api为BuildPipeline.BuildPlayer(),详见文档unity documentation。unity支持自定义增加工程menu item,在Build.cs文件中增加使用逻辑即可。
这里我们其实就可以做这样子的操作,把打出来的apk下assets目录下的unity相关资源文件,AndroidManifest.xml,build.gradle等文件拷贝到一个module目录下,然后对其进行文件里的修改,比如把build.gradle下的com.android.application改成com.android.library让它声明改成是一个library module等操作。可以理解成直接用代码修改文件形式把一个phone module改成library module。并且在android native层settings.gradle文件中把这个library module引用进去,这些都是android的基础知识。

代码具体如下:
在这里插入图片描述
这里注意一点,考虑到通用性,让其能过通过相对路径直接修改,需要把unity项目移到你的flutter工程下的unity目录下。

ok,经过这一步以后我们就可以打出一个这样子的module了。
在这里插入图片描述
至此android native层的工作就搞好了,这一部分工作主要是比较繁琐,逻辑还是很清晰的。

flutter module

native层的工作搞定之后接下来我们就要构建一个flutter plugin,给flutter project使用了。

首先实现registerWith方法,代码位于FlutterUnityWidgetPlugin.kt中,这里对LifecycleOwner进行了特殊处理判断,对LifecycleOwner不熟悉的同学可以看这里
在这里插入图片描述
接下来就是创建FlutterUnityWidgetFactory集成PlatformViewFactory,去实现其create方法去创建UnityView。
在这里插入图片描述
我们再转到FlutterUnityWidgetController.kt,其继承了PlatformView。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里我们新建加载了我们的UnityView。这里要注意需要引入unity-class.jar,不然flutter项目中是无法获取的,这里的原理和native层去加载UnityPlayerActivity同理。
这里我们还要关注下onMethodCall方法
在这里插入图片描述
分别在UnityPlayerUtils类下实现了几个相关的生命周期方法供flutter调用。
接下来我们只要在flutter plugin层去创造对应的UnityWidget就行了。代码在unity_view.dart里。

数据通信

数据通信这一块,我们可以看到主要通过native周转,flutter和native之间通信,native再和unity去进行通信
在这里插入图片描述

ok,基本上原理这块就是这样子。

性能监测

unity场景在flutter中运行,应该会比较关注性能这一块,这里列出测试的Android数据。测试手机: Galaxy M20 Android10 全屏simple ar状态
包体积大小:
一个空flutter项目 50.6MB
加了一个空场景 77.51MB
加了AR founadation 100.09MB

平均帧率38.0 frames per second左右,基本控制在16ms以下
以及其内存使用情况
在这里插入图片描述

不同AR场景之间切换的内存使用情况
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/82897
推荐阅读
相关标签
  

闽ICP备14008679号