本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与插件的开发。
目前国内各大博客上搜到的文章内容基本上都是相互抄来抄去,比如说先是清一色的继承UnityPlayerActivity,然后再配置AndroidManifest文件等等,这些确实有效果,但是具有很大的局限性。例如,如果项目中如果存在两个Android插件或SDK会怎么样?都继承UnityPlayerActivity显然是不行的,启动入口Activity只能有一个,AndroidManifest文件没法这样配置。笔者最近在做毕设,帮同学接了若干个Android下的SDK,包括支付宝,科大讯飞以及二维码扫描的SDK,参考一些国外的优秀博客以及自己的实践,总结出一套SDK接入与插件开发的通用流程,在这里分享给大家。
1.开发软件:笔者使用的开发软件是Unity 5.4.3f 和Android Studio 2.3。
2.所需类库:UnityPlayer等需要的classes.jar包。在 Unity支持Android下IL2CPP后,UnityPlayer相关的这个jar包位置由原来的`Editor\Data\PlaybackEngines\AndroidPlayer\bin`变成了`Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono(or il2cpp)\Release\Classes`,选择jar包时需要注意选择对应Backend的版本。
package com.soulgame.myplugin;
import android.app.Fragment;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
public class MyPluginClass extends Fragment
{
private static final String TAG = "MyPlugin";
private static MyPluginClass Instance = null;
private String gameObjectName;
public static MyPluginClass GetInstance(String gameObject)
{
if(Instance == null)
{
Instance = new MyPluginClass();
Instance.gameObjectName = gameObject;
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true); // 这一句很重要,保存对该Fragment的引用,防止在旋转屏幕等操作时时丢失引用(Fragment隶属于Activity)
}
//示例方法一:简单的向Unity回调
public void SayHello()
{
UnityPlayer.UnitySendMessage(gameObjectName,"PluginCallBack","Hello Unity!");
}
//示例方法二:计算传入的参数并返回计算结果
public int CalculateAdd(int one, int another)
{
return one + another;
}
}
编写完成,将插件编译导出,选中Android Studio右侧的Gradle,选中如图所示的选项编译输出,稍等一会儿,在左侧的Project面板可以看到相关的aar文件了,这个aar文件就是最终输出给Unity使用的aar包,拿到aar包之后,需要进行一项关键的操作,将其后缀改为压缩格式(zip或rar)打开
压缩包删除掉libs/下面的classes.jar(原因是Unity在打包的时候会再次拷贝安装目录下的classes.jar到项目中造成冲突)!如果插件使用到了so文件,
将对应平台的so文件拷贝至libs下面,如下图右所示:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PluginManager : MonoBehaviour
{
public string className = "com.soulgame.myplugin.MyPluginClass";
public Text callbackText = null;
public Text resultText = null;
private AndroidJavaObject pluginObject = null;
void Start()
{
#if UNITY_ANDROID && !UNITY_EDITOR
pluginObject = new AndroidJavaClass(className).CallStatic("GetInstance", gameObject.name);
pluginObject.Call("SayHello");
resultText.text = pluginObject.Call("CalculateAdd", 22, 33).ToString();
#endif
}
public void PluginCallBack(string text)
{
callbackText.text = text;
}
}
编写完成后,设置好Platform和Bundle Identifier以及Mininum API Level(和插件保持一致),到真机上测试即可。