最近博主在开发Unity在安卓上用蓝牙接收数据,数据形式比较特殊,属于高频低速的传输,所以在做这类蓝牙传输的时候效率比较低很容易断线,关于这个问题还在研究中,等研究完了补上博客,供小伙伴们参考。言归正传,Unity跟安卓的通信不外乎四点“Unity调用安卓静态方法”、“Unity调用安卓非静态方法”、“Unity调用安卓字段”“安卓调用Unity方法”。
Unity跟安卓Java代码通信的时候需要先构建jar包,需要用eclipse去打一个相应的jar包出来。此处附有eclipse下载地址:链接: http://pan.baidu.com/s/1boBa3cN 密码: h7dn 。
下载好后安装完成,里面自带AndroidSDK。网上好多导出Jar包的说明,在这里我们不再演示如何导出Jar包。
在Jar包中的Java代码:
package com.example.bluetooth.glovescontrol;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
public static int Add(int a,int b){
int c = a + b;
return c;
}
Unity调用此方法的代码:
public void StartDiscovery()
{
AndroidJavaClass jc = new AndroidJavaClass ("com.example.bluetooth.glovescontrol.MainActivity ");【注解2】
int c = jc.CallStatic<int> ("Add", 1,2);【注解3】
Debug.Log(c);
}
注解2:
“com.example.bluetooth.glovescontrol”为包名,“MainActivity ”为类名
注解3:
在调用有返回值的安卓方法的时候一定要用接收相应的类型的方法如上面所示的“CallStatic< int>”,尖括号内的是泛型,需要填写的是Java代码返回值的类型,如果不用接收返回值的方法去调用Java有返回值类型的方法是会报错的。相应的如果调用的方法没有返回值,则不需要带尖括号以及尖括号内容的内容。
因为很多逻辑需要在Java端处理,所以有很多情况下是需要调用JAVA的非静态方法,在Unity里是这么调用的:
public void StartDiscovery()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic("currentActivity");【注解4】
bool isReady = jo.Call<bool>("startDiscovery", true);【注解5】
}
注解4:
其中”com.unity3d.player.UnityPlayer”与”currentActivity”是固定写法,不用因为项目改变而做任何修改。
注解5:
在调用有返回值的安卓方法的时候一定要用接收相应的类型的方法如上面所示的“Call< bool>”,尖括号内的是泛型,需要填写的是Java代码返回值的类型,如果不用接收返回值的方法去调用Java有返回值类型的方法是会报错的。相应的如果调用的方法没有返回值,则不需要带尖括号以及尖括号内容的内容。
如果需要用到安卓调用Unity方法,则需要将安卓的classes.jar导入到eclipse中的bin文件夹下构建一下,并在Activity里继承“UnityPlayerActivity”,如下所示:
package com.gz.test;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
public void Add(String a){
【注解1】
UnityPlayer.UnitySendMessage("Text","ShowOnText",a);
}
}
注解1:
其中“UnityPlayer.UnitySendMessage”为Java调用Unity的方法,其各项参数代表如下所示:
“Text”为Unity中Hierarchy面板里面对象的名称;
“ShowOnText”为“Text”这个名称物体上所带脚本内的方法名;
“a”为传过去的参数,为String类型。
如果不需要安卓调用Unity则不需要继承UnityPlayerActivity ,且并不需要导入Classes.jar包,Unity直接调用方法即可。但是一般Unity跟安卓通信肯定是因为要调用安卓的一些功能,比如说震动、GPS、WiFi、蓝牙等等,此时一定要将eclipse工程中的”AndroidMainifest.xml”文件拖到Unity工程”Asstes/Plugins/Android”目录下,如果没有这个XML,如果仅仅做Unity-Android通信测试的时候,比如自己写一个简单的回调,去来回调是没有问题的,但是如果调用到安卓里面的功能了,则就会出问题。所以一定一定要在测试的时候也将这个文件放到Unity里!
"AndroidMainifest.xml"这个XML非常重要,他负责Unity在安卓机上显示相关,以及版本信息等内容,如果遇到打出的Unity打出的安卓包一旦改变横竖屏就崩溃的情况,则是这个XML中少了
android:configChanges="keyboardHidden|orientation|screenSize"
这样一句代码,将其添加在
...
...
android:configChanges="keyboardHidden|orientation|screenSize"//这个地方就可以
>
>