標籤:
首先,我們需要一台已經配置好可以開發Android應用的電腦,這裡我使用的是Windows系統+Eclipse+ADT的開發環境,當然也可以使用Android Studio或者使用Mac系統都可以。
匯出到Eclipse設定U3D工程
首先需要設定遊戲的平台為Android:
在Player Settings...面板中記得設定一下:
這個名稱需要設定。
匯出Android工程
設定好Android的配置之後,我們需要對Android工程進行匯出,我們仍然點擊Builder Setting,勾選匯出工程:
我們將工程匯出到指定的檔案夾中,注意我們在匯出過程中需要選擇Android SDK和JDK的路徑。
匯入工程
我們開啟Eclipse匯入當前的工程:
需要注意的是,如果我們當前的Workspace和匯出的檔案夾一致則會報錯“Invalid project description”,解決的辦法是,我們匯出的檔案夾和Workspace的檔案夾不一致即可,如下:
如上,我的匯出路徑是AndroidOutput檔案夾,而我的Eclipse的Workspace是Android檔案夾。
Unity與平台互動
在Android這邊,我們要修改的是UnityPlayerNativeActivity.java檔案:
Android調用Unity的方法
可以直接使用靜態方法:
UnityPlayer.UnitySendMessage(String arg0, String arg1, String arg2);
我們看看他的3個參數:
- 第一個參數:位於情境中的GameObject的名稱。
- 第二個參數:調用該GameObject身上存在的方法名稱。
- 第三個參數:傳遞的參數,這裡只能使用字串類型。
比如:我們情境中存在一個名為“AndroidInterface”的GameObject,同時為其綁定了一個指令碼,指令碼中存在一個名為“AndroidCallback”的方法,那麼我們在Android平台上要調用該方法就可以使用下面的代碼:
UnityPlayer.UnitySendMessage("AndroidInterface", "AndroidCallback", "");
有意思的是,Unity中的方法的存取權限不一定要是public的,使用protected及private都可以被調用到。
Unity調用Android的方法
Unity調用Android的方法首先要擷取到AndroidJavaObject對象,同時調用的方法必須在UnityPlayerNativeActivity類中定義,我們看看下面的指令碼:
1 using System; 2 using UnityEngine; 3 4 /// <summary> 5 /// 和 Android 平台互動相關的指令碼. 6 /// </summary> 7 public class AndroidInterface : MonoBehaviour 8 { 9 private static AndroidInterface _instance;10 11 public static AndroidInterface GetInstance()12 {13 if(_instance == null)14 {15 throw new Exception("AndroidInterface is not initialized!");16 }17 return _instance;18 }19 20 private AndroidJavaObject _activity;21 22 void Awake()23 {24 if(_instance != null)25 {26 throw new Exception("GameDebug is Singleton!");27 }28 _instance = this;29 30 AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");31 _activity = javaClass.GetStatic<AndroidJavaObject>("CurrentActivity");32 }33 34 /// <summary>35 /// 彈出詢問是否退出的對話方塊.36 /// </summary>37 public void ShowQuitDialog()38 {39 _activity.Call("showQuitDialog");40 }41 42 /// <summary>43 /// 彈出對話方塊.44 /// </summary>45 /// <param name="title">標題.</param>46 /// <param name="content">內容.</param>47 public void ShowDialog(string title, string content)48 {49 _activity.Call("showDialog", new string[]{title, content});50 }51 }
我們通過如下調用即可調用到UnityPlayerNativeActivity類中對應名稱的方法了:
AndroidInterface.GetInstance().ShowQuitDialog();
同時,Java方面的方法也可以是protected和private的存取權限,同時傳遞的參數無限制。
偵錯工具
(註:我這邊使用模擬器運行時會報EGL_emulation的錯誤,調試實際上是不成功的,但是發布後是可以正常啟動並執行。)
選擇“Run”-》“Run”即可。
發布安裝包
由於已經作為Android工程所以不能再使用Unity3D來發布了,但是發布比較簡單:
選擇工程點擊右鍵,“Android Tools”-》“Export Signal Application Package”即可,需要我們使用一個Keystore,沒有進行建立即可。
問題總結
匯入Android項目失敗:http://www.crifan.com/adt_android_invalid_project_description_overlaps_the_location_of_another_project/
Android模擬器啟動報錯:http://blog.csdn.net/yu413854285/article/details/7559333
Installation error: INSTALL_FAILED_CONTAINER_ERROR:http://www.cnblogs.com/lovecode/articles/3658211.html
Unity3D之移植學習筆記:移植到Android平台