1. 程式人生 > >Unity安卓外掛教程(2)

Unity安卓外掛教程(2)

在本系列教程的上一篇(翻譯)Unity 安卓外掛開發教程(1/3) 基礎中,我強調了封裝外掛的重要性,主要是為了與其他外掛無衝突的一起工作。本篇教程更像一個經典的循序漸進的教程,在建立Unity安卓外掛時,展示了方便的專案設定和構建開發流程。最後,我會給你展示兩個基本的正常執行 的Unity Android plugin Hello World! 例子

如果你想跳過教程直接開始開發的話,我已經將Unity Android plugin Hello World! 例子上傳到Github上了。

Unity 安卓外掛工具

工程資料夾結構

這個教程最後會做出一個叫“My Plugin”的Unity 安卓外掛,第一步是建立一個對應的Unity工程

這裡寫圖片描述  這裡寫圖片描述

下一步是為外掛工程資料夾佈局。為了不影響Unity構建程序,並且避免我們的外掛非必要的轉移原始碼(除非是為了釋出),我建議將外掛工程檔案放到Assets資料夾的相同根目錄下。作為一個單獨的工程可以包含多個外掛,我們應該建立Android和IOS資料夾各一個,這樣我們就可以持有多個子外掛的檔案夾了。我同樣建議外掛工程的字尾名帶上平臺名稱,避免有太多相同名稱的資料夾。在有了外掛工程後,你的工程應該和上面的圖片類似。

在Android Studio中建立Unity 安卓外掛工程

下面幾步我們要建立一個簡單的安卓應用工程,然後將它轉變為一個外掛工程。一步一步的準備。

這裡寫圖片描述 這裡寫圖片描述

在我們之前建立的Android資料夾下建立一個叫“My_Plugin_Android

”的新的Android Studio工程,並且選擇“Add No Activity” 選項,目前我們在工程裡並不需要任何類。

這裡寫圖片描述 這裡寫圖片描述

在“1:Project tab”下,選擇“Project” 檢視(不是安卓)來顯示工程中的每個檔案,然後在根資料夾下點選右鍵選擇“New/Module”為我們的外掛建立一個新的“Android Library Module”。

這裡寫圖片描述 這裡寫圖片描述

外掛有了新的模組後,你可以在“App”模組上點選右鍵刪除之前的應用模組,然後到“Open Module Settings”,點選“-”按鈕。之後,你就安全的移除了這個資料夾。

對於這個工程你也可以移除test suites(androidTest和test資料夾)和resources

(res資料夾)。之後在你給外掛新增特性的時候,你可以在go中新增這些。這些操作過後你的工程架構應該像下面圖片一樣。

這裡寫圖片描述

請注意在移除資原始檔夾後也會移除任何定義好的字串資源,因此在AndroidMainfest.xml中你應該將 標籤下的android:label屬性改成上圖中顯示的字串。

就這樣!我們的Unity安卓外掛工程已經可以構建了。至少他可以將所有部分整合到AAR 包(可以匯入到Unity中使用的包)。在工具欄“View/Tool Windows/Gradle”開啟GradleAndroid Studio用來編譯的工具),在“My_Plugin_Android/:My_Plugin/Tasks/build/assemble”下雙擊執行assemble Gradle 任務。

這裡寫圖片描述 這裡寫圖片描述

如果你獲取AAR檔案並將它放到Assets/Plugins目錄下(或者任意的Unity5資料夾下),它會與Unity工程一起構建。然而,為了快速迭代和定製鉤子,我們可以。

外掛打包程序

除了版本控制,第二個將外掛工程放在這裡的理由是為了可以將匯出的外掛包複製到Unity應用程式中。我建立了一個Gradle指令碼來做這個任務,這個自我解釋的指令碼可以為進一步的定製開發做基礎。進一步的清理,我們可以移除Android Studio為外掛模組設定的不再需要的依賴。在My_Plugins/build.gradle檔案的結尾處插入下列程式碼塊。

...
dependencies {
}
android.libraryVariants.all { variant ->
    // Task names.
    String variantName = "${variant.name.capitalize()}"; // Like 'Debug'
    String deployTaskGroup = "plugin";
    String deployTaskName = "deploy${variantName}PluginArchive"; // Like 'deployDebugPluginArchive'
    String dependencyTaskName = "assemble${variantName}"; // Like 'assembleDebug'
    // Source.
    String sourceAARFolder = "${buildDir.getPath()}/outputs/aar/";
    String sourceAARName = "${project.name}-${variant.name}.aar";
    // Target.
    String targetAssetFolder = "Assets/Plugins/My Plugin";
    String targetAARFolder = "${rootDir.getPath()}/../../${targetAssetFolder}"; // Navigate into 'Assets'
    String targetAARName = "My Plugin Android.aar"; // The form you ship your plugin
    // Create task.
    task(deployTaskName, dependsOn: dependencyTaskName, type: Copy) {
        from(sourceAARFolder)
        into(targetAARFolder)
        include(sourceAARName)
        rename(sourceAARName, targetAARName)
    }.group = deployTaskGroup;
}

Gradle同步完成之後,你可以在Gradle任務中找到一個叫plugin的新的組作為新的打包任務。雙擊deployReleasePluginArchivey執行任務。你使用Debug或者Release變數都無所謂,目前並沒有什麼不同。

你可以在指定的路徑資料夾中找到任務的輸出外掛包。在執行任務後,Android Studio自動建立了一個執行配置檔案,因此現在可以使用CTRL+R快捷鍵來發布外掛

這裡寫圖片描述

除了依賴管理,這個教程中我還分享了專案設定會出現的問題。現在你可以輕易解決Java 編譯錯誤,自動打包工具,包含庫檔案,安卓支援庫檔案,圖片資源問題,基於這些讓開發出一個便利的和可維護的Unity安卓外掛。

對於大工程你最好維護一個應用模組,這樣你也可以在模擬環境中使用或者除錯。但是對於小模組,可以構建本地Java外掛程式碼就夠了。然後在Unity工程中打包整個工程並進行真機測試。

剩下的事就是建立一個外掛。

Unity安卓外掛示例 Hello World!

雖然接入本地特性或者Unity執行時需要一些特殊的情形,但可以首先建立一個簡單的靜態Hello World! 方法。在com.eppz.myplugin包下建立一個叫My_Plugins的java類,新增一個像下面的靜態方法。

package com.eppz.myplugin;
public class My_Plugin
{
    public static String getMessage()
    { return "Hello World!"; }
}

Unity可以使用和方便的處理安卓java類和物件,他們都是自我解釋型的。因此開發並且使用的Java程式碼可以只有兩行。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class My_Plugin : MonoBehaviour
{
  void Start()
  {
    AndroidJavaClass pluginClass = new AndroidJavaClass("com.eppz.myplugin.My_Plugin");
    GetComponent<Text>().text = pluginClass.CallStatic<string>("getMessage");
  }
}

我建立了一個有Text的小的測試場景,然後切換到安卓開發平臺,為應用程式設定Bundle Identifer。你可以在一個真實的安卓裝置中執行這個程式(注意在編輯模式下不能執行)。

這裡寫圖片描述

如果想要在體驗這個開發流程,你可以切換回Android Studio,將My_Plugins.java中的第六行改成{ return “Hello from Android”;},然後點選CTRL+R,在任務完成後,切換回Unity,然後打包執行

這裡寫圖片描述