Unity和Android交互笔记——接入Android SDK

本文对拥有相关经验的同学会有一些帮助,如果没有相关经验,请移步学习Android基础和Unity基础。如果有些看不懂的东西欢迎留言……

一、Unity和Android交互

     目前Unity和Android交互主要有两种方案:

  1. Android 打出 jar包或者aar包放在Unity的plugin/Android文件夹中以供调用;
  2. Unity 导出Android工程供Android Studio处理(早期这里也支持Eclipse,但是那东西太丑了这里不予讨论哈哈哈)

1.先说下Unity如何和Java进行交互

   Unity和Java交互,Unity为我们提供了一个很好用的工具类AndroidJavaClass,具体用法的话废话少说上代码。

public class SDK : MonoBehaviour
{
    private static SDK sdkInstance;
#if UNITY_ANDROID //&& !UNITY_EDITOR
    private AndroidJavaClass androidJavaClass;
    private AndroidJavaObject androidJavaObject;
#endif
    public static SDK Instance
    {
        get
        {
            if (sdkInstance == null)
            {
                sdkInstance = new SDK();
                return sdkInstance;
            }
            else
            { 
                return sdkInstance;
            }
        }
    }
    private SDK()
    {
        Init();
    }
    public void Init()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        androidJavaObject = androidJavaClass.GetStatic("currentActivity");
#endif

    }
//获取设备ID
    public string GetDeviceID()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        string s = androidJavaObject.Call("getDeviceId");//这里是调用Android Activity中注册的接口方法,怎么注册下面会讲到
        return s;
#else
        return "123456";//这里是写一个没有SDK的临时返回值,防止一些异常
#endif
    }

    public void ShowSDKLoginTips()
    {

#if UNITY_ANDROID && !UNITY_EDITOR
        androidJavaObject.Call("showSDKLoginTips");//这里是接口中的无返回值方法
#endif
    }
    
}

下面是对应的Android MainActivity方法:

public class MainActivity extends UnityPlayerActivity {
    public MainActivity() {
    }
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    public String showTest() {
        return "show test success";
    }
//这里是接口方法 获取设备ID
    public String getDeviceId() {
        String m_szDevIDShort = "35" + Build.BOARD.length() % 10 + Build.BRAND.length() % 10 + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 + Build.MANUFACTURER.length() % 10 + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10;
        String serial = null;

        try {
            serial = Build.class.getField("SERIAL").get((Object)null).toString();
            return (new UUID((long)m_szDevIDShort.hashCode(), (long)serial.hashCode())).toString();
        } catch (Exception var4) {
            serial = "serial";
            return "null";
        }
    }
//这里是接口方法
    public void showSDKLoginTips()
    {

    }
}

1.先说下Unity引入Jar包的方案

     首先在Android Studio中新建一个工程一个Empty Activity就可以了,然后引入Unity的class.jar包下面是Jar包相对路径,参考自己的Unity安装文件夹:../Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\class.jar(如何引入Jar包自己去参考Android Studio教程,后面也会发一篇别人教程的链接)

     要打Jar包的话记得处理下build.gradle 首先将 apply plugin: 'com.android.application' 改成 apply plugin: 'com.android.library'

     在MainActivity(可以自定义名字,但是记得要继承UnityPlayerActivity不然会出问题)中写入自己的接口,代码上面我复制了就不黏贴了。

      最后就是打jar包出来:

在项目根目录下的build.gradle末尾加入如下代码:

task makeJar(type: Copy) {
    delete 'build/outputs/mydemosdk.jar' //mydemosdk名字可自定义
    from('app/build/intermediates/aar_main_jar/release/')  //只适用于androidstudio 3.0或4.0及以上
    into('build/outputs/') //输出路径,可自定义
    include('classes.jar')
    rename ('classes.jar', 'mydemosdk.jar') //111名字可自定义
}

然后在Android Studio的右上角Gradle中就会出现如下截图的方法 路径:../task/other

Unity和Android交互笔记——接入Android SDK_第1张图片

这里有一个坑需要避免:from('app/build/intermediates/aar_main_jar/release/') //只适用于androidstudio 3.0或4.0及以上,这里的aar_main_jar在不同版本中可能名字不一样,可以自己在intermediates文件夹中查找。(备注:jar包塞入Unity后可以随意命名)

如果需要aar的话aar在输出目录下自行查找(这里也有一个坑,记得用压缩工具打开aar包删除class.jar,不然会出问题)。

最后就是把jar包导入到Unity 工程中这里还需要引入AndroidManifest.xml到工程中

Unity发布Android的APK时

如果在Plugins/Android( Unity特殊目录 ),不存在AndroidManifest文件,会使用Unity默认的AndroidManifest文件。默认的AndroidManifest文件目录在:Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk如果存在AndroidManifest文件,那么Unity会使用它代替默认的AndroidManifest文件,这个AndroidManifest,必须带有活动以及标签。

参考:



    android:versionCode="1"
    android:versionName="1.0" >
 
    
 
    
        
            
                
 
                
            
            
            
        
    
 

2.再说下Unity导出Android工程的方案

这里有一个小技巧,导出工程时Unity写引用Android方法不需要导入jar包,仅需要在Android中导出即可

如图所示导出Android 工程,这里有个天坑,后面会说下:

 

Unity和Android交互笔记——接入Android SDK_第2张图片

导出Android工程后就可以在AndroidStudio中打开工程了,后面在Android中的编辑工作参考上面Activity代码。

3.踩到的一个天坑

引入三方SDK时候player setting需要这样处理Scripting Backend 选择IL2Cpp(上架版需要支持64位),不然打开外挂程序(例如三方SDK)时候会发现莫名其妙的崩溃,初步认为是monolib.so文件的问题(也就是Unity的锅)

Unity和Android交互笔记——接入Android SDK_第3张图片

4.致谢 以及 参考链接地址

刚开始重新捡起Android和IOS接入的东西,有些思路不太完善,如果对读者产生了误导,请见谅,本人接受任何留言批评,并会尽快改正。       

这里要感谢@lizhengwei1989@jiaxunnanling两位大佬的两篇文章,让我避免了一些踩坑的东西(也是很久不做这些东西忘得差不多了),感谢大佬让我有一次提高的东西,顺便引用下两位的文章。

如有侵权请联系,本人会自行删除引用。

最后附上大佬的文章地址:

Android与Unity交互以及各种踩的坑:https://blog.csdn.net/lizhengwei1989/article/details/54631241  

Unity与Android交互-基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744

你可能感兴趣的:(Unity,Android)