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 文件

