(五)Unity插件生成

1)新建空的AndroidStudio工程,但是新建过程时最小SDK版本要与unity一致,如下图所示,本次操作均为api16

 

2)创建Library,如下图所示,新建module,然后选择Android Library。

新建模块为UnityPlugin,如下图所示,注意此时的PackageName后续用得到

4)引入unity的classes.jar

按下图所示,找到Unity安装目录下的classes.jar文件,并放入上述工程中unitypluginlibs下(即新建Module下的libs下)。

 

选择File-ProjectStructure,调出Project Structure界面,依次选择unityplugin(上述建立的module)-Dependencies,然后点击右侧加号-Jar dependences,并选择libs下引入的classes.jar,如下图所示,确定引入。

5)添加插件代码

在com.idea.unityplugin下新建类UnityPlugin

在类UnityPlugin(继承UnityPlayerActivity )中添加如下代码

package com.idea.unityplugin;

import android.os.Bundle;
import android.widget.Toast;

import com.unity3d.player.UnityPlayerActivity;

public class UnityPlugin extends UnityPlayerActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }

    // 传入数据,并通过toast显示
    public void ShowToast(final String message){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
            }
        });
    }

    // 返回一个字符串(静态方法)
    public static String GetInformation()
    {
        return "Android Static Msg";
    }
    // 返回一个字符串(非静态方法)
    public String GetInfo()
    {
        return "Android Msg";
    }
}

6)生成jar或者aar包

点击build.gradle(此插件的gradle),添加如下代码,操作如下图所示。(也可直接点击Build-MakeModule'app'来生成aar包,然后解压出生成的aar包,只取出jar包),也可采用下述方法,两者均可。

Ps:经测试发现,下述方法根据Gradle版本不同,使用命令行gradlew makeJar时会失效,因为不同版本From(‘buildXXXXXXXXrelease’)内的debug和release路径均不同,但是点击右上方Gradle-unityplugin-Tasks-other-makeJar可以使用)。

task makeJar(type: Copy) {
    delete 'build/libs/unityplugin.jar'
    from('build/intermediates/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename('classes.jar', 'unityplugin.jar')
}

makeJar.dependsOn(build)

 点击Terminal,输入gradlew makeJar回车,等待执行结束即可,即可在unitypluginuildoutputsaar下目录下找到.aar文件。

 

7)将6)中aar文件放入unity中Assets文件下PluginsAndroid目录下,同时新建AndroidManifest.xml文件,并添加如下内容

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxxx.androidplugin"
    android:versionCode="1"
    android:versionName="1.0">
 
    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity android:name="com.XXXX.unityplugin.UnityPlugin"
                  android:label="@string/app_name">
            <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

注意事项如下图所示

8)调用代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CallAndroidMethod : MonoBehaviour
{
    public Button[] buttons;
    public Text text;
    
    private void ShowAndroidToast()
    {
        //text.text = "Toast ";
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                text.text = "Toast:";
                jo.Call("ShowToast", "Android Toast");
            }
        }
        //using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        //{
        //    text.text += " Toast1 ";
        //    using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("crrentActivity"))
        //    {
        //        text.text += " Toast2 ";
        //        //jo.Call("ShowToast", "Android Toast");
        //        jo.CallStatic<string>("GetInformation");
        //        text.text += " Toast3 ";
        //    }
        //}
    }

    private void GetInfomation()
    {
        string info = "";

        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                text.text = "Static:";
                info = jo.CallStatic<string>("GetInformation");
            }
        }

        text.text += info;
    }

    private void GetInfo()
    {
        string info = "";

        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                text.text = "Nonstatic:";
                info = jo.Call<string>("GetInfo");
            }
        }

        text.text += info;
    }

    // Use this for initialization
    void Start ()
    {
        buttons[0].onClick.AddListener(ShowAndroidToast);
        buttons[1].onClick.AddListener(GetInfomation);
        buttons[2].onClick.AddListener(GetInfo);
    }
}

然后发布apk即可用了

出现问题:

1)CommandInvokationFailure: Gradle build failed.

解决:修改Build System为Internal

2)IOException: Failed to Move File / Directory from 'Temp/StagingAreaandroid-librariesapp-debugclasses.jar' to 'Temp/StagingAreaandroid-librariesapp-debuglibsclasses.jar'.

解决:将插件aar文件用解压软件打开(直接双击),并不解压,然后删除libs下的classed.jar即可。

参考文献:

https://blog.csdn.net/qq_16763249/article/details/81876038(非MainActivity调用方法,纯java类调用)

https://blog.csdn.net/qq_28775437/article/details/78605691?locationNum=3&fps=1(打包报错问题汇总)

https://blog.csdn.net/qiu_zhongya/article/details/51419456(主要参考文献_原文)

原文地址:https://www.cnblogs.com/llstart-new0201/p/9995022.html