写点什么

Android/Unity 大乱斗 - 集成遇到的问题

作者:芝麻粒儿
  • 2022 年 7 月 16 日
  • 本文字数:2315 字

    阅读完需:约 8 分钟

Android/Unity大乱斗-集成遇到的问题

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!专注于 Android/Unity 和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)


👉即将学会

从头到脚,从懵懂到运行,完美搞定 Android 和 Unity 联合开发。文章分上下两篇。

👉背景

🙈小空和🙎小芝:这是一个很长很长的 story!

👉实践过程

布局渲染

我们需要在任意布局加载 3d,怎么个任意法?就是找个 view 来 addview 既不影响 3d 还有 android 原生界面


//xml布局<LinearLayout        android:id="@+id/linear"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_margin="50dp"        android:orientation="vertical" /> //java文件mLinear.removeAllViews();mLinear.addView(mUnityPlayer.getView());mUnityPlayer.requestFocus();
复制代码


操作效果请看图片,全部具体代码的话 就直接放到RXlung/Android-Unity---: Android/Unity大乱斗-完整双方集成交互指南 (github.com)


通信交互

Android 调用 Unity


//参数二是 Unity中的方法名   参数一是哪个物体挂在了这个C#脚本  参数三 字符串UnityPlayer.UnitySendMessage("Main Camera", "AndroidCallUnity", "");
复制代码



Unity 调用 Android 仔细看注释

using System.Collections;using System.Collections.Generic;using UnityEngine;//https://juejin.cn/user/4265760844943479/posts//https://zhima.blog.csdn.net/public class Manager : MonoBehaviour{    private AndroidJavaObject m_androidObj = null;    public GameObject diqiu;     void Start()    {        //注意-情况不同 com.unity3d.player.UnityPlayer  可能不同,可参考其他博主        AndroidJavaClass androidClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        m_androidObj = androidClass.GetStatic<AndroidJavaObject>("currentActivity");        diqiu.SetActive(false);    }     //Unity中的某个物体出发此事件    public void UnityCallAndroid()    {        Debug.Log("调用方法");        if (m_androidObj != null)        {            Debug.Log("调用方法进来");            // 第一个参数是android里面java代码的方法名,第二个是携带的字符串参数            m_androidObj.Call("CallAndroid", "我是Unity,我给你发消息了");        }    }     //Android调用Unity-方法名一定要注意    public void AndroidCallUnity(string json)    {        if (diqiu.activeInHierarchy)        {            diqiu.SetActive(false);        }        else        {            diqiu.SetActive(true);        }    }}
复制代码

场景切换

  • Unity 内部自己去处理,就跟玩游戏一样,让 Unity 开发自己去做。

  • Andorid 触发,unity 换场景,这个借助上面说的消息通信来实现。 

  • 这还有一个技巧,如果资源不是很多且在一个场景的话,可以让 Unity 一次直接渲染出来存在字典里,然后想显示哪个 Android 给 Unity 发消息,Unity 根据订好的消息,展示不同的内容,这个好处就是切换展示速度极快。重点处理一下刚启动的时候的耗时即可。

动态资源

态加载资源的问题,因篇幅有限,咱先只提供个思路,Unity 支持读取 android 设备的存储文件,让他们处理即可,然后 android 发消息告诉他们地址即可

// 参数一是Unity中的物体名称,参数二Unity中的方法名  参数三路径字符串UnityPlayer.UnitySendMessage("AndriodMethodMgr", "CallUnitySetPath", Environment.getExternalStorageDirectory() + "");
复制代码

啊哈,到这基本就结束了。快了又开心。

坑中带坑

为了愉快的装逼,最好还是看一看遇到的这些问题,能至少省几天时间。

1. 混淆问题,如果你开启了混淆,切记 切记,把混淆添加进入,这个大坑耽误我好久啊

2. 如果模型在 unity 中没问题,在 android 端穿帮,可以看看发布质量,将 android 的设置成高的



3. 如果反复执行的模型动画不对,怎么不对?举例心脏跳动,这是非常注重动画的衔接的,如果衔接时间不对会造成心脏动画的抖动,这会非常的明显。 

可以看动画的 setting 退出时间,退出时间是比例(如下图),1 代表全部动画,0.5 代表动画使劲按的一般。过度时间前后动画重叠(好像默认.95?) 可以改成 0,如图设置 



4. 集成到 apk 后 申请了横竖屏 但是 apk 没作用,是 unity 发布出的设置导致的,再 Unity 导出的时候 other setting 中设置宣传方向 

5. 权限问题,上面说了会导出一个 android 项目,你仔细看这个项目的 AndroidManifest 文件,你会发现也有权限。 注意,这时候比如你的 android 项目有权限 A 这个 Unity 导出的项目没有权限 A,当你集成合并之后,导致最终的 apk 没有权限 A,这并不是我们想看到的; 所以为了 解决这个问题,很简单,我们把两个清单文件的权限保持一致即可,记住啊,否则怎么哭的都不知道。

6. 还有一个未解决的问题,放到这,有朋友知道的话,感谢指教。 带有动画的一个物体,在有的 android 设备上,动画表现征程,但是有的会出现动画跳动的情况,感觉像是电视的进度条那在跳进度一样。 

结尾

最后,别问我为啥知道这么多问题,问就是因为自己跪着走过来的。


👉其他

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:https://www.infoq.cn/profile/DB2492B85795C4/publish

📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

发布于: 刚刚阅读数: 3
用户头像

芝麻粒儿

关注

尺有所短;寸有所长。 2020.08.29 加入

👑CSDN博客专家-华为云享专家-Android/Unity领域优质作者 🏅目前在模拟医学行业做Android/Unity双端开发 🏆微信公众号:【空名先生】 🏆QQ交流群:204918251或877807592

评论

发布
暂无评论
Android/Unity大乱斗-集成遇到的问题_android_芝麻粒儿_InfoQ写作社区