基於Unity2017.4.37c2,AndroidStudio3.5.2,最小安卓版本23,目標版本26
首先創建一個安卓項目,項目名和包名隨意取,如果只是把某個功能嵌入到Unity裏,不需要用到這兩個,項目類型選擇Empty Activity
建立完項目之後,要等待AndroidStudio加載完依賴項,纔可以創建Module,在全部加載完成之前,New-Module按鈕爲灰色
等待加載完成之後,我們點擊建立一個Module
類型選擇AndroidLibraly,此處名字要記住
建立完成之後,可以在左側Project視窗中看見,如果找不到對應文件夾,可以把上方改成Project
之後我們點擊上方菜單欄File-Project Structure按鈕
在Dependencies菜單中將工程自帶的app文件夾刪掉
從Unity安裝目錄Unity\2017.4.37c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes下,把Classes.jar包拖入到lib文件夾下
再次進入File-Project Structure-Dependencies界面,點擊加號,將lib下的Classes.jar添加進去
之後,我們在src-main-java-com.cuihuo.test2unity文件夾下右鍵-New-JavaClass創建一個類
鍵入以下代碼,此處要特別注意,android.app.Fragment已經被棄用,如果自己手動輸入extends Fragment的話,AndroidStudio會自動引用androidx.fragment.app.Fragment,此時add(Instance,"Test2Unity")語句會報錯,將Instance改成new android.app.Fragment()即可解決報錯,但是能不能與Unity進行交互我沒有測試過,所以此處需要我們手動引用android.app.Fragement;
package com.cuihuo.test2unity;
import android.app.Fragment;
import com.unity3d.player.UnityPlayer;
public class test2Unity extends Fragment {
public static test2Unity Instance;
public static void Start()
{
Instance=new test2Unity();
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance,"Test2Unity").commit();
}
public void CallBack(String _obj, String _fun, String _val){
UnityPlayer.UnitySendMessage(_obj, _fun, "Android Callback " + _val);
}
}
之後點開test2unity文件夾下的build.gradle文件
在最後面加上以下代碼
//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}
//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/bundles/default/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'test2unity.jar')
}
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
exportJar.dependsOn(deleteOldJar, build)
此處是參考這篇博客,經過實際測試之後,打包出來並沒有release文件夾,但是第二個方法代碼不可刪除,刪除會無法導出jar包,第三個方法是解決使用過時api導致的導出報錯問題,參考這篇博客
輸入完成之後,我們在右側Gradle界面,選中對應文件,右鍵-Refresh Gradle project
運行完成之後,原文件下方會出現一個單獨的對應文件,選中新創建出來的test2unity-test2unity-Tasks-other-ExprotJar
打包完成之後不會出現Releas文件夾,而是在對應的項目目錄下的build-outputs-aar文件夾下,其中releas即是我們要使用的安卓包
將其放入我們的Unity項目中,新建一個Text
新建一個Test.cs,鍵入以下代碼,隨便掛在遊戲內哪個物體上,將Text拖入對應的變量裏
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
public Text txt;
// Use this for initialization
void Start () {
AndroidJavaClass ajc= new AndroidJavaClass("com.cuihuo.test2unity.test2Unity");
ajc.CallStatic("Start");
AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("Instance");
ajo.Call("CallBack",this.gameObject.name,"SetText","測試");
}
// Update is called once per frame
void Update () {
}
public void SetText(string str)
{
txt.text = str;
}
}
這其中有幾個需要注意的地方,AndroidJavaClass中的String路徑,是由包名及類名組成的,要特別注意大小寫,其中包名在一開始我們寫的那段代碼中可以看到Package com.cuihuo.test2unity,類名就是我們新建腳本時所命名的,AndroidJavaObject即是類中的變量,最後放個成功運行的效果