首先,我們需要一台已經配置好可以開發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