1.背景
??这里的实现是在Android studio 2.2和Unity 5.4上。本人是Android开发者,因为公司的业务需求需要与unity进行对接。那么暴露出来最需要解决的问题就是android上实现的方法和unity脚本上实现的方法如何进行相互的调用。在解决该问题的过程中,找了很多的教程以及google了很多其中问题的解决方法。下面就是我整理出来的一些操作步骤和问题的解决方式。
2 Android上的操作 2.1 新建Android项目??首先新建一个android项目,file-->new-->new project,这里新建项目的名称为UnityAndroid,包名为cn.unity.android,一直点击next到finish就ok了。
新建android项目
??然后将项目切换成project的格式,打开app目录下的build.gradle文件,将apply plugin: 'com.android.application',改成apply plugin: 'com.android.library',因为android studio只有在这种格式下才可以导出unity需要使用的aar或者jar文件。然后删除defaultConfig下的applicationId,去掉默认的dependencies下的
compile 'com.android.support:appcompat-v7:25.0.0'的引入,因为这里不需要用到它,而且这个包包含了很多的资源文件我们是用不到的,最后格式为。
build.gradle文件
project格式
??接下来我们需要修改AndroidManifest文件和res文件,首先删除values下的style.xml文件,因为这里面默认包含的是之前删除的com.android.support:appcompat-v7:25.0.0包里面的主题。然后修改AndroidManifest文件中application下的theme为android自带的主题。同时将<activity android:name=".MainActivity">修改为<activity android:name="cn.unity.android.MainActivity">,防止在unity中导出的app与AndroidManifest中的包名不一致产生的问题。
??然后添加<meta-data>信息,否则在 Unity 导出 APK 时会报找不到manifest 文件的错误信息
??最后得到的AndroidManifest和res的格式如下
修改后的AndroidManifest
res目录结构
2.2 引入unity的 classes.jar包??找到unity的classes.jar包。windows下和mac下包的路径分别为
C:\ProgramFiles\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\classes.jar
/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes\classes.jar
??将其拷贝到UnityAndroid项目app目录下的libs目录下,然后进行导入,导入之后可以发现在build.gradle中就有他的引入了。
导入classes.jar
classes.jar导入成功
2.3 为unity写android方法??首先需要让MainActivity继承UnityPlayerActivity,因为unity导出的app的视图展示需要在UnityPlayerActivity下。假如MainActivity继承的是Activity,那么显示的就是Android自己的界面。在这里我们写两个方法,一个是弹出Toast通知,一个是获取当前时间,具体代码如下。
package cn.unity.android; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.widget.Toast; import com.unity3d.player.UnityPlayerActivity; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; { private Toast mToast; { super.onCreate(savedInstanceState); } String text) { new Handler(Looper.getMainLooper()).post(new Runnable() { { if (mToast == null) { mToast = Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT); } else { mToast.setText(text); } mToast.show(); } }); } public String getNowTime() { long time = System.currentTimeMillis(); return new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.CHINESE).format(new Date(time)); } }??接下来需要导出aar包和jar包,为接下来unity调用提供方法。点击build-->build apk,然后在app-->build-->outputs-->aar目录下的到app-debug.aar文件