栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Unity安卓开发][使用篇]Unity&Android交互基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Unity安卓开发][使用篇]Unity&Android交互基础

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中文文档

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中文文档

AndroidJavaClass 是 java.lang.Class 的Unity 表示,可以理解为Java Class的化身。继承自AndroidJavaObject。需要通过构造来指定这个Class的来源。

AndroidJavaClass javaStringClass = new AndroidJavaClass("java.lang.String");
AndroidJavaProxy

AndroidJavaProxy中文文档

AndroidJavaProxy用于实现任何 Java 接口。与代理对象中的接口匹配的任何 Java vm 方法调用都将自动传递给 c# 实现。 

class ExampleClass : MonoBehaviour
{
    private static DateTime selectedDate = DateTime.Now;

    class DateCallback : AndroidJavaProxy
    {
        /// 
        /// 实现来自android.app.DatePickerDialog的OnDateSetListener接口
        /// 
        public DateCallback() : base("android.app.DatePickerDialog$OnDateSetListener") { }
        /// 
        /// 接口的实现方法,这里一定要和Java接口对上
        /// 
        /// 
        /// 
        /// 
        /// 
        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("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 表示。

AndroidJavaRunnable中文文档

请注意,这是一个委托。因此,每次将其作为参数传递给 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/927222.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号