注:本博文介绍的是如何搭建 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的名字,点击确定
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各位前辈的博文的指引!
参考资料: