Android 集成 Unity 环境遇到的一些坑

项目中最近在做一个 AR 扫行标(银行 Logo)抽奖的活动,动画模型依托 Unity 环境来展现的。Android 集成 Unity 很简单(比 iOS 方便太多),但是在使用过程中还是需要到一点小麻烦。

需求中要求扫描页面可以反复进出,在 @Override protected void onDestroy () 生命周期的回调方法中需要调用 mUnityPlayer.quit(); 来达到退出 Unity 的目的。但是发现 mUnityPlayer.quit(); 方法会杀死当前进程,不调用 mUnityPlayer.quit(); 方法,控制台中又会提示一个服务没有被清理,会发生内存泄漏,网上的做法是集成 UnityPlayer 写一个新类,重写掉 kill() 方法,不杀死进程,但是实验了之后发现没有效果,依然会有内存泄漏的提示,虽然大部分机型可以正常使用,但是测试中小米和其他品牌的部分机型在反复进出几次 Unity 程序后,会闪退。

最后的解决办法是,在另一个进程中启动 UnityPlayerActivitymUnityPlayer.quit(); 方法杀死当前子进程,而不影响主进程。

<activity
    android:name="cn.com.global_vision_ar.UnityPlayerActivity"
    android:screenOrientation="portrait"
    android:process=":unityAR"
</activity>

这个办法解决了闪退问题,但是还没有结束,UnityPlayerActivity 中需要接收 AR 程序的回调方法,如:public void getGift() ,在这个方法中请求后台接口,发起抽奖。Unity 程序改成用新进程启动后,发起抽奖接口时,发生了会话丢失的情况(抽奖是需要登录的,后台会话是基于 Cookie 中的 JessionId)。我猜是因为不在同一个进程,Cookie 没有同步,导致送到后台的 JessionId 不一致(不是登录成功后返回的 JessionId)。

解决办法是使用 Broadcast 跨进程通信,把抽奖的请求写在主进程,要抽奖时发起广播进行抽奖,抽奖结束后得到抽奖结果的数据,再通过广播的方式把数据传回 UnityPlayerActivity,使用 UnityPlayer.UnitySendMessage 方法通知 Unity 程序。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,523评论 25 708
  • 说一下需求,因为最近AR有点火,大BOSS从手机淘宝发现了一个AR游戏,在“我的淘宝”右上角 有一个“抓喵喵”的游...
    关山明月阅读 11,019评论 11 36
  • 为山里孩子送温暖,山高水长,路慢慢…… 岩禾塘村小学一年级的小磊磊8岁,与爸爸妈妈失去联系的“留守儿童”…… 小磊...
    寒冰0601阅读 137评论 0 0
  • (水果店的三种顾客类型,你是哪一种?)做买卖会遇到各种各样的顾客,他们的购买习惯也大不相同。 一般有以下三种(情景...
    張嘉宾阅读 297评论 2 2
  • 大家晚上好!今天我们继续《秘密》第七章:关系的秘密。 这里举了两个例子,很神奇的说明了他们知道这个秘密之后所做的改...
    三生三世花阅读 1,445评论 0 0