当前位置:   article > 正文

接sdk_【unity游戏开发】SDK学习(1)-C#与jar交互

unity 接入sdk 导入jar包

引言

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

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

概述

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

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

实践

一、创建Android工程(Android Studio)

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

8e3aafa534baf2968e451f463aacd196.png

c85e2df5c9839b1115f33431f3adf96c.png

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

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

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

3f35b8b30c92f96e1c7327aeba704df1.png

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

三、编写Android端的代码

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

cfdc7c90b3cca1cf7494ae9ecdb14863.png

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

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

  1. package com.Aver3.Snake;
  2. import com.unity3d.player.UnityPlayerActivity;
  3. import com.unity3d.player.UnityPlayer;
  4. import android.os.Bundle;
  5. public class MainActivity extends UnityPlayerActivity {
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. // setContentView(R.layout.activity_main); 注释掉 不显示View
  10. }
  11. //供U3D调用的方法
  12. public int Add(int x,int y){
  13. return x + y;
  14. }
  15. // Android调用Unity的方法
  16. public void JavaCallUnityFunc(){
  17. String str="Android Call Unity.";
  18. String UnityClass="Canvas";
  19. String UnityMethod="ForJavaCallFunc";
  20. //参数1:unity脚本挂载的gameobject 参数2:方法名 参数3:要传递的参数
  21. UnityPlayer.UnitySendMessage(UnityClass, UnityMethod, str);
  22. }
  23. }

四、导出Android项目为Jar包

  1. 修改build.gradle模块文件

e4b21318c39dd056eed062cfe45d7b7a.png
  1. //apply plugin: 'com.android.application'
  2. apply plugin: 'com.android.library' //说明是Library模块
  3. android {
  4. compileSdkVersion 28
  5. defaultConfig {
  6. // applicationId "com.Aver3.Snake"
  7. minSdkVersion 17
  8. targetSdkVersion 28
  9. versionCode 1
  10. versionName "1.0"
  11. multiDexEnabled true
  12. }
  13. buildTypes {
  14. release {
  15. //混淆
  16. minifyEnabled false
  17. //加载默认混淆配置文件
  18. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  19. }
  20. }
  21. lintOptions {
  22. abortOnError false
  23. }
  24. dexOptions {
  25. javaMaxHeapSize "4g"
  26. }
  27. }
  28. //删除build.gradle里的依赖
  29. //这里要删的话,导出前删,否者会XML配置会报错
  30. dependencies {
  31. implementation fileTree(include: ['*.jar'], dir: 'libs')
  32. implementation 'com.android.support:appcompat-v7:28.0.0'
  33. implementation files('libs/classes.jar')
  34. }
  35. task makeJar(type: Copy) {
  36. delete 'build/libs/mysdk.jar' //删除旧的Jar包
  37. from('build/intermediates/intermediate-jars/release') //从该地址复制
  38. into('build/libs/') //复制到该地址
  39. include('classes.jar') //包含文件
  40. rename ('classes.jar', 'mysdk.jar') //重命名
  41. }
  42. makeJar.dependsOn(build)

2. 删除单元测试

删除androidTest和Test

29d25db85a3fb2e28333c146e51182e8.png

3. 删除布局文件

删除activity_main.xml

bbcbb09c96fb096108c275cd3c99831a.png

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.Aver3.Snake"
  4. android:installLocation="auto">
  5. <application
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".MainActivity"
  12. android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. </application>
  19. </manifest>

5. 同步gradle

08333e5bb51d076f9264baf92c039241.png

6. 运行makeJar 任务

5faa6fc00150fb968e41be28ef8442c1.png

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

88320e010ce35b7c37562342fac53c81.png

272b71faf7bf00c374dfe5b663794c88.png

五、导入 Unity

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

953b4c8a00b9c5c011594488ff23f132.png

2. 修改AndroidManifest.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.Aver3.Snake">
  4. <application
  5. android:theme="@style/UnityThemeSelector"
  6. android:icon="@drawable/app_icon"
  7. android:label="@string/app_name">
  8. android:theme="@style/UnityThemeSelector">
  9. <activity android:name="com.Aver3.Snake.MainActivity"
  10. android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
  11. <intent-filter>
  12. <action android:name="android.intent.action.MAIN" />
  13. <category android:name="android.intent.category.LAUNCHER" />
  14. </intent-filter>
  15. <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
  16. </activity>
  17. </application>
  18. </manifest>

六、unity和Jar交互

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

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

2. jar调用unity

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

例子:

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. public class Test : MonoBehaviour
  4. {
  5. public Button btn1;
  6. public Button btn2;
  7. public Text logText;
  8. private void Start()
  9. {
  10. btn1.onClick.AddListener(TestCallJavaFunc);
  11. btn2.onClick.AddListener(TestFromJavaCallUnityFunc);
  12. logText.text = "Start";
  13. }
  14. private const string JAVA_CLASS_Name = "com.unity3d.player.UnityPlayer";
  15. private void CallJavaFunc(string javaFuncName, params object[] args)
  16. {
  17. try
  18. {
  19. //获取到AndroidJavaClass,至于这里为什么调用这个类,我也不是很清楚
  20. //获取unity的Java类,只能调用静态方法,获取静态属性
  21. using(AndroidJavaClass jc = new AndroidJavaClass(JAVA_CLASS_Name))
  22. {
  23. //获取到Activity
  24. using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
  25. {
  26. //调用Java方法
  27. jo.Call(javaFuncName, args);
  28. }
  29. }
  30. }
  31. catch(System.Exception ex)
  32. {
  33. Debug.Log("callSdk error:" + ex.Message);
  34. }
  35. }
  36. void TestCallJavaFunc()
  37. {
  38. try
  39. {
  40. AndroidJavaClass javaVM = new AndroidJavaClass(JAVA_CLASS_Name);
  41. AndroidJavaObject currentActivity = javaVM.GetStatic<AndroidJavaObject>("currentActivity");
  42. int result = currentActivity.Call<int>("Add", 1999, 1);
  43. logText.text = "Call Java Func :Add ,rusult:" + result.ToString();
  44. }
  45. catch(System.Exception ex)
  46. {
  47. Debug.LogError("Call Sdk Error:" + ex.Message);
  48. logText.text = ex.Message;
  49. throw;
  50. }
  51. }
  52. public void ForJavaCallFunc(string str)
  53. {
  54. logText.text = str;
  55. }
  56. public void TestFromJavaCallUnityFunc()
  57. {
  58. CallJavaFunc("JavaCallUnityFunc");
  59. }
  60. }

七、打包测试

打包也是很多坑

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

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

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

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

14ac649f74417a5cc371f3ad46da1f38.png

c90c945e204240157867082f074c7314.png

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

Classes.jar 介绍: Extending the UnityPlayerActivity Java Code

Android Studio导出jar包并在Unity3d中使用​gameinstitute.qq.com
4842b1ac3ad83cee941d4ec62f8b5560.png
【Unity游戏开发】SDK接入与集成--小白入门篇 - 马三小伙儿 - 博客园​www.cnblogs.com
8d0a9f27e73dbaa477ddc17dc737f31b.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/323071
推荐阅读
相关标签
  

闽ICP备14008679号