zoukankan      html  css  js  c++  java
  • (五)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(主要参考文献_原文)

  • 相关阅读:
    挑战程序设计竞赛 dp
    算法导论 动态规划
    算法导论第二章
    divide conquer
    时间戳
    bootstrap 针对超小屏幕和中等屏幕设备定义的不同的类
    jQuery中的Ajax
    怎么判断一个变量是Null还是undefined
    认识Ajax
    关于apache
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/9995022.html
Copyright © 2011-2022 走看看