👉即将学会
从头到脚,从懵懂到运行,完美搞定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://juejin.cn/post/6995888006179602468
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
👉其他
📢作者:小空和小芝中的小空
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。