Unity3D与Android之间的通信
1.首先创建一个Android工程,,设置AndroidAPI最小为2.3,
然后next,勾选Make this project as library选项。然后一直next直到finish。
2.将Unity3D的classes.jar包导入到Android工程中。
2.1在Unity安装目录下搜索classes.jar 会出现两个classes.jar,随便选择一个(两个中的任意一个),将其copy到桌面。
2.2将classes.jar包导入到Android工程中
选中工程,右键——》Build Path——》Add External Archives:
选择classes.jar包:
点击打开按钮,将classes.jar导入到Android工程中。导入后在Android工程中,Referenced Libraries会有我们导入的jar包。
3.引入包
引入com.unity3d.player.UnityPlayer和 com.unity3d.player.UnityPlayerActivity两个包,并替换MainActivity继承的基类为UnityPlayerActivity,删除多余的代码。
packagecom.example.test;
importandroid.os.Bundle;
importcom.unity3d.player.UnityPlayer;
importcom.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
4.然后添加我们自己的代码:
packagecom.example.test;
importandroid.os.Bundle;
importcom.unity3d.player.UnityPlayer;
importcom.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void Test1 () {
//这里的UnityPlayer.UnitySendMessage();是Android工程调用Unity中的方法
//其中参数1是调用Unity中的游戏对象
//参数2是调用游戏对象上挂载脚本中的方法名
//参数3是方法的参数
UnityPlayer.UnitySendMessage("Cube","BackCall", "Android");//即调用Cube游戏对象上的脚本中的BackCall方法,参数是Android
}
// 返回一个string类型
public String Test2 () {
return"Test";
}
}
5.创建另一个package:
命名为com.example.test2:
创建一个新类:
写入一下代码,注意这个类中的方法必须是static的:
packagecom.example.test2;
public class Test2 {
//必须是static类型的
public static int Max (int x,int y) {
return x > y ? x : y;
}
}
6.将Android工程中的res文件夹、libs文件夹、以及AndroidManifest.xml文件copy到桌面上
将android工程中的src文件夹导出为jar包:
右键——》Export
选择Java——》JAR file:
然后next:
JAR file:名字随便取,保存到桌面,点击Finish。
7.然后将桌面上的res文件夹、AndroidManifest.xml、libs文件夹以及上步中导出的jar包导入到Unity中,注意一定是Unity中Assets目录下的Plugins文件夹下的Android文件夹中。
8.然后创建在Unity中调用Android中的方法。注意第四步中的Test1方法。Unity中已经创建了Cube游戏对象,在Cube游戏对象上挂载一个一个脚本组件,该脚本组件中有一个BackCall的方法。
using UnityEngine;
using System.Collections;
public classTest :MonoBehaviour {
privatestringinfo ="Name";
voidOnGUI()
{
if(GUILayout.Button("Test1"))
{
//固定写法,调用Android中的方法。
AndroidJavaClass jc =new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
//调用Test1方法
jo.Call("Test1");
}
if(GUILayout.Button("Test2"))
{
AndroidJavaClass jc =new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
//调用Test2方法,尖括号中是Test2方法的返回值
info = jo.Call<string>("Test2");
}
if(GUILayout.Button("Max"))
{
//调用com.example.test2包下的Test2类中的方法Max方法
AndroidJavaClass jc =new AndroidJavaClass("com.exmaple.test2.Test2");
//因为Max方法是Static的,所以调用CallStatic方法,参数1是Android中的方法名,参数2是方法的参数,返回值是Int型,所以尖括号中是int
info = jc.CallStatic<int>("Max",new object[]{1,2})+"";
}
GUILayout.Box(info);
}
public void BackCall(string str)
{
info= str;
}
}
9.设置Bundle Identifier
File——》Build Settings——》PlayerSettings:
这里的BundleIdentifier一定要和AndroidManifest.xml中的Package一样:
如果不一样,程序就会挂掉,而且在Unity中设置的横屏竖屏也一定要和AndroidManifest.xml中设置的一样,否则也会导致程序挂掉。
10.打包成APK