Unity和安卓的交互:
//Unity访问安卓非静态方法public void CallAndroid() {
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
activity.Call("init");
}
//Unity访问安卓静态方法
public void CallAndroidStatic() {
AndroidJavaClass jc = new AndroidJavaClass("com.sdk.OliverInterface");
jc.CallStatic("Login");
}
//安卓回调Unity
UnityPlayer.UnitySendMessage("RecevieObject", "方法名","参数");// RecevieObject Unity中接收回调的Object名字
实际操作封装:
Unity端 SDKBase(不继承Mono)、SDKMgr单例类(继承Momo)、SDKForAndroid(继承自SDKBase)、测试类Test
public class SDKBase{
public virtual void Init() { }
public virtual void Login() { }
public virtual void Logout() { }
/// <summary>
/// 支付方法
/// </summary>
/// <param name="s">后期用Json代替,做解析</param>
public virtual void Pay(string s) { }
/// <summary>
/// 游戏分享
/// </summary>
/// <param name="s">后期也是用Json代替,做解析</param>
public virtual void GameCenter(string s) { }
}
public class OliverSDKMgr : MonoBehaviour {
public static OliverSDKMgr mInstance;
private SDKBase mSDKApi;
void Awake() {
mInstance = this;
#if UNITY_EDITOR
mSDKApi = new SDKBase();
#elif UNITY_ANDROID
mSDKApi = new SDKForAndroid();//继承自SDKBase
#endif
}
public void Init() {mSDKApi.Init();
}
{
mSDKApi.Login();
}
{
mSDKApi.Logout();
}
{
mSDKApi.Pay(s);
}
public void GameCenter(string s)
{
mSDKApi.GameCenter(s);
}
public void ReceiveNotifyFromSDK(string s) {
Debug.LogError("Unity ----------ReceiveNotifyFromSDK--------:" + s);
}
}
public class SDKForAndroid : SDKBase {
public override void Init()
{
using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) {
jo.Call("init");
}
}
}
public override void Login()
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("login");
}
}
}
public override void Logout()
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("logout");
}
}
}
public override void Pay(string s)
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("pay",s);
}
}
}
public override void GameCenter(string s)
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("gameCenter",s);
}
}
}
}
public class Test : MonoBehaviour {
void OnGUI() {
if(GUI.Button(new Rect(0,0,300,100),"Init")){
Debug.LogError("this is Unity Init");
// CallAndroid();
OliverSDKMgr.mInstance.Init();
}else if(GUI.Button(new Rect(0,130,300,100),"Login")){
Debug.LogError("this is Unity Login");
OliverSDKMgr.mInstance.Login();();
}else if。。。
}
}
安卓端 ①Unity导出安卓工程OliverBase 它的libs下有一个 unity-classes.jar 可以用unity的东西(eg:回调Unity)jar包就类似于C#里的dll。 ps:OliverBase 作为 is Library
②OliverSDK工程依赖OliverBase工程,其中MainActivity(主要在这里边开发)继承BaseActivity(在OliverBase中)。而BaseActivity又继承自UnityPlayerNativeActivity(就是我们的主Activity,即游戏Activity)
以后对接其他SDk,则只需再建一个OtherOliverSDK,再依赖OliverBase即可。
实际操作,接Vivo的SDk
步骤:①新建一个工程(SDK方给的Demo工程导入,做修改即可),将SDK工程中src下的报名改为自己Unity中的包名(com.xxx.xxx)
②右键SDK工程选Android,然后勾选Is Library选项,Add添加OliverBase(即SDKBase)
③将SDK工程下的MainActivity继承(extends)BaseActivity
④读文档,按照文档接即可,该拷贝的代码就直接拷贝 将权限(SDK方会提供)添加进工程的res目录下的AndroidManifest文件中,其中的package也要改成自己Unity的包名,以及文件中的activity要改成自己的MainActivity
最后,打包出包:
需要拷贝到Unity中Assets/Plugins/Adroid文件夹下的内容有:①OliverBase(SDKBase)工程下的bin下的oliverbase.jar ②OliverVivoDev工程(之前需要接入的SDKDemo工程,修改后的那个)下的bin下的olivervivodev.jar
③OliverVivoDev工程下的AndroidManifest.xml文件
④OliverVivoDev工程下的assets文件夹
⑤OliverVivoDev工程下的libs文件夹
⑥OliverVivoDev工程下的res文件夹
然后,直接Unity中Build出apk包即可。
小问题:①打包出来,安装后闪退 做优化:AndroidManifest文件中加入android:installlocation = “preferExternal”;
游戏的装载位置防止内存不够,可以装载在sd卡
②可添加一些其他权限:诸如 是否支持大、小、正常屏幕 android:smallScreens = "true"; android:normalScreens = "true";
③是否可以后台运行
④android:luanchMode = "singleTask";如果已有此任务则直接打开,没有才去新创建(提高速度)