Unity3D自己就是一款跨平臺開發軟件,兼容性高,可是每每在開發移動端過程當中,須要與Android原生態進行混合開發,這就包括兩中形式:android
- 以Unity3D爲主導開發
- 以Android爲主導開發
注意:若是工程格式不對,要打開app目錄下的build.gradle文件,將apply plugin: 'com.android.application',改爲apply plugin: 'com.android.library',由於android studio只有在這種格式下才能夠導出unity須要使用的aar或者jar文件。而後刪除defaultConfig下的applicationId,去掉默認的dependencies下的
compile 'com.android.support:appcompat-v7:25.0.0'的引入,由於這裏不須要用到它,並且這個包包含了不少的資源文件咱們是用不到的,最後格式爲。架構
(2)從unity安裝目錄的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes中,複製classes.jar出來,放到該剛纔建的工程的libs文件夾裏,並右鍵add as library
(3)修改AndroidManifest.xmlapp
首先刪除values下的style.xml文件,由於這裏面默認包含的是以前刪除的com.android.support:appcompat-v7:25.0.0包裏面的主題。而後修改AndroidManifest文件中application下的theme爲android自帶的主題。同時將<activity android:name=".MainActivity">修改成<activity android:name="cn.unity.android.MainActivity">,防止在unity中導出的app與AndroidManifest中的包名不一致產生的問題。而後添加<meta-data>信息,不然在 Unity 導出 APK 時會報找不到manifest 文件的錯誤信息編輯器
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
最終以下:
(4)上安卓原生代碼ide
package com.romantic.forunity; import android.app.AlertDialog; import android.os.Vibrator; import android.os.Bundle; import android.widget.Toast; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public String ShowDialog(final String _title, final String _content){ runOnUiThread(new Runnable() { @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(_title).setMessage(_content).setPositiveButton("Down", null); builder.show(); } }); return "Java return"; } // 定義一個顯示Toast的方法,在Unity中調用此方法 public void ShowToast(final String mStr2Show){ // 一樣須要在UI線程下執行 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(),mStr2Show, Toast.LENGTH_LONG).show(); } }); } }
(5)導出aar包和jar包函數
點擊build-->build apk,而後在app-->build-->outputs-->aar目錄下的到app-debug.aar文件
將app-debug.aar文件解壓,獲得根目錄下的classes.jar文件,請注意這個classes.jar文件並非最開始從unity中導入到android的classes.jar文件,並且你寫的android代碼的class文件的壓縮包(能夠解壓看看裏面實際的內容)。以後unity所須要使用的是res文件夾下的文件,classes.jar(android的)和AndroidManifest文件。性能
(6)Unity3D上面須要的工做gradle
而後將咱們以前導出的jar和res文件拷貝到Plugins/Android文件夾下。ui
直接上代碼this
//獲取Android的Java接口 AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); //每一個unity app在啓動的時候都會有一個unityPlayer實例。經過獲取該實例裏面currentActivity對象,其實就是咱們的MainActivity實例。 public void ShowAndroidTime () { jo.Call ("showToast", "Test" }); }
一樣安卓也可調用Unity中的方法(在安卓原生態腳本中添加):
// 第一個參數是unity中的對象名字,記住是對象名字,不是腳本類名 // 第二個參數是函數名 // 第三個參數是傳給函數的參數,目前只看到一個參數,而且是string的,本身傳進去轉吧 public void callUnityFunc(String _objName , String _funcStr, String _content) { UnityPlayer.UnitySendMessage(_objName, _funcStr, "Come from:" + _content); }
最後導出App就OK了。
注意:
Unity版本必須是Unity 2019.3.a2以上
Android Studio 3.3.2以上
將Unity做爲庫使用,要求開發者對Android/Java和iOS/Objective C的架構有着深刻的瞭解。
因爲Unity再也不控制運行時的生命週期,所以咱們沒法確保它能夠在全部用例都正常工做
Unity運行時庫會公開控制功能,以管理在原生應用中加載,激活和卸載的時間和方式。移動應用的構建過程整體上依舊相同,Unity將建立Android Gradle項目。
爲了啓用該功能,咱們修改了生成iOS Xcode和Android Gradle項目的結構,結構以下:
一、庫:Android Archive(AAR)文件,包含全部源文件和插件。
二、精簡的啓動器:包含應用程序展現數據,它會運行庫部分。
若是使用Unity做爲庫,Android Gradle項目的結構會發生改變。若是使用自定義mainTemplate.gradle或AndroidManifest.xml,這些改變也會影響項目或Unity插件。
此前,Unity會使用單個Gradle模塊來構建Android應用。如今,Unity會使用二個模塊建立Gradle項目,即:unityLibrary模塊和啓動器模塊。unityLibrary模塊包含Unity運行時和項目數據。該模塊是一個能夠輕鬆集成到任何其它Gradle項目中的庫,也能夠把Unity嵌入到現有原生Android項目中。
啓動器模塊包含全部圖標和應用名稱,它是一個簡單的Android應用程序,能夠啓動Unity。
將Unity做爲庫會提供新的Gradle項目結構,它會更好的符合Android Studio項目最佳結構。該結構中有一個根文件夾,其中包含一些能夠單獨構建和使用的子項目。它讓導入Unity Android Studio項目更加簡單。
Gradle模板會描述和配置使用Gradle構建Android應用的方法。每一個Gradle模板表明一個Gradle項目,Gradle項目能夠包括和依賴其它Gradle項目。
將Unity做爲庫的Gradle模板文件以下:
一、baseProjectTemplate.gradle:包含全部其它模板和Gradle項目共享的配置,即Android Gradle插件上的代碼庫和依賴。
二、launcherTemplate.gradle:包含如何構建Android應用的指令,例如:打包,簽名和APK分離等,具體取決於unityLibrary項目,它會輸出一個APK文件或App Bundle。
三、mainTemplate.gradle:包含如何把Unity構建爲庫的指令,它會輸出.aar格式文件,用戶能夠提供自定義模板來重寫Unity模板,包括編輯器設置。
四、libTemplate.gradle:與以前的工做方式相同。
將Unity做爲庫會改變Unity Android應用清單文件的使用方式。此前會有一個AndroidManifest.xml文件,用於給Android應用提供圖標、行爲、權限和其它設置。使用新系統後,咱們有二個清單文件,而不是一個:
一、LauncherManifest.xml:負責處理圖標、應用名稱、開始行爲及其目的、安裝位置、支持的屏幕大小和設置「isGame」。
二、LibraryManifest.xml:負責聲明Unity行爲、權限、Unity行爲使用的主題、VR模式、VR性能、使行爲不能夠調整大小、設置最大高寬比、應對配置改動、朝向、啓動模式、Android UI硬件加速、使用的功能,例如遊戲手柄或圖形API和槽口支持。該清單文件能夠經過在Plugins/Android文件夾中提供自定義AndroidManifest.xml文件來重寫。
(1)下載gradle插件,進行Unity開發。
(2)Unity3D打包切換到安卓平臺,選擇導出項目
將UnityProject導出到androidBuild文件夾,文件夾結構應以下所示:
(3)將Unity庫模塊添加到NativeAndroidApp,在Android Studio中打開NativeAndroidApp,
打開settings.gradle,在settings.gradle文件的末尾,咱們添加了指向unityLibrary模塊的新項目:
包括':unityLibrary' 項目(':unityLibrary' )。projectDir =新文件('.. \\ UnityProject \\ androidBuild \\ unityLibrary' )
打開build.gradle(模塊:應用),在依賴關係塊中添加如下內容
實施項目(':unityLibrary' )
打開build.gradle(項目:NativeAndroidApp),在allprojects {repositories {塊中添加如下內容
flatDir { dirs 「 $ {project(':unityLibrary')。projectDir} / libs」 }
後面就能夠看見unityLibrary模塊。
最後運行調試,打包就能夠了。
附上官網專家解答地址:
https://forum.unity.com/threads/integration-unity-as-a-library-in-native-android-app.685240/