Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >unity和android的项目交互

unity和android的项目交互

作者头像
包子388321
发布于 2020-06-16 10:32:46
发布于 2020-06-16 10:32:46
2.5K00
代码可运行
举报
文章被收录于专栏:包子的书架包子的书架
运行总次数:0
代码可运行

背景

由于近期工作要求需要给实现unity5.6.5上打包android的项目,个人算是研究一天左右,才完成这个工作,将自己遇到的坑和一些学习操作的过程,总结一下与大家分享。

开发工具

unity5.6.5 官方下载地址 android studio3.1.2 下载地址

利用Android Studio导出可供Unity使用的aar插件

1、第一步,点击File->New->New Project,打开"Create New Project"对话框,选择合适的Application name与Company Domain,保证Package name与Unity项目中的Bundle Idenifier一致(这个地方很重要因为如果没有设置一样会找不到activity的类)

2、第二步,选择Phone and Tablet,并选择合适的Minimum SDK(也可以在创建后的build.gradle中设置)

3、第三步,选择“Empty Activity”

image.png

4、第四步,保持默认的Activity Name与Layout Name即可 5、最后,点击"Finish"创建工程

添加Unity的classes.jar引用

在unity的安装目录下:D:\Program Files\Unity\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar,将该文件拷贝到app module下的libs目录

image.png

然后添加jar的依赖,这边是单独依赖,也可以直接依赖libs下的所有jar包 implementation fileTree(include: ['*.jar'], dir: 'libs')

开始编写android给unity调用的代码

1、编写unity调用的主窗口类,即继承UnityPlayerActivity,必须要去掉setContentView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import android.os.Bundle;
import android.widget.Toast;

import com.unity3d.player.UnityPlayerActivity;

public class MainActivity 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 "This is a Plugin's content!";
    }
}

2、在AndroidManifest.xml清单文件这个类添加配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cby.unitydemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:theme="@android:style/Theme.NoTitleBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <!--添加unity的配置-->
            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
        </activity>
    </application>

</manifest>

修改gradle配置,打包出aar文件

将app的gradle的文件 'com.android.application' 修改为 'com.android.library',然后需要去掉applicationId

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

导出供Unity使用的*.aar文件

1、点击“Build -> ReBuild Project”,生成aar文件 2、用压缩软件打开aar文件,删除掉libs下的刚刚导入的unity的classes.jar的文件,因为unity环境本身有改文件,如果没有删除会在unity编译打包的时候出错

Unity导入插件,并调用

1、新建Unity项目,创建Secne场景

2、在左测边,添加了两个按钮和文本,可以点右-->UI-->Button,然后点击按钮再you右侧的Inspector调整

3、在unity的project下的assert目录下新建plugins目,然后再plugins目录下,在新建Android目录,将aar文件和项目的AndroidManifest.xml文件拷贝进去

4、创建unity的脚本文件 C#的文件 可以在plugins下载新建个scripts的目录,放置新建的脚本文件

5、编写甲苯文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Call : MonoBehaviour {

    // Use this for initialization
    private Transform canvasForm;
    private Button testButton;
    private Button showButton;
    private Text ResultText;

    void Start () {
        canvasForm = GameObject.Find("Canvas").transform;
        //获取控件对象设置时间监听
        testButton = canvasForm.Find("TestButton").GetComponent<Button>();  
        showButton = canvasForm.Find("ShowButton").GetComponent<Button>();
        ResultText = canvasForm.Find("ResultText").GetComponent<Text>();
        testButton.onClick.AddListener(BtnShwMessage);
        showButton.onClick.AddListener(showClick);
        ResultText.text = "hello";
    }

    public void showClick()
    {
        Debug.Log("showClick click");
        print("执行了showClick方法!");
        ResultText.text = "show the click event";
    }

    public void BtnShwMessage()
    {
            
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        //调用成员方法
        jo.Call("ShowToast", "Unity 调用了这个方法");

        //调用静态方法
        ResultText.text = jo.CallStatic<string>("GetInformation");
    }

    // Update is called once per frame
    void Update () {
        
    }

}

代码中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

这两句代码是unity调用android代码的窗口,照抄就是了。 6、编写上述的脚本文件,就需要将该脚本文件添加到component中,设置调用 通过add component-->scripts, 然后选择所开发的脚本文件

image.png

7、导出APK,File-->Build Setting

点击Player setting ,在右侧显示Inspector中设置package name (这边的包名就是和android 项目清单文件的包名要一致)

image.png

8、设置好了点击Build and run,打包apk,记得连接上手机

image.png

好了,大功告成,这样就完成了,unity调用android aar打包apk

补充

如果在android 中打aar包时,有要调用activity的互相调用的时候,如果要调用的activity的父类是AppCompatActivity 或者是FragmentActivity之类的,不是原生包的时候,是其他包类似support v4的,需要在项目libs下导入对应的support包,因为Android studio的implementation 'com.android.support:appcompat-v7:26.+'的依赖是不会打包进去,不然会报错提示找不到class

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
selenium自动化测试报告_selenium自动化测试断言
注意:driver.close() ,当前关闭的是主窗口,只有完成页面切换才可以关闭当前新的页面
全栈程序员站长
2022/11/15
2.8K0
selenium自动化测试报告_selenium自动化测试断言
selenium最大化浏览器-Web UI自动化测试之Selenium工具篇
  注意:3.0 版本下所有浏览器除了需要安装 框架 以外,还需要安装对应的驱动程序
宜轩
2022/12/26
2.2K0
Selenium4+Python3系列(八) - Cookie、截图、单选框及复选框处理、富文本框、日历控件操作
我所在的城市昨天出了近20+的阳性案例,但这丝毫没有 影响 到996的工作时间,当然,也没有影响到我想继续更新文章的决心。
软件测试君
2022/12/05
2.7K0
Selenium4+Python3系列(八) - Cookie、截图、单选框及复选框处理、富文本框、日历控件操作
【Python爬虫实战】Selenium自动化网页操作入门指南
在现代网络开发和数据爬取中,Selenium 已成为不可或缺的自动化工具之一。无论是用于测试、数据抓取,还是模拟用户行为,Selenium 都可以在不干预的情况下自动化浏览器操作,为开发者节省大量时间和精力。本指南将带您从 Selenium 的安装配置到高级操作,逐步掌握网页自动化的核心技巧。
易辰君
2024/11/07
2.1K0
《selenium2 python 自动化测试实战》(10)——下拉框和alert
先上代码: # coding: utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep # 去掉"Chrome正受到自动测试软件的控制。" options = webdriver.ChromeOptions() options.add_argument('disable-infobars') d
孟船长
2018/05/18
1.1K0
使用Selenium自动化操作浏览器
Selenium可以自动化操作浏览器,例如:选择元素,输入,点击等,可以用于软件自动化测试,爬虫等工作,也可以做你想做的任何事情。
YaoQi
2025/07/14
3992
使用Selenium自动化操作浏览器
Python+Selenium笔记(九):操作警告和弹出框
#之前发的 driver.switch_to_alert() 这句虽然可以运行通过,但是会弹出警告信息(这种写法3.x不建议使用)  改成 driver.switch_to.alert就不会了。 (一) 前言 开发人员使用JavaScript 警告或者模态对话框来提示校验错误信息、报警信息、执行操作后的返回信息,甚至用来接收输入值等。 (二) Alert类 Selenium WebDriver 通过Alert 类来操控 JavaScript 警告。 (三) Alert功能及方法 功能/属性 简
free赖权华
2018/04/27
4.1K0
Python+Selenium笔记(九):操作警告和弹出框
软件测试|selenium弹窗操作
<font size='3'>说明:本篇博客基于selenium 4.1.0</font>说明操作弹窗共分两步:创建弹窗对象alert = driver.switch_to.alert操作弹窗print(alert.text) # 获取弹窗文本alert.send_keys('helloworld') # 弹窗输入,需要弹窗有输入框才能输入alert.accept() # 弹窗确定,等同于点击弹窗的'确定'按钮alert.dismiss()
霍格沃兹测试开发Muller老师
2022/12/28
7200
Python爬虫(二十一)_Selenium与PhantomJS
本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的页面,甚至页面截屏,或
用户1174963
2018/01/17
3K0
Python爬虫(二十一)_Selenium与PhantomJS
用Selenium来爬取数据?真挺简单的!
于是Selenium就应运而生了,它可以算的上是自动化测试框架中的佼佼者,因为它解决了大多数用来爬取页面的模块的一个永远的痛,那就是Ajax异步加载 。今天将给大家详解如何用Selenium爬取数据,并最后附上一个真实的案例。
快学Python
2021/08/09
5K0
Selenium操作Frame中的页面元素
在Web应用中经常会遇到网页中嵌套多个Frame框架的情况。这种情况下,如果直接去定位嵌套在Frame页面中的元素就会抛出NoSuchElementException异常。所以在操作嵌套在Frame框架上页面元素前,需要将页面焦点切换到Frame中。Selenium提供的switch_to.frame()方法可以实现Frame之间的跳转。
Altumn
2019/10/21
2.9K0
Selenium操作Frame中的页面元素
Python Selenium库的使用「建议收藏」
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
全栈程序员站长
2022/07/29
4.8K0
Python Selenium库的使用「建议收藏」
Selenium和PhantomJS 终极最全使用总结
1. 加载页面[image.png]PhantomJS 截取的是网页的完整页面,包括下拉进度条的内容
Python疯子
2018/08/27
3.5K0
Selenium 系列篇(三):窗口篇
Selenium 自动化过程中,对窗口本身的操作包含:打开一个窗口、关闭一个窗口、刷新一个窗口、窗口的回退和前进。
AirPython
2020/09/22
2.7K0
Selenium 系列篇(三):窗口篇
【Python爬虫实战】全面掌握 Selenium 的 IFrame 切换、动作链操作与页面滚动技巧
在使用 Selenium 进行网页自动化测试或数据抓取时,我们经常会遇到需要操作 iframe、模拟复杂的 用户交互动作,以及处理 动态加载页面 的情况。这些操作是实现稳定且高效自动化流程的关键。本指南将详细介绍如何切换 iframe、使用动作链执行复杂交互,以及如何通过页面滚动加载更多内容。无论是自动化测试还是爬取动态网页,这些技巧都能帮助你更好地控制浏览器。
易辰君
2024/11/07
1.6K0
web自动化08-下拉选择框、弹出框、滚动条
我们首先可以通过直接定位下拉框中的内容对应的元素,完成对下拉框元素的处理,我们也可以通过select类
似小陈吖
2023/10/17
7070
《手把手教你》系列练习篇之8-python+ selenium自动化测试 -压台篇(详细教程)
  本文是练习篇的最后一篇文章,虽然练习篇的文章到此就要和大家说拜拜了,但是我们的学习之路才刚刚开始。不要停下你的脚步,大步朝前走吧!比你优秀的人还在走着,我们有什么理由停下自己的脚步了,生命不止,学习亦是如此。好了,宏哥的毒鸡汤好
北京-宏哥
2019/12/10
1.8K0
《手把手教你》系列练习篇之8-python+ selenium自动化测试 -压台篇(详细教程)
Selenium2+python自动化47-判断弹出框存在(alert_is_present)
前言 系统弹窗这个是很常见的场景,有时候它还没弹出来去操作的话,会抛异常,这就需要去判断弹窗是否弹出了。 本篇接着Selenium2+python自动化42-判断元素(expected_conditions)讲expected_conditions这个模块 一、判断alert源码分析 class alert_is_present(object): """ Expect an alert to be present.""" """判断当前页面的alert弹窗""" def __init
上海-悠悠
2018/04/08
5.8K0
Selenium2+python自动化47-判断弹出框存在(alert_is_present)
Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)
判断button是否显示,和is_displayed()容易混淆的是is_enabled()。
软件测试君
2022/12/05
1.1K0
Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)
Python爬虫之selenium
注意:用 xpath时,如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出 NoSuchElementException 的异常
白墨石
2021/01/13
5060
推荐阅读
相关推荐
selenium自动化测试报告_selenium自动化测试断言
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验