前言
刚接手一个项目,用到 Unity 与 Android 的交互。这篇文章就来总结一下。
交互方式
Android 与 Unity 的交互有两种方式:Android 作为 Unity 的一部分或者把 Unity 作为 Android 的一部分。至于使用哪种方式,就要根据具体情况来决定了。
1、如果你的项目是以 Unity 为主( Unity 的部分需要经常改动,而 Android 的部分比较固定),就把 Android 作为 Unity 的一部分来实现交互。
2、如果你的项目是以 Android 为主( Android 的部分需要经常改动, Unity 部分比较固定),这时就把 Unity 作为 Android 的插件来使用。
一、Android 作为 Unity 的一部分
使用这种方法时我们需要使用 Unity 为 Android 提供的一个叫做 classes.jar 的库。首先,我们要在 Unity 的安装路径下找到这个库。由于 Unity 版本的不同这个库所在的路径会有不同,笔者这里提供一个大致的位置 /Unity 的安装目录/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar,这个路径是 Mac 下的;Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes/classes.jar,这个路径是 Windows 下的。
新建 Android 项目
在 Eclipse 中新建一个 Android 项目。然后把上述 classes.jar 作为外部的库导入项目中。如下图:
继承 UnityPlayerActivity
MainActivity 继承 UnityPlayerActivity。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//显示 Unity 内容
setContentView(mUnityPlayer);
mUnityPlayer.requestLayout();
}
public void onClick(View v) {
// 调用 Unity 的方法
UnityPlayer.UnitySendMessage("Player", "ZoomIn", "");
}
// 被 Unity 调用的方法
public String getName(String s) {
return "TestUnity";
}
|
第 7 行,是将 Unity 的内容显示到 Activity。注意:在 Unity 5.1 版本中 mUnityPlayer 变量名是 a。所以,如果你的 Unity 是 5.1 版本的,第 7 、 8 行应该换成setContentView(a); a.requestLayout();
第 13 行,是 Android 调用 Unity 的方法。其中第一个参数是 Unity 组件的名字;第二个参数,被调用方法的方法名;第三个参数是被调用方法的实参。这个参数只能是 String 类型的。
导出 Android 包
把 Android 项目设置成 library。如下图:
然后clean 项目并 build 。在项目的 bin 文件夹下会生成 .jar 的文件。如下图:
在桌面新建 Android 文件夹,在 Android 文件夹中,新建 bin 文件夹。
将项目里 bin 下新生成的 jar 包,复制到新建的 Android 文件夹下的 bin 目录下。如果 Android 项目有用到 aidl 也要将项目下 bin 里的 aidl 文件夹复制到新建的 Android 文件夹下的 bin 目录下。除此之外,把上图中画红框的文件复制到新建的 Android 文件夹下。
设置 Unity
在 Assets 下新建 Plugins 包,将上述新建的 Android 文件夹拖拽到 Plugins 里面。如下图:
添加代码
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class textOperate : MonoBehaviour {
// Use this for initialization
public Text text;
void Start () {
this.name = "Count Text";
GetData ();
}
void GetData(){
//调用 Android 的方法
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string name = jo.Call<string> ("getName", "成功调用android方法");
text.text = name;
}
}
|
第 13 行到第 16 行是 Unity 调用 Android 的代码,其中第 16 行jo.Call<string> ("getName", "成功调用android方法")
的第一个参数是被调用方法的方法名,第二个参数是被调用方法的实参,这个参数是不定参数可以有多个。
打包 APK
点击 File –> BuildSetting,如下图:
选中 Android ,点击 Switch Platform ;然后点击 Player Setting ,出现如下界面:
将 Bundle Identifier 改为 Android 的包名。点击 Build 进行打包,如下图:
二、把 Unity 作为 Android 的一部分
将 Unity 项目作为插件导入 Android 项目中。从而实现 Android 和 Unity 之间的交互。
从 Unity 中导出 Android 项目
点击 File 选择 Build Setting,出现如下图界面,选中 Android 平台。选中右侧 Google Android Project。
点击 Player Setting 按照上篇文章的说明设置好 Android 的信息,点击 Build 即可。这时我们会得到一个 Eclipse 下的 Android 项目。
在 Eclipse 中使用
如果你是使用 Eclipse 进行 Android 开发,并且没有已经存在的 Android 项目。那么你可以直接将刚才从 Unity 中导出的 Android 项目导入 Eclipse 中即可。如果已经有 Android 的项目存在,将刚才从 Unity 中导出的 Android 项目中的 libs 和 assets 拷贝到你的项目中去即可。同时参考从 Unity 中导出的 Android 项目的 AndroidManifest.xml 文件配置好你的项目的 AndroidManifest.xml 文件。
在 AndroidStudio 中使用
在 AndroidStudio 中使用稍微需要注意一下。需要将从 Unity 中导出的 Android 项目的 libs 的 jar 包拷贝到你的项目中的 libs 中并引用。并将 assets 拷贝到你的项目的主工程的 mian 文件夹下。然后,在 main 文件夹下新建 jniLibs 文件夹,将 Unity 导出的 Android 工程的 libs 中的 armeabi-7va 、x86 等平台的文件夹拷贝到 jniLibs 中。最好配置好 AndroidManifest.xml 文件 就可以了。
AndroidStudio 中的配置
结语
至此,Android 和 Unity 的交互就介绍完了。在实际的开发中,由于 Unity 各个版本的不兼容会出现很多坑。
文章评论
Well done to think of sotnehimg like that
Me and this article, sitting in a tree, L-----RAN-I-NEG!