• Android开发 互相调用模式之导出Jar包、扩展MainActivity、Java主导


    首先讲导出Jar包,在以前都是用这种方法,但是现在官方不推荐使用此方法,官方推荐导出Aar包

    (1)首先创建一个Android空工程

    注意:这里选择API 16,因为Unity支持的最低是API 16

    (2)创建一个新的模块

    依次选择,File > New > New Module,然后选择Android Library

    保证最小API等级为16

    (3)创建一个Activity

    创建好后,默认生成了一个xml布局,删除掉,我们的布局是unity控制的

    (4)切换到Project下,导入Unity支持包

    Unity支持包在Unity安装目录下:G:unity2017.1.1EditorDataPlaybackEnginesAndroidPlayerVariationsmonoReleaseClassesclasses.jar

    复制以上目录下的classes.jar,粘贴到libs文件夹下

    粘贴进去后,把这个包添加到当前模块中去

    (4)切回到Android下,打开AndroidManifest.xml,这相当于一个Android清单,告诉Android我们的程序都有哪些东西,每个页面都是干嘛的,还能配置一些权限。要扩展Unity的MainActivity,先改这个

    修改方法:将app文件夹下的AndroidManifest.xml的这部分复制过来,然后删掉红色报错部分

    修改label,以后安装到手机就是这个名字

    标识Activity的类型是Unity用的,加上下面的代码:

    <meta-data android:name="unityplayer.UnityActivity" android:value="true" />

    修改MainActivity.java

    (5) 提供一个方法给Unity,这里提供了一个简单的加法运算

    在java中写好这个方法后,要提供给Unity使用,先做出这个模块

    切换到Project,依次打开testlibrary > build > intermediates > bundles(老版本是这个,新版本是packaged-classes) > debug > libs下的jar包

    删除这个包,将debug目录下与libs文件夹同层的包拷贝进来

    把这个libs文件夹复制到桌面备用,然后把与libs文件夹同层的res文件夹也复制到桌面备用。但是新的版本的res文件夹是没有的,找了下,也是在文件夹packaged-classes下面

    然后把这个xml复制到桌面备用

    打开这个xml,修改这个名字为自己需要的名字,注意全部小写

    (6) 在Unity中使用这个方法

    创建好工程,设置为Android打包,设置包名,包名为上面xml中我们修改的那个

    创建文件夹Plugins及其子文件夹Android(注意:这两个文件夹名字是固定的),将复制到桌面上的3个东西拷贝进去

    创建一个脚本挂在相机上,在这里我们使用Unity来调用Android那边提供的add方法,然后把结果显示在Text组件上。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Test : MonoBehaviour {
    
        public Text text;
    
    	void Start () {
            // 获得位于com.unity3d.player包下的UnityPlayer类
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            // 获得jc所代表的类下的currentActivity对象
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    
            // 调用Android提供的Android方法
            // 使用Call调用,<>表示有返回值,没有返回值则不需要这个
            text.text = jo.Call<int>("add", 2, 3).ToString();
    	}
    }
    

    数据线连接手机,打包,可以看到结果

    (7)上面是在Android中定义了一个方法,在Unity中调用。现在我们在Unity中定义一个方法,在Android中调用。

    定义一个简单的方法,改变字体的颜色。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Test : MonoBehaviour {
    
        public Text text;
    
    	void Start () {
            // 获得位于com.unity3d.player包下的UnityPlayer类
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            // 获得jc所代表的类下的currentActivity对象
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    
            // 调用Android提供的Android方法
            // 使用Call调用,<>表示有返回值,没有返回值则不需要这个
            text.text = jo.Call<int>("add", 2, 3).ToString();
    	}
    
        public void ChangeColor()
        {
            text.color = Color.red;
        }
    }
    

    在Android中调用,使用方法:

    UnityPlayer.UnitySendMessage("Main Camera","ChangeColor","");

    第一个参数表示脚本所挂载的位置,第二个参数表示函数名,第三个参数表示参数

    重新Build,导出libs和res文件夹,替换Unity下对应文件夹,然后重新打包运行,结果:

  • 相关阅读:
    Talk the Talk
    2.1 使用eclipse4.4 搭建 maven简单结构项目。
    [LeetCode] Best Time to Buy and Sell Stock
    hdu4605Magic Ball Game 树状数组
    phoenixframe自己主动化平台在Linux环境下运行用例的说明
    数据存储值归档Archive
    BZOJ 1040 ZJOI2008 骑士 树形DP
    HDOJ 5357 Easy Sequence DP
    Autodesk 招聘Revit二次开发咨询顾问,与Autodesk全球团队紧密合作,提高职业生涯的好机会
    Codeforces Round #263 (Div. 1) A B C
  • 原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798668.html
Copyright © 2020-2023  润新知