草庐IT

Android 与 Unity(随笔录)

小尹编码中... 2023-06-20 原文

前言

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

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

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

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

结尾:

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

有关Android 与 Unity(随笔录)的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  3. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  7. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

  8. 【Unity大气散射】GAMES104:3A中如何实现大气散射 - 2

    写在前面前两天学习并整理的大气散射基础知识:【Unity大气渲染】关于单次大气散射的理论知识,收获了很多,但不得不承认的是,这其实已经是最早的、90年代的非常古老的方法了,后来也出现了一些优化性的计算思路和方法。因此,我打算先不急着跟各种教程在Unity中实现大气散射,而是再花时间来看看最近的游戏是如何去实现大气渲染的:06.游戏中地形大气和云的渲染(下)|GAMES104-现代游戏引擎:从入门到实践接下来就跟着GAMES104讲地形大气和云渲染的部分学习并做简单的记录,涉及到之前没提到的Mie散射也只选择直接截图PPT的方式记录啦!毕竟对于做作品来说,之后实现出来才是重要的~当然,May佬的

  9. ruby - 使用 Ruby 编写 Unity 游戏 - 2

    所以我看到unity支持c#、JS和Boo。我可以学习其中一个,但我想制作一个“编译器”或类似的东西,让我可以编写ruby​​代码并输出JS代码或制作一个可以被Unity编译器读取的层。这有可能吗?我愿意在这方面投入很多时间并且有相当多的经验。 最佳答案 如果您的问题实际上是“我如何将Ruby编译为JavaScript”,那么这更容易回答:Opal:RubytoJavaScriptcompiler但是,学习其中一种受支持的语言会更好。当运行的是用另一种语言解释的代码时,很难调试“您的”代码。

  10. Unity常用文件夹 - 2

    1.Scenes游戏场景文件夹用于放置unity的场景文件 2.Plugins插件文件夹用于放置unity的依赖文件,例如dll 3.Scripts脚本文件夹用于放置unity的c#脚本文件 4.Resources游戏资源文件夹用于放置unity的各种游戏资源,比如images,prefabs,同时只有放到Resources文件夹的游戏资源才能使用Resource.load(资源路径不加后缀)加载到游戏内存中进行使用 5.EditorUnity编辑器扩展脚本文件夹usingUnityEditor;这个名称空间就是Unity编辑器的名称空间这个名称空间提供了扩展Unity编辑器的各种类 【你所有

随机推荐