Unity学习笔记
Unity(2019)嵌入安卓开发-实现相互跳转
思路
先将unity打包成as能识别的文件格式,里面需要包含从unity跳转到安卓原生界面的方法。然后在as中导入unity打包好的模块,添加一些配置信息,添加从原生安卓界面跳转到unity的方法,最后打包apk测试即可
流程
先在unity中添加跳转到安卓的方法
AndroidJavaObject jo;
public Button btn;
private void Awake()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
btn.onClick.AddListener(CallAndroid);
}
public void CallAndroid()//这个是从unity跳转到原生app界面的方法,这里用到的个人的理解是反射的原理,通过在unity获得java的反射从而调用他的方法(纯粹个人猜测)
{
jo.Call("ShowToast");
Debug.Log("点击按钮");
System.Console.WriteLine("点击按钮");
}
注意
这两坨是不能改的(看大佬的帖子是这么说的,还没试过修改)
然后在场景中添加一个button的ui,把脚本挂载到场景中的某个物体,然后把button挂载到脚本上即可
然后打包
2019是这么操作的,由于项目升级,2018的打包方式和2019是不一样的,18的话点击gradle打包方式就可以了
AS配置unity的信息
这里可以看下面这两个大佬的帖子,写的很详细,跟着做就行了
https://blog.csdn.net/weixin_43271060/article/details/109547834
https://blog.csdn.net/qq_45888298/article/details/104209044?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control
这里我主要以第二个帖子为主进行的配置
在as里找到setting.gradle配置文件,然后添加
include ':unityLibrary'
project(':unityLibrary').projectDir=new File('F:\\test\\unityLibrary')
这两行代码,意思是让as去找对应路径下的unity打包好的项目
然后
在app模块的build.gradle里添加
implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
这两行代码,这里我的大概理解是把里面的jar add as library的方法
然后还需要
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
这行代码,这里我感觉和前面的用处差不多,不过没有仔细研究
然后sync一下,如果找不到的话,可以
右上角的红框,点击是一样的效果
然后就能看到unitylibrary导入在我们的as 里了
然后打开unitylibrary的androidmanifest.xml文件,吧把红框里的注释掉
不然apk在生成的时候会出现两个apk。一个是原生的,一个是unity的
到这里as 的配置也差不多了,接下来就是添加互相跳转的方法即可
2021.5.27更新一下
后期如果unity项目有更新的话,可以在unity打包成export后把里面的内容复制粘贴到上面as识别unitylibrary的目录里去,然后sync一下,再在unity的library里的androidmanifest.xml里注视掉inflter那个标签即可(不注视的话打包后会在真机里出现两个apk(因为包名不同导致)),用这个方法就快捷一点,不用每次都重新新建as项目然后重复这些操作
as添加跳转至unity的方法
在app的MainActivity类里添加下面的代码
这里的意思是给原生app界面里的button添加监听事件,当点击的时候则跳转到unity的activity里
上面是在as里简单添加button的流程(本人对as的使用不熟练,用的都是比较简单的~)
记住这里button 的id,我们上面跳转到unity的方法里需要用到这个button的id来找到这个button
as添加unity跳转到app的方法
在app模块的路径下,创建一个新的activity类,然后继承unityplayerActivity这个父类
添加下面的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_unity);
}
public void ShowToast(){
Intent intent = new Intent(this,MainActivity.class);
this.startActivity(intent);
}
需要引用的alt+enter让程序自动添加引用即可
到这里就可以进行打包调试了
调试的方法
pc上
然后ok即可
手机上
打开开发者选项(没有的在关于手机里点多几次版本号就有了)
打开usb调试,注意,这里我的手机是neo5,点击管理文件的话as是识别不了的,我是点击传输照片才行的
然后点击
这个播放键,手机就会自动安装我们写好的程序
这里需要注意,打包好后,如果有的大佬和我一样出现了string
类似这种问题的话,需要在
路径下添加这个代码
<string name="game_view_content_description">Game view</string>
小的也不是很懂这个代码的含义,但能解决string出现的问题
然后测试运行即可,到这里小弟的跳转功能就实现了,就是从app跳转到unity上的时间会有点长
历经将近半年的时间,终于把这个难关打通了~其实之前已经基本实现了,就是卡在string这个bug上,一直不知道怎么解决,就搁置了,之前使用的是2018的版本,所以2018的跳转按照流程来走的话应该是没问题的,只要在string.xml文件里添加上面的代码就能解决
解决了就一个字,爽!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
加油,不能骄傲~
后期项目就要开始负责了,成长系统任务系统装备系统等等等等,还有资源热更新的问题,让一个半路出家的人来承受确实顶,希望能坚持住吧,加油~
同天晚上更新
有些细节没有处理
1,app跳转到unity的时候虽然能正常运行,但时间太长
2,当从unity跳转到app的时候,回来都是重新打开的状态,体验极差
这两个目前感觉只能从as上下手,但是本人对as的研究太浅,网上对这些的处理有的行不通, 有的是看不懂,这些问题只能等大佬或者以后自己研究研究解答了
隔天更新一下~
有关两个项目的包名是否需要一致的问题,这里我测试的时候用的不是一致的包名,也能够正常运行,所以应该是不用一致的~
不过这可能只适用于2019版本及以上,以下的话就不清楚了~
2022.12.8更新
问题,为了应用上传手机厂商应用市场,需要打包32位64位兼容包才能过审,但是unity2019如果使用mono模式打包的话是无法兼容64位的,在嵌入到安卓后会提示硬件不支持,所以在unity项目打包的时候需要把脚本的编译改成il2cpp的模式,并且勾选上下方红框勾上的armv7和arm64,一定要勾上,这里说一下我的问题,测试中为了加快速度于是我在中途改回了mono模式去打包apk,然后内嵌到安卓项目的时候再用回il2cpp,但是你在unity设置中选回il2cpp的时候,下面的arm64会恢复到默认的不勾选的状态,切记,选择了il2cpp后一定要看一下下面的两个arm是不是都有勾选上,没有的话在内嵌到安卓的时候在真机运行时很多机型就会提示硬件不支持的问题
再提一下,内嵌的安卓项目里最好把原来的unity的安卓工程的lib和src删掉,不然的话打包出来会有比实际大很多,不知道是缓存的问题还是什么