Unity3D 与 Android 通信

作者: binyu1231 | 来源:发表于2017-07-10 00:12 被阅读512次

    这篇文章主要记述Android Studio 打出 jar 包供 Unity 使用的过程,主要参考的链接就是这篇《unity-与Android交互(unity5、android studio)》

    整个过程分为 准备 - code - 打包导入

    一. 准备

    Android Studio 和 Android SDK 的准备就不介绍了,这里出现了一个问题。当 SDK Tool 的版本为26时,Unity 将不能使用 SDK 打包。解决方法是降级 SDK。参考链接

    1. 创建新的 Android 工程

    Note: 实际上我们只需要创建 Module,但是其必须依赖于某个项目目录中,所以创建的项目名称和包名都可以随意填写。

    20170709204740.png
    1. 之后一直下一步直至创建项目完成。此时我们点击 File - New - New Module 来创建新的模块
    $SG@KRX%7BC%YSHV6XET17M.png
    1. 选择 Android Library 然后 Next。创建 Module 的名称可以随意填写,但是包名要与使用该 Module 的 Unity 项目相同
    588NUK$_118D74LR(K8~JX4.png
    1. 将 Unity 中的 class.jar 文件放入 Module 的 libs 目录下,并为其添加依赖

    eg: \Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes -
    \AAA\nativeforandroid\libs

    1. 将此 class.jar 添加为依赖项,选中项目右键 - Open Module Settings
    1. 修改 build.gradle
    20170709213222.png

    选中这个 Module 的 build.gradle 文件,在最下放加入以下代码

    ```
    task clearJar(type:Delete){
         delete 'build/outputs/BB.jar'
         delete 'build/outputs/AndroidManifest.xml'
    }
    
    task makeJar(type:Copy){
         from('build/intermediates/bundles/default/')     // 好多文章此处为 /bundles/release/ 但是我没有找到
         into('build/outputs/')
         include('classes.jar')
         include('AndroidManifest.xml')
         rename('classes.jar','NativeForAndroid.jar')
    }
    
    makeJar.dependsOn(build) 
    ```
    

    7.修改 AndroidManifest.xml
    nativeforandroid/manifests/AndroidManifest.xml

    <manifest 
      xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example">  <!-- 包名 -->
    
      <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
          <!-- 添加此 activity 标签 -->
          <activity android:name="com.example.Test"> 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <!--添加一下一行,否则 Unity打包时会报错-->
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
          </activity>
      </application>
    </manifest>
    

    二. code

    在 Module 中的 Java/包名(没有标记) 的文件夹下新建 Java Class。

    eg: Test.java

    package com.example;
    
    import android.os.Bundle;
    import android.widget.Toast;
    import com.unity3d.player.UnityPlayerActivity;
    
    public class Test extends UnityPlayerActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
        }
    
    
        // 定义一个显示Toast的方法,在Unity中调用此方法
        public void ShowToast(final String displayString){
            // 需要在UI线程下执行
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), displayString, Toast.LENGTH_LONG).show();
                }
            });
        }
    }
    
    

    三. 打包导入

    在 Android Studio 右上角找到 Gradle 按钮,在所在的模块下找到之前我们添加过的 clearJarmakeJar 命令

    K$X)B5BBEIAYID_1FT$NXDO.png

    双击 makeJar 执行打包命令,等下方读条结束后,前往 \AAA\nativeforandroid\build\outputs 目录中找到打包好的 AndroidManifest.xmlNativeForAndroid.jar。将它们拖入 Unity 项目目录 Assets/Plugins/Android/

    调用

    using System.Runtime.InteropServices;
    
    ...
    
      void OnClick () {
         var jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
         var jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    
         jo.Call("ShowToast", "Toast"); // 函数名,参数
      }
    ...
    

    参考链接

    相关文章

      网友评论

        本文标题:Unity3D 与 Android 通信

        本文链接:https://www.haomeiwen.com/subject/dmejhxtx.html