Unity 和 Android 之间的简单通讯

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/CC_childe/article/details/79498627

       近段时间一直在研究android SDK 的接入,在网上找了很多的资料,经过消化之后,本着人人为我,我为人人的原则,特将我的一些经验拿出来一同分享给大家。

      一:准备工作        

        首先,新建一个Unity工程,并在Build Setting中设置好相应的Package Name,后面在 Android 中会用到,同时注意好Minimum API Level(Android SDK最低支持版本)的选项,一般默认就好如下:

      二:Android Studio 部分

        1、创建一个 Android Project,并保持 package name 和 unity 中的一致(如果不一致,会导致 Unity 发布出来的 apk 包运行时直接闪退)。

        2、选择好对应的SDK版本,保持和Unity中的一致。Include Android Instant Appsupport(安卓及时应用支持)跟我们接 Unity 没半毛钱关系,所以不需勾选。

        3、下面的这些选项都是针对安卓应用开发的,我们此处只需利用 android studio 给我们提供 unity 中调用 android 这边的底层的接口,所以除了 Activity Name 这一类要认真填写之外,当然默认就好,其他都不用去勾选。

        4、好吧,接下来就进入到我们的工程界面了,首先我们要将 Android 视图 换成 Project 视图。

        5、导入 Unity 提供的依赖库。Unity 自带的接口文件放置在 C:\Program Files(此处为安装路径)\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\Classes 文件夹下。对应的 classes.jar 就是我们要找的东西,然后将其导入到 Android Studio 中对应的 libs 文件夹中,对其右击 -> Add as Library... ,将其作为依赖库添加进来,实际 SDK 的接入中还会有一些其他的库,将需要的都导进来。

        6、完成之后我们就可以填写我们所需要的代码了,依次找到 app-> src -> main -> java -> com.heiheihei.sdkdemo -> MainActivity,首先将MainActivity extends Activity改为extendsUnityPlayerActivity,并重写onCreate(),然后就可以在这个类里实现我们想要的功能了,此处只是简单的写了两个测试方法。

package com.heiheihei.sdkdemo;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
    }

    public String ToShow() {
        return "this is from android";
    }

    public int Add(int a, int b) {
        return a + b;
    }
}

        7、修改项目生成文件。找到当前对应的 Module 下面对应的 build.gradle,我们只要发布成库体文件,所以将 apply plugin: ‘com.android.application’修改成apply plugin: ‘com.android.library’,同时删掉下面的 applicationId “com.heiheihei.sdkdemo”,做完修改后记得点击右上角的Sync Now。

//apply plugin: 'com.android.application'
apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    defaultConfig {
        // applicationId "com.heiheihei.sdkdemo"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation files('libs/classes.jar')
}

        8、接下来就是生成我们需要的依赖库了,点击菜单栏中的 Build -> Make Project(Rebuild Project),下图中生成的classes.jar就是我们生成的jar文件啦,然后将其 copy 到 unity 中(最好是改个名字,方便以后查找),同时也找到当前工程路径下的 AndroidManifest.xml(在你编写的代码上一级目录),并将其一并 copy 到 unity 中,Android Studio 算是告一段落了。

        9、关于我们继承的 UnityPlayerActivity,我们可以通过导入的 unity 库查看相关的接口,接口一看就顾名思义了。

      三、Unity 部分

        1、将上述生成的 classes.jar(下图中已改成sdkdemo.jar) 文件和 AndroidManifest.xml 文件放到Plugins/Android下。如果项目中还有其他库文件,同样要将其放入到此文件夹中(包括在 Android Studio 中导入的其他 library 文件)。

        2、修改下 AndroidManifest.xml 文件里的配置。这份配置是Unity打包时的一些资源配置表,有些属性不改的话,会报找不到对应资源导致打包失败,不懂的话可以参照下面的配置。需要注意的点:

               1)package 需和发布的包体一致;

               2)activityandroid:name=”.MainActivity”对应你在AndroidStudio中继承UnityPlayerActivity的类名;

               3)元数据那栏配置一定要加上;

               4)Unity 需要的权限也是在这个文件里面添加,具体可自行搜索;

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.heiheihei.sdkdemo">

    <application
        android:allowBackup="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true"
        android:theme="@style/UnityThemeSelector"> 
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            
            <!-- 添加元数据,原有的文件中没有这一行,记得添加 -->
            <meta-data android:name="unityplayer.UnityActivity" android:value = "true" />
        </activity>
    </application>

</manifest>

        3、简单建个UI,写点东西测试下吧。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SDKTest : MonoBehaviour {

    private Button showBtn;
    private Button addBtn;
    private Text showTxt;

    private AndroidJavaClass _jc;
    private AndroidJavaObject _jo;

    void Start () {
        showBtn = transform.Find("ShowBtn").GetComponent<Button>();
        addBtn = transform.Find("AddBtn").GetComponent<Button>();
        showTxt = transform.Find("Text").GetComponent<Text>();

        showBtn.onClick.AddListener(ShowTest);
        addBtn.onClick.AddListener(AddTest);

        _jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        _jo = _jc.GetStatic<AndroidJavaObject>("currentActivity");
    }
	
    public void AddTest()
    {
        int result = _jo.Call<int>("Add", 1, 3);
        showTxt.text = result.ToString();
    }

    public void ShowTest()
    {
        string result = _jo.Call<string>("ToShow");
        showTxt.text = result;
    }
}

 
        4、测试OK。

      四、总结

        网上找到的基本上都是发布成 .aar 文件,然后在删除里面重复添加的 jar 包体,步骤繁琐,且 .aar 文件是对安卓工程中的所有组件的打包,就是删除了重复的依赖库,其中还有很多我们不需要的资源也打包进来,简约即是美。

猜你喜欢

转载自blog.csdn.net/CC_childe/article/details/79498627