Unity3d与Android通信

因公司产品需要用到unity3d,鄙人是android,无赖,学吧,下面记录一下成果
先交代几点
1.u3d可以直接打包成APK或android项目(项目可以在androidIDE中直接运行)供android二次开发
2.android目前最新也是官方支持的方式是使用arr文件替代jar,至于这两种文件最大的区别就是arr包含各种资源文件,jar需要单独拷贝资源文件(本文只介绍arr方式)

一.Unity3d调用Android方法
先介绍一下u3d中调用android的一些API
UnityPlayer是unity3d自身的一个jar包,两端通信的关键,
currentActivity是android需要的上下文,这两个东西你可以当作是调用某些android方法需要的参数,记下就行

AndroidJavaClass ajc=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject ajo=ajc.GetStatic(“currentActivity”);

jo.Call(method ,parameter );//调用实例方法
jo.Get(method ,parameter );//获取实例变量(非静态)
jo.Set(method ,parameter );//设置实例 变量(非静态)
jo.CallStatic(method ,parameter );//调用静态变量(非静态)
jo.GetStatic (method ,parameter );//获取静态变量
jo.SetStatic (method ,parameter );//设置静态变量
有了这些API就可以开启与android的通信了,可以我们自己写android代码,也可以用别人写好的,只要知道它的类名,方法名和需要的参数

1.创建arr文件,AS为例,如图,方法很简单,传入两个参数android会用Toast显示传入的string,下面的context就是我们u3d中的currentActivity这个实例,红色箭头是在u3d中调用时需要填写的
这里写图片描述
note:build中的”minSdkVersion”和u3d中”Minimum API Level”最小版本号必须一致,否则u3d打包时会出错

2.生成arr文件,如图,点击build中的make Modue xx后就会在下图的路径中自动生成一个arr文件
这里写图片描述
3.将arr文件复制到unity3d中,理论上任意文件夹都是可以的,但是最好都放在Plugins=>Android中

4.u3d调用代码,ao就是上面第一步android代码需要的context,这个ao是全局的,其他类或方法都可以使用,不用重新获取实例

 void OnGUI()
    {
        if (GUI.Button(new Rect(150, 150, 250, 135), "调用android原生方法"))
        {
            AndroidJavaClass ac = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject ao = ac.CallStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject androidClass = new AndroidJavaObject("cn.nutown.android_project.MyAndroidClass");//我们android的类名
            androidClass.Call("showMassege",ao,"hi!");//对应我们android的方法需要的参数
        } 
}       

来一个效果图
这里写图片描述
另外AndroidJavaProxy的使用,大家知道回调是我们经常用的东西,比如u3d中的Action和java中的interface像到达的效果都是一样的,而这个AndroidJavaProxy就是为了在u3d中使用android的回调接口而产生的,直接看代码

需求描述:比如在处理android动态权限时,我们需要监听到用户接受和拒绝的操作,然后去做相应的处理,android的方式是这样
public void RequestPermissionAsync(IPermissionRequestResult iperm){
//判断或请求权限
….
用户接受权限,调用成功的方法

if(iperm !=null){
iperm.OnPermissionGranted();
}
用户拒绝权限,调用失败的方法
if(iperm!=null){
 iperm.OnPermissionDenied();
}
}

interface IPermissionRequestResult {
void OnPermissionGranted();

void OnPermissionDenied();
}


unity3d中创建IPermissionRequestResult这个实例


 class IPermissionRequestResult : AndroidJavaProxy
   {
        public IPermissionRequestResult(Action permissionGranted, Action permissionDenied) : base("com.nutown.kuanzhai.permissions.ToUnityPermissions$IPermissionRequestResult")
        {
            this.permissionDenied = permissionDenied;
            this.permissionGranted = permissionGranted;
        }
        void OnPermissionGranted()
        {
            //这里就得到了android的成功回调

        }
        void OnPermissionDenied()
        {
                //android的失败回调
        }
    }

二.android调用u3d方法
1.u3d中选择Export导出android工程
这里写图片描述

导出的android项目结构如下图(MyClass是我自己创建的)
这里写图片描述

2.开始使用
默认的三个unity类一般不动,我们新建一个MyClass继承UnityPlayerActivity
调用u3d方法,第一个参数是u3d中的对象名,第二个是方法名,第三个是参数

UnityPlayer.UnitySendMessage(“GameObject”, “unityMethod”, “hi~”);
获取u3d界面

mUnityPlayer.getView();

这个的效果图就不演示了

最后需要注意一下在被调用的那方的方法中是在子线程下,否则有时候就会Only the original thread that created a view hierarchy can touch its views!的~~

第一次做这种供其他编译器调用的对接调用,特此记录一下。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值