大致步驟如下:
1.創(chuàng)建新的 Android Studio 工程
2.為此 Android Studio 工程創(chuàng)建 Android Library 類庫(也就是一個 Module)(后面就是用它生成 jar)
3.生成 Jar
4.將 jar 導(dǎo)入 Unity 工程中的 Assets/Plugins/Android/
5.使用 AndroidJavaObject.Call 等方式調(diào)用
創(chuàng)建新的 Android Studio 工程#
1. 設(shè)置好 名稱 、 路徑 盅藻、 包名
這里的 Package name 只是這個 Android Studio 工程的包名氏淑,而我們需要的并不是這個工程假残,我們后面會在這個工程內(nèi)新建一個 Android Library 類庫,這個類庫才是我們要導(dǎo)出 Jar 的對象眶俩。所以颠印,這個 Android Studio 工程的 Application name 荒勇、Company Domain 沽翔、Package name 這三個參數(shù)可以隨意填寫仅偎,并不需要與正式工程相同。
2. 選擇 SDK 版本
這里的意思是選擇一個可兼容的最低的 Android 系統(tǒng)版本座咆。自行選擇介陶,隨意。
3. 選擇 Empty Activity
直接選擇空的 Activity 就可以了某残,因?yàn)檫@個是本工程的 Activity,并不是我們要導(dǎo)出的 Jar 的 Activity椭豫。
4. 給此 Activity 定義參數(shù)
同樣,因?yàn)檫@個是本工程的 Activity谆构,并不是我們要導(dǎo)出的 Jar 的 Activity搬素。所以隨意填寫摸屠,和要導(dǎo)出的 Jar 無關(guān)季二。
5. 新建 Module
6. 選擇 Android Library
7. 輸入 Module 的參數(shù)
這里的參數(shù)就是要導(dǎo)出 jar 的 Android Library 類庫參數(shù)。Package name 與正式工程一致桑嘶。 Application/Library name 就是就填你要導(dǎo)出的 jar 插件的名稱。Module name 自動填寫就不用管了以政。
8.找到 Unity 中的 classes.jar 導(dǎo)入到這個 Module 的 libs 中妙蔗。classes.jar 在安裝路徑的相對路徑如下:
\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
(Project 視圖下可以看到 libs 文件夾)
9.把 classes.jar 加入依賴。點(diǎn)擊 File->Project Structure
Modules 選擇自己新建的 Android Library,中間欄點(diǎn) Dependencies 標(biāo)簽梳杏,然后點(diǎn)擊右側(cè)加號+十性,選擇 File Dependency劲适,然后找到自己拷貝進(jìn)來的在 libs 目錄下的 classes.jar 點(diǎn)擊OK
9.給 Module 添加 Activity Class
給新建的 Class 命名烹植。輸入 Name 然后點(diǎn)擊 OK草雕。
package com.example.myjar;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public class MyActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
public void ShareText(String message, String body) {
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, message);
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(sharingIntent, "Share via"));
}
}
10. 修改 build.gradle
雙擊 build.gradle嘴纺,修改代碼栽渴,注意修改的是自己新建的 Library 的build.gradle闲擦,不是整個 project 的 build.gradle
在 build.gradle 末尾添加以下代碼纯路,表示添加了一個 Task 任務(wù)
//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}
//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(deleteOldJar, build)
11. 刷新 gradle
一般情況下修改了 build.gradle 后驰唬,系統(tǒng)上方會讓你 SyncNow叫编,還可以手動刷新一下搓逾,右側(cè)點(diǎn)擊 Gradle 標(biāo)簽霞篡,選中自己的 Library朗兵,右擊選擇Refresh external project
12. 生成 Jar
在上一步的窗口中(Gradle projects窗口)往下翻,可以在自己的 Library 展開項(xiàng)的 other 的展開項(xiàng)中找到 exportJar 浊吏,雙擊,然后等待完成墩衙。
然后就可以在 release 目錄下面找到生成好的 jar 包了漆改,右擊這個 jar 包選擇 Show in Explorer 就可以拿到這個 jar 包了。
13. 導(dǎo)入 Unity
將拿到的 jar 放到 unity 工程的 Asset/Plugins/Android/ 目錄下樊破。沒有的話就手動創(chuàng)建目錄哲戚。
**14. 修改或添加 AndroidManifest.xml **
**(重要王浴,請仔細(xì)閱讀叼耙,真正理解 AndroidManifest 才是最快的方式) **
如果你是新工程筛婉,沒有使用過其他 android 的 sdk(指的是 unity 的插件)入蛆,應(yīng)該是沒有AndroidManifest.xml文件的,這樣可以在 Asset/Plugins/Android/ 目錄下新建一個 AndroidManifest.xml硕勿。
先介紹新加一個 AndroidManifest.xml
**需要注意 **的就是主 activity 的 android:name 需要為 用于導(dǎo)出 jar 的 Library 的包名 + 我們導(dǎo)出的 jar 的主類名(就像下方第4行:"com.example.myjar.MyActivity")(這個包名哨毁,其實(shí)也就是 unity 工程 Player Settings 中填寫的包名,因?yàn)樗麄冃枰恢拢?/p>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
<activity android:name="com.example.myjar.MyActivity"
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>
</activity>
</application>
</manifest>
修改 AndroidManifest.xml
如果你之前的工程有使用過其他的 Android 的 SDK(指的是 unity 的插件)源武,那么在 Asset/Plugins/Android/ 目錄下應(yīng)該已經(jīng)有一個 AndroidManifest.xml扼褪,那么你就需要將這次導(dǎo)出的 jar 的 activity 添加到這個 AndroidManifest.xml 中進(jìn)行注冊想幻。
一個 AndroidManifest.xml 只有一個主 activity (直接的觀察就是這個 activity 標(biāo)簽中包含了下面這段標(biāo)簽)。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
(這里需要強(qiáng)調(diào)一下话浇,本文是基于 unity 的 Android 平臺的)
而 unity 工程脏毯,需要將繼承了 UnityPlayerActivity 或者 UnityNativePlayerActivity 的 Activity (見上面第9步)為啟動 Activity ,才可以在 Android 平臺(說白了就是手機(jī)等等)啟動你的 unity 工程幔崖。而這個 “設(shè)置為啟動 Activity ” 的步驟嗅定,就是在 AndroidManifest.xml 中完成的,也就是在 AndroidManifest.xml 中將這個 Activity 注冊為主 Activity 荠锭。
還有愧怜,你在 unity 中做的所有東西猜惋,發(fā)布到 Android 上禾锤,就只有一個 Activity,你如果在 unity 中喚起了其他的 Activity,就會像手機(jī)后臺切應(yīng)用一樣的切換到你喚起的這個 Activity。所以稿壁,進(jìn)行 unity 的 android 插件開發(fā)蕾羊,只有一個入口利凑,也就是繼承 UnityPlayerActivity 或者 UnityNativePlayerActivity (UnityNativePlayerActivity 其實(shí)就是繼承UnityPlayerActivity 的一個類,并沒有進(jìn)行任何操作)择示。
理解了這些之后,就能理解為什么一般的 unity 插件硕淑,并不會將自己的 Activity 注冊成主 Activity,所以你只需要將他們的 Activity 標(biāo)簽復(fù)制粘貼到你的 AndroidManifest.xml(Asset/Plugins/Android/ 目錄下,一個工程只需要一個 AndroidManifest.xml(多個的用法本文不涉及尝江,你只需要知道辜纲,Asset/Plugins/Android/ 目錄下僅有一個 AndroidManifest.xml 文件))中就可以了(如果他們的 Activity 標(biāo)簽有上面提到的 “intent-filter” 標(biāo)簽 也就是被標(biāo)記成主 Activity,你就要考慮,他們的功能是需要在 unity 的這個主 Activity 啟動就響應(yīng)的种吸,還是切換另外一個 Activity 才進(jìn)行操作的)。
所以降允,綜上尉剩,如果是你自行開發(fā)的多個 unity Android 插件(jar),就需要盡量先在 Android 層合并成一個 jar 插件包童社,以保證只有一個入口,一個主 Activity 旦装。不光是自行開發(fā)的,使用其他 sdk 的時候含长,也要想券腔,如果可以直接在 Android 層進(jìn)行合并操作(統(tǒng)一一個 Activity 入口,然后所有調(diào)用其他 sdk 功能的接口全部放在這個 Activity 中)的拘泞,就盡量在 Android 層進(jìn)行纷纫。
多個 unity Android 插件(jar)合并的時候,難的部分其實(shí)也不難陪腌,就是理解他們的功能辱魁,然后合并 AndroidManifest.xml 的操作烟瞧。
(下次我會介紹一些特殊情況,比如如何合并 Vuforia 的 AR SDK 和 其他 SDK 插件)
15.調(diào)用 jar 插件中的接口
unity 中調(diào)用 android 層的接口基本都是通過 AndroidJavaClass 染簇、AndroidJavaObject 的方式参滴。
比如,上面我導(dǎo)出的 jar 插件中锻弓,在 MyActivity 類中我寫了一個 ShareText(String , String ) 的接口(第9步)砾赔,那么我在 unity 中就可以通過以下代碼調(diào)用這個接口。
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
string message = "this is my title";
string body = "this is my content";
jo.Call("ShareText", message, body);
如果你需要喚起其他的 Activity青灼,就在上方第二行暴心,將 "currentActivity" 改成你在 AndroidManifest.xml 中注冊的 Activity 名字,然后就可以通過 AndroidJavaObject.Call 的方式調(diào)用那個 Activity 類里的接口杂拨。如果這個接口在這個 Activity 類里被標(biāo)記成了 static专普,還可以通過AndroidJavaObject.CallStatic 的方式調(diào)用。
第一行的 "com.unity3d.player.UnityPlayer" 是需要調(diào)用的接口所在的 Activity 所在的包名弹沽,如果是 unity 主 Activity 檀夹,就可以直接使用 "com.unity3d.player.UnityPlayer",如果是其他插件包策橘,就使用那個包的包名击胜。
16. 效果