Unity和Android互動
Unity和Android的互動一般涉及兩種場景:
Unity開發為主,安卓開發作為輔助:以提供aar包等形式提供給Unity使用手機端的功能。如:通路Wifi資訊,進行定位等。
Android開發為主,Unity隻負責開發部分場景功能 :手機中嵌入一些Unity開發的小遊戲,或者需要呈現AR,VR效果的場景。
Android插件輔助Unity開發
Android端準備
建立Android工程,并在新工程中建立Module,選擇Android Library

編寫功能類,實作供Unity端調用的功能方法

Android Studio中選擇菜單Build -> Make Module 'xxxxxx',對目前Module進行建構,建構成功後可找到生成的aar包


Unity端準備
工程目錄Assets目錄下建立Plugins/Android子目錄,然後将Android端生成的aar包放入。

腳本中建立AndroidJavaObject對象(入參為Android代碼中需要用到的方法所在類的完整類名),調用Call方法即可(入參為Android代碼中要調用的方法名)。
public string GetWifi() {
WifiHelper = new AndroidJavaObject("com.zxy.gpuimagehelp.WifiHelper");
return WifiHelper.Call("getWifiName");
}
關于AndroidJavaObject以及Call方法的更多詳細資訊,可參考官方文檔說明
Android端對Unity端主動通信
Android代碼中編寫方法,反射調用該類com.unity3d.player.UnityPlayer中的靜态方法UnitySendMessage,第二個入參為Unity中的GameObject對象名稱,第三個入參為要執行的方法名,第四個參數為要傳遞的資料(隻能傳遞一個字元串,需要傳遞多種類型,可約定好分隔符後拼接成字元串,Unity端按分隔符進行分割)。

2.Unity中編寫對應腳本方法,提供給Android使用。

Tips
若Unity腳本需要在子線程中調用Android代碼,調用前必須先将線程依附到Java虛拟機,執行完後需要對線程進行分離。否則,直接在子線程中調用Android方法,程式會出報錯退出。詳見AndroidJNI.AttachCurrentThread和AndroidJNI.DetachCurrentThread
Unity打包嵌入到Android程式
Unity端編寫好程式後,打包并導出。在File -> Build Settings 裡面進行一些打包設定。Buile System 選擇Gradle,Export Project 勾選上,Package Name 和 Company Name / Product Name 要對應,之後選擇Export進行導出。

将導出後的工程檔案夾打開
libs檔案夾下的jar包要添加Android Studio工程中并依賴
assets和jniLibs目錄下的的内容也直接複制到Android Studio工程中。
需要嵌入Unity場景的頁面Activity必須繼承UnityPlayerActivity(需要先導入Unity導出工程中libs工程中的jar包),在onCreate方法中嵌入Unity頁面。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unity);
// Unity視圖的容器
FrameLayout fl_unity_container = findViewById(R.id.fl_unity_container);
fl_unity_container.addView(mUnityPlayer);
mUnityPlayer.requestFocus();
}
Tips
Unity退出時會調用整個程序的退出,并且在Activity中嵌入的Unity場景,将會攔截Android的回退事件。如果想要重新捕獲Android的回退事件,并在Unity退出時隻關閉目前Activity,可以在onKeyDown中捕獲回退事件,并調用UnityPlayer的quit方法。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
Log.d("onKeyDown", "KEYCODE_BACK");
mUnityPlayer.quit();
}
return super.onKeyDown(keyCode, event);
}