当前位置: 首页 > news >正文

[Unity]Unity跨平台开发之针对Android开发

用户手册的这一部分包含Android平台关于输入(input)、资产管理(asset management)和调试(debugging)等相关主题的开发信息。

Android移动脚本编写

注意:安卓可以在C#中使用UNITY_ANDROID来进行宏定义编译。具体可以参考不同平台的宏定义编译

设备输入相关、震动相关内容,可以参阅以下链接:

  1. Mobile device input
  2. Mobile keyboard
  3. Handheld.Vibrate

活动指示器(Activity indicator)

可以使用以下接口来获取设备相关的属性信息:

脚本

设备属性

SystemInfo.deviceUniqueIdentifier

返回安卓设备ID的md5值,更多信息可参

考ANDROID_ID

SystemInfo.deviceName

返回设备名。对于安卓设备来说,Unity会尝试从系统安全设置中读取device_namebluetooth_name。假如读取不到这些值,会返回<unknown>

SystemInfo.deviceModel

返回设备型号。通常包括制造商名称和具体型号(例如:“LGE Nexus 5“或者”SAMSUNG-SM-G900A“)。

SystemInfo.operatingSystem

返回操作系统名称和版本。

GooglePlay应用分发

参考链接:Unity - Manual: Android application size restrictions

安卓图形(Graphics for Android)

Android设备的硬件功能因型号而异,市场上有许多不同的Android型号。在开发图形功能和编写着色器时需要着重考虑这一点。

屏幕配置

Unity提供了在编辑器中和运行时配置屏幕的功能。

屏幕方向

您可以在Android设备上控制应用程序的屏幕方向。检测屏幕方向变化的功能或强制指定方向的功能对于某些需要依赖特定方向的应用非常有用。

要获取当前应用程序的屏幕方向,可以访问Screen.orientation属性。可用的方向包括:

方向

行为

Portrait

该应用程序处于竖屏模式,要求设备直立且主页按钮位于底部。

PortraitUpsideDown

该应用程序处于竖屏模式但颠倒过来,并期望设备直立且主页按钮位于顶部。

LandscapeLeft

该应用程序处于横屏模式,并期望设备直立且主页按钮位于右侧。

LandscapeRight

该应用程序处于横屏模式,并期望设备直立且主页按钮位于左侧。

无论应用程序的默认方向如何设置,您的应用程序的屏幕方向可能会因用户设置的设备方向而有所不同。 

以下表格显示了应用程序设置的默认屏幕方向,以及根据设备方向加载的实际屏幕方向:

默认屏幕方向:自动旋转

(Autorotate)

默认屏幕方向:竖屏(Portrait)

默认屏幕方向:横屏

(Landscape)

设备方向:自动旋转

(Autorotate)

应用程序屏幕以纵向加载,并可以在纵向、纵向上下、横向右侧和横向左侧方向之间旋转。
注意:在平板电脑上,应用程序屏幕根据设备方向以纵向或横向加载。

应用程序屏幕以纵向加载,并可以在纵向和纵向倒置方向之间旋转。

应用程序屏幕的加载方向与设备方向相同。如果设备方向为纵向,则应用程序屏幕将以纵向加载,并可以旋转为横向。在横向模式下,屏幕只能在横向向右或横向向左方向之间旋转。
注意:在平板电脑上,如果用户关闭设备自动旋转设置,然后重新打开应用程序,则应用程序屏幕方向保持不变。

设备方向:竖屏锁定

(Portrait lock)

应用程序屏幕加载后将保持锁定在纵向。
注意:在纵向时,如果您将纵向的ScreenOrientation.AutoRotation属性设置为false,则应用程序屏幕将保持纵向,直到您将设备旋转为横向。一旦进入横向,屏幕就无法旋转回纵向。如果您现在将横向的

ScreenOrientation.AutoRotation属性设置为 false,则屏幕方向保持不变。

应用程序屏幕加载并保持锁定在纵向方向。

即使您将纵向选项设置为false,应用程序屏幕也会加载并保持纵向锁定。要允许屏幕旋转,请将所需的方向分配给Screen.orientation属性。您可以使用ScreenOrientation.AutoRotation启用自动旋转。

设备方向:横屏锁定

(Landscape lock)

应用程序加载并保持锁定在横向方向。

即使您将任一选项设置为 false,应用程序也会以横向加载,并根据设备方向保持锁定在横向左侧或横向右侧方向。
要更改方向,请将所需方向分配给Screen.orientation属性。您可以使用ScreenOrientation.AutoRotation启用自动旋转。

应用程序以横向加载,并根据设备方向保持锁定在横向左侧或横向右侧方向。

测试和调试

Android符号表(Android symbols)

符号表是内存地址与函数名、文件名、行号的映射表。有了符号表,才能根据程序堆栈看出方法调用过程。

格式:<起始地址> <结束地址> <函数> [<文件名:行号>]

Android symbols

  1. libmain: 负责初始 Unity 引擎加载逻辑。
  2. libunity: Unity引擎代码。
  3. libil2cpp: 由项目内C#脚本编译生成的C++代码。

上传符号表到 Firebase

两种方法
  1. 通过 gradle 上传

但是不知为何,libil2cpp 始终无法解析成功,符号文件的 uuid 应该是正确的,因为用第二种方法上传后,就可以解析。

Firebase 文档:获取 Android NDK 崩溃报告

  1. 通过 firebase cli 命令上传,解析 il2cpp.so

FIREBASE_APP_ID 在 Firebase Crashlytics 控制台拿,符号文件需要自己符号表收集一个文件夹中,然后指定上传这个文件夹。

firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS

如何触发 Unity Crash

UnityEngine.Diagnostics.Utils.ForceCrash(UnityEngine.Diagnostics.ForcedCrashCategory.AccessViolation);

导出符号表

  1. 打开Unity的Build Settings窗口。
  2. 切换安卓平台。
  3. 设置Create symbols.zip选项。
Public和Debugging的区别
1. Public Symbols (公共符号)
  • 内容
    Public symbols 是符号表的一部分,包含了程序中公共符号的基本信息,例如函数名称、全局变量的名称及其地址映射。
    它们通常不包含具体的调试信息,如本地变量、代码的行号信息。
  • 用途
    • 崩溃日志的基本分析:提供函数调用栈的符号解析,但信息有限,只能看到高层的函数调用。
    • 减小调试信息的大小:比完整的 debug symbols 文件小得多。
  • 特性
    • 较少暴露代码的内部实现细节(例如私有变量、局部变量等),因此更适合在生产环境中使用。
    • 用于帮助开发人员对发布后的崩溃日志进行初步分析。
  • 生成位置
    • 在 Unity 的构建设置中,可以选择导出符号文件。公共符号文件通常用于发布环境。
2. Debug Symbols (调试符号)
  • 内容
    Debug symbols 是完整的调试信息,包含公共符号以及更详细的调试数据,例如:
    • 函数的局部变量。
    • 代码的行号信息。
    • 代码与生成的二进制文件之间的映射。
  • 用途
    • 详细调试:提供了完整的符号信息,可以用于调试器(如 Visual Studio、lldb 等)对程序进行深度分析。
    • 定位问题:开发过程中,通过符号信息能够准确定位到代码的某一行或某个函数。
    • 崩溃日志详细分析:可以根据符号信息恢复更完整的调用栈和变量内容。
  • 特性
    • 文件体积大(相比 public symbols)。
    • 包含代码的敏感信息,不适合直接随应用发布。
    • 通常在开发和测试阶段使用。
  • 生成位置
    • Unity 中可以在构建设置中选择生成调试符号。
    • Debug symbols 通常存储为 .pdb 文件(在 Windows 上)或 .dSYM 文件(在 macOS/iOS 上)。

注意:符号文件名必须与符号文件所属的共享库的名称匹配。例如,如果共享库名为mylibrary.so,则符号文件也必须命名为mylibrary.so。为了避免文件名冲突,符号文件和共享库必须位于不同的目录中。

重要提示:请确保符号文件是最新的,并且与包含可执行代码的共享库兼容。否则,本地调试器和 Google Play 将无法解析共享库中代码的堆栈跟踪。

参考文档

  1. Unity Manual : Android symbols
  2. Firebase上无NDK符号表的解决
  3. Firebase 文档:获取Android NDK崩溃报告
  4. 为非Gradle构建或不可访问的未剥离本机库上传符号
  5. Unity异常处理与分析
  6. 用addr2line手动解析函数地址Symbolicate Android crash
  7. Firebase Crashlytics初始化及上传符号表

在Android中创建和使用插件

Unity 支持原生插件,它们可以是用C、C++和Objective-C等语言编写的本机代码库。插件允许您用C#编写的代码调用这些库中的函数。此功能允许Unity与中间件库或现有的 C/C++代码集成。

Android插件

  1. Android库项目和Android Archive插件(AAR)
  2. JAR插件
  3. Android原生插件
  4. Java和Kotlin源代码插件

其他

  1. Unity中的插件

注:文章摘要翻译自Unity官方手册,版本2022.3x。

相关文章:

[Unity]Unity跨平台开发之针对Android开发

用户手册的这一部分包含Android平台关于输入&#xff08;input&#xff09;、资产管理&#xff08;asset management&#xff09;和调试&#xff08;debugging&#xff09;等相关主题的开发信息。 Android移动脚本编写 注意&#xff1a;安卓可以在C#中使用UNITY_ANDROID来进行…...

ELK部署

背景 很多公司还是在单体项目中苦苦挣扎&#xff0c;没有必要上elk系统&#xff0c;大家都懂的一个原则系统的技术栈越多系统越复杂&#xff0c;维护起来也越麻烦&#xff0c;在没有大流量高并发的情况下我们就用单体服务挺舒服。我们行业的特殊性做的都是BTB的项目&#xff0…...

ELK系列-(四)轻量级的日志收集助手-Beat家族

一、前文回顾 ELK系列-&#xff08;一&#xff09;Docker部署ELK核心组件 ELK系列-&#xff08;二&#xff09;LogStash数据处理的瑞士军刀 ELK系列-&#xff08;三&#xff09;Kibana 数据可视化的艺术家 关于部署的整体架构欢迎大家回到前面的文章观看&#xff0c;此处&a…...

NodeJs-包管理工具

包英文单词是 package &#xff0c;代表了一组特定功能的源码集合 管理包的应用软件&#xff0c;可以对包进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作 借助包管理工具&#xff0c;可以快速开发项目&#xff0c;提升开发效率 前端常用的包管理…...

AWR microwave office 仿真学习(二)使用多层结构天线/超表面的S参数确定层间距

引言 如果大家有看过一些多层天线或超表面的论文,有两种比较常用的分析方法,等效电路法和传输线分析法,这两种方法都是三维结构的电磁问题转换为二维/集总的电路问题。本文就介绍根据这种思想进行多层结构优化的一种方法:在AWR软件中根据单层结构的S参数,确定最佳层间距。…...

【zlm】 webrtc源码讲解三(总结)

目录 setsdp onwrite ​编辑 play 参考 setsdp onwrite play 参考 【zlm】 webrtc源码讲解_zlm webrtc-CSDN博客 【zlm】 webrtc源码讲解&#xff08;二&#xff09;_webrtc 源码-CSDN博客...

Springboot+Druid(可切换Hikari)+Mybatis-plus+mysql+hive的多数据源项目配置

1.搭建一个springboot项目&#xff0c;不会的搜一下&#xff0c;很简单这里不做赘述。 2.首先你搭建的springboot能正常启动之后&#xff0c;pom文件添加如下依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid</arti…...

Git使用步骤

Git 是一个分布式版本控制系统&#xff0c;广泛用于软件开发和其他需要跟踪文件变更的项目。以下是 Git 的基本使用方法和一些常用命令的详细说明。 安装 Git 在大多数操作系统上&#xff0c;你可以通过包管理器安装 Git&#xff1a; Windows: 下载并安装 Git for Windows。…...

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天&#xff0c;用 Python 和 OpenCV 结合机器学习实现物体识别&#xff0c;不仅是酷炫技能&#xff0c;更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入&#xff0c;识别人、动物、车辆及其他物品&#xff0c;让你的程序瞬间具备 AI …...

springboot449教学资源共享平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大&#xff0c;容错率低&am…...

类OCSP靶场-Kioptrix系列-Kioptrix Level 4

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 1.4. 敏感信息 2.漏洞发现 2.1.登录框万能密码 2.2.系统用户密码-ssh链接 2.3.mysql-udf提权 一、前情提要 kali黑客-利用searchsploit搜索exp一键化攻击-CSDN博客 一篇文章带你理…...

贪心算法在背包问题上的运用(Python)

背包问题 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 这就是典型的背包问题(又称为0-1背包问题),也是具体的、没有经过任何延伸的背包问题模型。 背包问题的传统求解方法较为复杂,现定义有一个可以载重为8kg的背…...

POD 存储、PV、PVC

目录 容器如何持久化存储&#xff1f; PV和PVC 为什么不能直接在 Pod 或容器中存储数据&#xff1f; 什么是 PV和 PVC&#xff1f; 可以使用本地磁盘空间创建PV吗&#xff1f; 如何让客户端通过ftp上传到远端服务器的POD里面&#xff1f; 另一个POD想访问ftp的POD里面的…...

C中strlen和sizeof的区别

1、代码如下&#xff1a; #include<stdio.h>int main() {char a[10] { h,e,l,l,0};printf("%d\n",strlen(a));printf("%d\n", sizeof(a));return 0; } 2、运行结果如下&#xff1a;...

WSL2内部的Ubuntu怎么设置网络内桥接模式,弄了好久老是不成功,怎么办?

环境: Win10专业版 WSL2 Ubuntu22.04 问题描述: WSL2内部的Ubuntu怎么设置网络内桥接模式 解决方案: 方法一 1.控制面板开启,Hyper-V 管理器 2.重启电脑 3…创建外部虚拟交换机 打开 Hyper-V 管理器,在右侧操作面板中点击“虚拟交换机管理器”。 选择“创建虚…...

Linux环境下 搭建ELk项目 -单机版练习

前言 ELK 项目是一个由三个开源工具组成的日志处理和分析解决方案&#xff0c;ELK 是 Elasticsearch、Logstash 和 Kibana 的首字母缩写。这个项目的目标是帮助用户采集、存储、搜索和可视化大量的日志和事件数据&#xff0c;尤其是在分布式系统中。下面是每个组件的概述&…...

ubuntu20.04安装mysql5.7

安装之前要确保之前没安装过或者安装后卸载干净了&#xff0c;不然后面的配置文件可能会报错。 1. 下载安装包 打开链接 downloads.mysql.com/archives/co… 选择相应版本进行下载&#xff0c;这里mysql版本选择 5.7.35&#xff0c;系统选择Ubuntu Linux&#xff0c;选择64位…...

MacPorts 安装 Tengine

创建 Portfile 以下是我参考 nginx 调整后的 Portfile&#xff0c;如需安装指定版本&#xff0c;除了修改版本号之外还需要修改 checksums 里的 sha256 sha256 值需下载 Tengine 源码文件&#xff08;tar.gz&#xff09;进行计算 模块的调整在最后的 configure.args-append …...

Git安装及基础学习

Git学习 Git安装 概述&#xff1a; Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理 从很小到非常大的项目版本管理&#xff0c;是目前使用范围最广的版本 管理工具。 下载安装&#xff1a; 下载地址&#xff1a;https://git-scm.com/ 下载后傻瓜式一键安…...

【celery】任务有时候不执行

celery任务有时执行&#xff0c;有时不执行&#xff0c;这种情况是任务被冒领&#xff1b;有时执行说明这个方法可以使用&#xff0c;有时不执行通常是被使用同一个消息队列的进程冒领了&#xff1b; 解决 Redis&#xff1a;指定一个分块就行了...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...