赞
踩
2023年9月10日11:51:42更新:
Unity与Android交互有两种方式,第一种是将Unity工程导出gradle project然后在java层写交互代码,另外一种是在java层导出aar供Unity调用,本文使用的是前者,但是其实后者更为简洁方便,详情可以参考这个文章:
知乎 - Unity与Android交互 - 作者:Everglow - https://zhuanlan.zhihu.com/p/119052124
注:本博文介绍的是如何搭建 Unity3D 和 Android Studio 的通信环境,虽然 Unity3D 可以直接制作安卓游戏,但倘若需要使用到 Android 的一些技术的话,建立通信环境还是很必要的。
什么,你问我为什么不把AS的项目导入到Unity中?博主很负责任地告诉你,这样做的话会出现很多很多很多坑,麻烦又不容易修改,Unity支持导出Google Gradle Project,你把Unity当做一个Activity插入到你的安卓项目中,真的灰常方便!
以AS中创建底部导航窗体(ButtonNavigationActivity)为例(中心思想就是把unity导出的那个文件夹中的东西合并同类项到AS工程中!)
下面的步骤都是以我的项目的路径为例,大家模仿时请以自己的项目路径为准:
这个就是完成之后的样子,大家完成之后看看自己项目整体的文件放置位置是否正确!
下面介绍方法:
1:Unity导出Goodle Gradle Project,注意勾选export project,且包名要以com.xxx.xxx格式命名
上面是Unity导出的Gradle项目的内容,看看有没有不全的。
2:AndroidStudio新建一个ButtonNavigationActivity(其他Activity同理),建议包名与第二点中Unity定义的包名一致
3:AndroidStudio切换到Project视图,把Unity导出的那个文件夹中的libs下
的unity-classes.jar直接复制粘贴到UnityTest—app—libs路径下,并右键它选择Add as library,选择你的工程app的名字,点击确定
下面给出src文件内的东西,看看有没有不全的:
4:把Unity导出的那个文件夹中的src–main–assets直接复制粘贴到UnityTest—app—src—main路径下
5:把Unity导出的那个文件夹中的src–main–jniLibs直接复制粘贴到UnityTest—app—src—main路径下
6:Unity导出的那个文件夹中的src–main–res是unity帮我们打包进去的图片和字符串资源文件,可不添加
7:Unity导出的那个文件夹中还有一个AndroidManifest文件,它是以Unity为默认窗口来生成的,如果你的app中有多个
窗口,建议保留MainActivity,并在你打算放置Unity游戏的那个Activity中如下填入配置信息:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qihua.unitytest" xmlns:tools="http://schemas.android.com/tools" android:versionName="3.0" android:versionCode="1" android:installLocation="preferExternal"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MyUnityActivity" android:screenOrientation="landscape"> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <meta-data android:name="unity.build-id" android:value="d536d543-d14b-406c-a322-bdf48faec6cf" /> <meta-data android:name="unity.splash-mode" android:value="0" /> <meta-data android:name="unity.splash-enable" android:value="True" /> <meta-data android:name="android.max_aspect" android:value="2.1" /> </application> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.vulkan" android:required="false" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> </manifest>
注意到没有,其实就是模仿那个unity帮我们生成的那个AndroidManifest文件,把它需要的属性都加到自己的AndroidManifest中就好了,so easy!
8:仔细看里面还有三个文件:build.gradle、local.properties、proguard-unity,也是照葫芦画瓢,找到同名的文件,把他们的内容填进去AS同名文件的相应的位置**(不是覆盖,是填入,例如A和B两个内容,A有一部份内容是B中没有的,就把那部分填入B的相应位置)**
9:至此,环境配置完成。
现在你可以在你想放置Unity项目的那个安卓窗体里面,继承UnityPlayerActivity,使用以下方法来相互调用:
(1)Unity调用Android:
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string result = jo.Call<string>("方法名");
注意com.unity3d.player.UnityPlayer和currentActivity这两个字符串不能写错!
(2)Android调用Unity:
UnityPlayer.UnitySendMessage("objectName", "functionName","value");
解释:Unity的场景中需要有名为“objectName”的物体,其绑定的某脚本需要包含这样的方法:
void functionName(string str)
注意当消息参数是String时,复杂对象无法直接传递,然后你可以传入一个符合这个函数的参数value进去。
有任何不懂的地方直接私信我,感谢CSDN各位前辈的博文的指引!
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。