Unity-使用Unity2018.2直接编译.java

版权声明:转载请注明出处 https://blog.csdn.net/pgw00k/article/details/83542724

环境配置说明

Unity2018.2.2f1(64bit),Visual Studio Pro 2017

前言

从Unity2018.2版本以后,Unity已经可以直接编译 .cpp、.a、.java 文件作为 插件 在Unity程序中使用了,可以节省下使用VS、AS、XCode进行插件开发的导出调试的步骤,十分方便。

准备一个.java插件的源文件

我这里以发送安卓Toast消息为例,实现一个在Unity中发送屏幕Toast消息。
那么先编写一个.java的源码:

package com.unity.androidplugin;

import android.content.Context;
import android.os.Environment;
import android.widget.Toast;

public class AndroidToast {
	//设置显示页面,没有这个Toast不会显示
    public static Context ShowContext = null;

    public static void SetContext(Context con) {
        ShowContext = con;
    }

    public static void ShowToast(String info, Context con) {
        Toast.makeText(con, info, Toast.LENGTH_LONG).show();
    }

    public static void ShowToast(String info) {
        Toast.makeText(ShowContext, info, Toast.LENGTH_LONG).show();
    }

}

添加到Unity工程中

路径的话默认使用 Asset/Plugins/Android ,似乎添加子目录也可以,不过尚未测试,看到网上说是可以的,总而言之要在 Plugins/Android 路径下。

在Unity中使用

那么前期准备工作完成了,那么要如何在Unity中调用呢,这里Unity也已经为我们准备了相当方便的 AndroidJavaClassAndroidJavaObject 这两个类,相信之前做过的Unity和安卓交互的同学应该相当熟悉了,那么以下是方法。
首先,先看我们.java源文件中,我声明的包名和类名:

package com.unity.androidplugin;
public class AndroidToast

相信有过安卓开发的朋友已经懂了,其实我们需要的真正类名是 包名+类名,即 com.unity.androidplugin.AndroidToast,知道这个就简单了,上C#代码:

            AndroidJavaClass jc = new AndroidJavaClass("com.unity.androidplugin.AndroidToast");
            AndroidJavaClass jc_UnityDefault = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo_UnityActivity = jc_UnityDefault.GetStatic<AndroidJavaObject>("currentActivity");
            jc.CallStatic("SetContext",jo_UnityActivity);
            jc.CallStatic("ShowToast", "Unity Call");

需要注意的就是,为了能让Toast显示出来,我们必须有一个显示容器,在此即为Activity,所以我先调用了 SetContext 函数设置了Unity默认的Activity为容器,这个具体原理可以看看其他Unity和安卓交互的文章。

另外,一定要注意 调用方法实际方法参数 还有 返回值 的一一对应,如上例所示,java方法为static标记的,则必须用CallStatic调用,否则无效,这个推测和堆栈有关。
其次,java方法有返回函数的也必须使用 Call<Type> 去调用,否则无效,这个推测和java机制有关,大概是必须根据返回值类型和参数去查找对应的函数反射,举例,java中有一个 public boolean ShowToastOK(String info) 的函数,则必须使用 jc.Call<bool>("ShowToastOK","Data") 这样的形式去调用。

示例

Java文件
C#文件

猜你喜欢

转载自blog.csdn.net/pgw00k/article/details/83542724