求助各位大神帮我看下 Unity3d 与 Android 交互的问题

求助各位大神帮我看下 Unity3d 与 Android 交互的问题,第1张

1将Unity3D安装目录下的Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin\classesjar

拷贝到Android工程的libs文件夹里:

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运行第一个场景没问题,第二个场景闪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9423532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存