Unity对接Android SDK

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();

    }


    public void Login()
    {
        mSDKApi.Login();

    }


    public void Logout()
    {
        mSDKApi.Logout();

    }


    public void Pay(string s)
    {
        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";如果已有此任务则直接打开,没有才去新创建(提高速度)

猜你喜欢

转载自blog.csdn.net/ai_little_ai/article/details/80520400