Android 与 Unity(随笔录)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

最近换了工作公司是做康复领域的由于项目需求需要Android产品中必须加入VR元素将虚拟场景与Android融合打造一个用户满意的产品。

本人是做Android开发的思考的是把Unity作为Android项目的一部分还是把Android项目作为Unity的一种其实把都是可取的但是根据项目需求权衡利弊后我还是选者了前者毕竟相较于UnityAndroid自己懂得比较多一些

VR我是在大学一个偶然的机会接触到的被学校安排去参加VR的相关比赛于是开始了Unity 3D的学习过程我大学主课其实是Android开发后来一有空闲时间就开始研究起了VR我接触最多的VR设备字节的PICO系列了当然了Steam VR也有接触过一些。

说起VR大家都会想到游戏其实吧我所了解到的是Unity不仅仅只是局限于游戏开发领域虚拟现实工业医疗App都有越来越多的厂商开始开发使用大部分都是代替了现实去做虚拟化的模拟演练如果说让我来形容一下Unity——创建虚拟的显示空间从视觉听觉感觉这三点让你在虚拟的世界里尽情发挥是心灵得到释放。

由于我在上海租房有点偏每次到公司通勤时间都是一个半小时每天花在路上的时间就有三个小时呜呜呜~~~还好公司没有996也从不加班这点倒是很庆幸了。每天能够让我期待的估计就是我的Pico neo3了睡觉前戴上感受一下虚拟场景的唯美画质感受一下场景中仿佛近在咫尺却无法触摸的天空盒还有那栩栩如生的场景模型和毫无违和感的骨骼动画让我身如其境白天的劳累又算得了什呢

言归正传我在公司的岗位是Android开发但是由于产品需求刚刚好我们公司又正缺一位Unity开发人员不过还是项目需要当然也可能因为我做过Unity吧我便负责了Android与Unity交互这一块也算是填补了公司目前的空缺吧。

其实我之前也没有做过康复类设备的虚拟场景我也没有过康复类的知识储备我大学也没有学过医疗知识我一开始也很好奇我也是带着学习的心态来做的按照需求我先把原项目升级到新版的Unity长期稳定支持版再将原项目中的一些过时和弃用的API该修改的就修改该重写的就重写由于是更新了Unity项目的版本我们不确定是否能适用相关的硬件设备而且还要反复打包测试是否能将虚拟场景正常运行上去

写到这里我突然意识到好像关于自己工作内容和工作上的事不能随便写的吧安全起见我还是不说了 具体演示视频在我博客视频上也有大家感兴趣也可以看看

Unity有哪些好处呢

目前大家都喜欢线下打卡某些旅游胜地名胜古迹餐厅公园等公共场所然后拿出手机打开App拍照发朋友圈

未来可以通过VR的形式一比一将现实场景还原到虚拟世界中用户可以线上打卡附近的森林湖泊加油站动物园体育馆公园餐厅等不同公共场所更加符合当下的疫情的局面

当然了目前我所了解到的康复产品在使用过程的效果演示图其实也是在虚拟场景中进行的

元宇宙的初步体现

我所了解到的其实已经有公司将虚拟场景应用在了党建司法教育军工等相关领域目前这家公司都已建成VR党建线上体验馆VR社区矫正教育基地VR智慧课堂VR模拟仿真技勤维护系统基于VR研发的涉及某型发射车船舶等模型设计验证训练技勤维护系统

还有就是前端时间很火的数字人虚拟主播。

我之前也在一些平台上看到虚拟数字人新闻播报视频这类视频好像给我的感觉与用户拍摄的传统视频有所不同它着实给整个新闻播报行业增添了丰富的色彩主持人不再是规规矩矩地坐在那里或者是笔直地站在那里了而是由虚拟数字人取而代之幕后的运营也不用辛苦背稿了直接提供文本就可以让虚拟数字人只能配音播报出来。

这类情况也是预示着元宇宙的席卷吧

不过我觉得最让行业印象深刻的可能是就是字节跳动了吧  突然之间宣布花了90亿来收购Pico或者是预感到了元宇宙时代吧

Android 集成 Unity上的坑

1. Unity版本的差异

Unity的版本在2019及其以下选择Mono方式打包出Android项目反之选择IL2CPP方式打包Android项目

为什么我会说这个Unity版本上会存在差异呢因为我在工作时发现我们项目原本是要升级到2022最新版的但是发现2022用Mono方式打包出来的Android项目运行到Android设备中能启动加载页面但是加载页面之后立马就报错显示Failure to iniyialize类的报错好像是指找不到 'libmain.so '然后我去看了文件夹里面的文件发现Mono打包出来的Android项目文件确实没有这个于是我又用2022版Unity采用 IL2CPP的方式再打包一个Android项目文件出来果然我找到了这个so库文件对比之下发现 IL2CPP打包出来的Android项目包才有这个库文件于是我带着好奇心去查看了一下Unity开发文档看看官方有没有声明原因不查不知道一查原来是Unity官方从2020开始就已经推荐大家使用 IL2CPP 打包的方式将Unity项目嵌入到Android项目中如果再打包是勾选 IL2CPP方式便可以勾选上ARM64选择Mono的话就不能勾选上ARM64了并且打包出来没有libmain.so库由于我对IL2CPP打包出来的文件夹的目录结构不熟悉因为它相较于Mono打包出来的文件会多两个文件夹我一时也不知道该如何做处理才好再加上项目刻不容缓。我主管当时问我我们项目选择的Unity版本选好了吗 我当时考虑到了时间和自己对于2019.4.10f1 LTS这个版本有把握我便选择了2019长期稳定版本的Unity 3D作为公司项目的开发主要也是自己不敢冒险的去采用最新版本去做避免一些不必要的麻烦和BUG。

2. Unity启动画面时间太长

正常现象因为用的是个人开发者许可证应选择购买专业开发者许可证才能跳过启动画面

将Unity虚拟场景嵌入到Android Studio中发现了一个问题跳转虚拟场景后先显示Unity Logo的加载页面这个时间大概是2.5秒左右但是Logo加载完成后我惊讶的发现竟然出现了长达10秒左右的黑屏。我一开始以为是报错了然后我开始了反复测试发现并不是Unity端报错也不是Android端报错看了看日志发现其实没有报错。于是我开始测试项目运行是否有问题经过反复打包和测试我发现项目没有任何问题全部正常运行我当时陷入了一个疑问这个黑屏到底是什么是Android设备卡了出问题了吗后来我再去看看官方文档去百度了一下发现其实它就是正常现象。 原因就是因为我没有花钱购买Unity的开发者许可证因为我用的一直都是Unity学生免费版本的许可证。如果打包的是一个接近空项目Unity的场景那么嵌入到Android是不会有这个黑屏的因为Unity打包时它认为你是做一个业余爱好者的身份来使用如果你在Unity场景防止外来导入的模型和其他那么在打包出去的时候Unity认为你将它用做专业开发用于商业使用将其嵌入到Android中便出现黑屏画面当然了除非你是购买了开发者许可证。唉如果给用户使用的时候我们肯定不能让用户等待Unity启动毕竟这个启动过程有这个10秒左右的黑屏其实也可以在这个黑屏期间放入自己公司产品的Logo来遮盖等虚拟场景运行起来后再取消遮盖或者也可以放入一段动画等等。

3.Unity嵌入Android的方式

嵌入方式不唯一我的方式是将Unity导出的Android jar包和生成的Android对应文件和相应的Activity文件放入到Android项目中然后更改添加相关配置

我看到网上其实也有很多其他的嵌入方法但是核心都只有一个那就导入的文件依然符合Android的目录结构只是更加丰富了Android内容毕竟增加了Unity引擎的虚拟场景那这个档次一下就上来了。对了这个不同于SDK的接入SDK的接入只需放入jar包将其解压在Android Studio中再调整一下配置就接入成功了接下来就可以按照开发文档来进行相关开发。嵌入Unity成功后还需考虑到双端通信是否能够正常进行这整个过程网上也没有什么可以参考的了。

4. Android与Unity如何交互

  1. 参数少的情况下正常的函数调用即可但每次一个参数多调用几次即可具体详情参考小编的上一篇文章
  2. 参数多的情况下面对接口编程实现双方的接口即可具体需求具体分析具体详情参考小编的下一篇文章

Android调用Unity函数

     UnityPlayer.UnitySendMessage("","","");

通过从UnityPlayer.UnitySendMessage“”“”“”方法来调用Unity中的脚本函数这个UnityPlayer是jar包中所包含的一个类可以直接调用的这里Android来调用Unity有一个好处那就是不用Unity反复打包操作因为你每次修改Unity场景或者脚本后你都得到重新打包并且重新嵌入Android那么这一过程就会很麻烦了所以我们尽量以Android为主将功能都间接的交给Android端来控制可以减少很多的调试开发过程为项目节省很多不必要的时间。

Unity调用Android函数

      AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");

实例化AndroidJavaClass对象获取Android中com.unity3d.player.UnityPlayer这个类在Unity3d导出工程的unity-class.jar中

实例化AndroidJavaObject对象是Unity发送消息给Android的关键获取到Android此刻正在运行的Activity

这里的部分的基本没有什么坑点啊只要你是按照我的方式来的话参考上一篇文章要是这里还有疑问的小伙伴那可以自己反省反省了

结尾

本人也是这方面的小白若有错误请麻烦您指出悉心听教只是希望后面从事这种项目的小伙伴能快速入门避免踩坑减少大量开发时间。最后问一句有没有和我一样正处在这个开发阶段的小伙伴呢可以试着联系一下交流交流。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android