【Unity3D】Unity与Android交互

1 Unity 发布 apk

1.1 安装 Android Build Support

        在 Unity Hub 中打开添加模块窗口,操作如下。

        选择 Android Build Support 安装,如下(笔者这里已安装过)。 

         创建一个 Unity 项目,依次点击【File→Build Settings→Android→Switch Platform】,配置如下。

        依次点击【Edit→Preferences→External Tools】打开 JDK、SDK、NDK、Gradle 配置页面,配置如下(勾选默认配置就行,也可以选择已安装的 JDK、SDK、NDK、Gradle路径)。

1.2 配置密钥

        依次点击【Edit→Project Settings→Player→Keystore Manager】(也可以从【File→Build Settings→Player Settings→Keystore Manager】中进入),操作如下。

        打开 Keystore Manager 后, 依次点击【Create New→Anywhere】,选择一个目录保存密钥库文件,笔者保存在项目目录下面的【Keystore/user.keystore】中。

        接着设置密码和别名,其他选项不是必设项。

        Add Key 后,会弹出“是否将创建的密钥库作为项目的密钥库”弹窗,点击 yes 确认。

         设置密钥后,回到 Project Settings 页面,显示如下。

        创建密钥时,也可以通过以下命令创建。

keytool -genkey -keyalg RSA -alias key_name -keystore keystore_name -validity day_time
keytool -genkey -keyalg RSA -alias first -keystore user -validity 36500

1.3 打包 apk

        依次点击【File→Build Settings→Player Settings】,配置公司名、项目名、版本号等信息,如下。

        在 Other Settings 中配置包名、Android SDK 的最小 API 版本、目标 API 版本等信息,如下。 

        关闭 Player Settings,在 Build Settings 页面点击底部的 Build,构建 apk。 

1.4 案例

        新建一个 Unity 项目,修改 Game 页面的屏幕尺寸,如下。

        搭建页面如下。

        给 Button 按钮添加脚本,如下。

        Test.cs

using UnityEngine;
using UnityEngine.UI;public class Test : MonoBehaviour {private Button button;private void Start() {button = GetComponent<Button>();button.onClick.AddListener(OnClick);}private void OnClick() {Debug.Log("Test-OnClick");}
}

        编译 apk 后,打开命令行窗口,输入以下命令安装到手机上。

adb instll -r -t -d Test.apk

        运行 apk 后,在命令行窗口中通过以下命令查看日志。

adb logcat | findstr "Test-OnClick"

         点击 Button 按钮,打印日志如下。

2 Unity 调 Android 的逻辑

2.1  Unity 项目中部署 Android 代码

        1)拷贝 Java 源码到 Unity 项目

        可以将 Android 项目中 Java 代码拷贝到 Unity 项目中 Assets 子目录下,如下,接着就可以通过 AndroidJavaClass 或 AndroidJavaObject 访问 Java 代码了。

        2)打包 Jar 到 Unity 项目

        可以将 Android 项目打包为 Jar,再将 Jar 拷贝到 Unity 项目中 Assets 子目录下,接着就可以通过 AndroidJavaClass 或 AndroidJavaObject 访问 Java 代码了。

        修改 Android 项目中 Module 的 build.gradle 文件,如下,主要将 id 由 'com.android.application' 修改为 'com.android.library',删除 android { } 模块中的 defaultConfig、buildTypes、compileOptions 子模块。

        build.gradle

plugins {id 'com.android.library'
}android {namespace 'com.zhyan8.test'compileSdk 33
}dependencies {implementation 'androidx.appcompat:appcompat:1.6.1'implementation 'com.google.android.material:material:1.8.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.5'androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

        修改 build.gradle 文件后,需要点击右上角的 Sync Now 同步,接着按以下步骤编译项目。

        编译结束后,在 Module 的【build\intermediates\aar_main_jar\debug】目录下生成打包的 classes.jar。

        预览 classes.jar 文件如下。

2.2 AndroidJavaObject 和 AndroidJavaClass

        AndroidJavaObject 和 AndroidJavaClass 是 Unity 提供的调用 Java 代码的 2 个类,AndroidJavaClass 继承 AndroidJavaObject,它们只有构造方法有一点差异,没有其他的差异,因此,本节只介绍 AndroidJavaObject。

        1)Set 和 Get 属性

        JavaTest.java

package com.zhyan8.test;public class JavaTest {public static int intVal = 0;private String strVal = "abc";
}

        UnityTest.cs

using UnityEngine;public class UnityTest : MonoBehaviour {private void Start() {AndroidJavaObject javaObject = new AndroidJavaObject("com.zhyan8.test.JavaTest");// 静态属性Set/GetjavaObject.SetStatic<int>("intVal", 123);int intVal = javaObject.GetStatic<int>("intVal");Debug.Log("UnityTest, intVal=" + intVal); // 打印: UnityTest, intVal=123// 非静态属性Set/GetjavaObject.Set<string>("strVal", "xyz");string strVal = javaObject.Get<string>("strVal");Debug.Log("UnityTest, strVal=" + strVal); // 打印: UnityTest, strVal=xyz}
}

        说明:对于 JavaTest 的 private 属性,AndroidJavaObject 也可以访问到。

        2)调用方法

        JavaTest.java

package com.zhyan8.test;import android.util.Log;public class JavaTest {public static void fun1() {Log.d("JavaTest", "fun1"); // 打印: JavaTest: fun1}private int fun2() {Log.d("JavaTest", "fun2"); // 打印: JavaTest: fun2return 123;}public String fun3(int value) {Log.d("JavaTest", "fun3, value=" + value); // 打印: JavaTest: fun3, value=235return "Call fun3";}public String fun4(String value1, int value2) {Log.d("JavaTest", "fun4, value1=" + value1 + ", value2=" + value2); // 打印: JavaTest: fun4, value1=abc, value2=123return value1 + value2;}
}

        说明:对于 JavaTest 的 private 方法,AndroidJavaObject 也可以访问到。  

        UnityTest.cs

using UnityEngine;public class UnityTest : MonoBehaviour {private void Start() {AndroidJavaObject javaObject = new AndroidJavaObject("com.zhyan8.test.JavaTest");// 静态方法javaObject.CallStatic("fun1");// 非静态无参方法int val2 = javaObject.Call<int>("fun2");Debug.Log("UnityTest, val2=" + val2); // 打印: UnityTest, val2=123// 非静单参方法string val3 = javaObject.Call<string>("fun3", 235);Debug.Log("UnityTest, val3=" + val3); // 打印: UnityTest, val3=Call fun3// 非静双参方法string val4 = javaObject.Call<string>("fun4", "abc", 123);Debug.Log("UnityTest, val4=" + val4); // 打印: UnityTest, val4=abc123}
}

        运行程序后,打印日志如下。

2.3 Unity 调用 Android 的 Toast

        UnityTest.cs

using UnityEngine;
using UnityEngine.UI;public class UnityTest : MonoBehaviour {private void Start() {GetComponent<Button>().onClick.AddListener(() => {Toast("Clicked", 1);});}// 调用Android的代码: Toast.makeText(context, msg, durationFlag).show();private void Toast(string msg, int durationFlag) { // durationFlag: Toast.LENGTH_SHORT=0, Toast.LENGTH_LONG=1AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject>("makeText", currentActivity, msg, durationFlag);toast.Call("show");}
}

        UnityPlayer 是 Unity 引擎提供的 Java 类。

3 Android 调 Unity 的逻辑

3.1 Unity 打包为 Android 项目

        在 Build Settings 页面勾选 Export Project 后,点击 Export 按钮,如下。

        构建成功后,Unity 项目将会被打包成一个 Android 项目,我们可以使用 Android Studio 打开生成的 Android 项目。

D:\Program Files\Unity Hub\Unity\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar

3.2 Unity 打包为 aar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/117913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot maven项目环境搭建idea

springboot maven项目环境搭建idea 文章目录 springboot maven项目环境搭建idea用到的软件idea下载和安装java下载和安装maven下载和安装安装maven添加JAVA_HOME路径&#xff0c;增加JRE环境修改conf/settings.xml&#xff0c;请参考以下 项目idea配置打开现有项目run或build打…

ubuntu 安装卸载 deb软件

install sudo dpkg -i 软件包名.deb uninstall sudo apt-get remove 软件包名称 reference https://help.ubuntu.com/kubuntu/desktopguide/zh_CN/manual-install.html

什么是WMS系统条码化管理

WMS系统是一种用于仓库管理的信息化系统&#xff0c;旨在提高仓库操作的效率和准确性。而在WMS系统中&#xff0c;条码化管理是一项关键的技术和方法&#xff0c;它通过将商品和物料打上条码&#xff0c;并利用扫描设备进行数据采集和处理&#xff0c;实现了仓库管理的全面自动…

深度学习模型笔记

加载和保存模型参数 保存模型参数 net MLP() # 此处省略训练过程&#xff0c;在训练之后&#xff0c;保存模型参数 # 保存字典格式的模型参数&#xff0c;模型参数名 torch.save(net.state_dict(), mlp.params) 加载模型参数 clone MLP() # 加载模型参数 clone.load_state…

【Axios封装示例Vue2】

文章目录 为什么要封装axios&#xff1f;如何封装axios在Vue组件中使用封装的axios 为什么要封装axios&#xff1f; 在Vue 2项目中&#xff0c;直接在组件中使用axios可能会导致以下问题&#xff1a; 代码重复&#xff1a;每个组件都需要导入axios并编写相似的请求代码&#…

开源大数据组件

集群&#xff1a;DataSphereStudio https://gitee.com/WeBank/DataSphereStudio?utm_sourcealading&utm_campaignrepo BI报表&#xff1a;DataEase https://github.com/dataease/dataease 集群管理 HDP/CDH/CDP – Todo

用 Rust 和 cURL 库制作一个有趣的爬虫

目录 一、介绍 二、准备工作 三、代码实现 四、解析 HTML 并提取特定元素示例 总结 本文将介绍如何使用 Rust 编程语言和 cURL 库制作一个有趣的网络爬虫。我们将通过实例代码来展示如何抓取网页内容、处理数据和解析 HTML 结构。同时&#xff0c;还将探讨爬虫技术的原理、…

uniapp 自定义导航栏

自定义导航栏 修改 pages.json 在 pages.json 中将 navigateionStyle 设为 custom 新建 systemInfo.js systemInfo.js 用来获取当前设备的机型系统信息&#xff0c;放在 common 目录下 /*** 此 js 文件管理关于当前设备的机型系统信息*/ const systemInfo function() {/***…

Linux系统安装redis并配置为服务

一、Linux环境 1、下载 官网提供的源码下载地址&#xff1a; https://github.com/redis/redis/archive/7.0.5.tar.gz 2、将源码上传至服务器 3、解压缩 # 将解压缩后的文件放置在同目录的source文件夹下 tar -zxvf redis-7.0.5.tar.gz -C ./source4、编译安装 对源码进行编…

echarts插件-liquidFill(水球图)

echarts插件-liquidFill&#xff08;水球图&#xff09; 1.下载2.引入&#xff1a;3.使用 1.下载 echarts.js下载&#xff1a;https://cdnjs.com/libraries/echarts echarts-liquidfill.js下载&#xff1a;https://github.com/ecomfe/echarts-liquidfill 2.引入&#xff1a; …

error: the following arguments are required: --model, --data 解决方法

错误原因&#xff1a;Windows下需要缺乏配置参数&#xff0c;需要进行相关参数配置。 解决办法&#xff1a;在Pycharm的编辑设置&#xff0c;加上–model--model ****,其中****为指定的模型名称&#xff0c;按照自己实际报错进行添加&#xff0c;比如我这里要跑的模型为bert&am…

获取Android签名文件的MD5和SHA1指纹

以前在App中集成百度地图时&#xff0c;需要在百度地图的开发者网站上绑定应用的包名和签名&#xff0c;以预防自己的key被别人乱用。 最近公司的一个球机产品也搞了类似的做法&#xff0c;我们要访问它的摄像头功能需要使用厂家提供的aar库&#xff0c;但是你要想正常调用它的…

Linux上常用网络相关命令

1. ifconfig&#xff1a; - 显示所有网络接口的配置信息&#xff1a;ifconfig - 显示特定网络接口&#xff08;例如eth0&#xff09;的配置信息&#xff1a;ifconfig eth0 2. ip&#xff1a; - 显示网络接口的配置信息&#xff1a;ip addr show - 显示路由表&…

主流架构(gcc、msvc、x86、x64、arm)中double与float浮点数精度处理

​​​​​​float 是单精度浮点数&#xff0c;内存占4个字节&#xff0c;有效数字8位&#xff0c;表示范围是 -3.40E38~3.40E38。 double 是双精度浮点数&#xff0c;内存占8个字节&#xff0c;有效数字16位&#xff0c;表示范是-1.79E308~-1.79E308。 C和C标准没有指定EDCOX…

如何批量给视频添加logo水印?

如果你想为自己的视频添加图片水印&#xff0c;以增强视频的辨识度和个性化&#xff0c;那么你可以使用固乔剪辑助手软件来实现这一需求。下面就是详细的操作步骤&#xff1a; 1.下载并打开固乔剪辑助手软件&#xff0c;这是一款简单易用的视频剪辑软件&#xff0c;功能丰富&am…

C语言解决八皇后问题

八皇后问题是指在一个88的棋盘上&#xff0c;放置8个皇后&#xff0c;使得任意两个皇后都不能在同一行、同一列或同一斜线上。这是一个著名的递归问题。下面是一个C语言实现八皇后问题的代码&#xff0c;以及对代码的讲解。 #include <stdio.h>int board[8][8] {0}; //…

windows本地搭建mmlspark分布式机器平台流程

文章目录 windows本地搭建mmlspark分布式机器平台流程安装环境pyspark环境spark环境java环境hadoop环境1.修改hadoop配置文件下的jdk地址为自己的实际地址2.修改bin文件离线环境jar包环境1mmlsprk第三方包jar包环境2参考代码我有话说其他问题记录概要参考文献windows本地搭建mm…

一起学数据结构(12)——归并排序的实现

1. 归并排序原理&#xff1a; 归并排序的大概原理如下图所示&#xff1a; 从图中可以看出&#xff0c;归并排序的整体思路就是把已给数组不断分成左右两个区间&#xff0c;当这个区间中的数据数量到达一定数值时&#xff0c;便返回去进行排序&#xff0c;整体的结构类似二叉树…

在 Mac M1 上运行 Llama 2 并进行训练

在 Mac M1 上运行 Llama 2 并进行训练 Llama 2 是由领先的人工智能研究公司 Meta &#xff08;前Facebook&#xff09;开发并发布的下一代大型语言模型 (LLM)。 它基于 2 万亿个公共数据 token 进行了预训练&#xff0c;旨在帮助开发人员和企业组织构建基于人工智能的生成工具和…