引言

通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成

对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,
而熟悉SDK接入的同学又觉得不断地重复做接入SDK工作这样没有成就感,太尼玛无聊了(Android渠道一弄就十几个,直接吐血)。

概述

其实通常情况下接入SDK都是很简单的一个过程,这边记录一下自己学习接入ShareSDK的过程。

  1. 创建Android工程,编写代码,导出Android项目为Jar包供Unity调用
  2. Unity端工程调用jar的接口,实现unity调用java函数
  3. 打包测试调用结果

实践

一、创建Android工程(Android Studio)

注意包名要和unity的包名一致

二、导入Classes.jar包到Android工程中

Unity和Android做交互,他们两个之间不认识肯定,没法直接通信,因此需要一个中间的搭桥牵线的人,Classes.jar就起到了这个作用。
Classes.jar是由Unity提供给我们的,我们需要找到它并且引入到我们的Android项目中。Claess.jar的路径一般如下
如果用MONO:Unity5.6.6EditorDataPlaybackEnginesandroidplayerVariationsmonoReleaseClasses
如果用il2cpp:Unity5.6.6EditorDataPlaybackEnginesandroidplayerVariationsil2cppReleaseClasses

我们找到它直接拖到我们的Android工程的libs目录下。

关键一步:右键-Add as Library,导入成功就可以开始编写代码了

三、编写Android端的代码

  我们在Android端编写一些代码,提供一些接口来供Unity一会的调用。

打开我们的MainActivity.java,然后添加代码。需要注意的是,让我们的MainActivity继承Jar包中的UnityPlayerActivity类,这样,Unity才能调的到

还需要把 setContentView(R.layout.activity_main); 这段代码注释掉,要不然会显示Android的默认布局文件,上面就一个 Hello World。

package com.Aver3.Snake;import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;
import android.os.Bundle;public class MainActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// setContentView(R.layout.activity_main); 注释掉 不显示View}//供U3D调用的方法public int Add(int x,int y){return x + y;}//    Android调用Unity的方法public void JavaCallUnityFunc(){String str="Android Call Unity.";String UnityClass="Canvas";String UnityMethod="ForJavaCallFunc";//参数1:unity脚本挂载的gameobject   参数2:方法名   参数3:要传递的参数UnityPlayer.UnitySendMessage(UnityClass, UnityMethod, str);}
}

四、导出Android项目为Jar包

  1. 修改build.gradle模块文件
//apply plugin: 'com.android.application'
apply plugin: 'com.android.library' //说明是Library模块android {compileSdkVersion 28defaultConfig {//      applicationId "com.Aver3.Snake"minSdkVersion 17targetSdkVersion 28versionCode 1versionName "1.0"multiDexEnabled true}buildTypes {release {//混淆minifyEnabled false//加载默认混淆配置文件proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}lintOptions {abortOnError false}dexOptions {javaMaxHeapSize "4g"}
}//删除build.gradle里的依赖
//这里要删的话,导出前删,否者会XML配置会报错
dependencies {implementation fileTree(include: ['*.jar'], dir: 'libs')implementation 'com.android.support:appcompat-v7:28.0.0'implementation files('libs/classes.jar')
}task makeJar(type: Copy) {delete 'build/libs/mysdk.jar'                           //删除旧的Jar包from('build/intermediates/intermediate-jars/release')   //从该地址复制into('build/libs/')                                     //复制到该地址include('classes.jar')                                  //包含文件rename ('classes.jar', 'mysdk.jar')                     //重命名
}makeJar.dependsOn(build)

2. 删除单元测试

删除androidTest和Test

3. 删除布局文件

删除activity_main.xml

4. 忘记有没有改AndroidManifest.xml文件了,也附上

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.Aver3.Snake"android:installLocation="auto"><applicationandroid:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

5. 同步gradle

6. 运行makeJar 任务

可以直接输入makeJar搜索,找到后双击运行这个任务,第一次运行需要下载一些依赖,可能需要一会儿,运行结束,jar就打好了。

五、导入 Unity

  1. 将生成的jar和AndroidManifest.xml导入unity 工程的 Asset/Plugins/Android/ 目录下。没有的话就手动创建目录。

2. 修改AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.Aver3.Snake"><applicationandroid:theme="@style/UnityThemeSelector"android:icon="@drawable/app_icon"android:label="@string/app_name">android:theme="@style/UnityThemeSelector"><activity android:name="com.Aver3.Snake.MainActivity"android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-data android:name="unityplayer.UnityActivity" android:value="true" /></activity></application>
</manifest>

六、unity和Jar交互

  1. unity调用jar
  AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");string message = "this is my title";string body = "this is my content";jo.Call("ShareText", message, body);

unity 中调用 android 层的接口基本都是通过 AndroidJavaClass 、AndroidJavaObject 的方式。

2. jar调用unity

//参数1:unity脚本挂载的gameobject   参数2:方法名   参数3:要传递的参数
UnityPlayer.UnitySendMessage("headImage","AndroidSaveHeadImageOver","headImage.png");

例子:

using UnityEngine;
using UnityEngine.UI;public class Test : MonoBehaviour
{public Button btn1;public Button btn2;public Text logText;private void Start(){btn1.onClick.AddListener(TestCallJavaFunc);btn2.onClick.AddListener(TestFromJavaCallUnityFunc);logText.text = "Start";}private const string JAVA_CLASS_Name = "com.unity3d.player.UnityPlayer";private void CallJavaFunc(string javaFuncName, params object[] args){try{//获取到AndroidJavaClass,至于这里为什么调用这个类,我也不是很清楚//获取unity的Java类,只能调用静态方法,获取静态属性using(AndroidJavaClass jc = new AndroidJavaClass(JAVA_CLASS_Name)){//获取到Activityusing(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")){//调用Java方法jo.Call(javaFuncName, args);}}}catch(System.Exception ex){Debug.Log("callSdk error:" + ex.Message);}}void TestCallJavaFunc(){try{AndroidJavaClass javaVM = new AndroidJavaClass(JAVA_CLASS_Name);AndroidJavaObject currentActivity = javaVM.GetStatic<AndroidJavaObject>("currentActivity");int result = currentActivity.Call<int>("Add", 1999, 1);logText.text = "Call Java Func :Add ,rusult:" + result.ToString();}catch(System.Exception ex){Debug.LogError("Call Sdk Error:" + ex.Message);logText.text = ex.Message;throw;}}public void ForJavaCallFunc(string str){logText.text = str;}public void TestFromJavaCallUnityFunc(){CallJavaFunc("JavaCallUnityFunc");}
}

七、打包测试

打包也是很多坑

sdk版本不匹配啊 Unity编译时找不到AndroidSDK的问题 | Unable to list target platforms

AndroidManifest.xml的包名和unity包名不匹配会闪退啊,各种坑,一脚一个深。

整了好久,终于可以互相调用了

理解了基本原理,下面接一个简单的分享链接的shareSDK测试一下是否能用。

AS导出具体流程: Android Studio 如何导出 Jar 给 Unity 使用

Classes.jar 介绍: Extending the UnityPlayerActivity Java Code

Android Studio导出jar包并在Unity3d中使用​gameinstitute.qq.com

【Unity游戏开发】SDK接入与集成--小白入门篇 - 马三小伙儿 - 博客园​www.cnblogs.com

删除 jar 的 asset_【unity游戏开发】SDK学习(1)-C#与jar交互相关推荐

  1. unity ui 补间动画_杭州Unity游戏开发培训内容有哪些?学习路线是如何规划的?...

    现在Unity游戏开发行业越来越受到欢迎,但是想要找到适合自己的课程和学习方法却有些困难.很多刚开始接触Unity游戏开发且没有基础的同学,不知道该从哪里开始学,也不知道要学习什么内容.该怎么开始Un ...

  2. 最全面的Unity游戏开发指南视频教程 第2卷

    最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小 ...

  3. Unity游戏开发之游戏存档方式

    目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法 4 ...

  4. unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理

    前言很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本 ...

  5. confluence 编辑器这次没有加载_喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:喵的Unity游戏开发之路 - 多场景:场景加载 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏 ...

  6. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  7. 喵的Unity游戏开发之路 - 玩家控制下的球的滑动

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  8. Unity游戏开发——新发教你做游戏(三):3种资源加载方式

    文章目录 一.前言 二.Unity的目录结构规范 1.Resources(不是很推荐把资源放这个目录) 2.RawAssets(存放生资源) 3.GameRes(存放熟资源) 4.StreamingA ...

  9. 喵的Unity游戏开发之路 - 互动环境(有影响的运动)

    如图片.视频或代码格式等显示异常,请查看原文: https://mp.weixin.qq.com/s/Sv0FOxZCAHHUQPjT8rUeNw 很多童鞋没有系统的Unity3D游戏开发基础,也不知 ...

最新文章

  1. 教程 | OpenCV深度神经网络实现人体姿态评估
  2. fpga mysql_FPGA的一些琐碎知识整理
  3. 苏大微型计算机原理与应用题库,苏州大学计算机原理及应用考研复习题.pdf
  4. Axure中后台管理信息系统通用原型方案 /框架模板/数据仪表/团队协作/会员管理/电商系统/资金统计/数据监控/销量统计/订单管理/客户管理/团队协作/职务管理/业务信息/员工管理/即时通讯
  5. linux上运行java程序 jar格式
  6. SQL Server 数据库之连接查询
  7. window驱动备份与安装
  8. linux之atoi,atol,atoll,atof
  9. 数据分析与挖掘建模(理论知识)
  10. 衡量计算机的指标(纯小白视角,帮助你理解如何去以较为专业的角度衡量计算机)
  11. 大疆精灵4多光谱无人机P4M影像辐射定标方法(三)
  12. flexbison编写语法分析器
  13. win10关闭快速启动_注意:win10系统快速启动功能虽然好用,但也会带来一些麻烦...
  14. 图像增强——伽马变换
  15. 基于php学生信息管理系统设计
  16. Hadoop权威指南——关于Sqoop
  17. 智和网管平台SugarNMS政府部门综合网管解决方案
  18. Docker安装MYSQL8及内存优化
  19. 日语中か行、た行的清辅音不在单词句首时发音的音便现象/浊音化现象
  20. 软件测试之系统测试总结报告

热门文章

  1. 小猿圈Web前端开发学习路线
  2. how to find the tomcat version info on linux
  3. 【计算机本科补全计划】Mysql 学习小计(2)
  4. Win8 Metro(C#)数字图像处理--3.3图像直方图计算
  5. 【PHP】Sublime下PHP网站开发指南
  6. 蚁群算法和简要matlab来源
  7. WebClient 文件下载
  8. 【Linux原理】Linux中硬链接和软链接的区别和联系
  9. 一篇文章搞定各种售后问题,电商客服运营看过来
  10. 福建省计算机二级c语言题型,计算机二级C语言题型和评分标准