有時候使用unity的時候會想要更改或使用到android內建的東西,像是android的鍵盤、android的通知欄(Toast)
這個時候單單使用unity能做到的事是有限的,所以必須使用android的plugin才能解決這類的問題
PluginsForAndroid 官方這邊就可以看到了
https://docs.unity3d.com/Manual/PluginsForAndroid.html
android plugin 的兩種格式
一個是用jar檔一個是aar檔,兩個都可以在unity內使用
兩者區別是:
jar檔只包含純code的模式,以下示意圖,每個jar檔可能都不一樣,當然還包含一些目錄的文件夾
aar檔則是有包含布局阿、圖檔阿...等這個plugin用到的資源,看起來像這樣
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一樣 (見下圖)
<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
<?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檔都沒出現在目錄上對,就是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:
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
沒有留言:
張貼留言