欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

程序员文章站 2022-06-11 08:58:15
...

LZ-Says:规矩的背后是*,*的背后,是坦然~ ^_^

前言

Hello,大家好,我胡汉三又回来了~!!!

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

时隔多日不见,有木有一种,士别三日,当刮目想看的赶脚~~~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

今天为带来番外篇,为什么叫做番外篇呢,因为没有接触过,哈哈~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

不扯犊子了,今天为大家带来Android Studio 3.1.1 打Jar包供Unity使用。

本文目标

通过LZ泪崩的实践,让你我下次面对提供Unity小伙伴Jar包时能够很装逼的来一句,等着,分分钟,都是小意思~

突然有点怀念当年了,哈哈~

基础了解

本文基础环境搭建完毕的小伙伴,如有不懂,可查阅下面俩篇文章:

菜鸡学Unity 之 Untiy 下载(安装)与**(基于Unity 2017版)

菜鸡学Unity 之 创建项目并预览游戏运行(基于Window平台)

其次,还要额外补充几点,关于Unity配置JDK以及SDK版本:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

而关于过程中的异常,则各位老铁移步下面这篇博文:

菜鸡学Unity 之 坑神之路 (记录坑点,不断更新中~)

另外,我们还需要记住Unity版本更新的一些和我们有关的特性:

  • Unity 5.x 开始支持使用 aar 文件

  • Unity 5.4 开始导出 Gradle 工程

最后,开启我们的爽歪歪之路吧~

Android 生成Jar

Step 1:创建Android工程

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 2:创建Android Library Module

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 3:去Unity本地安装目录拷贝jar包

这一步需要去你Unity本地安装目录下拷贝Jar包,地址如下:

\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar

这里可能会遇到一个问题,就是在PlaybackEngines目录下找不到AndroidPlayer的问题,这里简单带大家解决下:

这里提供大家几种方式下载Android Support:

方式一:Unity 3D官方直接下载

https://unity3d.com/get-unity/download/archive

方式二:百度网盘下载

链接:https://pan.baidu.com/s/11Fl-4FXk-mm_2DAiG1lp3Q 密码:jcya

方式三:Unity打开Build Settings选择Android,点击右侧Open Download Page

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

接下来就是无脑式安装,各位自行安装即可。

安装完成后,打开Unity安装目录,就会发现AndroidPlayer目录神奇般的出现了~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

到上面给出的Jar包地址拷贝Jar。

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 4:将拷贝的Jar放置到Android Library Module

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 5:创建Activity,继承自UnityPlayerActivity

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 6:创建测试Activity,并为LoadingActivity对外公开方法

首先定义如下布局样式,以方便接下来我们的测试:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

随后编辑TestActivity,这里主要有以下几方面内容:

  • 显示图片资源;

  • 测试Unity触发Android按钮事件;

  • 测试Unity往Android传值并显示

So,TestActivity代码如下:

/**
 * author : HLQ
 * e-mail : aaa@qq.com
 * time   : 2018/4/19
 * desc   : 测试在nity中跳转
 * version: 1.0
 */
public class TestActivity extends AppCompatActivity {

    private Button mShowBtn;
    private TextView mUnityInfoShow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initView();
        String msg = getIntent().getStringExtra("UnityTest");
        if (!TextUtils.isEmpty(msg)) {
            setUnityText(msg);
        }
    }

    private void initView() {
        mShowBtn = findViewById(R.id.btn_show);
        mUnityInfoShow = findViewById(R.id.tv_unity_info_show);
        initEvent();
    }

    private void initEvent() {
        mShowBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(TestActivity.this, "Unity触发Jar按钮事件", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

    /**
     * Unity传值 Android Jar 接收并显示
     *
     * @param unityText
     */
    public void setUnityText(String unityText) {
        mUnityInfoShow.setText(unityText);
    }

}

最后,LoadingActivity中对Unity暴露一个接收值得方法如下:

    /**
     * Unity传值 Android Jar 接收并显示
     *
     * @param unityText
     */
    public void setUnityText(String unityText) {
        Intent startIntent = new Intent(LoadingActivity.this, TestActivity.class);
        startIntent.putExtra("UnityTest", unityText);
        startActivity(startIntent);
    }

Step 7:build.gradle新增打包脚本

// 定义SDK包名称
def SDK_BASENAME = "AndroidPlugin"
// 定义SDK包版本
def SDK_VERSION = "_V1.0.0"
// SDK包生成地址
def SDK_PATH = "build/libs"
// 删除之前的Jar包 保证每一次生成的都是最新的
task deleteOldJar(type: Delete) {
    delete SDK_PATH + SDK_BASENAME + SDK_VERSION + '.jar'
}
task exportJar(type: Copy) {
    // 从源地址拷贝
    from('build/intermediates/packaged-classes/release/')
    // 存放
    into(SDK_PATH)
    // 导入
    include('classes.jar')
    // 重命名
    rename('classes.jar', SDK_BASENAME + SDK_VERSION + '.jar')
}
// 执行脚本文件
exportJar.dependsOn(deleteOldJar, build)

这里需要注意一点,如下:

  • 2.3 之前
    from(‘build/intermediates/bundles/release/’)

  • 2.3 之后
    default和debug debug目录之前也是有的,没有变化,只是原来的release目录被现在的default目录代替了。

  • 3.1 之后
    之前有的bundle目录现在没有了(classes.jar文件在里面),取而代之的是packaged-classes目录

Step 8:执行脚本,开始打包

点击右侧Gradle,选择刚刚新建的Lib工程,点击other,如下图:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

找到exporJar,用力双击:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

成功会有如下提示:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

下面查看生成的Jar包:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Ok,到此,Android打Ja包告此一段落,可以简单的松口气了~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Unity调用Jar包(Unity与Android简单交互)

喝杯茶,抽根烟,让我们继续开动~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 1:新建Unity工程,导入Jar包以及资源文件

在Assets目录下创建Plugins、Android以及libs目录,如下:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

将Jar包拷贝到libs目录下:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

如上图,导入时需要注意,Windows环境下需要使用WinRAR打开并删除buildConfig文件,具体原因请看文章开头异常总结。

接下来复制相关资源文件:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 2:复制AndroidManifest并修改

修改后如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <application android:label="@string/app_name">
    <activity android:name="com.hlq.hlqlib.activity.LoadingActivity"
          android:label="@string/app_name"
          android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <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>
    <activity android:name="com.hlq.hlqlib.activity.TestActivity" />
  </application>
</manifest>

要注意,以下为必填项:

<meta-data android:name="unityplayer.UnityActivity" android:value="true" />

Step 3:创建脚本文件,关联Main Camera

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

关联很Easy,点击Main Camera,选择右侧下方的Add Component,搜索刚刚创建的Test确定即可。

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 4:绘制按钮,调用Jar包

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

public class Test : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(100, 100, 300, 150), "点我啊~"))
        {
            // 获取unity的Java类,只能调用静态方法,获取静态属性
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            // 获取当前的Activity对象,能调用公开方法和公开属性
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("setUnityText", "This is Unity info.");
        }
    }

}

Step 5: 配置基本属性

点击File,选择Build Setting…

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

这里需要配置Id也就是包名以及最小兼容版本号,如下图:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

Step 6:点击Build,生成APK,运行查看实例

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

这里需要注意一点,首次运行会出现如下异常:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

问题原因如下:

我们先来看下TestActivity继承关系:

TestActivity extends AppCompatActivity

它依赖 com.android.support:appcompat-v7:26.1.0 ,所以针对目前这种情况,LZ给出俩个解决方案:

  • TestActivity extends Activity: android.app.Activity

  • 下载对应v7包,拷贝Unity Libs目录下即可。(LZ未测试)

题外话

有些老铁问我,为什么不撸了呢,如下图所示:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

以及最惨痛的事儿:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

最后:

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

GitHub查看地址

https://github.com/HLQ-Struggle/UnityDemo

个人公众号

欢迎关注,不定时发布~~~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

赞赏

如果感觉不错,不妨赞助LZ~ 3q~~~

番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)

参考资料

  1. https://answers.unity.com/questions/1147298/where-can-i-download-android-build-support-531f1.html
  2. https://blog.csdn.net/builder_taoge/article/details/70170590
相关标签: Unity Android