【Unity】製作AndroidPlugin的重點與可能遇到的坑

有時候使用unity的時候會想要更改或使用到android內建的東西,像是android的鍵盤、android的通知欄(Toast)

這個時候單單使用unity能做到的事是有限的,所以必須使用android的plugin才能解決這類的問題

PluginsForAndroid 官方這邊就可以看到了

https://docs.unity3d.com/Manual/PluginsForAndroid.html

android plugin 的兩種格式

一個是用jar檔一個是aar檔,兩個都可以在unity內使用

兩者區別是:

jar檔只包含純code的模式,以下示意圖,每個jar檔可能都不一樣,當然還包含一些目錄的文件夾

img

aar檔則是有包含布局阿、圖檔阿…等這個plugin用到的資源,看起來像這樣

img

Unity官方則是推薦使用aar來當作plugin使用

製作android plugin的文章已經很多了,這邊講一下比較重要跟比較容易遇坑的幾點

導入classes (UNITY內的)

**
**unity有提供一個jar檔作為android 與 unity的橋樑,

大致路徑是C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

ps.如果最後輸出的是aar檔,最後要將aar檔內的libs/classes.jar刪除,以免與unity重複打包

app資料夾內build.gradle內

**
**1. apply plugin: ‘com.android.application’改成apply plugin: ‘com.android.library’ //因為是要當成plugin使用,所以要將application改成library,不然會輸出成apk

\2. applicationId “com.xx.xxxxx” //這一行刪除

\3. dependencies內新增compile files(‘libs/classes.jar’) //後面這個路徑是unity plugin接入的路徑跟檔名

\4. minSdkVersion 21 對應到 unity BuildSetting內的MinimumAPI LEVEL (下面有)

AndroidManifest

這個是一個xml檔案,用來指向unity連接android的入口與一些app屬性的操作,像是

裡面比較重要的是packgeName ,unity BuildSetting內的packgeName要跟AndroidManifest內的packgeName一樣,minSdkVersion 也必須跟BuildSetting內MinimumAPI Level一樣 (見下圖)

img

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

放在下面 上面

完整版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.u2a.testconnect" >


<application

android:label="@string/app_name" // 如果你打沒這行,你在unity build出來的app名字會跟你在productName設定的不相符
android:theme="@android:style/Theme.NoTitleBar">
<activity android:name="com.u2a.testconnect.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>

如果製作jar檔,可能會遇到的坑

上面一經贅述了很多,至於怎麼製作jar檔,參考連結應該會有,筆者爬了很多製作jar檔的方式,發現有個小坑,會讓你按export jar之後,資料夾與jar檔都沒出現在目錄上

img

對,就是gradle的版本,默認情況下會使用2.3.3版本,可是這樣照著網路上的資料來做的話,並不會出現想要的jar檔,我是改成2.2.3之後重build一次才出現jar檔的。

Extra: ((由於不多,所以不想多占一篇))

接上unity的plugin後,通常都會在MainActivity繼承UnityPlayerActivity (( 當然其他的Activity也可以,但是記得AndroidMainfest上的入口要修改為你用UnityPlayerActivity的那個 )),那這時已經建立連接口了,創建其他Activity的時候就不用再import UnityPlayerActivity了,除非有特殊需求,而如果要在unity內讀取其他Activity的話,則只需要使用AndroidJavaClass來指定讀取的路徑就可以了,像是我的packgeName為com.u2a.testconnect,第二個Activity 叫做SecondActivity,裡面有個靜態方GetSecondActivityNumber,回傳一個int,則會寫成這樣

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public Text log;
int secondActivityNum = 0;

private void OnGUI()
{

if (GUI.Button(new Rect(50, 500, 200, 100), "呼叫 SecondActivity的GetNumber"))
{

using ( AndroidJavaClass unity = new AndroidJavaClass("com.u2a.testconnect.SecondActivity")) //找出packge內的SecondActivity類別
{
secondActivityNum = unity.CallStatic<int>("GetSecondActivityNumber");
ShowSecondActivityNum();
}

}

}

public void ShowSecondActivityNum()
{
log.text = "顯示的數字(預設0) :"+secondActivityNum;
}

關於``UnityPlayer.UnitySendMessage 看一下文件使用方法就知道了,這邊就不再多說。

成品:GOOGLE雲端

如果上述文章有任何疑問或錯誤理解,請留言告知我,感謝。


參考資料與延伸閱讀:

Android Activity與 UnityPlayer Activity

http://eppz.eu/blog/unity-android-plugin-tutorial-1/

Android和Unity混合开发——Activity和Unity脚本交互和信息传递

http://www.jianshu.com/p/a7d82b3ac0c4

Android studio中如何生成引用 .aar 和 .jar

http://www.jianshu.com/p/76559da9ab39

Android Studio导出并使用aar和jar

http://chiahaolu.github.io/2016/06/27/Android-Studio%E5%AF%BC%E5%87%BA%E5%B9%B6%E4%BD%BF%E7%94%A8aar%E5%92%8Cjar/

Android Studio 打包及引用 aar

http://www.androidchina.net/2467.html