Unity对Java的使用
Jar包文件
Java Archive File 也就是所谓的Jar包,将多个java文件合并为一个文件,我们平时接触到的最多的文件形式。
AAR文件
Android Archive一个带有资源文件的第三方库文件结构。相比于Jar包除了含class文件,还包含resource文件,目前比较推荐的方式。
Java类文件
目前Unity2018+是支持直接编译Java文件,只需要将Java文件放在你的项目里即可。
Unity对Java的封装
AndroidJavaObject
AndroidJavaObject 是 java.lang.Object 的Unity 表示,可以理解为Java Object的化身。可以用过指定Object的来源来构造对应的Java实例。
AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String");
java.lang.String组成是由package和class或者interface组成,也就是 "java.lang.String"是package,而"String"是class。
如果要是获取类中的内部类或者内部接口应该用"$"作为标识。如:android.app.DatePickerDialog$OnDateSetListener。这里android.app是package,而"DatePickerDialog"是class,而"OnDateSetListener"是的内部接口。
主要的几个api的使用:
Call方法
调用实例对象Java 方法,这里不是静态方法。
CallStatic方法
调用实例对象静态方法。
Get方法
调用Java 实例对象的字段值。
GetStatic方法
调用Jave的静态字段值。
Set方法
设置Java实例对象的字段值
SetStatic方法
设置Jave的静态字段值。
Dispose方法
释放这个对象。
AndroidJavaClass
AndroidJavaClass 是 java.lang.Class 的Unity 表示,可以理解为Java Class的化身。继承自AndroidJavaObject。需要通过构造来指定这个Class的来源。
AndroidJavaClass javaStringClass = new AndroidJavaClass("java.lang.String");
AndroidJavaProxy
AndroidJavaProxy用于实现任何 Java 接口。与代理对象中的接口匹配的任何 Java vm 方法调用都将自动传递给 c# 实现。
class ExampleClass : MonoBehaviour
{
private static DateTime selectedDate = DateTime.Now;
class DateCallback : AndroidJavaProxy
{
/// <summary>
/// 实现来自android.app.DatePickerDialog的OnDateSetListener接口
/// </summary>
public DateCallback() : base("android.app.DatePickerDialog$OnDateSetListener") { }
/// <summary>
/// 接口的实现方法,这里一定要和Java接口对上
/// </summary>
/// <param name="view"></param>
/// <param name="year"></param>
/// <param name="monthOfYear"></param>
/// <param name="dayOfMonth"></param>
void onDateSet(AndroidJavaObject view, int year, int monthOfYear, int dayOfMonth)
{
selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
}
}
void OnGUI()
{
if (GUI.Button(new Rect(15, 15, 450, 75), string.Format("{0:yyyy-MM-dd}", selectedDate)))
{
//这里通过AndroidJavaClass获取UnityPlayer类并且获取currentActivity字段值,也就是当前我们的Activity,获取currentActivity这里返回的是AndroidJavaObject而不是AndroidJavaClass。
AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
//这里启动了在UI线程运行的实例,AndroidJavaRunnable等同于java.lang.Runnable,Runnable接口是线程辅助类,仅定义了一个方法run()方法,主要实现多线程
activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
//这里的代码等用于Java 代码:
//new DatePickerDialog(activity, new OnDateSetListener(), year, month, day).show();
new AndroidJavaObject("android.app.DatePickerDialog", activity, new DateCallback(), selectedDate.Year, selectedDate.Month - 1, selectedDate.Day).Call("show");
}));
}
}
}
AndroidJavaRunnable
AndroidJavaRunnable 是 java.lang.Runnable 对象的 Unity 表示。
请注意,这是一个委托。因此,每次将其作为参数传递给 Java 时,都会创建一个新的 java.lang.reflect.Proxy 对象。这意味着多次向 Java 传递 AndroidJavaRunnable 类型的变量时,每次均会生成一个具有不同哈希码值的新 Java 对象。这也意味着,对 Java 对象(创建为 AndroidJavaRunnable 变量的表示)调用
equals()
将始终返回 false,即使在与自身比较时也如此。
权限请求接口
用于权限的检查和申请
Permission
用于Android权限结构管理的类。
Unity官方文档连接不在过多详述使用https://docs.unity3d.com/cn/current/ScriptReference/Android.Permission.html
Android权限说明文档https://developer.android.google.cn/guide/topics/permissions/overview#permission-groups
Unity提供的预定义权限有限可以直接写入对应权限的常量值。比如说允许应用程序通过NFC执行I/O操作。权限我们可以直接使用:
Permission.RequestUserPermission("android.permission.NFC");
权限常量值文档https://developer.android.google.cn/reference/android/Manifest.permission