• (转)Unity3D接入Android第三方SDK流程


    一、本例子中使用的Android Studio为3.2.0版本,Unity为2018.3.12版本
    二、SDK调用Unity3D
    1、一般第三方SDK都会有一个暴露给接入方(即Unity3D)的一个接口类,该类中包含了一些SDK功能的各个调用方法,例如下面这个SDK接口类中包含了初始化、登录、登出三个功能的接入类,里面的每个方法跟参数都加了注释;

    先看SDK库工程目录,mysdk是SDK库工程,app是一个依赖于SDK库工程的demo,其中只有一个MainActivity类,便于开发时进行测试,mysdk中只有一个MySDkPlatform类,这个类就是unity接入需要调用的接口类;

    /**
     * 类说明:unity接入SDK的接口类
     */
    public class MySDkPlatform {
        
        private static String gameObjectName;//unity传过来的接收SDK回调的类名,SDK根据此类名调用unity类中的方法
        private static String unityInitCallbackName;//unity传过来的接收SDK回调的类中的方法,SDK根据此方法名调用unity中的方法
        private String unityLoginCallbackName;//同上
        private String unityLogoutCallbackName;//同上
        
        //单例模式
        public static MySDkPlatform mySDkPlatform;
        public static MySDkPlatform getInstance(){
            if (mySDkPlatform == null) {
                mySDkPlatform = new MySDkPlatform();
            }
            return mySDkPlatform;
        }
     
        //初始化
        public void init(Activity activity){
            System.out.println("调用了mysdk的初始化方法");
            //该方法的三个参数
            //gameObjectName:unity中的gameObject的类名
            //unityInitCallbackName:unity中gameObject绑定的c#脚本里的方法名
            //第三个参数:SDK向unity传递的字符串
            UnityPlayer.UnitySendMessage(gameObjectName,unityInitCallbackName,"这是SDK初始化结果回调");
        }
     
        //登录
        public void login(String arg1){
            System.out.println("调用了mysdk的登录方法;arg1 = "+arg1);
            UnityPlayer.UnitySendMessage(gameObjectName,unityLoginCallbackName,"这是SDK登录结果回调");
        }
     
        //登出,静态,跟以上非静态方法做不同例子演示
        public static void logout(String arg1){
            System.out.println("调用了mysdk的登出方法");
            UnityPlayer.UnitySendMessage(gameObjectName,unityLogoutCallbackName,"这是SDK登出结果回调");
        }
     
        //拿到unity的类名
        public void setGameObjectName(String gameObjectName){
            this.gameObjectName = gameObjectName;
        }
        //拿到unity接收SDK初始化结果的方法名
        public void setUnityInitCallbackName(String unityInitCallbackName) {
            this.unityInitCallbackName = unityInitCallbackName;
        }
        //拿到unity接收SDK登录结果的方法名
        public void setUnityLoginCallbackName(String unityLoginCallbackName) {
            this.unityLoginCallbackName = unityLoginCallbackName;
        }
        //拿到unity接收SDK登出结果的方法名
        public void setUnityLogoutCallbackName(String unityLogoutCallbackName) {
            this.unityLogoutCallbackName = unityLogoutCallbackName;
        }
    }

    2、类中的UnityPlayer.UnitySendMessage(gameObjectName,callbackName,arg1)方法是Unity中的一个unity-classes.jar包下的方法,SDK需要引入该包才能编译,在引入过程中需要注意,因为unity中已经有这个jar包,SDK库工程只在编译的时候需要用到,真正接入的时候,只需要拷贝SDK库工程生成的aar包即可,不需要把unity-classes.jar编译进去,否则会报异常,引入unity-classes.jar方法如下:

    (1)新建一个unity3dlibs文件夹,保证与工程中的libs不重名,将unity-classes.jar放入该文件夹下

    (2)在工程的build.gradle中加入依赖

    //添加一个本地仓库,并将unity3dlibs目录作为仓库地址
    repositories{
        flatDir {
            dirs 'unity3dlibs'
        }
    }
     
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:28.0.0'
        testImplementation 'junit:junit:4.12'
     
        compileOnly files('unity3dlibs/unity-classes.jar')//只在编译的时候用到
    }

    (3)清单文件;如果SDK中需要在manifest中application根节点下注册信息,在清单文件中需要编写以下代码:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sdk.mysdk">
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
     
            //方式一:SDK的接口类继承了unity的UnityPlayerActivity,这里启动入口填写SDK的接口类路径
            //方式二:SDK的接口类没有继承unity的UnityPlayerActivity,这里填写"com.unity3d.player.UnityPlayerActivity"
            //本例子中使用方式二
            //Unity启动入口activity
            <activity android:name="com.unity3d.player.UnityPlayerActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
     
    </manifest>

    清单文件中注册UnityPlayerActivity是为了将SDK做成符合Unity接入的plugins,Unity编译时会将自身生成的manifest和SDK的manifest进行合并,但SDK的manifest优先级比较高,所以需要SDK在manifest中注册启动的UnityPlayerActivity。 (注:如果SDK中有Activity并且继承了UnityPlayerActivity,则启动应用的main入口需要改为SDK的Activity)

    三、Unity3D调用SDK

    1、在Unity中新建一个脚本,调用MySDkPlatform中的方法

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
     
    public class NewBehaviourScript : MonoBehaviour
    {
     
        AndroidJavaClass unityPlayer;
        AndroidJavaObject currentActivity;
     
        AndroidJavaClass androidJavaClass;
        AndroidJavaObject androidJavaObject;
     
        // Start is called before the first frame update
        void Start()
        {
            步骤一:拿到接口对象实例
            //方式一
            //通过包名获取UnityPlayer,目的为了获取下面当前activity对象用
            //使用这种方式,SDK的接口类需要继承UnityPlayerActivity
            //拿到unityPlayer(固定写法,不用修改),即可调用SDK接口类中的静态方法,
            unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            //通过unityPlayer获取当前的activity (注:固定写法,不用修改),拿到currentActivity,即可调用SDK接口类中的非静态方法
            currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
     
            //方式二(本例中使用的该方式)
            //获取SDK的MySDkPlatform类对象,可以直接使用androidJavaClass调用MySDkPlatform的静态方法
            androidJavaClass = new AndroidJavaClass("com.sdk.mysdk.MySDkPlatform");
            //获取SDK的MySDkPlatform类中的单例对象,可以直接使用androidJavaObject调用MySDkPlatform中的非静态方法
            androidJavaObject = androidJavaClass.CallStatic<AndroidJavaObject>("getInstance");
     
            //步骤二:告诉SDK返回参数时要调用Unity的哪一个方法名
            //unity调用SDK的方法,传入一个参数,该参数为定义在unity中的方法名,当unity调用SDK的接口,
            //且需要SDK返回参数时,SDK会根据这里传入的方法名,调用定义在unity中的方法
            //setGameObjectName为SDK里定义的方法名,Main Camera为untiy当前挂载的脚本
            androidJavaObject.Call("setGameObjectName", "Main Camera");
            //setUnityInitCallbackName为SDK里定义的方法名,initCallback为unity定义的方法名,用于接收SDK回调,下面两个一样
            androidJavaObject.Call("setUnityInitCallbackName", "initCallback");
            androidJavaObject.Call("setUnityLoginCallbackName", "loginCallback");
            androidJavaObject.Call("setUnityLogoutCallbackName", "logoutCallback");
     
            //步骤三:调用SDK的接口方法
            //SDK初始化
            Button btn = GameObject.Find("Button").GetComponent<Button>();
            btn.onClick.AddListener(() => 
            {
                Debug.Log("-->初始化");
                //调用初始化方法,传入当前activity对象(注:这里的activity参数就是方式一中获取到的currentActivity)
                androidJavaObject.Call("init", currentActivity);
            });
     
            //登录
            Button btn2 = GameObject.Find("Button2").GetComponent<Button>();
            btn2.onClick.AddListener(() =>
            {
                androidJavaObject.Call("login", "unity调用了SDK的登录");
            });
     
            //登出
            Button btn3 = GameObject.Find("Button3").GetComponent<Button>();
            btn3.onClick.AddListener(() =>
            {
                //这里使用的是androidJavaClass调用的SDK的登出,在SDK接口类中logout方法为静态的,                
                //所以这里使用androidJavaClass类直接调用,而上面登录方法为非静态的,所以使用的是androidJavaObject
                androidJavaClass.Call("logout", "unity调用了SDK的登出");
            });
     
        }
     
        //步骤四:定义unity接收SDK返回参数的方法,这里的方法名与步骤二中传入的参数名必须一致
        //SDK初始化后,会调用该方法,参数为回调结果
        void initCallback(string callback)
        {
            Debug.Log("-->收到SDK初始化的回调:"+callback);
        }
     
        //SDK登录后,会回调该方法,参数为回调结果
        void loginCallback(string callback)
        {
            Debug.Log("-->收到SDK登录的回调:" + callback);
        }
     
        //SDK登出后,会回调该方法,参数为回调结果
        void logoutCallback(string callback)
        {
            Debug.Log("-->收到SDK登出的回调:" + callback);
        }
     
        // Update is called once per frame
        void Update()
        {
     
        }
    }

    四、打包

    1、方式一:SDK打成plugins给Unity(unity版)

    把SDK编译成aar,然后把aar文件、manifest文件放入Unity对应的Assets文件夹下的plugins下的Android下,以及libs下,没有的文件夹自己新建一个,目录对应如下:

    Manifest放入Android文件夹下(如上图)

    SDK的aar包放入libs文件夹下(如上图)

    配置好以上步骤即可开始打包编译;

    2、方式二:Unity导出安卓工程接入SDK(studio版)

    这种方式接入更为简单,将SDK的aar包拷贝到游戏导出的studio工程的libs文件夹下,并在gradle中添加aar依赖,然后修改Manifest清单文件即可;(注:SDK工程中unity-classes.jar不需要拷贝进去,untiy导出的studio工程中已经有了这个jar包)。

    转载链接:https://blog.csdn.net/u010263943/article/details/89366539

  • 相关阅读:
    Request.ServerVariables
    asp.net 枚举
    MSSQL批量替换语句 在SQL SERVER中批量修改替换数据
    由于 ASP.NET 进程标识对全局程序集缓存没有读权限,因此未能执行请求
    mongodb 下载地址,mongodb.dll 下载
    mongodb 常用操作(转)
    mssql 列出数据库中的所有表
    jpg图片在火狐中和ie中格式区别
    Ndo 新版本发布
    消息总线设计系列之 调停者模式
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/15658557.html
Copyright © 2020-2023  润新知