Unity3D之移植學習筆記:移植到Android平台


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

  1. 第一個參數:位於場景中的GameObject的名稱。
  2. 第二個參數:調用該GameObject身上存在的方法名稱。
  3. 第三個參數:傳遞的參數,這里只能使用字符串類型。

比如:我們場景中存在一個名為“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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM