本文适用对象
- 有一定的Unity开发经验,会使用Unity
- 有一定的Android开发经验,会使用AndroidStudio
方案优势
- 不需要引用unity下的class.jar
- 不用在Unity的/Plugins/Android下放置AndroidManifest.xml文件
- Unity打包时PackageName不依赖于引用文件
- 发布简单,只需要导出arr并直接拷贝到/Plugins/Android目录下即可使用,不用对文件做任何修改
文章DEMO对应的IDE版本
- AndroidStudio 3.0 (2.1亲测通过)
- Unity 2017.2 (5.4.3亲测通过)
流程
Android部分
创建AndroidStudio项目
- 首先我们打开AndroidStudio,并创建一个新项目,这里随便填写项目名、包名即可,因为这个项目我们后面并不会用到。
- SDK我们选最低的就行。
-
Activity我们选个EmptyActivity也行。
-
然后我们点击「Finish」完成AndroidStudio项目创建。
创建和unity交互的Moudle项目
-
项目创建好以后开始我们的主菜,选中app然后新建一个moudle
2.png
-
类型选择「Android Library」
3.png
-
Application/Library name认真填写,之后为arr导出的名称,这里我们叫「MyUnityLib」。
-
Module name没有强迫症就不用管它
-
Package name认真填写,之后unity里会用到,不过它和unity导出的包名没有什么关系这里我们叫「com.jing.unity」好了
-
Minimum SDK能选多低选多低,反正不超过unity发布的版本就行
4.png
-
创建
-
然后我们在com.jing.unity包下创建一个类,作为Unity和Android通信的核心类,名字尽量炫酷一点,这里我们叫「Unity2Android」
6.png
编写Android端代码
-
然后我们直接粘贴该类的代码,讲解直接看注释。这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,有一定的开发经验应该很容易理解。
这里我们实现一个简单的接口「showToast」。package com.jing.unity; import android.app.Activity; import android.widget.Toast; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Created by Jing on 2018-1-18. */ public class Unity2Android { /** * unity项目启动时的的上下文 */ private Activity _unityActivity; /** * 获取unity项目的上下文 * @return */ Activity getActivity(){ if(null == _unityActivity) { try { Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer"); Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype); _unityActivity = activity; } catch (ClassNotFoundException e) { } catch (IllegalAccessException e) { } catch (NoSuchFieldException e) { } } return _unityActivity; } /** * 调用Unity的方法 * @param gameObjectName 调用的GameObject的名称 * @param functionName 方法名 * @param args 参数 * @return 调用是否成功 */ boolean callUnity(String gameObjectName, String functionName, String args){ try { Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer"); Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class); method.invoke(classtype,gameObjectName,functionName,args); return true; } catch (ClassNotFoundException e) { } catch (NoSuchMethodException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } return false; } /** * Toast显示unity发送过来的内容 * @param content 消息的内容 * @return 调用是否成功 */ public boolean showToast(String content){ Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show(); //这里是主动调用Unity中的方法,该方法之后unity部分会讲到 callUnity("Main Camera","FromAndroid", "hello unity i'm android"); return true; } }
导出arr准备给unity使用
-
代码写好了我们选中module然后选择「Build」「Rebuild Project」
7.png
-
接着将这个arr文件找到,就是我们要导入到unity的文件了。
更多unity2018的功能介绍请到paws3d爪爪学院查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213
近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解