這是一篇2021年的存檔,使用Unity2020版本。
至今,Unity與AS很多通訊方式也是基于此衍生。
作為Unity與AS聯合開發的受益者,難得掏出自己的飯碗,諸君共享!
Unity & Android Studio 聯合開發快速入門
——Unity與AS之間的互相調用實戰指南
在移動開發中,Unity 常常用于快速構建跨平臺的 3D/2D 應用,而 Android Studio(AS)則是調用 Android 原生功能的利器。為了結合二者的優勢,我們需要掌握 Unity 與 AS 的互相調用方式。本文將從環境配置開始,逐步講解 Unity 調用 Android 方法、AS 調用 Unity 方法,以及實際的通信示例。
文章目錄
- Unity & Android Studio 聯合開發快速入門
- 一、Unity 環境配置
- 1. 開發模塊
- 2. 開發平臺
- 3. 環境配置
- 二、Visual Studio 配置
- 方式1:Unity Hub 中勾選
- 方式2:手動配置 Visual Studio
- 先決條件
- 安裝 Visual Studio Tools for Unity
- 檢查更新
- 配置 Unity 使用 VS
- 三、Unity 調用 AS 導出的 aar
- 1. AS 導出 aar
- 2. Unity 導入 aar
- 3. 編寫腳本與綁定
- 4. 調試與運行
- 5. 運行結果
- 四、AS 調用 Unity 導出的工程
- 1. 示例腳本
- 2. 導出 Android 工程
- 3. 調用方式
- 4. 常見問題
- 五、Unity 與 AS 互相調用
- 1. Unity 調用 AS
- 方式1:繼承 UnityPlayerActivity
- 方式2:調用靜態方法
- 方式3:調用非靜態方法 / 單例模式
- 2.AS 調用 Unity
- 方式1:UnitySendMessage
- 方式2:使用 AndroidJavaProxy 實現回調通信
- 3. Unity 調用 Android Toast 示例
- Unity 直接調用 Android API
- Unity 調用 AS 中的 Toast
- 總結
一、Unity 環境配置
1. 開發模塊
打開 Unity Hub → 安裝 Unity 版本 → 添加模塊時,勾選 Android Build Support。
2. 開發平臺
在 Unity 編輯器中切換到 Android 平臺:
File → Build Settings → Android → Switch Platform
。
3. 環境配置
進入 Edit → Preferences → External Tools
,確認 JDK、SDK、NDK 路徑正確。
注意 Unity 版本兼容性,例如 Unity 2020 LTS 僅支持:
- JDK 1.8
- NDK 19.0.523213
二、Visual Studio 配置
方式1:Unity Hub 中勾選
安裝 Unity 時直接選擇 Visual Studio 組件。
方式2:手動配置 Visual Studio
先決條件
確保已通過 Unity Hub 安裝 Unity。
安裝 Visual Studio Tools for Unity
- 打開 Visual Studio Installer。
- 選擇安裝或修改現有版本。
- 在 工作負載 中勾選 使用 Unity 的游戲開發。
檢查更新
幫助 → 檢查更新
,保持 VS 最新,確保 bug 修復與 Unity 支持。
配置 Unity 使用 VS
- Unity →
Edit > Preferences > External Tools
。 - 在 External Script Editor 中選擇 VS。
- 如未列出,可手動選擇
devenv.exe
。 - 勾選 Editor Attaching,保證調試可用。
三、Unity 調用 AS 導出的 aar
1. AS 導出 aar
-
在 AS 中編寫 Java 方法。
-
執行 Gradle 構建:
clean → assemble
。
-
aar 生成路徑:
build/outputs/aar/
。
2. Unity 導入 aar
將 aar 文件放入:
Assets/Plugins/Android/
目錄下,即可直接在 C# 中訪問。
3. 編寫腳本與綁定
- 在 Unity C# 腳本中調用 aar 方法。
- 將腳本掛載到場景對象(如
Main Camera
)。
4. 調試與運行
-
使用 Attach to Unity 調試。
-
注意:PC 模擬時返回值可能與 Android 不同(如布爾值)。
* -
構建 APK,在手機開啟開發者模式后運行測試。
5. 運行結果
場景啟動時調用 aar 方法,例如調用 showToast()
在手機端顯示 Toast。
四、AS 調用 Unity 導出的工程
1. 示例腳本
在 Unity 中編寫 C# 腳本,供 Android 調用。
2. 導出 Android 工程
Unity → Build Settings → Export Project
。
導出的文件目錄如下
3. 調用方式
- AS 直接導入:用 AS 打開導出的工程,直接運行。
- 作為依賴模塊導入:僅導入
unityLibrary
模塊,集成到現有 AS 工程。
修改安卓清單和gradle配置
該模塊主要有一個UnityPlayerActivity,這是Unity官方提供的,它默認是全屏加載Unity工程導出的場景,注意,這是個示例,因此可以自定義修改它。
4. 常見問題
-
找不到 so:檢查 gradle 是否配置
abiFilters
。
由于習慣了如此引用,因此將內容修改如下圖
-
找不到 aar:檢查
dependencies
配置,確認項目級 gradle 是否包含倉庫地址。
檢查gradle文件中dependencies
檢查工程的gradle(不是模塊的gradle)是否有如下配置,(最新的AS創建的工程創建后沒有如下內容)
模塊的gradle中添加如下內容
五、Unity 與 AS 互相調用
1. Unity 調用 AS
方式1:繼承 UnityPlayerActivity
Android 端繼承 UnityPlayerActivity
,Unity 通過 AndroidJavaObject
調用。
unity代碼:
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("login","這里是傳過去的參數");
Android代碼:
package com.example.test;public class MainActivity extends UnityPlayerActivity {public void login( String str )
{ }
方式2:調用靜態方法
Unity 端:
AndroidJavaClass jc = new AndroidJavaClass("com.example.test.Test");
jc.CallStatic("login", "參數");
Android 端:
public class Test {public static void login(String str) { ... }
}
方式3:調用非靜態方法 / 單例模式
Unity 通過 AndroidJavaObject
調用實例方法,或先調用靜態方法獲取單例,再調用非靜態方法。
unity代碼:
AndroidJavaObject jo = new AndroidJavaObject("com.example.test.Test");
jo.Call("login","");
Android代碼:
package com.example.test;public class Test{public void login( String str ) { }
2.AS 調用 Unity
把消息發送給Unity場景中指定物體上的指定方法
UnityPlayer.UnitySendMessage(“物體名稱”, “方法名稱”, 參數);
實例:
方式1:UnitySendMessage
UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", "參數");
方式2:使用 AndroidJavaProxy 實現回調通信
與 UnitySendMessage
通過字符串傳遞消息不同,AndroidJavaProxy
提供了一種更穩定、更結構化的通信方式。它允許 Unity 實現 Android 端定義的接口,并將接口實現作為回調傳遞給 AS,從而實現雙向通信,適合復雜場景。
步驟如下:
1. 在 AS 端定義接口
先在 Android 工程中編寫一個接口,接口方法將作為回調被 Unity 實現。
package com.example.test;public interface UnityasrEventCallback {void Speechcontent(int a);void Test1(String msg);
}
2. 在 Unity 端實現該接口
在 Unity 中創建一個 C# 腳本,定義一個類繼承 AndroidJavaProxy
,并在構造方法中指定 AS 端接口的“包名+接口名”。然后實現接口中定義的方法。
public class AsrEventCallback : AndroidJavaProxy
{// 構造方法中傳入 AS 端接口的完整類名public AsrEventCallback() : base("com.example.test.UnityasrEventCallback") { }// 實現接口中的方法public void Speechcontent(int content){int a = content;Debug.Log("收到來自AS的整型回調: " + a);}public void Test1(string msg){string b = msg;Debug.Log("收到來自AS的字符串回調: " + b);}
}
3. 在 Unity 中注冊回調
在合適的生命周期方法(如 Start()
)中,將 AndroidJavaProxy
實例傳遞給 AS 的方法(如 setCallback
)。
void Start()
{AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");// 創建代理實例AsrEventCallback asrEventCallback = new AsrEventCallback();// 將代理傳遞給 ASjo.Call("setCallback", asrEventCallback);
}
這樣,AS 端只要調用 mCallback.Test1("xxx")
或 mCallback.Speechcontent(123)
,就能觸發 Unity 端的對應方法,實現回調通信。
3. Unity 調用 Android Toast 示例
Unity 直接調用 Android API
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass toast = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject context = jo.Call<AndroidJavaObject>("getApplicationContext");jo.Call("runOnUiThread", new AndroidJavaRunnable(() => {toast.CallStatic<AndroidJavaObject>("makeText", context, "Hello from Unity", toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
}));
Unity 調用 AS 中的 Toast
Unity 調用:
jo.Call("testToast", "吐司!");
AS 端:
public void testToast(final String msg) {runOnUiThread(() -> Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show());
}
總結
本文完整介紹了 Unity 與 Android Studio 互相調用的實現方式:
- Unity 環境與 VS 配置
- Unity 調用 AS aar
- AS 調用 Unity 工程
- 雙向通信方案(UnityPlayerActivity、靜態方法、UnitySendMessage、AndroidJavaProxy)
- 實際示例(Toast 調用)
通過這些方法,開發者可以在 Unity 中調用 Android 原生能力,同時讓 Android 端靈活調用 Unity 的邏輯,實現高效的跨平臺應用開發。