1将Unity3D安装目录下的Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin\classesjar
2
右键单击classesjar选择Build Path里面的Add to Build Path:
3
在MainActivity中继承UnityPlayerActivity。删除多余的方法,仅保留onCreate方法中的superonCreate语句,如下:
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
}
}
4
添加要在unity中调用的方法,这里添加一个带一个参数的方法StartActivity来调用Android的Activity从而运行Android的代码。还添加了一个有返回值的方法GetInt,用来测试在Unity中获取android中方法的返回值。(貌似只能有一个UnityPlayerActivity,而且这个Activity不能是调用第三方SDK方法的Activity。UnityPlayerActivity只能作为Unity和Android交互的一个接口,在这里面再去调用其他的Activity)
5
package comexampleunitydemo;
import androidcontentContext;
import androidcontentIntent;
import androidosBundle;
import comunity3dplayerUnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
private Context mContext = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
mContext = this;
}
public void StartActivity(String name) {
Intent intent = new Intent(mContext, WelcomeActivityclass);
intentputExtra("name", name);
thisstartActivity(intent);
}
public int GetInt()
{
return 1;
}
}
6
然后Clean一下当前工程,避免一些不必要的问题。
然后在Build Project
右键单击工程,选择Export
选择JAR file
右边全部勾选,输入JAR的路径和名字,然后单击finish:
在Unity项目中创建一个Plugins,如下的目录结构
其中bin文件夹放我们刚刚导出的JAR包,libs文件夹放需要用的第三方库文件,res文件夹和AndroidManifest直接从Android工程中拷贝过来。
(除了res文件夹不能动,其他的最好都不要放在单独的文件夹里面,貌似除了jar能加载出来,其他格式的文件如果放在其他目录下会加载不出来)
然后在Unity里面创建一个脚本文件,绑定在MainCamera上(当然也可以绑定在其他的对象上),如下:
在脚本文件中写如下代码:
using UnityEngine;
using SystemCollections;
public class Demo : MonoBehaviour {
void Start () {
}
void Update()
{
//当用户按下手机的返回键或home键退出游戏
if (InputGetKeyDown(KeyCodeEscape) || InputGetKeyDown(KeyCodeHome) )
{
ApplicationQuit();
}
}
void OnGUI()
{
if (GUIButton(new Rect(Screenwidth 01f, Screenheight 01f, Screenwidth 08f, Screenheight 01f), "StartActivity"))
{
AndroidJavaClass jc = new AndroidJavaClass("comunity3dplayerUnityPlayer");
AndroidJavaObject jo = jcGetStatic<AndroidJavaObject>("currentActivity");
joCall("StartActivity", "第一个Activity");
}
if (GUIButton(new Rect(Screenwidth 01f, Screenheight 02f, Screenwidth 08f, Screenheight 01f), "GetInt"))
{
AndroidJavaClass jc = new AndroidJavaClass("comunity3dplayerUnityPlayer");
AndroidJavaObject jo = jcGetStatic<AndroidJavaObject>("currentActivity");
DebugLog(joCall<int>("GetInt"));
}
}
}
然后生成APK文件,记得先把包名改成与Android工程一样的包名。
要测试,只能在手机上测。
最终效果图:
17
单击StartActivity,启动Android的一个Activity,单击GetInt,Console显示1
参考链接:Android Studio打包arr包并导入Unity中
Android非静态java方法:
Unity中调用,通过对象调用(AndroidJavaObject):
Android静态java方法:
Unity调用:
方法一,通过对象调用(AndroidJavaObject):
方法二、通过类调用(AndroidJavaClass ):
解决方法如下:
1、通过结构体,把数据包去掉包头,然后转换成与服务器打包数据时相同数据类型的结构体。
2、通过结构体获取包里的数据。
3、去掉包头,按照服务器的结构体,依次读取相应长度的数据。
APK是Android *** 作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是APK。
Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的。
个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题。
所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分。
不过我之后的相关内容都会使用AndroidStudio,希望依然使用Eclipse的同学尽快跟上~
本文主要讲解Unity导出的Android-Studio工程的目录结构。
话先说在前面,这篇文章和1、导出的Xcode工程 非常相似,我建议手游开发者将两篇结合起来看~
同时,我建议大家完整阅读姊妹篇2、导出的Android-Eclipse工程 ,以建立完整的流程认知体系。
我所用软件的版本:
Unity 535f1
AndroidStudio 131
前导步骤
第一步,创建一个新的工程 Unity_Build_to_Android
第二步,创建以下文件
//为了演示原生Android的jar包
Plugins/Android/libs/Jarjar
//为了演示原生Android调用jni所需要的so文件
Plugins/Android/libs/x86/libnativeso
//为了演示原生Android调用jni所需要so文件
Plugins/Android/libs/armeabi-v7a/libnativeso
//为了演示Unity中随包只读文件的去向
StreamingAssets/ALL_EmptyTxttxt
第三步,保存一下场景,如下图
第四步,打开PlayerSettings,修改Bundle Identifier(包名),Unity里面不修改不让导出Android的~
第五步,选择Android平台,Export导出Android工程
第六步,使用AndroidStudio打开该Eclipse工程
选中Unity导出了Eclipse工程,OK。
存储到合适的路径,Next。
三个勾都选上,Finish
进入正题
0、Eclipse -> AndroidStudio
我们先来看看从Eclipse工程到AndroidStudio工程,在结构上有哪些变化,下图为AndroidStudio工程自动生成的导入摘要。
通过这个文件我们可以看到,AndroidStudio其实是建立了一个新的AndroidStudio工程,然后将原Eclipse工程中有用的文件转移到对应目录。
显而易见的迁移就不说了,主要看看libs文件夹中的迁移方向,我们可以看到jar文件都转移到了app/libs文件夹下、/so文件都转移到了app/src/main/jniLibs文件夹下/so。
1、程序入口
任何程序都有一个入口,Unity导出的Android工程中也不例外,通过下图我们可以看到,在AndroidManifestxml文件中,将UnityPlayerActivity设置为应用的入口。(AndroidManifestxml是Android的配置文件之一,具体请自行搜索~)
通过下图我们可以看到,UnityPlayerActivity是继承了Activity,至于它是什么我就不赘述了,大家可以看一下这一篇文章:Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
下图为一个Activity的生命周期,我们可以看到系统事件存在着非常有用的监听,在UnityPlayerActivityjava里面我们也可以看到对应的函数,这意味着在Unity中一样可以收到这些事件,以后我们将继承UnityPlayerActivity,并重写这些监听。
2、C# -> C++
这就是个很尴尬的问题了,现在535的版本还不支持在Android平台下使用IL2CPP的模式,但是54的版本已经可以支持了,这一点我打算等54的版本出了再补上~
3、资源 StreamingAssets -> app/src/main/assets
Unity导出Android工程后,原工程中的各种资源都被压缩、打包、加密后存放在app/src/main/assets/bin/Data文件夹中,见下图,这一点和iOS是一致的,网上也有很多资源解密的方法,大家有需要可以自行搜索。
我们重点说一下Unity中的StreamingAssets文件夹,关于这个文件的作用,大家可以看一下这篇文章:Unity3D研究院之手游开发中所有特殊的文件夹
通过下图我们可以看到,StreamingAssets文件夹中的ALL_EmptyTxttxt文件被完整地拷贝到assets文件夹中,实际上不光是文件,文件夹也会原封不动地拷入该文件夹。
至于这有什么用,比如说,配置文件放在这里,上手机调试的话可以在Android工程中直接修改配置,而不需要到Unity里重新导出Android工程。
4、 Plugins/Android/libs -> app/libs 、app/src/main/jniLibs
Plugins/Android文件夹中通常会放一些jar、so文件,这些文件是什么、有什么用,大家可以看一下官方的文档:Building Plugins for Android
在Android-Studio工程中,jar文件都转移到了app/libs文件夹下、/so文件都转移到了app/src/main/jniLibs文件夹下/so。
这些文件将拷贝至在的libs文件夹中,在Android编译时也将被编译。
5、unity-classesjar、libmainso、libmonoso、libunityso
unity-classesjar是unity的封装好的一些Java类,用于在Android原生环境下处理相关业务,如果有兴趣的同学可以去反编译看看。
libmainso、libmonoso、libunityso文件是Unity写的底层CPP,当然其中也包含我们的C#逻辑,由于我们的重点不在这,就不展开讲了。(这个超纲,我没研究过~)
6、 Icon
在Unity的Player Settings是中,我们可以添加相应的Icon
这些Icon将被重新压缩、命名最后放入下图中的位置。
关于在哪边设置icon的问题,看项目需要吧,如果觉得分辨率不够可以到导出工程这边添加修改~
比如:多渠道打包时,可能要多次替换Icon,写脚本在Android工程中自动化替换打包是一种不错的选择~
7、闪屏
Unity在Android是可以设置单闪屏的,如下图。
不过Android天生是不带闪屏这种东西的,所以APP会在第一个Activity中先显示预先设定的。想深入了解可以看一看这篇文章:Android进阶篇之引导页系列之Splash闪屏Logo
Unity的在Android的闪屏实现应该也是这样处理的,注意注意!!这个思路很重要,以后我们Unity的闪屏也是这个思路做的。
8、Player Settings -> 设置
1首先在手机上开启USB调试功能,并安装驱动(这一步很多手机助手都可以完成)。
2用USB电缆连接手机和电脑。
3确保手机和电脑在一个局域网内,简单的说就是电脑和手机共用一个路由器,网段一样。
4打开电脑上CMD窗口,输入以下命令:
adb tcpip 5555(该命令打开手机adb网络调试功能)
正常情况下输入命令后控制台会出现回显
restarting in TCP mode port: 5555
打开手机查看手机的IP地址(不会请百度)假设手机的地址是1921681x输入命令
adb connect 1921681x
如果一切正常控制台会回显以下内容
connected to 1921681x:5555
如果你想查看是否连接成功请输入以下内容
adb devices
控制台会回显连接的设备
5如果一切连接成功,请拔掉USB电缆,选择File->Build&Run,在编译之前要勾选上Development Build 和Script Debugging这两项(在build setting里面勾选不要忘记否则是不能调试的)电脑会自动编译文件并将APK推送至手机,在手机上同意并安装。
6当程序运行后再Monodevelop里面打开Run->Attach to process 会发现你手机的选项,选择手机,在脚本里面添加断点,你发现可以调试了,那叫一个爽!出现问题再也不用去瞎猜,或者添加Debuglog了。
MD,先骂一句,这破玩意搞了一天,能搜到的没一个靠谱的。还有Unity,也是个贼不靠谱的。
起因:
公司没有安卓/ios开发人员,我对安卓也不熟,因此项目做完后,一些权限获取,全靠插件内部自行调用,导致出现一个问题:如果用户拒绝权限,会导致程序卡死/崩溃/出错,而一些录屏插件等等,又没有写获取权限是否允许和调用权限的接口。
解决过程(不想看过程就直接看最后结论):
1一开始搜,搜到 这篇 ,如获至宝啊,旧版本用的多了都没发现Unity增加了这个API。立马新开一个项目,调用一下,跑一下???根本没卵用!
2想了想,是不是设置哪边需要勾选一下,查了半天设置,谷歌和unity官方论坛的问答,都没人说这个问题。难道是我mac系统的问题???
3win上装了个201945f1LTS版本,装了三次才装上,依旧没有用!跟mac导出来之后一样,调用了没效果,也没报错log。这是逼着用户去学安卓?
4想想会不会是安卓版本问题, 官网API 上说最低设置API23也就是安卓60就行,早就按这个设置了,前前后后找了三台手机,安卓10的,安卓7的都试过了,没卵用!!!!
5于是想放弃了这个官方API查查有没有插件,csdn上有个,忒贵就不说了,评论也也有人踩过坑了,无法商用,又是一顿谷歌,终于找到 这个 ,真是大好人啊,都不收钱的,还五星评论,也没人说要设置什么的。
6于是下下来用,结果:依然没用!!!!但是, AndroidRuntimePermissionsOpenSettings();这个方法倒是意外地可以用,到此为止如果判断为false,再让用户去设置界面打开,并且用这个方法直接打开设置界面就能解决上面的问题了。
但是,我是这么好说话的人吗?动态去调用RequestPermission开权限依旧不能用,不能忍,继续查。
7在安卓端安装的时候发现,如果勾选了othersetting中的write permission(写入权限)为External(SDCard)的时候,安装后选择拒绝,之后不管调用官方的API还是插件的API都可以调用成功。同时在这个插件的github最后的描述中有这么一句话:
随即吐血三升,被官方的API带偏了都说什么动态获取权限不需要在AndroidManifest先声明。基本可以定性为AndroidManifest的问题。
8确定是AndroidManifest的问题后,就查如何改AndroidManifest,百度都说在Plugins/Android文件夹下面放一个AndroidManifestxml文件导出的时候就会覆盖Unity默认的AndroidManifest,实测:不论是否勾选External(SDCard),都不行。写在AndroidManifest的权限都调不出来,更别说官方API调用了。
9最后逼得没有办法了,去修改Unity自带的默认AndroidManifest,把要用的权限加进去,这时候再去调用插件或者官方API,都可以调通了!!!!
总结:
1AndroidRuntimePermissions这个插件,可以一键打开设置界面,还能获得用户的拒绝状态(是拒绝,还是拒绝且不再提示),这就比Unity自带API强多了,因此决定直接使用此插件。
这是我整理后的AndroidRuntimePermissions插件
77h9
2实测新版本(Unity20192+)存在AndroidManifest无法自动整合的问题,在Plugins/Android文件夹下面放AndroidManifest文件根本不起作用(也可能是我自己菜)。因此使用此插件需修改Unity 默认AndroidManifest文件,文件路径为:
在文件中添加需要的权限,如:
在最后一行</manifest>上面加即可。(注意换项目要把权限拿去掉呀)
添加后:
3这时候再去调用官方的:
或AndroidRuntimePermissions插件的:
安卓权限分为两种,一种是普通权限,一种是涉及用户隐私的(如通讯录、相机、sd卡等)危险权限。这里总结一下Unity常用到的 危险权限 如下:
普通权限在AndroidManifest里写都不需要用户同意的。
最终我把安卓ios的权限整合到一个插件里了: >
以上就是关于求助各位大神帮我看下 Unity3d 与 Android 交互的问题全部的内容,包括:求助各位大神帮我看下 Unity3d 与 Android 交互的问题、Unity中调用Android jar包或arr包方法、unity导出的安卓apk运行第一个场景没问题,第二个场景闪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)