已有Android工程整合Unity工程
前言
最近專案有個需求,將Unity工程整合入甲方的Android App中,網上看了一些資料,但大多都是過期的操作,也少有提及如何從Unity跳轉回Android App,或者提及的方法是先在Android中寫方法,然後匯出jar包到Unity中再呼叫,我感覺應該不用這樣繁瑣,本文記錄下我研究的過程,因為我之前完全未涉及Android開發,所以這裡的方式未必好,僅提供參考。
開發環境
Unity 5.6.1(64位)
Android Studio 3.0
正文
一、搭建Android App工程
因為之前完全未涉及Android開發,所以先跟著官方網站的基礎教程(需要翻牆開啟)做了一個簡單的App,這個App有兩個Activity:MainActivity和DisplayMessageActivity,功能為前者頁面中輸入文字,點選”Send”按鈕,便開啟後者並顯示輸入的文字內容。
MainActivity:
DisplayMessageActivity:
二、製作Unity工程
簡單起見,僅實現點選螢幕,Cube便顯示在點選位置的功能,核心程式碼如下:
void Update () {
#if UNITY_STANDALONE_WIN || UNITY_EDITOR
if (Input.GetMouseButton(0))
{
transform.position = cam.ScreenToWorldPoint(Input.mousePosition + vec);
}
#elif UNITY_ANDROID || UNITY_IOS
if (1 == Input.touchCount && Input.GetTouch(0).phase == TouchPhase.Ended)
{
transform.position = cam.ScreenToWorldPoint(Input.mousePosition + vec);
}
#endif
}
其中vec值是(0,0,10),也就是z軸加了一個離攝像機的距離,不然Cube會出現在攝像機的位置,顯示結果就是Cube消失了。
三、整合
1.Unity匯出安卓工程檔案
注意PlayerSettings中PackageName必須與Android App一致,然後BuildSettings中切換到Android平臺,設定Build System為“Gradle”,勾選”Export Project”,點選”Export”。
匯出後的工程根目錄如下:
內部檔案目錄為:
- libs/unity-classes.jar
- src/main/assets
- src/main/java
- src/main/jniLibs
- src/main/res
- src/main/AndroidManifest.xml
2.拷貝檔案到Android工程
- 將libs/unity-classes.jar檔案拷貝至app/libs目錄下,並右鍵點選”Add as Library”;
- 將src/main/assets整個目錄拷貝至app/src/main目錄下;
- 將src/main/java最終子目錄中的UnityPlayerActivity.java檔案拷貝至app/src/main/java子目錄中MainActivity同級目錄下;
- 將src/main/jniLibs整個目錄拷貝至app/src/main目錄下;
- 將src/main/AndroidManifest.xml中<activity>...</activity>
程式碼塊中的
<action android:name="android.intent.action.MAIN" />
刪除後,拷貝至app/src/main/AndroidManifest.xml中;
最後的目錄結構應該是這樣:
3.編寫Android開啟Unity介面的程式碼
- 在MainActivity中新增一個Button,文字為”Open Unity”,見步驟一中的MainActivity圖片;
- 在”MainActivity.java”中新增”OpenUnity”方法,程式碼如下:
- 繫結該方法到Button的onClick事件上;
到此步驟後,可先行測試是否可正常從Android開啟Unity,下一步驟需要更改Unity工程重新發布。
4.編寫Unity開啟Android介面的程式碼
- Unity中新增指令碼,編寫跳轉方法,並繫結到一個按鈕上,關鍵程式碼如下:
public void ReturnToAndroid()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.CallStatic("Return",jo);
AndroidJavaObject context = jo.Call<AndroidJavaObject>("getApplicationContext");
}
- 按第三步驟第1步重新匯出Unity的Android工程檔案,然後用新的assets替換舊的assets目錄,其他不用動;
- Android工程中在UnityPlayerActivity.java中新增方法:
至此,所有步驟就完成了,連上手機,在Android Studio中點選Run即可看到效果了。