Unity和Android互動
前言:在 Android 軟體的開發中,會經常遇到 Unity 呼叫 Android 中的介面方法,不單是內購和廣告的接入,普通的使用 Unity 去呼叫 Android 的原生訊息框都會需要使用到互動相關的知識,接下來我們開始吧.
前期需要準備:
確認安裝 Android Studio 開發軟體.
整體步驟我分為:
-
基於 AS(Android Studio) 編寫介面方法類並打出 jar
-
配置關聯 Unity 編寫呼叫 Android 原生方法介面方法
-
配置打包環境安裝到 Android 裝置
我的開發環境:
Unity 版本為 2017.4.6f1 Android Studio 版本為 3.2.0
1.基於 AS 編寫介面方法類並打出 jar.
開啟 Android Studio ,選擇 Start a new Android Studio project 新建一個 Android 工程.

建立工程
下面是設定工程名字簽名存放位置等等,這裡我簡單填寫就好,目的是編寫介面方法打出 jar ,設定完畢後點擊 Next .

設定名字與簽名
這裡我選擇的是 Android 手機,最小相容的版本為 API 16 ,也就是 Android 4.1 ,接著點 Next .

選擇最小相容的 API 版本
接著會提示讓我們建立一個 Activity 類,這裡我們選擇 Add No Activity 不新增 Activity ,再點選 Finish 完成建立.

Add an Activity to Mobile 介面
工程建立完畢後,首先切換成 Project 檢視,也就是綠框中的選項.
右鍵點選我們工程的主目錄選擇 New -> Module 建立一個新 Module .

建立 Module
選擇 Android Library 後點擊 Next .

New Module 介面
設定好名字後點擊 Finish .

Android Library 介面
建立好 Module 後,別忘了新增用於編譯的 Unity 庫,將你 Unity 安裝目錄下的 Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
檔案複製到我們工程中剛剛建立的 Module 的 libs 目錄下.

複製到 Unity 工程中
回到AS介面,會發現我們建立的 Module 目錄下的libs 下出現了我們複製新增的 classes.jar 庫.

Android Studio Project 檢視
光新增進來可沒用,我們還需要給它新增依賴.
右鍵點選我們建立的 Module 選擇 Open Module Settings 開啟 Module 設定面板.

開啟 Module 設定介面
點選我們建立的 Module 選擇 Dependencies -> Jar dependency .

設定依賴庫
選擇我們從 Unity 複製新增的 classese.jar 後點擊 OK .

選擇 classes.jar
設定好依賴庫後,我們可以開始編寫介面方法類了,右鍵點選我們建立的 Module 目錄下 src/main/java/com.xxx.xxx
選擇 New -> Java Class .

新增 Java 類
設定好我們的 Activity 類名(就是我們的介面方法類)

新增 Java 類設定
Superclass是設定要繼承的父類,這裡我們事先設定為繼承 UnityPlayerActivity .
在剛剛建立的 Java 檔案中新增以下程式碼.
import android.widget.Toast; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class UnityAndroidActivity extends UnityPlayerActivity { public void SetInfo() { UnityPlayer.UnitySendMessage("Main Camera", "SetInfo", "Hello Unity!"); } public void SendToast(String info) { Toast.makeText(this, info, Toast.LENGTH_SHORT).show(); } }
首先我定義了一個私有 String 型別的變數.接著還有兩個方法.
方法一:呼叫 Unity 中名為 Main Camera 的遊戲物件身上我們編寫的指令碼中的 SetInfo 方法,併發送一串字元為 SetInfo 的第一個引數.
方法二:將 info 的內容用 Toast 傳送一條訊息.
現在我們的方法介面類已經準備好了,可以開始將我們寫好的類打包成 jar 庫了.
首先點選上方的 Build 選擇 Make Module 'xxx' .

Make Module
開啟我們 Module 目錄下的 build.gradle 檔案.

build.gradle
在 build.gradle 中的最下方新增以下程式碼:
android.libraryVariants.all { variant -> def task = project.tasks.create "jar${variant.buildType.name.capitalize()}",Jar task.dependsOn variant.javaCompile task.from variant.javaCompile.destinationDir artifacts.add('archives',task) } task jarUnityLib(type: Jar, dependsOn: ['build']) { archiveName = 'UnityAndroid.jar' //設定打出 jar 包的名字. from('build/intermediates/javac/release/compileReleaseJavaWithJavac/classes') destinationDir = file('build/libs') exclude('com/Test/unityandroidlibrary/BuildConfig.class') //這裡是自動設定好刪除BuildConfig.class exclude('com/Test/unityandroidlibrary/BuildConfig\$*.class') exclude('**/R.class') //這裡是自動設定好刪除 R.class 檔案 exclude('**/R\$*.class') include('com/Test/unityandroidlibrary/UnityAndroidActivity*.class') //這裡是選擇要匯出的方法介面類 }
注意: from 要根據自己的 Gradle 版本進行設定,由於我的 Gradle 版本是 4.6 ,是剛剛更新 AS 3.2.0 自動更新的.
如果是 4.6 之前的版本,大概要填 build/intermediates/javac/release
,具體所填,請自行查閱填之.
點選右上方的 Gradle 選擇我們的 Module 的 Gradle 選擇 other .

Gradle 任務介面
在 other 中找到我們編寫的任務 jarUnityLib 並雙擊它.

jarUnityLib 任務
打包完畢後會出現以下Log訊息.

打包後的 Log 訊息
在我們的Module目錄下會出現剛剛打出的jar包.

打出的 Jar 包
2.配置關聯Unity,編寫呼叫Android原生方法介面類
開啟 Unity ,設定好工程名字後點擊 Create project 建立工程.

建立 Unity 工程介面
建立好工程後,右鍵點選Assets 選擇Create -> Folder建立資料夾.

建立 Android 互動所需資料夾
按照下列格式建立資料夾,分別為Plugins Android libs三個資料夾.

要建立的資料夾格式
右鍵點選Android 資料夾選擇Show in Explorer開啟目錄.

開啟 Android 所在目錄
在Android 目錄下建立一個AndroidManifest.xml,可以建立Txt 文字後連同拓展名一起修改為xml 檔案.

建立 AndroidManifest.xml 檔案
新增以下程式碼:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:label="@string/app_name"> <activity android:name="com.Test.unityandroidlibrary.UnityAndroidActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screen Layout|screenSize|smallestScreenSize|uiMode|touchscreen"> <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>
需要注意:第三行所要設定的主Activity 需要填寫我們編寫的方法介面類,由於是繼承UnityPlayerActivity所以可以將主Activity 設定為我們所編寫的方法介面類.
右鍵點選我們打好的UnityAndroid.jar後選擇Show in Explorer.

開啟打好的 jar 包目錄
將打好的jar 包複製一份到Unity 中先前建立的 Plugins/Android/libs
目錄下.

複製到 Unity 工程的 libs 目錄
回到Unity 介面,建立一個Sctipts資料夾用於放置Unity 指令碼,右鍵點選剛剛建立的資料夾選擇
Create -> C# Script建立指令碼,指令碼名字可以自定義設定.

建立 C# 指令碼
建立好指令碼後開啟它.
新增以下程式碼:
using UnityEngine; public class UnityAndroidTest : MonoBehaviour { private AndroidJavaObject m_Jo; private AndroidJavaClass m_Jc; private string m_Info = null; private void Start() { m_Jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); m_Jo = m_Jc.GetStatic<AndroidJavaObject>("currentActivity"); m_Jo.Call("SetInfo"); } public void SetInfo(string info) { m_Info = info; } public void SendToast() { m_Jo.Call("SendToast", m_Info); } }
以上程式碼解析:
-
首先定義了AndroidJavaObject 和AndroidJavaClass 以及一個String 型別的變數m_Info .
-
Start 方法中初始化了m_JC 和m_Jo .還呼叫Android 中我們編寫SetInfo介面方法.
-
SetInfo方法是用於給Android 呼叫的公開方法,賦值當前類中的m_Info .
-
SendToast 是輔助呼叫Android 中傳送當前類中m_Info 內容到螢幕上.
編寫並儲存指令碼後,回到Unity 介面.
將我們編寫好的指令碼拖至Main Camera的Inspector 中.

拖拽指令碼至 Main Camera 的 Inspector
右鍵點選Hierarchy 面板,選擇 UI -> Button建立一個按鈕.

建立 Button 按鈕
點選我們剛剛建立的Button ,將MainCamera 拖至Button 的Inspector面板的OnClick 下.
點選No Function選擇UnityAndroidTest(也就是我們剛剛建立的指令碼)-> SendToast()

新增 OnClick 事件
新建一個Scenes資料夾用於存放場景檔案,使用快捷鍵 Ctrl + S
進行儲存.

儲存場景
設定好場景名點選儲存即可儲存場景.
3.配置打包環境安裝到Android裝置
點選File -> Build Settings開啟右邊的介面.
確認當前是Android 開發環境,點選Android 再點選Switch Platform切換開發環境.

切換開發環境到 Android
點選Add Open Scenes新增需要載入的場景.
Android 選項右方若有Unity 的圖示就代表現在是Android 開發環境.
接著點選 Player Settings進行打包前的基本設定.

配置打包設定
配置解析:
設定應用的名字,設定好籤名以及最低相容的版本Android 4.1和預設最高的目標版本.

Player Settings 介面
準備完畢後,就可以用USB線連線你的Android 手機.
確認連線完畢後點擊Build And Run進行打包.

開始打包
打包成功後開啟,點選Button 按鈕後會出現一條Android 傳送到Unity 的一條HelloUnity!的訊息.
這條訊息是通過Android 傳送到Unity ,Unity 再通過呼叫Android傳送訊息的方法將收到的內容傳送到螢幕上.

Demo 測試介面
到此Unity 和Android 的互動就完成了.比起iOS 的互動,Android 的互動繁瑣了許多.