【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檔可能都不一樣,當然還包含一些目錄的文件夾









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"/>

放在</intent-filter>下面 </activity>上面

完整版:


<?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






Share:
Read More