邢臺(tái)做網(wǎng)站的價(jià)格成都搜索優(yōu)化排名公司
1 Unity 發(fā)布 apk
1.1 安裝?Android Build Support
? ? ? ? 在 Unity Hub 中打開添加模塊窗口,操作如下。
????????選擇 Android Build Support 安裝,如下(筆者這里已安裝過)。?
? ? ? ? ?創(chuàng)建一個(gè) Unity 項(xiàng)目,依次點(diǎn)擊【File→Build Settings→Android→Switch Platform】,配置如下。
????????依次點(diǎn)擊【Edit→Preferences→External Tools】打開 JDK、SDK、NDK、Gradle 配置頁面,配置如下(勾選默認(rèn)配置就行,也可以選擇已安裝的 JDK、SDK、NDK、Gradle路徑)。
1.2 配置密鑰
????????依次點(diǎn)擊【Edit→Project Settings→Player→Keystore Manager】(也可以從【File→Build Settings→Player Settings→Keystore Manager】中進(jìn)入),操作如下。
????????打開?Keystore Manager 后, 依次點(diǎn)擊【Create New→Anywhere】,選擇一個(gè)目錄保存密鑰庫文件,筆者保存在項(xiàng)目目錄下面的【Keystore/user.keystore】中。
????????接著設(shè)置密碼和別名,其他選項(xiàng)不是必設(shè)項(xiàng)。
????????Add Key 后,會(huì)彈出“是否將創(chuàng)建的密鑰庫作為項(xiàng)目的密鑰庫”彈窗,點(diǎn)擊 yes 確認(rèn)。
? ? ? ? ?設(shè)置密鑰后,回到 Project Settings 頁面,顯示如下。
? ? ? ? 創(chuàng)建密鑰時(shí),也可以通過以下命令創(chuàng)建。
keytool -genkey -keyalg RSA -alias key_name -keystore keystore_name -validity day_time
keytool -genkey -keyalg RSA -alias first -keystore user -validity 36500
1.3 打包 apk
????????依次點(diǎn)擊【File→Build Settings→Player Settings】,配置公司名、項(xiàng)目名、版本號(hào)等信息,如下。
? ? ? ? 在 Other Settings 中配置包名、Android SDK 的最小 API 版本、目標(biāo) API 版本等信息,如下。?
? ? ? ? 關(guān)閉 Player Settings,在 Build Settings 頁面點(diǎn)擊底部的 Build,構(gòu)建 apk。?
1.4 案例
? ? ? ? 新建一個(gè) Unity 項(xiàng)目,修改 Game 頁面的屏幕尺寸,如下。
? ? ? ? 搭建頁面如下。
????????給 Button 按鈕添加腳本,如下。
????????Test.cs
using UnityEngine;
using UnityEngine.UI;public class Test : MonoBehaviour {private Button button;private void Start() {button = GetComponent<Button>();button.onClick.AddListener(OnClick);}private void OnClick() {Debug.Log("Test-OnClick");}
}
? ? ? ? 編譯 apk 后,打開命令行窗口,輸入以下命令安裝到手機(jī)上。
adb instll -r -t -d Test.apk
? ? ? ? 運(yùn)行 apk 后,在命令行窗口中通過以下命令查看日志。
adb logcat | findstr "Test-OnClick"
? ? ? ? ?點(diǎn)擊 Button 按鈕,打印日志如下。
2 Unity 調(diào)?Android 的邏輯
2.1? Unity 項(xiàng)目中部署 Android 代碼
????????1)拷貝 Java 源碼到 Unity 項(xiàng)目
????????可以將 Android 項(xiàng)目中 Java 代碼拷貝到 Unity 項(xiàng)目中?Assets 子目錄下,如下,接著就可以通過?AndroidJavaClass 或 AndroidJavaObject 訪問 Java 代碼了。
? ? ? ? 2)打包 Jar 到 Unity 項(xiàng)目
????????可以將 Android 項(xiàng)目打包為 Jar,再將 Jar 拷貝到 Unity 項(xiàng)目中?Assets 子目錄下,接著就可以通過?AndroidJavaClass 或 AndroidJavaObject 訪問 Java 代碼了。
????????修改 Android 項(xiàng)目中 Module 的 build.gradle 文件,如下,主要將 id 由 'com.android.application'?修改為 'com.android.library',刪除 android { } 模塊中的 defaultConfig、buildTypes、compileOptions 子模塊。
????????build.gradle
plugins {id 'com.android.library'
}android {namespace 'com.zhyan8.test'compileSdk 33
}dependencies {implementation 'androidx.appcompat:appcompat:1.6.1'implementation 'com.google.android.material:material:1.8.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.5'androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
????????修改 build.gradle 文件后,需要點(diǎn)擊右上角的 Sync Now 同步,接著按以下步驟編譯項(xiàng)目。
????????編譯結(jié)束后,在 Module 的【build\intermediates\aar_main_jar\debug】目錄下生成打包的 classes.jar。
? ? ? ? 預(yù)覽 classes.jar 文件如下。
2.2 AndroidJavaObject 和 AndroidJavaClass
? ? ? ? AndroidJavaObject 和?AndroidJavaClass 是 Unity 提供的調(diào)用 Java 代碼的 2 個(gè)類,AndroidJavaClass 繼承 AndroidJavaObject,它們只有構(gòu)造方法有一點(diǎn)差異,沒有其他的差異,因此,本節(jié)只介紹?AndroidJavaObject。
? ? ? ? 1)Set 和 Get 屬性
? ? ? ? JavaTest.java
package com.zhyan8.test;public class JavaTest {public static int intVal = 0;private String strVal = "abc";
}
? ? ? ? UnityTest.cs
using UnityEngine;public class UnityTest : MonoBehaviour {private void Start() {AndroidJavaObject javaObject = new AndroidJavaObject("com.zhyan8.test.JavaTest");// 靜態(tài)屬性Set/GetjavaObject.SetStatic<int>("intVal", 123);int intVal = javaObject.GetStatic<int>("intVal");Debug.Log("UnityTest, intVal=" + intVal); // 打印: UnityTest, intVal=123// 非靜態(tài)屬性Set/GetjavaObject.Set<string>("strVal", "xyz");string strVal = javaObject.Get<string>("strVal");Debug.Log("UnityTest, strVal=" + strVal); // 打印: UnityTest, strVal=xyz}
}
? ? ? ? 說明:對(duì)于 JavaTest 的 private 屬性,AndroidJavaObject?也可以訪問到。
? ? ? ? 2)調(diào)用方法
? ? ? ? JavaTest.java
package com.zhyan8.test;import android.util.Log;public class JavaTest {public static void fun1() {Log.d("JavaTest", "fun1"); // 打印: JavaTest: fun1}private int fun2() {Log.d("JavaTest", "fun2"); // 打印: JavaTest: fun2return 123;}public String fun3(int value) {Log.d("JavaTest", "fun3, value=" + value); // 打印: JavaTest: fun3, value=235return "Call fun3";}public String fun4(String value1, int value2) {Log.d("JavaTest", "fun4, value1=" + value1 + ", value2=" + value2); // 打印: JavaTest: fun4, value1=abc, value2=123return value1 + value2;}
}
????????說明:對(duì)于 JavaTest 的 private 方法,AndroidJavaObject?也可以訪問到。??
????????UnityTest.cs
using UnityEngine;public class UnityTest : MonoBehaviour {private void Start() {AndroidJavaObject javaObject = new AndroidJavaObject("com.zhyan8.test.JavaTest");// 靜態(tài)方法javaObject.CallStatic("fun1");// 非靜態(tài)無參方法int val2 = javaObject.Call<int>("fun2");Debug.Log("UnityTest, val2=" + val2); // 打印: UnityTest, val2=123// 非靜單參方法string val3 = javaObject.Call<string>("fun3", 235);Debug.Log("UnityTest, val3=" + val3); // 打印: UnityTest, val3=Call fun3// 非靜雙參方法string val4 = javaObject.Call<string>("fun4", "abc", 123);Debug.Log("UnityTest, val4=" + val4); // 打印: UnityTest, val4=abc123}
}
? ? ? ? 運(yùn)行程序后,打印日志如下。
2.3 Unity 調(diào)用 Android 的 Toast
????????UnityTest.cs
using UnityEngine;
using UnityEngine.UI;public class UnityTest : MonoBehaviour {private void Start() {GetComponent<Button>().onClick.AddListener(() => {Toast("Clicked", 1);});}// 調(diào)用Android的代碼: Toast.makeText(context, msg, durationFlag).show();private void Toast(string msg, int durationFlag) { // durationFlag: Toast.LENGTH_SHORT=0, Toast.LENGTH_LONG=1AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject>("makeText", currentActivity, msg, durationFlag);toast.Call("show");}
}
????????UnityPlayer 是 Unity 引擎提供的 Java 類。
3 Android 調(diào) Unity 的邏輯
3.1 Unity 打包為 Android 項(xiàng)目
? ? ? ? 在 Build Settings 頁面勾選 Export Project 后,點(diǎn)擊 Export 按鈕,如下。
? ? ? ? 構(gòu)建成功后,Unity 項(xiàng)目將會(huì)被打包成一個(gè) Android 項(xiàng)目,我們可以使用 Android Studio 打開生成的 Android 項(xiàng)目。
D:\Program Files\Unity Hub\Unity\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar