zoukankan      html  css  js  c++  java
  • Unity3d和Android之间互相调用

    摘抄博客 Unity3d Android SDK接入解析(一)Unity3d 与 Android之间的互相调用,一共四章,一定要看完

    No1:

    总体来说Unity3d与Android之间的互相调用,是通过Unity3d提供的classes.jar来实现的

    No2:

    常见的方法就是

    1)在Android层定义好接口

    2)在Unity中通过反射调用(反射大法好啊,真是好)

    No3:

    UnityPlayer是FrameLayout的一个子类,而currentActivity则是UnityPlayer类中的静态对象。

    No3:

    我们一般建立了一个新的MyActivity继承UnityPlayerActivity,并在AndroidManifest中把MyActivity设置为启动的Activity,然后使用currentActivity这个jo来调用方法。

    No4:

    新版Unity生成的unity-class.jar中类的继承关系变简单了:UnityPlayerActivity->Activity,之前的UnityPlayerNativeActivity被废弃了

    No5:

    UnityPlayerActivity中

    mUnityPlayer = new UnityPlayer(this);

    把上下文传进去

    在UnityPlayer中

     public UnityPlayer(Context var1) {
            super(var1);
            if (var1 instanceof Activity) {
                currentActivity = (Activity)var1;
            }

    把上下文传给currentActivity,所以currentActivity就是当前的上下文

    No6:

    Android SDK的接入一般分为两种

    1)一种是把Unity的工程导出google project的形式进行接入 
    2)另一种是通过把Android的工程做成Plugins的形式进行接入

    对比

    No7:

    只有当需要在Activity的生命周期中执行一些操作时,我们才需要一个中间Activity去完成这些与生命周期相关的操作,而其他情况下,一个Class足以

    No8:

    Unity调用Android方法默认不是在UI主线程上执行的,所以如果你想要对UI界面进行操作,那就要使用runOnUiThread才行。

    No9:

    每个渠道SDK有两个class,一个管理账号信息,一个管理支付信息,账号与支付分离

    No10:

    调用上,C#初始化“包名+类名”的AndroidJavaClass对象,使用这个对象来调用对应功能

    No11:

    Activity生命周期的处理:(C#处理的方式)

    android代码

    public void lifeCycle(int status) {
        if (getActivity() == null) {
            DybGSdkUtil.E("还未Init初始化,不执行生命周期操作 ");
            return;
        }
    
        switch (status) {
        case DybGSdkConstants.onStart:
            break;
        case DybGSdkConstants.onResume:
            BuoyOpenSDK.getIntance().showSmallWindow(getActivity());
            break;
        case DybGSdkConstants.onPause:          
            BuoyOpenSDK.getIntance().hideSmallWindow(getActivity());
            BuoyOpenSDK.getIntance().hideBigWindow(getActivity());
            break;
        case DybGSdkConstants.onStop:
            break;
        case DybGSdkConstants.onDestroy:
            OpenHwID.releaseResouce();
            BuoyOpenSDK.getIntance().destroy(getActivity());
            break;
        default:
            break;
        }
    }

    C#调用

    void OnApplicationPause(bool isPause)
            {
                if (isPause) {
                    string json = "{'status':'3'}";
                    ajc_SDKCall.CallStatic("uaLifeCycle",json);
                }
            }
    
        void OnApplicationFocus(bool isFocus)
        {
            if (isFocus)
            {
                if (ajc_SDKCall != null){
                    string json = "{'status':'1'}";
                    ajc_SDKCall.CallStatic("uaLifeCycle",json);
                    json = "{'status':'2'}";
                    ajc_SDKCall.CallStatic("uaLifeCycle",json);
                }
            }
        }
    
        void OnApplicationQuit()
        {
            string json = "{'status':'5'}";
            ajc_SDKCall.CallStatic("uaLifeCycle",json);
        }
    // Android Activity生命周期
    public static final int onStart = 1;
    public static final int onResume = 2;
    public static final int onPause = 3;
    public static final int onStop = 4;
    public static final int onDestroy = 5;
    public static final int onRestart = 6;

    No12:

    如果想从android层传数据到unity层,使用UnityPlayer.UnitySendMessage(OBJNAME, "andToU3dCallback", "exit");方法

    切记:这个API需要大写S开头的Send才能调出来,小写s开头的send调不出来,坑爹啊

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    关于table表格的一些问题
    leetcode 845. 数组中的最长山脉 做题笔记
    leetcode 845. 数组中的最长山脉 做题小结
    leetcode 925. 长按键入小结
    leetcode 925. 长按键入小结
    java单链表反转 详细讲述
    java单链表反转 详细讲述
    Leetcode 3. 无重复字符的最长子串 做题小结
    Leetcode 3. 无重复字符的最长子串 做题小结
    复变函数的幂函数
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8794869.html
Copyright © 2011-2022 走看看