Unity和Android交互
一、前言
Unity做安卓項目時,經常會碰到接安卓sdk的問題,需要獲取Android權限,或者調用sdk中寫好的Java代碼;
1.前期准備:
1)配置java環境;
下載jdk,同時配置環境變量;
2)下載AndroidSDK;


以下查看sdk,jdk,ndk安裝是否正常;

3)下載AndroidStudio;
二、安卓打包成Jar/arr
1.操作流程
1.android studio中創Empty項目,項目名和sdk版本設置與Unity一致;


2.修改項目build.gradle中id從application 改為library——同時注釋defaultConfig中applicationID(或者重新創建Moudle);

3.導入unity的classes.jar在lib中,右鍵mark as library;
classes.jar分為Release和Mono版本;

4.src-java-com...中導入UnityPlayerActivity類;並創建新方法類繼承UnityPlayerActivity;

5.在新的java類中寫需要調用的方法;
6.在gradle中添加
task makeJar(type: Copy) {
delete 'build/libs/mysdk.jar'
from('build/intermediates/intermediate-jars/release') //從該地址復制
into('build/libs/') //復制到該地址
include('classes.jar') //包含文件
rename ('classes.jar', 'mysdk.jar') //重命名
}
makeJar.dependsOn(build)
7.在終端Terminal中輸入gradlew makejar;

8.在build/intermediates/arr_main_jar/debug中找到classes.jar(打包好的插件)放進unity中使用 ;
2.注意事項
1.終端Terminal失敗,可能是沒有java環境,先配置java環境(下載jdk);
2.unity高版本之后將classes.jar和UnityplayerActivity.jar分開了,分別在Unity目錄中:
Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes;
Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player;
3.打包時候的包名和項目名一致;
4.打包完成必須把untiyplayeractivity和classes.jar刪除(用壓縮文件形式打開),或者添加依賴時使用compileonly;
三、Unity導出Android項目
選擇安卓平台,勾選export導出;

四、Unity和Java的互相調用
1.Java調用Unity
UnityPlayer.UnitySendMessage(對象名, 方法名, 參數)API的使用;
對象名:Unity場景中實例的物體名=Hierarchy面板顯示的物體名(注意clone);
方法名:該物體上任意腳本中的方法名;
參數:String,只能一個參數,但是String嘛,自己拆分;
2.Unity調用Java
AndroidJavaClass 和 AndroidJavaObject 類的使用;
Unity段只能調用在java中UnityPlayerActivity類的方法;
兩種調用方式:
1)靜態
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayerActivity"))
{
stirng str = jc.CallStatic<string>("ShowStr",str1,str2);
}
2)非靜態
前提在UnityPlayerActivity類中有對應GetInstance方法,如下:
private static UnityPlayerActivity instance;
public static UnityPlayerActivity GetInstance() {
if (instance == null)
instance =new UnityPlayerActivity();
return instance;
}
instance在onCreate中賦值this;
調用端:
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayerActivity"))
{
using (AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("GetInstance"))
{
stirng str = jo.CallStatic<string>("ShowStr",str1,str2);
}
}
重要API:
| Call | 調用Android代碼中的非靜態方法 |
|---|---|
| CallStatic | 調用Android代碼中的靜態方法 |
| Dispose | IDisposable 回調 |
| Get | 獲取Android代碼中的非靜態字段 |
| GetRawClass | 獲取一個指向Java class的原始引用 |
| GetRawObject | 獲取一個指向Java object的原始引用 |
| GetStatic | 獲取Android代碼中的靜態字段 |
| Set | 設置Android代碼中的非靜態字段 |
| SetStatic | 設置Android代碼中的靜態字段 |
