Unity和Android交互

前言:Android 软件的开发中,会经常遇到 Unity 调用 Android 中的接口方法,不单是内购和广告的接入,普通的使用 Unity 去调用 Android 的原生消息框都会需要使用到交互相关的知识,接下来我们开始吧.

前期需要准备:

确认安装 Android Studio 开发软件.

整体步骤我分为:

  • 基于 AS(Android Studio) 编写接口方法类并打出 jar

  • 配置关联 Unity 编写调用 Android 原生方法接口方法

  • 配置打包环境安装到 Android 设备

我的开发环境:

Unity 版本为 2017.4.6f1

Android Studio 版本为 3.2.0

1.基于 AS 编写接口方法类并打出 jar.

打开 Android Studio,选择 Start a new Android Studio project 新建一个 Android 工程.

创建工程

下面是设置工程名字签名存放位置等等,这里我简单填写就好,目的是编写接口方法打出 jar,设置完毕后点击 Next.

设置名字与签名

这里我选择的是 Android 手机,最小兼容的版本为 API 16 ,也就是 Android 4.1,接着点 Next.

选择最小兼容的 API 版本

接着会提示让我们创建一个 Activity 类,这里我们选择 Add No Activity 不添加 Activity,再点击 Finish 完成创建.

Add an Activity to Mobile 界面

工程创建完毕后,首先切换成 Project 视图,也就是绿框中的选项.
右键点击我们工程的主目录选择 New -> Module 创建一个新 Module.

创建 Module

选择 Android Library 后点击 Next.

New Module 界面

设置好名字后点击 Finish .

Android Library 界面

创建好 Module 后,别忘了添加用于编译的 Unity 库,将你 Unity 安装目录下的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar 文件复制到我们工程中刚刚创建的 Modulelibs 目录下.

复制到 Unity 工程中

回到 AS 界面,会发现我们创建的 Module 目录下的 libs 下出现了我们复制添加的 classes.jar 库.

Android Studio Project 视图

光添加进来可没用,我们还需要给它添加依赖.
右键点击我们创建的 Module 选择 Open Module Settings 打开 Module 设置面板.

打开 Module 设置界面

点击我们创建的 Module 选择 Dependencies -> Jar dependency.

设置依赖库

选择我们从 Unity 复制添加的 classese.jar 后点击 OK.

选择 classes.jar

设置好依赖库后,我们可以开始编写接口方法类了,右键点击我们创建的 Module 目录下src/main/java/com.xxx.xxx 选择 New -> Java Class.

添加 Java 类

设置好我们的 Activity 类名(就是我们的接口方法类)

添加 Java 类设置

Superclass 是设置要继承的父类,这里我们事先设置为继承 UnityPlayerActivity.

在刚刚创建的 Java 文件中添加以下代码.

import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class UnityAndroidActivity extends UnityPlayerActivity {
    public void SetInfo() {
        UnityPlayer.UnitySendMessage("Main Camera", "SetInfo", "Hello Unity!");
    }

    public void SendToast(String info) {
        Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
    }
}

首先我定义了一个私有 String 类型的变量.接着还有两个方法.

方法一:调用 Unity 中名为 Main Camera 的游戏对象身上我们编写的脚本中的 SetInfo 方法,并发送一串字符为 SetInfo 的第一个参数.

方法二:将 info 的内容用 Toast 发送一条消息.

现在我们的方法接口类已经准备好了,可以开始将我们写好的类打包成 jar 库了.

首先点击上方的 Build 选择 Make Module 'xxx'.

Make Module

打开我们 Module 目录下的 build.gradle 文件.

build.gradle

在 build.gradle 中的最下方添加以下代码:

android.libraryVariants.all { variant ->
    def task = project.tasks.create "jar${variant.buildType.name.capitalize()}",Jar
    task.dependsOn variant.javaCompile
    task.from variant.javaCompile.destinationDir
    artifacts.add('archives',task)
}

task jarUnityLib(type: Jar, dependsOn: ['build']) {
    archiveName = 'UnityAndroid.jar' //设置打出 jar 包的名字.
    from('build/intermediates/javac/release/compileReleaseJavaWithJavac/classes')
    destinationDir = file('build/libs')
    exclude('com/Test/unityandroidlibrary/BuildConfig.class') //这里是自动设置好删除BuildConfig.class
    exclude('com/Test/unityandroidlibrary/BuildConfig\$*.class')
    exclude('**/R.class') //这里是自动设置好删除 R.class 文件
    exclude('**/R\$*.class')
    include('com/Test/unityandroidlibrary/UnityAndroidActivity*.class') //这里是选择要导出的方法接口类

}

注意: from 要根据自己的 Gradle 版本进行设置,由于我的 Gradle 版本是 4.6 ,是刚刚更新 AS 3.2.0 自动更新的.

如果是 4.6 之前的版本,大概要填 build/intermediates/javac/release ,具体所填,请自行查阅填之.

点击右上方的 Gradle 选择我们的 ModuleGradle 选择 other .

Gradle 任务界面

other 中找到我们编写的任务 jarUnityLib 并双击它.

jarUnityLib 任务

打包完毕后会出现以下 Log 消息.

打包后的 Log 消息

在我们的 Module 目录下会出现刚刚打出的 jar 包.

打出的 Jar 包

2.配置关联Unity,编写调用Android原生方法接口类

打开 Unity ,设置好工程名字后点击 Create project 创建工程.

创建 Unity 工程界面

创建好工程后,右键点击 Assets 选择 Create -> Folder 创建文件夹.

创建 Android 交互所需文件夹

按照下列格式创建文件夹,分别为 Plugins Android libs 三个文件夹.

要创建的文件夹格式

右键点击 Android 文件夹选择 Show in Explorer 打开目录.

打开 Android 所在目录

Android 目录下创建一个 AndroidManifest.xml ,可以创建 Txt 文本后连同拓展名一起修改为 xml 文件.

创建 AndroidManifest.xml 文件

添加以下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:label="@string/app_name">
        <activity android:name="com.Test.unityandroidlibrary.UnityAndroidActivity"
            android:label="@string/app_name"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screen
Layout|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>
    </application>
</manifest>

需要注意: 第三行所要设置的主 Activity 需要填写我们编写的方法接口类,由于是继承 UnityPlayerActivity 所以可以将主 Activity 设置为我们所编写的方法接口类.

右键点击我们打好的 UnityAndroid.jar 后选择 Show in Explorer .

打开打好的 jar 包目录

将打好的 jar 包复制一份到 Unity 中先前创建的 Plugins/Android/libs 目录下.

复制到 Unity 工程的 libs 目录

回到Unity 界面,创建一个 Sctipts 文件夹用于放置 Unity 脚本,右键点击刚刚创建的文件夹选择
Create -> C# Script 创建脚本,脚本名字可以自定义设置.

创建 C# 脚本

创建好脚本后打开它.

添加以下代码:

using UnityEngine;

public class UnityAndroidTest : MonoBehaviour
{
        private AndroidJavaObject m_Jo;
        private AndroidJavaClass m_Jc;
        private string m_Info = null;

        private void Start()
        {
             m_Jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
             m_Jo = m_Jc.GetStatic<AndroidJavaObject>("currentActivity");
             m_Jo.Call("SetInfo");
        }

        public void SetInfo(string info)
        {
             m_Info = info;
        }

        public void SendToast()
        {
             m_Jo.Call("SendToast", m_Info);
        }
}

以上代码解析:

  • 首先定义了 AndroidJavaObjectAndroidJavaClass 以及一个 String 类型的变量 m_Info .

  • Start 方法中初始化了 m_Jcm_Jo .还调用Android 中我们编写 SetInfo 接口方法.

  • SetInfo 方法是用于给 Android 调用的公开方法,赋值当前类中的 m_Info .

  • SendToast 是辅助调用 Android 中发送当前类中 m_Info 内容到屏幕上.

编写并保存脚本后,回到 Unity 界面.
将我们编写好的脚本拖至 Main CameraInspector 中.

拖拽脚本至 Main Camera 的 Inspector

右键点击 Hierarchy 面板,选择 UI -> Button 创建一个按钮.

创建 Button 按钮

点击我们刚刚创建的 Button ,将 MainCamera 拖至 ButtonInspector 面板的 OnClick 下.
点击 No Function 选择 UnityAndroidTest(也就是我们刚刚创建的脚本)-> SendToast()

添加 OnClick 事件

新建一个 Scenes 文件夹用于存放场景文件,使用快捷键 Ctrl + S 进行保存.

保存场景

设置好场景名点击保存即可保存场景.


3.配置打包环境安装到Android设备

点击 File -> Build Settings 打开右边的界面.
确认当前是 Android 开发环境,点击 Android 再点击 Switch Platform 切换开发环境.

切换开发环境到 Android

点击 Add Open Scenes 添加需要加载的场景.
Android 选项右方若有 Unity 的图标就代表现在是 Android 开发环境.
接着点击 Player Settings 进行打包前的基本设置.

配置打包设置

配置解析:
设置应用的名字,设置好签名以及最低兼容的版本 Android 4.1 和默认最高的目标版本.

Player Settings 界面

准备完毕后,就可以用 USB 线连接你的 Android 手机.
确认连接完毕后点击 Build And Run 进行打包.

开始打包

打包成功后打开,点击 Button 按钮后会出现一条 Android 发送到 Unity 的一条 HelloUnity! 的消息.
这条消息是通过 Android 发送到 Unity , Unity 再通过调用 Android 发送消息的方法将收到的内容发送到屏幕上.

Demo 测试界面

到此 UnityAndroid 的交互就完成了.比起 iOS 的交互, Android 的交互繁琐了许多.
第一次写技术文档,写的不好的地方请多多指教.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 感恩老婆昨晚上的开导让我正面思考并播下好的种子,感恩昨天陈总及同事从中协调,感恩公司给我依然提供了机会与平台,感恩...
    日精进_a07d阅读 172评论 0 3
  • 1.斯蒂芬-库里 库里是目前联盟最炙手可热的球星之一,他的出现改变了篮球的格局和发展趋势,让小球战术真正的走上了巅...
    NBA篮球联盟阅读 1,488评论 0 0
  • 高伟有画说阅读 350评论 0 2