Unity3D和移動端(Android)交互

Unity3D自己就是一款跨平臺開發軟件,兼容性高,可是每每在開發移動端過程當中,須要與Android原生態進行混合開發,這就包括兩中形式:android

  • 以Unity3D爲主導開發
  • 以Android爲主導開發
  1. Unity3D爲主導,調用Android原生態代碼
    (1)首先咱們使用AndroidStudio建立一個普通的Android工程,注意要記着PackageName的名稱;

    注意:若是工程格式不對,要打開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
Unity3D和移動端(Android)交互
Unity3D和移動端(Android)交互
(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" />

最終以下:
Unity3D和移動端(Android)交互
(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文件。
Unity3D和移動端(Android)交互性能

(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了。

  1. 以Android爲主導開發,從Unity 2019.3.a2開始,咱們經過把Unity運行時組件和內容集成到原平生臺項目,在原生應用中將Unity做爲庫使用

    注意:
    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項目更加簡單。
Unity3D和移動端(Android)交互


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打包切換到安卓平臺,選擇導出項目
Unity3D和移動端(Android)交互
將UnityProject導出到androidBuild文件夾,文件夾結構應以下所示:
Unity3D和移動端(Android)交互
(3)將Unity庫模塊添加到NativeAndroidApp,在Android Studio中打開NativeAndroidApp,
打開settings.gradle,在settings.gradle文件的末尾,咱們添加了指向unityLibrary模塊的新項目:

包括':unityLibrary'
項目(':unityLibrary' )。projectDir =新文件('.. \\ UnityProject \\ androidBuild \\ unityLibrary' )

Unity3D和移動端(Android)交互
打開build.gradle(模塊:應用),在依賴關係塊中添加如下內容

實施項目(':unityLibrary' )

Unity3D和移動端(Android)交互
打開build.gradle(項目:NativeAndroidApp),在allprojects {repositories {塊中添加如下內容

flatDir {
   dirs 「 $ {project(':unityLibrary')。projectDir} / libs」
}

Unity3D和移動端(Android)交互
後面就能夠看見unityLibrary模塊。
最後運行調試,打包就能夠了。
附上官網專家解答地址:
https://forum.unity.com/threads/integration-unity-as-a-library-in-native-android-app.685240/

相關文章
相關標籤/搜索