Unity——與Android(Java)交互


Unity和Android交互

一、前言

Unity做安卓項目時,經常會碰到接安卓sdk的問題,需要獲取Android權限,或者調用sdk中寫好的Java代碼;

1.前期准備:

1)配置java環境;

下載jdk,同時配置環境變量;

2)下載AndroidSDK;

image-20210929002501590

image-20210929002523089

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

image-20210929002946051

3)下載AndroidStudio;

二、安卓打包成Jar/arr

1.操作流程

1.android studio中創Empty項目,項目名和sdk版本設置與Unity一致;

image-20210929162349244

image-20210929162447608

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

image-20210929162700203

3.導入unity的classes.jar在lib中,右鍵mark as library;

classes.jar分為Release和Mono版本;

image-20210929162857106

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

image-20210929163021419

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;

image-20210929163209050

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導出;

image-20210929163429077

四、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代碼中的靜態字段


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM