Unity2018、2019和安卓通信,基于AAR包优化
说明和优点
Unity高版本以后,把UnityPlayActivity.java从jar包分离了出来;
Unity集成了安卓打包的全部环境,包括SDK、OpenJava,默认会下载一个最新的Platform编译平台
classes.jar包和UnityPlayActivity.java文件位置
\Unity\Hub\Editor\2019.4.6f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
\Unity\Hub\Editor\2019.4.6f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
优点
1、项目的包名不需要和安卓的包名一致
2、不需要处理classes.jar文件
3、使用起来方便
搭建安卓项目
1、创建一个空的AS项目
2、在项目里面创建一个Module
3、修改build.grade
4、复制资源到Module里面
复制\Unity\Hub\Editor\2019.4.6f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk\res覆盖到项目里面的res目录
5、修改Manifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.newgamestudio.unitydemolib">
<application>
<activity
android:name="com.newgamestudio.unitydemolib.DemoActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
</activity>
</application>
</manifest>
6、编写android和unity通信代码
public class AndroidUnityDemo {
/**
* 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;
}
}
7、打包AAR文件,复制AAR和mianfest文件到Unity的Plugins/Android下面
搭建Unity项目
1、放置文件
2、编写测试代码
public class UnityAndroidDemo1 : MonoBehaviour
{
public Text m_TxtAndroid;
private AndroidJavaObject mJavaObj;
private void Start()
{
mJavaObj = new AndroidJavaObject("com.newgamestudio.unitydemolib.AndroidUnityDemo");
}
public void OnClick()
{
bool success = mJavaObj.Call<bool>("showToast", "Unity Call.");
Debug.Log(success);
}
public void FromAndroid(string content)
{
m_TxtAndroid.text = content;
}
}
3、真机测试
安卓项目和Unity源码下载:
https://download.csdn.net/download/inspironx/12704690
本文地址:https://blog.csdn.net/inspironx/article/details/107934348