AndroidStudio3.5.2打包成AAR與Unity2017.4.37c2互相調用

基於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即是類中的變量,最後放個成功運行的效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章