因公司产品需要用到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中调用时需要填写的
Unity3d与Android通信_第1张图片
note:build中的”minSdkVersion”和u3d中”Minimum API Level”最小版本号必须一致,否则u3d打包时会出错

2.生成arr文件,如图,点击build中的make Modue xx后就会在下图的路径中自动生成一个arr文件
Unity3d与Android通信_第2张图片
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("currentActivity");            AndroidJavaObject androidClass = new AndroidJavaObject("cn.nutown.android_project.MyAndroidClass");//我们android的类名            androidClass.Call("showMassege",ao,"hi!");//对应我们android的方法需要的参数        } }       

来一个效果图
Unity3d与Android通信_第3张图片
另外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工程
Unity3d与Android通信_第4张图片

导出的android项目结构如下图(MyClass是我自己创建的)
Unity3d与Android通信_第5张图片

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!的~~

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

更多相关文章

  1. Android使用自定义字体的方法
  2. Android下 读写文件
  3. Android中经常用到的方法--SDcard下文件的操作
  4. Android 将被依赖的库项目打包成aar(非jar)文件
  5. android中实现多个apk文件
  6. Android 文件系统移植总结
  7. Android Intent调用方法总结
  8. Android 应用程序退出后不在运行列表中显示的方法
  9. Android 瘦身之道 ---- so文件

随机推荐

  1. 如何使用ajax GET或POST方法将数据传递到
  2. 如何从SQL SELECT查询中的c#变量创建jQuer
  3. 在Chrome中使用AJAX发送选项而不是GET/PO
  4. jQuery实现点击全选和取消全选
  5. 适用于prettyPhoto的FLV播放器(基于jQuery
  6. 使用Ajax+JQuery构造分页查询列表
  7. 通过jQuery设置全局Ajax加载时呈现Loadin
  8. [求助]如何用JQuery来实现Ctrl+Space完成
  9. 在jQuery返回的HTML中找到控件
  10. 2017.4.9 JQuery学习续写