【教程】如何使Unity3D和Android Studio相互通信


注:本博文介绍的是如何搭建 Unity3D 和 Android Studio 的通信环境,虽然 Unity3D 可以直接制作安卓游戏,但倘若需要使用到 Android 的一些技术的话,建立通信环境还是很必要的。


写教程之前,博主搜索了n篇类似的博文,奋斗了几天几夜后终于成功利用Unity3D(5.6.0p3版本至2017.2.0版本)和Android Studio(2.3.3版本)进行了相互通信(心酸泪奔),废话不多说,下面介绍通信环境的搭建:

什么,你问我为什么不把AS的项目导入到Unity中?博主很负责任地告诉你,这样做的话会出现很多很多很多坑,麻烦又不容易修改,Unity支持导出Google Gradle Project,你把Unity当做一个Activity插入到你的安卓项目中,真的灰常方便!

以AS中创建底部导航窗体(ButtonNavigationActivity)为例(中心思想就是把unity导出的那个文件夹中的东西合并同类项到AS工程中!)
下面的步骤都是以我的项目的路径为例,大家模仿时请以自己的项目路径为准:
【教程】如何使Unity3D和Android Studio相互通信_第1张图片
这个就是完成之后的样子,大家完成之后看看自己项目整体的文件放置位置是否正确!

下面介绍方法:

1:Unity导出Goodle Gradle Project,注意勾选export project,且包名要以com.xxx.xxx格式命名

【教程】如何使Unity3D和Android Studio相互通信_第2张图片

上面是Unity导出的Gradle项目的内容,看看有没有不全的。

2:AndroidStudio新建一个ButtonNavigationActivity(其他Activity同理),建议包名与第二点中Unity定义的包名一致

3:AndroidStudio切换到Project视图,把Unity导出的那个文件夹中的libs下
的unity-classes.jar直接复制粘贴到UnityTest—app—libs路径下,并右键它选择Add as library,选择你的工程app的名字,点击确定

unity-classes.jar

下面给出src文件内的东西,看看有没有不全的:
【教程】如何使Unity3D和Android Studio相互通信_第3张图片

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各位前辈的博文的指引!

参考资料:

  1. Android:AS与Unity3D之间打包的一些坑及解决方案
  2. 【Unity3d】Unity5与Android交互通信(使用Android Studio2.4) 详细操作
  3. Unity调用 Android 接口实践与总结(Unity5.6 和 Eclipse 及 AndroidStudio2.3.1)

你可能感兴趣的:(学习笔记,Android,Unity3D)