首先講導出Jar包,在以前都是用這種方法,但是現在官方不推薦使用此方法,官方推薦導出Aar包
(1)首先建立一個Android空工程
注意:這裡選擇API 16,因為Unity支援的最低是API 16
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL0kkeORTT610dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4kzN2UzN0IjM3IjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(2)建立一個新的子產品
依次選擇,File > New > New Module,然後選擇Android Library
保證最小API等級為16
(3)建立一個Activity
建立好後,預設生成了一個xml布局,删除掉,我們的布局是unity控制的
(4)切換到Project下,導入Unity支援包
Unity支援包在Unity安裝目錄下:G:\unity2017.1.1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
複制以上目錄下的classes.jar,粘貼到libs檔案夾下
粘貼進去後,把這個包添加到目前子產品中去
(4)切回到Android下,打開AndroidManifest.xml,這相當于一個Android清單,告訴Android我們的程式都有哪些東西,每個頁面都是幹嘛的,還能配置一些權限。要擴充Unity的MainActivity,先改這個
修改方法:将app檔案夾下的AndroidManifest.xml的這部分複制過來,然後删掉紅色報錯部分
修改label,以後安裝到手機就是這個名字
辨別Activity的類型是Unity用的,加上下面的代碼:
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
修改MainActivity.java
(5) 提供一個方法給Unity,這裡提供了一個簡單的加法運算
在java中寫好這個方法後,要提供給Unity使用,先做出這個子產品
切換到Project,依次打開testlibrary > build > intermediates > bundles(老版本是這個,新版本是packaged-classes) > debug > libs下的jar包
删除這個包,将debug目錄下與libs檔案夾同層的包拷貝進來
把這個libs檔案夾複制到桌面備用,然後把與libs檔案夾同層的res檔案夾也複制到桌面備用。但是新的版本的res檔案夾是沒有的,找了下,也是在檔案夾packaged-classes下面
然後把這個xml複制到桌面備用
打開這個xml,修改這個名字為自己需要的名字,注意全部小寫
(6) 在Unity中使用這個方法
建立好工程,設定為Android打包,設定包名,包名為上面xml中我們修改的那個
建立檔案夾Plugins及其子檔案夾Android(注意:這兩個檔案夾名字是固定的),将複制到桌面上的3個東西拷貝進去
建立一個腳本挂在相機上,在這裡我們使用Unity來調用Android那邊提供的add方法,然後把結果顯示在Text元件上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
public Text text;
void Start () {
// 獲得位于com.unity3d.player包下的UnityPlayer類
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// 獲得jc所代表的類下的currentActivity對象
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 調用Android提供的Android方法
// 使用Call調用,<>表示有傳回值,沒有傳回值則不需要這個
text.text = jo.Call<int>("add", 2, 3).ToString();
}
}
資料線連接配接手機,打包,可以看到結果
(7)上面是在Android中定義了一個方法,在Unity中調用。現在我們在Unity中定義一個方法,在Android中調用。
定義一個簡單的方法,改變字型的顔色。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour {
public Text text;
void Start () {
// 獲得位于com.unity3d.player包下的UnityPlayer類
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// 獲得jc所代表的類下的currentActivity對象
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 調用Android提供的Android方法
// 使用Call調用,<>表示有傳回值,沒有傳回值則不需要這個
text.text = jo.Call<int>("add", 2, 3).ToString();
}
public void ChangeColor()
{
text.color = Color.red;
}
}
在Android中調用,使用方法:
UnityPlayer.UnitySendMessage("Main Camera","ChangeColor","");
第一個參數表示腳本所挂載的位置,第二個參數表示函數名,第三個參數表示參數
重新Build,導出libs和res檔案夾,替換Unity下對應檔案夾,然後重新打包運作,結果: