Unity2018.2.2f1(64bit),Visual Studio Pro 2017
从Unity2018.2版本以后,Unity已经可以直接编译 .cpp、.a、.java 文件作为 插件 在Unity程序中使用了,可以节省下使用VS、AS、XCode进行插件开发的导出调试的步骤,十分方便。
我这里以发送安卓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();
}
}
路径的话默认使用 Asset/Plugins/Android
,似乎添加子目录也可以,不过尚未测试,看到网上说是可以的,总而言之要在 Plugins/Android
路径下。
那么前期准备工作完成了,那么要如何在Unity中调用呢,这里Unity也已经为我们准备了相当方便的 AndroidJavaClass
和 AndroidJavaObject
这两个类,相信之前做过的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")
这样的形式去调用。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删