Unity与Android交互之Unity调用java方法

发表于2018-12-05
评论0 6.8k浏览
今天给大家介绍下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 后弹出

  1. 选择android平台
  2. 点击player settings
  3. 更改包名 很重要
  4. 勾选goole android project 一定要勾选 否则导出来的是一个apk文件
  5. 点击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 文件

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引