Unity与Android交互之Unity调用java方法
发表于2018-12-05
今天给大家介绍下unity与android的交互中unity调用java函数。可以实现的方法主要有两种,但这篇只给大家详细介绍下第一种。
1.将uinty项目导成android工程后二次开发
2.使用eclipse新建一个项目,编写一个jar文件导入到unity中使用
为什么要使用第一种呢,因为有很多有计费点的游戏会接介入很多不通的渠道,不同的渠道就有不同的接法,如果要使用第二种就会很麻烦,用第一种就可以打包出一个android工程无限的复制、复制。
Unity调用java方法如下
一、创建一个unity工程
在这工程里我就简单了拖出来了两个button 和一个text文本
并且写了一个C#脚本挂在了摄像机上
代码如下:
using UnityEngine; using System.Collections; using UnityEngine.UI; public class Test : MonoBehaviour { //定义一个int 变量用来接收java传过来的参数 int index = 0; public Text mtext; /** * button1的点击事件 我是直接将方法拖到按钮上 * 这个方法用来调用java中的makePauseUnity方法 并接收从java中传回来的int型数据,并显示在mtext文本上 */ public void OnClick1() { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); index = jo.Call<int>("makePauseUnity"); mtext.text = index.ToString(); } /** * button2的点击事件 * 这个方法用来调用java中的ShowMessage方法 并向改放发传递一个string类型的数据"Unity" * */ public void OnClick2() { print("OnClick1 被执行到了"); AndroidJavaClass jc = new AndroidJavaClass("com.android.unityToandroid.UnityPlayerActivity"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("m_instance"); jo.Call("ShowMessage","Unity"); } }
其中OnClick1()函数是网上常见的写法,
里面的 “com.unity3d.player.UnityPlayer“与”currentActivity“是固定的写法。
index = jo.Call<int>("makePauseUnity");
jo.call 参数代表的是java对象的函数名字。< >指的是java函数返回来的类型。
OnClick2()函数是我在巧合的情况下写出来的 基本上与OnClick1相同,但是
new AndroidJavaClass("com.android.unityToandroid.UnityPlayerActivity");
里面的 com.android.unityToandroid是你导android工程定义的包名,UnityPlayerActivity 是你要调用java方法所在的类名。
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("m_instance");
m_instance是UnityPlayerActivity类中自己声明
这种写法一定要注意 包名,类型相同,声明的m_instance一定要有。
jo.Call("ShowMessage","Unity");
里面的第一个参数是 java中对应的方法名,“Unity”代码向这个函数传递一个参数。
好了编程大概就是这样,接下来进行打包
二、打包Android工程
1、File->Build Setting 后弹出
- 选择android平台
- 点击player settings
- 更改包名 很重要
- 勾选goole android project 一定要勾选 否则导出来的是一个apk文件
- 点击Export 静静等待。
2、导出后是这样的一个文件夹
三、eclipse导入工程并开发
1、打开eclipse File->Import 后弹出
2、选择 Android 然后 next
3、点击Browse…选择你刚刚导出的项目 最后点击结束
现在就导入结束了
接下来到了最重要的编程环节,我们可以看见报下面有三个脚本到底要写哪一个呢?
我们可以从AndroidManifest.xml 文件中看到
找到了脚本 接下来开始代码,上代码
package com.andrtoid.unityToandroid; import com.unity3d.player.*; public class UnityPlayerActivity extends Activity { protected UnityPlayer mUnityPlayer;referenced from native code private int index; public static UnityPlayerActivity m_instance=null; // Setup activity layout @Override protected void onCreate (Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy mUnityPlayer = new UnityPlayer(this); setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); m_instance=this; } //Unity调用的ShowMessage方法并传递参数 str public void ShowMessage(final String str){ Log.i("调用信息", "我被onclik2调用了"); runOnUiThread(new Runnable() { @Override public void run() { Show(str); } }); } public void Show(String str){ Toast.makeText(this, str+"成功调用了android中的函数", Toast.LENGTH_LONG).show(); } //Unity调用的makePauseUnity方法并返回index public int makePauseUnity(){ Log.i("调用信息","我被onclick1调用了"); index++; return index; } }
在这里我只粘贴了重要的代码。
其中ShowMessage() makePauseUnity() 对应了unity的jo.call 里的参数,这里需要注意的是,如果unity有参数传过来,在java中必须要写上去,有一个就要写几个,否则出错的。
编程的工作就这样结束了 接下来我们来检验下我们的成果。
按钮一实现的功能
每一次点击都能看见数字加一
按钮二的功能
在这里需要注意的是 如果我们 Toast 直接写在ShowMassage方法中 会不显示的,这也困恼了我很久的时间总以为 那地方写错没有成功,最后看了log文件才知道问题。要调用Toast 需要在runOnUiThread 线程中。
在看看Log 文件