知识点来源:人间自有韬哥在,豆包
目录
- 一、发布应用程序
-
- [1. 修改发布必备设置](#1. 修改发布必备设置)
-
- [1.1 打开设置面板](#1.1 打开设置面板)
- [1.2 修改公司名、游戏项目名、版本号和默认图标](#1.2 修改公司名、游戏项目名、版本号和默认图标)
- [1.3 修改 Package Name 和 Minimum API Level](#1.3 修改 Package Name 和 Minimum API Level)
- [2. 发布应用程序](#2. 发布应用程序)
-
- [2.1 配置 Build Settings](#2.1 配置 Build Settings)
- [2.2 选择发布选项](#2.2 选择发布选项)
- [2.3 构建 APK 文件](#2.3 构建 APK 文件)
- [3. 测试发布的 APK 文件](#3. 测试发布的 APK 文件)
-
- [3.1 使用 Android 设备进行测试](#3.1 使用 Android 设备进行测试)
- [3.2 使用 Android 模拟器进行测试](#3.2 使用 Android 模拟器进行测试)
- 二、发布界面参数介绍
- 三、交互项目创建
一、发布应用程序
1. 修改发布必备设置
1.1 打开设置面板
在Unity编辑器中,依次点击 File
-> Build Settings
,接着在弹出的窗口里点击 Player Settings
按钮,这将打开 Player Settings 面板。
1.2 修改公司名、游戏项目名、版本号和默认图标
- 公司名 :在 Player Settings 面板的
Identification
部分,找到Company Name
字段,把它修改为你公司的名称。 - 游戏项目名 :同样在
Identification
部分,将Product Name
字段修改为你的游戏项目名称。 - 版本号 :还是在
Identification
部分,修改Version
字段,以反映游戏当前的版本号,版本号通常遵循主版本号.次版本号.修订号
的格式,例如1.0.0
。 - 默认图标 :在
Other Settings
下的Icon
部分,点击+
按钮,选择你准备好的图标文件(通常为 PNG 格式)。Unity 支持多种尺寸的图标,你可以上传不同尺寸的图标以适配不同的设备。
1.3 修改 Package Name 和 Minimum API Level
- Package Name :在
Other Settings
部分,找到Package Name
字段,这个字段是应用在 Android 系统中的唯一标识符,一般采用反向域名的格式,例如com.yourcompany.yourgame
,必须对其进行修改设置。 - Minimum API Level :同样在
Other Settings
部分,找到Minimum API Level
字段,根据你的游戏兼容性需求选择合适的 Android API 级别。通常建议选择一个较广泛支持的 API 级别,但也要考虑到你使用的功能对 API 级别的要求。
2. 发布应用程序
2.1 配置 Build Settings
在 Build Settings
窗口中,选择 Android
平台,然后点击 Switch Platform
按钮,等待 Unity 完成平台切换。
2.2 选择发布选项
- Build System :通常选择
Gradle
。 - Target SDK Version:根据你的需求选择合适的 Android SDK 版本。
- Scripting Backend :可以选择
IL2CPP
以获得更好的性能,或者选择Mono
以获得更广泛的兼容性。
2.3 构建 APK 文件
点击 Build
按钮,选择一个保存 APK 文件的目录,然后等待 Unity 完成构建过程。构建过程可能需要一些时间,具体取决于项目的大小和复杂度。
3. 测试发布的 APK 文件
3.1 使用 Android 设备进行测试
- 开启 USB 调试 :在 Android 设备的
设置
->关于手机
中,多次点击版本号
开启开发者选项,然后在开发者选项中开启USB 调试
功能。 - 连接设备:使用 USB 数据线将 Android 设备连接到电脑。
- 安装 APK 文件:在电脑上找到之前构建好的 APK 文件,将其复制到 Android 设备上,然后在设备上找到该文件并点击安装。
- 测试游戏:安装完成后,在设备的应用列表中找到并打开游戏,进行全面的测试,确保游戏的各项功能正常运行。
3.2 使用 Android 模拟器进行测试
- 安装模拟器:可以使用 Android Studio 自带的模拟器,或者第三方模拟器如 BlueStacks。
- 启动模拟器:启动模拟器并等待其完全启动。
- 安装 APK 文件:将 APK 文件拖放到模拟器窗口中,按照提示完成安装。
- 测试游戏:安装完成后,在模拟器的应用列表中找到并打开游戏,进行测试。
二、发布界面参数介绍
1.1.BuildSettings生成设置
设置项 | 描述 | 可选值及说明 |
---|---|---|
Texture Compression(纹理压缩) | 设置发布后的纹理压缩格式 | 1. Use Player Settings:使用在播放器设置中设置的纹理压缩格式 2. ETC:使用ETC格式 3. ETC2:使用ETC2格式,安卓常用,支持透明通道,老设备可能不支持 4. ASTC:使用ASTC格式 5. DXT:使用DXT格式 6. PVRTC:使用PVRTC格式 可统一设为ETC2,并在ETC2 fallback设置不支持时的替代方式 |
ETC2 fallback(ETC2回退) | 当Unity用于不支持ETC2的安卓设备时的RGBA纹理格式 | 1. 32 - bit:32位,以全分辨率存储RGBA纹理,质量最高,内存占用最多 2. 16 - bit:16位,以全分辨率存储RGBA纹理,质量较低,内存占用相对较少 3. 32 - bit, half resolution:32位,半分辨率,纹理会模糊,内存占用较小 非ETC2压缩,大多用32 - bit备用,取决于GPU支持 |
Export Project(导出项目) | 勾选后,将Unity项目导出为可导入Android Studio的Gradle项目 | - |
Symlink Sources(符号链接源) | 当勾选Export Project时才能勾选,决定是否在Unity和导出的Gradle项目之间共享Java和Kotlin源文件 | 启用后利于测试和迭代Java和Kotlin代码,重新导出时更改会保留,适合二次开发 |
Build App Bundle (Google Play)(生成应用程序资源包) | 是否将应用程序作为Android应用捆绑包(AAB) | 1. 启用:发布AAB,可配合安卓二次开发 2. 禁用:发布APK,可直接安装 |
Create symbols.zip(创建符号压缩文件) | 符号文件可帮助调试应用程序 | 1. Disabled:不生成 2. Public:生成公共符号包,包含解析函数地址信息,包小于调试符号包 3. Debugging:生成调试符号包,含完整调试信息和符号表,可解析堆栈、附加调试器 |
Run Device(运行设备) | 指定在哪个附加设备上测试生成 | 连接新设备或列表无设备时,点击Refresh刷新 |
Build to Device(构建到设备) | 不创建完整构建,将修改文件直接部署到设备 | 速度快,方便调试 |
Development Build(开发构建) | 是否包含脚本调试符号和性能分析器到项目中 | 勾选可调试应用程序 |
Autoconnect Profiler(自动连接分析器) | 是否自动将分析器连接到生成的应用程序 | - |
Deep Profiling(深度分析) | 是否启用深度剖析在分析器中 | 启用可返回详细分析数据,但会降低脚本执行速度 |
Script Debugging(脚本调试) | 是否允许调试应用程序的脚本文件 | Wait For Managed Debugger:程序运行脚本代码前是否等待调试器连接 |
Compression Method(压缩方法) | Unity在构建时压缩项目中数据的方式 | 1. Default:默认用ZIP,压缩效果略好,解压慢 2. LZ4:快速压缩格式,提高加载时间 3. LZ4HC:LZ4高压缩版本,构建慢,发布版本效果好,提高加载时间 |
Max Texture Size(最大的纹理大小) | 用于本地开发时导入纹理的最大尺寸 | 减小可加快资源导入和平台切换 |
Texture Compression(纹理压缩相关选项) | 选择可加快资源导入和平台切换 | 1. No Override:使用默认设置 2. Force Fast Compressor:强制快速压缩 3. Force Uncompressed:强制解压缩 |
2.PlayerSettings
设置项 | 分类 | 描述 | 可选值及说明 |
---|---|---|---|
icon(图标设置) | 基础设置 | 设置在设备上显示的应用图标 | 1. Adaptive:运行在 Android 8.0 及以上版本设备的应用图标 2. Round:运行在 Android 7.1 及以上版本设备的应用图标 3. Legacy icons:运行在 Android 7.1 以下版本设备的应用图标 |
Resolution and Presentation(分辨率和演示设置) | 基础设置 | - | - |
Fullscreen Mode(全屏模式) | 分辨率和演示设置 | - | 1. Fullscreen Window:全屏窗口,导航栏始终隐藏,应用内容可能缩放,有黑边 2. Windowed:窗口模式,大小取决于应用分辨率 |
Default Window Width | 分辨率和演示设置 | 应用程序窗口的默认窗口宽度 | 单位为像素 |
Default Window Height | 分辨率和演示设置 | 应用程序窗口的默认窗口高度 | 单位为像素 |
Minimum Window Width | 分辨率和演示设置 | 应用程序窗口的最小宽度 | 单位为像素 |
Minimum Window Height | 分辨率和演示设置 | 应用程序窗口的最小高度 | 单位为像素 |
Resizable Window(可调整大小的窗口) | 分辨率和演示设置 | 设置用户是否可调整应用窗口大小,可在 Android 和平板应用中启用多窗口功能 | 详情见 Android Developers |
Hide Navigation Bar | 分辨率和演示设置 | 是否隐藏顶部显示的导航栏 | - |
Render outside safe area | 分辨率和演示设置 | 是否使用所有可用屏幕控件渲染,包括刘海区域 | - |
Optimized frame Pacing | 分辨率和演示设置 | 是否均匀分布帧以减小帧率方差,启用后体验更流畅 | - |
Resolution Scaling Mode(分辨率缩放模式) | 分辨率和演示设置 | - | 1. Disabled:禁用,应用以设备本机屏幕分辨率呈现 2. Fixed DPI:使用 API 应用分辨率缩放,优化性能和电池寿命 |
Target DPI | 分辨率和演示设置 | 若设备本机屏幕 DPI 高于此值,Unity 降低应用分辨率匹配设置 | 计算方式:Min(Target DPI * Factor / Screen DPI,1),Factor 是 Quality 质量设置中 Resolution Scaling Fixed DPI Factor 参数 |
Reset resolution on window resize | 分辨率和演示设置 | 本机窗口大小更改时,是否将屏幕分辨率设为新的本机窗口大小,若为 Fixed DPI 则重新计算分辨率 | - |
Blit Type(光高类型) | 分辨率和演示设置 | 是否使用 Blit 将最终图像呈现在屏幕上 | 1. Always:Unity 渲染到屏幕外缓冲区,再用 Blit 复制到设备帧缓冲区 2. Never:Unity 渲染到设备操作系统提供的帧缓冲区,失败有警告,通常更快但不兼容所有设备 3. Auto:先渲染到设备提供的帧缓冲区,失败则用 Blit 呈现 |
Supported Aspect Ratio(支持的纵横比) | 分辨率和演示设置 | - | - |
Aspect Ratio Mode | 分辨率和演示设置 | 指定应用支持的最大纵横比,设备纵横比大于此值时,Unity 用此纵横比并添加黑条 | 1. Legacy Wide Screen(1.86):支持 Android 传统宽屏宽高比 2. Native Aspect Ratio:支持 Android 本机宽高比 3. Custom:自定义纵横比 |
Up To | 分辨率和演示设置 | 选择自定义纵横比时可自行设置 | - |
Orientation(屏幕取向) | 分辨率和演示设置 | - | - |
Default Orientation | 分辨率和演示设置 | 指定应用使用的屏幕方向 | 1. Portrait:竖屏,应用窗口底部和屏幕底部对齐 2. Portrait Upside Down:竖屏倒置,应用窗口底部和屏幕顶部对齐 3. Landscape Right:右横屏,应用窗口右侧和屏幕底部对齐 4. Landscape Left:左横屏,应用窗口左侧和屏幕底部对齐 5. Auto Rotation:自动旋转,可勾选允许的方向 |
Use 32 - bit Display Buffer | 分辨率和演示设置 | 显示缓冲区是否保存 32 位颜色值而非 16 位,后期处理有条纹或需 Alpha 值时启用 | 某些后期处理效果需此设置,因以相同格式创建渲染纹理 |
Disable Depth and Stencil | 分辨率和演示设置 | 是否禁用深度和模板缓冲区 | - |
Render Over Native UI | 分辨率和演示设置 | 是否在 Android 或 iOS 的本机 UI 上渲染,生效需相机清除标志设为使用 Alpha 值低于 1 的纯色 | - |
Show Loading Indicator(显示加载指示器) | 分辨率和演示设置 | 指定加载指示器是否显示及显示方式 | 1. Don't Show:不显示加载指示条 2. Large:显示大的加载指示条 3. Inversed Large:显示大的加载指示条,颜色翻转 4. Small:显示小的加载指示条 5. Inversed Small:显示小的加载指示条,颜色翻转 |
Splash Image(启动图像设置) | 基础设置 | - | - |
Virtual Reality Splash Image | 启动图像设置 | 虚拟现实的初始屏幕设置 | - |
Show Splash Screen | 启动图像设置 | 是否显示启动图像,收费版本可修改,免费版本不能改 | - |
Preview | 启动图像设置 | 预览启动图像 | - |
Splash Style(启动风格) | 启动图像设置 | - | 1. Dark on Light:暗到亮 2. Light on Dark:亮到暗 |
Animation(启动图像动画效果) | 启动图像设置 | - | 1. Static:静态不动 2. Dolly:由小变大 3. Custom:自定义 |
Draw Mode(绘制模式) | 启动图像设置 | - | 1. Unity Logo Below:Unity Logo 显示在前 2. All Sequential:所有按顺序 3. Logos:可添加 Logo 图片按顺序显示 |
Overlay Opacity | 启动图像设置 | 覆盖不透明度 | - |
Background Color | 启动图像设置 | 背景颜色 | - |
Blur Background Image | 启动图像设置 | 是否模糊背景图像 | - |
Background Image | 启动图像设置 | 背景图像 | - |
Alternate Portrait Image | 启动图像设置 | 备选图像 | - |
Static Splash Image | 启动图像设置 | 静态启动图像 | - |
Scaling(缩放比例) | 启动图像设置 | - | 1. Center:居中(仅缩小),图像太大时缩小,否则以原始大小绘制 2. Scale to fit(填充):缩放图像使较长尺寸适合屏幕,用黑色填充空白 3. Scale to fit(裁剪):缩放图像使较短尺寸适合屏幕,裁剪较长维度 |
3.OtherSettings-渲染
设置项 | 描述 | 可选值及说明 |
---|---|---|
Color Space(色彩空间) | 切换 Unity 中用于渲染的色彩空间 | 1. Gamma(伽马):纹理倾向于保存在此空间,但着色器采样时基于伽马值可能导致结果不准确 2. Linear(线性):效果相对较好,不是所有平台都支持。支持平台有 Android、iOS、WebGL、Windows、Mac OS X 、Linux。Android 至少需 OpenGL ES 3.0 图形 API 和 Android 4.3;iOS 需要 Metal 图形 API;WebGL 至少需 WebGL 2.0 图形 API。确定主流设备支持情况选择,不支持自动退出 |
Vulkan | 一个跨平台的 2D 和 3D 绘图应用程序接口,是 OpenGL 的下一代版本,旨在提供更低的 CPU 开销与更直接的 GPU 控制 | - |
Auto Graphics API(自动图形接口) | 控制图形 API 接口的使用方式 | 1. 勾选:Unity 自动尝试使用对应图形 API 接口,默认使用 Vulkan,不支持则退到 GLES3.2、GLES3.1 或 GLES3.0 2. 不勾选:可在列表中自行对使用的图形 API 接口进行排序,设置使用优先级。下方副选项 ES3.1、ES3.1+AEP、ES3.2 用于配置最低 OpenGL ES 3.X 次要版本(Require ES3.1: 要求使用 ES3.1;Require ES3.1 + AEP: 要求使用 ES3.1 + AEP;Require ES3.2: 要求使用 ES3.2)。只有当 GLES2 不在列表中时,Unity 才会将额外的三个选项要求添加到 Android 应用清单中,若发布到 Google Play 应用商店,不受支持设备不会显示该应用 |
Color Gamut(色域) | 添加或删除 Android 平台用于渲染的色域,色域定义设备可显示的颜色范围 | 1. sRGB:默认且必需的色域,一般手机使用此色域即可 2. DisplayP3:当定位具有宽色域显示的设备(如 PC 主机游戏)时,可利用完整显示功能 |
Multithreaded Rendering(多线程渲染) | 将图形 API 调用从 Unity 的主线程移动到单独的工作线程,提升主线程 CPU 使用率较高的应用程序性能 | 启用此选项可实现;不启用则不进行此操作 |
Static Batching(静态批处理) | 将静态物体合并处理 DC,提升性能 | 启用可实现合并处理;不启用则不进行此操作 |
Dynamic Batching(动态批处理) | 动态合并 DC 提高性能,可编程渲染管线(SPR)处于活动状态(启用 URP 或 HDRP)时不起作用,使用 FairyGUI 时需开启以优化 DC | 启用可实现动态合并;不启用则不进行此操作,且在特定情况(启用 URP 或 HDRP)下无法使用 |
Compute Skinning(计算蒙皮) | 启用 DX11/ES3 GPU 计算蒙皮,释放 CPU 资源,对图形接口版本要求较高(PC 上 DX11、移动设备 ES3) | 启用可启用计算蒙皮;不启用则不进行此操作 |
Graphics Jobs (Experimental)(图形作业) | 启用后将渲染循环的图形任务移到其它 CPU 内核上运行的工作线程,减少主线程时间 | 启用可实现任务转移;不启用则不进行此操作 |
Texture Compression Format(纹理压缩格式) | 可在 ASTC、ETC2、ETC 之间选择纹理压缩格式 | 可选择 ASTC、ETC2、ETC 其中一种格式 |
Normal Map Encoding(法线地图编码) | 选择 XYZ 或 DXT5nm 样式设置法线映射编码,影响法线贴图的编码方案和压缩格式 | 1. 选择 XYZ 样式 2. 选择 DXT5nm 样式:法线贴图质量更高,但在着色器中解码成本更高 |
Lightmap Encoding(光照贴图编码) | 选择"正常质量"或"高质量"设置光照贴图编码,影响光照贴图的编码方案和压缩格式 | 1. 选择"正常质量" 2. 选择"高质量" |
Lightmap Streaming(光照贴图流) | 是否对光照贴图使用 Mipmap 流式处理 | 选择启用则使用;选择不启用则不使用 |
Streaming Priority(流优先级) | 设置 Mipmap 流式处理系统中所有光照贴图的优先级,生成光照贴图时应用于所有光照贴图,正数表示更高优先级,范围为 --128 到 127 | 可设置具体数值(在 --128 到 127 之间的整数) |
Frame Timing Stats(帧时序统计) | 启用可收集 CPU 和 GPU 帧时间统计信息,需和摄像机上的动态分辨率设置(Camera 组件下的 Allow Dynamic Resolution 选项)结合使用,确定应用程序受 CPU 还是 GPU 限制 | 启用可收集统计信息;不启用则不收集 |
OpenGL: Profiler GPU Recorders | 是否启用 OpenGL 的探查 GPU 记录器,在 OpenGL 上,探查 GPU 记录器会禁用 GPU 探查器 | 启用则开启记录器并禁用 GPU 探查器;不启用则不开启记录器 |
Virtual Texturing(虚拟纹理) | 在场景有很多高分辨率纹理时减少 GPU 内存使用量和纹理加载时间,将纹理拆分为瓦片,按需上传到 GPU 内存,不兼容安卓设备 | 启用可实现虚拟纹理功能;不启用则不进行此操作,且因不兼容安卓设备,安卓平台无法使用 |
Shader Precision Model(着色器精度模型) | 控制着色器中使用的采样器的默认精度 | - |
360 Stereo Capture(360 度立体捕捉) | Unity 是否可以捕获立体 360 度全景图像和视频,不兼容 Android | 启用则可进行捕捉操作;不启用则不进行此操作,且因不兼容 Android,安卓平台无法使用 |
4.OtherSettings-Vulkan设置和身份证明
设置项 | 分类 | 描述 | 可选值及说明 |
---|---|---|---|
SRGB Write Mode(SRGB 写入模式) | Vulkan设置 | 允许呈现器在运行时切换 sRGB 写入模式,可暂时关闭线性到 sRGB 写入颜色转换 | 1. 启用:可切换 sRGB 写入模式,但不建议移动设备启用,会增加 GPU 负担 2. 不启用:保持默认的 sRGB 写入模式 |
Number of swapchain buffers(交换链缓冲区数量) | Vulkan设置 | 设置交换链缓冲区数量,与Vulkan渲染器配合使用,可解决移动平台延迟问题 | 1. 设为 2:双缓冲 2. 设为 3:三重缓冲,一般保持为 3,不建议安卓设备使用双缓冲,会产生负面影响 |
Acquire swapchain image late as possible(尽可能晚的获取交换链图像) | Vulkan设置 | 启用后,Vulkan 延迟获取后缓冲器,直到将帧渲染为屏幕外图像,与双缓冲结合可提高性能,但额外的 blit 会占用带宽 | 1. 启用:延迟获取后缓冲器,可能提高性能但有带宽占用风险,不建议安卓设备修改 2. 不启用:按常规方式获取后缓冲器 |
Recycle command buffers(回收命令缓冲区) | Vulkan设置 | 决定 Unity 执行命令缓冲区后是回收还是释放命令缓冲区 | 1. 回收:执行后回收命令缓冲区 2. 释放:执行后释放命令缓冲区 |
Apply display rotation during rendering(在渲染期间应用显示旋转) | Vulkan设置 | 启用可在显示的本机方向上执行所有渲染,有性能优势但有使用限制 | 1. 启用:在本机方向渲染,有性能优势但有使用限制,不建议修改 2. 不启用:按常规方式渲染 |
Override Default Package Name(是否覆盖默认包名称) | 身份证明 | 用于在公司名和游戏名不是英文时,自行设置包名 | 1. 勾选:可自行设置包名 2. 不勾选:使用默认包名 |
Package Name(软件包名) | 身份证明 | 应用程序的 ID,用于在设备和安卓应用商店中唯一标识应用 | 格式为 com.公司名.产品名,只能包含字母数字和下划线,每段都必须以字母开头 |
Version(版本号) | 身份证明 | 标识应用程序包的迭代 | 格式为数字.数字.数字......,如 1.0、4.3.2、1.2.1 等 |
Bundle Version Code(内部版本号) | 身份证明 | 用于确定版本新旧,数字越大版本越新,不显示给用户 | 为整数,每次发布新版本可让数字加一 |
Minimum API Level(最低API级别) | 身份证明 | 决定应用程序运行所需的最低 API 级别,SDK 版本低于该设置的设备无法安装应用 | 设置具体的 API 级别,如 Android 系统的 API 版本号 |
Target API Level(目标API级别) | 身份证明 | 指定应用的目标 API 级别,通知 Android 系统已针对目标版本测试,应用也可在较低版本运行(取决于 Minimum API Level) | 设置具体的 API 级别,如 Android 系统的 API 版本号 |
5.OtherSettings-配置(Configuration)
设置项 | 描述 | 可选值及说明 |
---|---|---|
Scripting Backend(脚本后端) | 决定Unity如何在项目中编译和执行C#代码 | 1. Mono:将C#编译为.Net公共中间语言CIL,并使用公共语言运行时执行中间语言 2. IL2CPP:将C#编译为CIL,再将CIL转换为C++,最后将C++编译为本机代码 |
Api Compatibility Level(API兼容性级别) | 决定可以在项目中使用的.Net API,影响代码和第三方库的兼容性 | 1...Net Standard 2.1:和.Net Standard 2.1兼容,生成较小版本,具有完整跨平台支持 2...Net Framework:和.Net Framework兼容(包含.Net Standard 2.1所有内容),包含更多API支持,但生成包更大。使用C#高级功能报错时可尝试切换,有替代方案时建议用.Net Standard 2.1以减小包体 |
C++ Compiler Configuration(C++编译器配置) | 只有将Scripting Backend设置为IL2CPP才能使用该选项 | 1. Debug(调试模式):关闭所有优化,代码生成速度快但运行慢,用于调试 2. Release(发布模式):对代码进行优化,编译后代码运行快、二进制文件小,但编译时间长 3. Master(大师模式):实现所有可能的优化,发布时间比发布模式长,发布最终版本时可使用 |
Use incremental GC(使用增量GC) | 启用后可使用增量垃圾回收器,将GC分散到多个帧上执行,降低一帧中GC造成的卡顿 | 启用或不启用 |
Assembly Version Validation(程序集版本验证) | Mono是否验证强名称程序集中的类型,强名称程序集为程序集创建唯一标识,防止程序集冲突 | 验证或不验证 |
Mute Other Audio Sources(将其它音频源静音) | 希望在运行Unity应用程序时停止后台运行应用程序中的音频,可启用该选项,否则后台音频和Unity音频一起播放 | 启用或不启用 |
Target Architectures(目标体系结构) | 允许应用程序运行的CPU,64位环境运行安卓应用有性能优势,64位应用可处理超4GB内存空间,Mono模式只能选ARMv7,IL2CPP模式可选更多 | 1. ARMv7:32位的ARM 2. ARM64:64位的ARM 3. x86(Chrome OS):32位 4. x86-64(Chrome OS):64位 |
Split APKs by target architecture(按目标架构拆分APK) | 启用后,为目标体系结构中选择的每个CPU架构创建单独的APK,在Google Play中根据设备情况下载对应版本APK,可减小apk大小,但主要针对Google Play,国内产品几乎不使用 | 启用或不启用 |
Target Devices(目标设备) | 指定允许运行APK的目标设备 | 1. All Devices(所有设备):允许apk在所有Android和Chrome OS设备上运行 2. Phones,Tablets,and TV Devices Only(手机、平板、电视设备):允许apk在Android手机、平板电脑、电视上运行,不能在Chrome OS设备上运行 3. Chrome OS Devices Only(Chrome OS设备):允许apk在Chrome OS设备上运行,不能在Android手机、平板、电视上运行 |
Install Location(安装位置) | 指定设备上应用程序的安装位置 | 1. Automatic(自动):由操作系统决定,用户可移动安装位置 2. Prefer External(首选外部):先尝试安装到外部存储(SD卡),不行则安装到手机存储空间 3. Force Internal(强制内部):安装到手机存储空间,用户无法移动到外部存储安装 |
Internet Access(互联网接入) | 选择是否始终将网络权限添加到Android清单(即使未使用任何网路API) | 1. Auto:仅当使用网络API时添加互联网访问权限 2. Require:始终添加互联网访问权限 |
Write Permission(写入权限) | 是否启用对外部存储(SD卡)的写入访问权限,并向Android应用清单添加相应权限 | 1. Internal(内部):仅授予对内部存储的写入权限 2. External(外置SD卡):启用对外部存储的写入权限 |
Filter Touches When Obscured(遮挡时过滤触摸) | 启用后丢弃在另一个可见窗口覆盖Unity应用程序时收到的触摸(触屏事件),防止窃听劫持 | 启用或不启用 |
Sustained Performance Mode(持续性能模式) | 启用此选项可在较长时间段内设置可预测且一致的设备性能级别,无需热限制,但整体性能可能降低 | 启用或不启用 |
Low Accuracy Location(低精度定位) | 启用后改为低精度值与Android位置API配合使用 | 启用或不启用 |
Chrome OS Input Emulation(Chrome OS输入仿真) | Chrome OS操作系统默认将鼠标和触摸板输入事件转为触屏输入事件,取消可禁用此默认行为 | 启用或不启用 |
Android TV Compatibility(安卓电视兼容性) | 启用后应用程序标记为兼容Android TV | 启用或不启用 |
Android Game(安卓游戏) | 启用后将输出的apk标记为游戏而非常规应用 | 启用或不启用 |
Android Gamepad Support Level(安卓游戏输入板支持等级) | 选择玩游戏时支持的输入方式 | 可根据需求选择相应等级 |
Warn about App Bundle size(警告应用程序包的大小) | 只有在Build Settings中勾选了Build App Bundle(Google Play)才有用,应用程序包大小超过阈值时收到警告 | 可设置具体的阈值大小 |
Active Input Handling(活动输入处理) | 选择处理来自用户输入的方式 | 1. Input Manager:老的输入系统,Input相关 2. Input System Package:新输入系统 3. Both:同时使用,在Unity进阶之InputSystem中有详细讲解 |
6.OtherSettings-ScriptCompilation
设置项 | 分类 | 描述 | 可选值及说明 |
---|---|---|---|
Scripting Define Symbols(脚本定义符号) | 脚本编译 | 设置自定义编译标志,使用第三方内容时可能在此添加脚本符号,Unity 有内置脚本符号,可配合多路测试 #if 使用,也可自定义 |
可添加自定义脚本符号,利用内置脚本符号(如 Lua 热更相关、FairyGUI 相关等),通过 #if 、#elif 、#else 、#endif 控制代码逻辑 |
Additional Compiler Arguments(其它编译器参数) | 脚本编译 | 向此列表添加条目以将其他参数传递给 Roslyn 编译器 | 1. 按"+"按钮创建新条目添加参数 2. 按"-"按钮删除条目 3. 单击"应用"按钮在将来编译中包括其他参数 4. 单击"还原"按钮将列表重置为最近应用的状态 |
Suppress Common Warnings(禁止显示常见警告) | 脚本编译 | 禁用此设置可显示 C# 警告 | 1. 启用:禁止显示常见 C# 警告,如 CS0169(从不使用私有字段)、CS0649(未初始化的私有或内部字段声明) 2. 禁用:显示 C# 警告 |
Allow 'unsafe' Code(允许使用"不安全"代码) | 脚本编译 | 启用对在预定义程序集中编译"unsafe"C# 代码的支持 | 1. 启用:支持编译"unsafe"C# 代码,使用指针等操作需勾选此项 2. 不启用:不支持编译"unsafe"C# 代码 |
Use Deterministic Compilation(使用确定性编译) | 脚本编译 | 启用此设置后,编译的程序集在每次编译时都是完全相同的,可用于确定二进制文件是否从受信任的源编译 | 1. 启用:使用确定性编译,编译的程序集每次相同 2. 禁用:防止使用 -确定性 C# 标志进行编译 |
Enable Roslyn Analyzers(启用罗斯林分析器) | 脚本编译 | 禁用此设置可编译用户编写的脚本,而无需项目中可能存在的 Roslyn 分析器 DLL(Roslyn 是微软的.Net 开源编译器,提供丰富的代码分析 API) | 1. 启用:使用 Roslyn 分析器分析脚本 2. 禁用:不使用 Roslyn 分析器,直接编译用户编写的脚本 |
unsafe 关键词(基本概念) | C# 语言特性 | 默认 C# 不支持指针,unsafe 关键词用于表示不安全的上下文,在 C# 中进行指针相关操作必须使用该关键词,不安全代码在 CLR 中是指无法验证的代码,但不一定危险,使用时需确保无安全风险和指针错误 |
在 C# 中使用指针等操作需使用 unsafe 关键词,代码在 CLR 中无法验证安全性,仅在完全信任的程序集中执行不安全代码 |
unsafe 关键词(基本使用) | C# 语言特性 | 在 Unity 中正常使用 unsafe 关键词编写程序,需在 Unity 的 Player Settings 中的 Other Settings 中将 Allow 'unsafe' Code 选项勾选上,可用于修饰函数、代码块、成员变量、类 |
1. 勾选 Allow 'unsafe' Code 选项后可使用 unsafe 关键词 2. 可修饰函数、代码块、成员变量、类 |
unsafe 关键词(总结) | C# 语言特性 | unsafe 的使用能让在 C# 中使用指针,但存在安全风险和稳定性风险,无特殊需求尽量避免使用 |
尽量避免在 C# 中使用 unsafe 关键词,以减少安全和稳定性风险 |
7.OtherSettings-优化和堆栈跟踪
设置项 | 分类 | 描述 | 可选值及说明 |
---|---|---|---|
Prebake Collision Meshes(预烘焙碰撞到网格) | 优化 | 在构建时将碰撞数据添加到网格 | 启用:在构建时添加碰撞数据到网格 不启用:不进行此操作 |
Keep Loaded Shaders Alive(保持加载的着色器的活动状态) | 优化 | 启动后,着色器不能卸载,避免卸载后重复加载造成性能开销和卡顿 | 启用:不能卸载着色器 不启用:可以卸载着色器 |
Preloaded Assets(预装资源) | 优化 | 设置启动时加载的资源数组,将想要预加载的内容拖入框中 | 可将需要预加载的资源拖入设置框中 |
Strip Engine Code(剥离引擎代码) | 优化 | 选择IL2CPP模式才会出现的字段,启用可删除Unity引擎功能中没有使用的代码,减小包体大小 | 启用:删除未使用的引擎代码,减小包体 不启用:不进行代码剥离 |
Managed Stripping Level(管理剥离水平) | 优化 | 选择Unity如何剥离未使用的C#代码,发布时自动去除未使用代码,可能意外删除需要的代码 | 1. Disabled:不剥离,只有在Mono模式下才能选择 2. Minimal:最小剥离,Unity 只会搜索Unity引擎未使用的.Net类库,不删除用户编写代码,IL2CPP模式下默认 3. Low:低级剥离,处理Unity相关,玩家自己编写的代码也会被剥离,尽量减小意外剥离 4. Medium:中级剥离,比Low更多一些剥离 5. High:高级剥离,优先考虑打包大小,最大限度剥离代码,可配合link.xml手动拒绝剥离,或使用[Preserve]特性(在不希望被剥离的函数前加该特性) |
Enable Internal Profiler(启用内部探查器) | 优化 | 已弃用的功能,用于从Android SDK的设备中获取profiler数据adblogcat测试项目时输出,仅在开发版本中可用 | 该功能已弃用 |
Vertex Compression(顶点压缩) | 优化 | 选择要设置的通道,以便在顶点压缩方法下压缩网格,减少内存中网格数据的大小,提高CPU性能 | 选择相应的通道进行顶点压缩设置 |
Optimize Mesh Data(优化网格数据) | 优化 | 启用后,构建时会从使用的网格中剥离未使用的顶点属性,减少网格数量,减小包体大小,减小加载时间和运行时内存使用,但运行时不能更改材质或着色器相关设置 | 启用:构建时剥离未使用的顶点属性 不启用:不进行此操作,运行时可自由更改材质或着色器设置 |
Texture MipMap Stripping(贴图纹理剥离) | 优化 | 启用后会启用纹理贴图剥离,在构建时会从纹理中剥离没有使用的纹理贴图,根据发布平台的质量设置确定哪些贴图用不到,mipmap生成的多分辨率图也会被剥离 | 启用:进行纹理贴图剥离 不启用:不进行此操作 |
StackTrace(堆栈跟踪) | 优化 | 选择在特定的上下文中允许的日志记录类型和日志记录的方式 | 日志记录类型: 1. Error:错误信息 2. Assert:断言(用于检测非法情况的)信息 3. Warning:警告信息 4. Log:打印日志信息 5. Exception:异常信息 日志记录方式: 1. None:不记录 2. ScriptOnly:只在运行脚本时记录信息 3. Full:一直记录 |
Clamp BlendShapes(Deprecated)(钳制混合形状权重的范围) | 优化 | 启用骨骼蒙皮动画中钳制混合形状权重的范围,已弃用 | 该功能已弃用 |
8.PublishingSettings-KeystoreManager
设置项 | 分类 | 描述 | 可选值及说明 |
---|---|---|---|
Android 中的签名 | 发布设置准备知识 | Android 要求所有已安装应用程序使用数字证书做数字签名,数字证书私钥由开发者持有,用于标示应用程序作者并建立信任关系,证书可自制,未正确签名应用无法安装或运行 | 数字证书私钥由开发者持有,可使用自制签名证书,无正确签名应用在 Android 系统(模拟器或真实设备)无法安装运行 |
Android 应用程序清单(AndroidManifest.xml) | 发布设置准备知识 | Android 应用程序工程中的 xml 文件,用于声明应用程序组件,确定用户权限、最低 API 级别,声明硬件和软件特性等,引入 Android 第三方 SDK 或与 Android 交互时需编辑,无需求可忽略 | 声明应用程序组件、确定用户权限(如网络、通讯录、信息读取等)、声明最低 API 级别、声明硬件和软件特性(如摄像头、蓝牙、多点触碰等) |
Gradle | 发布设置准备知识 | 一个自动化构建开源工具,基于 JVM,主要面向 Java 应用,也支持其他语言,可用于 Android 项目构建,使项目更简洁,在 Unity 中用于打包安卓应用程序,Android Studio 也使用它打包 | 基于 JVM 的自动化构建工具,用于 Android 项目构建,帮助打包安卓应用程序 |
ProGuard | 发布设置准备知识 | 一个压缩、优化和混淆 Java 字节码文件的免费工具,可删除无用内容、优化字节码、重命名类等,常用于 Android 开发混淆项目,增加反编译难度,Unity 发布安卓应用默认使用 | 压缩、优化和混淆 Java 字节码文件,删除无用类、字段、方法和属性,删除注释,重命名类、字段等 |
R8 | 发布设置准备知识 | 相对 ProGuard 较新的 Android 混淆编译器,可减小应用大小,Android Gradle 3.4.0 或更高版本构建项目不再使用 ProGuard 优化,Android Sutdio 3.3 版本开始用它做代码压缩器,比 ProGuard 缩减代码更快、输出大小更优,Unity 发布安卓应用可选择使用 | 较新的 Android 混淆编译器,减小应用大小,在特定版本 Android 构建项目中替代 ProGuard,缩减代码更快、输出更优 |
密钥管理器 | 发布设置 | 可通过密钥管理器创建、配置和加载密钥和密钥库,可在 Keystore Manager 窗口或 Publishing Settings 发布设置中加载现有密钥库和密钥 | - |
下拉菜单(密钥管理器) | 发布设置 | 在该下拉菜单选择创建新的密钥库或加载现有的密钥库 | 1. Create New:创建新的密钥库 - Anywhere:打开项目文件夹根目录下的文件资源管理器,是 Unity 存储密钥库的默认位置 - In Dedicated Location:将密钥库文件保存到计算机中的另一个目录中,为协同开发方便,建议保存在项目文件夹下 2. Select Existing:选择现有密钥库,可指定加载现有密钥库 |
Password(密钥库的密码) | 发布设置 | 密钥库的密码 | 设置密钥库密码 |
Confirm password(创建密钥库时需要重复一次密码) | 发布设置 | 创建密钥库时重复输入密码以确认 | 重复输入密码与 Password 一致 |
Existing Keys(现有密钥) | 发布设置 | 界面中包含当前密钥库包含的密钥的只读列表 | 显示当前密钥库中密钥的只读信息 |
New Key Values(新键值) | 发布设置 | 可在此处在密钥库中添加密钥 | 1. Alias:密钥的标识名字,一般分不同厂商,如 huawei、xiaomi 2. Password:密钥的密码 3. Confirm password:密钥的确认密码,必须和密码相同 4. Validity(years):有效期(年),默认有效期为 50 年,一般设置较大值,可理解为管理应用程序的有效时间 5. First and Last Name:名字和姓氏 6. Organizational Unit:所在企业中的部门 7. Organization:组织,管理应用程序的组织,一般为公司名 8. City Or Locality:个人所在的城市或地区 9. State or Province:个人所在的州或省 10. Country Code(XX):个人的国家代码,中国的国家代码为 86 |
9.PublishingSettings-其他
项目密钥库
项目密钥库是用来保存签名密钥,以保障应用程序安全性的容器。若要加载并使用现有的密钥库,需进行以下操作:
- 启动 Custom Keystore。
- 在 Select 下拉列表里选 Browse,从文件系统挑选密钥库。
- 输入密钥库密码。
相关设置说明
设置项 | 描述 |
---|---|
Custom Keystore | 启用后,能够指定加载和使用现有的密钥库 |
Select | 启用 Custom Keystore 后,可通过此按钮选择要使用的密钥库 |
Path | 显示所选密钥库所在的路径 |
Password | 输入用于加载所选密钥库的密码 |
Project Key | 加载密钥库后,Unity 会加载库中的全部密钥。可在此设置从该密钥库中选择哪一个密钥作为项目的活动密钥 |
Alias | 选择用于打开项目的密钥 |
Password(项目密钥密码) | 输入所选密钥的密码 |
构建相关
默认情况下,Unity 采用安装时提供的清单文件、Gradle 模板和文件来构建应用程序。若要进行自定义,需启用 Build 下方的复选框,此时文件会出现在复选框下方,接着打开新文件进行修改,保存修改后的文件,Unity 下次构建应用程序时就会自动使用这些文件。
设置项 | 描述 |
---|---|
Custom Main Manifest | 这是一个 xml 文件,可在此决定权限设置,还能设置是否启用某些安卓功能等 |
Custom Launcher Manifest | 同样是 xml 文件,可在此决定应用程序启动前的外观和行为 |
Custom Main Gradle Template | Gradle 是一个构建系统,能自动执行许多构建过程并避免常见的构建错误,Unity 对所有 Android 版本都使用 Gradle |
Custom Launcher Gradle Template | 这是一个 gradle 文件,包含了构建 Android 应用程序的相关说明 |
Custom Base Gradle Template | 是一个 gradle 文件,包含了所有其他模板和 Gradle 项目间的共享配置 |
Custom Gradle Properties Template | 属于属性文件,包含了 Gradle 生成环境的配置设置 |
Custom Proguard File | 是一个 txt 文件,包含了缩小过程的配置设置 |
代码混淆和缩小相关
Minify 是对应用程序代码进行缩减、混淆和优化的过程,能减小代码大小并增加反编译难度。使用 Minify 设置可确定 Unity 何时以及如何将缩小应用于构建。不过使用该功能会延长发布时间,还会使调试变得复杂,所以通常在最终发布时才使用,平时发布测试应用时无需开启。
设置项 | 描述 |
---|---|
Use R8 | 默认情况下,Unity 使用 Proguard 进行缩小。启用此复选框可改用 R8 |
Release | 若希望 Unity 在发布构建时缩小应用程序的代码,需启用此复选框 |
Debug | 若希望 Unity 在调试构建时缩小应用程序的代码,需启用此复选框 |
拆分应用程序二进制文件
启用 Split Application Binary 选项,可将输出包拆分为主包 (APK) 和扩展包 (OBB) 包。若要发布大于 100 MB 的应用程序,Google Play 应用商店要求使用此功能。
三、交互项目创建
1.Unity调用安卓
操作类型 | 方法调用格式 | 描述 |
---|---|---|
成员变量获取 | androidJavaObject.Get<变量类型>("变量名") |
用于获取 Android Java 对象的成员变量 |
成员变量赋值 | androidJavaObject.Set<变量类型>("变量名", 值) |
用于给 Android Java 对象的成员变量赋值 |
静态变量获取 | androidJavaObject.GetStatic<变量类型>("变量名") |
用于获取 Android Java 对象的静态变量 |
静态变量赋值 | androidJavaObject.SetStatic<变量类型>("变量名", 值) |
用于给 Android Java 对象的静态变量赋值 |
无返回值成员函数调用 | androidJavaObject.Call("函数名", 参数) |
调用 Android Java 对象的无返回值成员函数 |
有返回值成员函数调用 | androidJavaObject.Call<返回值类型>("函数名", 参数) |
调用 Android Java 对象的有返回值成员函数 |
无返回值静态函数调用 | androidJavaObject.CallStatic("函数名", 参数) |
调用 Android Java 对象的无返回值静态函数 |
有返回值静态函数调用 | androidJavaObject.CallStatic<返回值类型>("函数名", 参数) |
调用 Android Java 对象的有返回值静态函数 |
代码示例:
csharp
androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
btnOpenAndroidActivity.onClick.AddListener((() =>
{
androidJavaObject.Call("OpenActivity");
}));
2.安卓调用Unity
Android调用Unity规则
- 需要写在继承MonoBehaviour的脚本中。
- 需要挂载在场景中处于激活状态的GameObject上。
- 交互时,在Android端调用API:
调用方法 :UnityPlayer.UnitySendMessage("对象名", "函数名", "参数信息")
注意:该API中的参数只能是String类型或者为null
3.Android开发的必备原理
(1)Android应用程序的基本构成
Android SDK :为开发Android应用程序提供了各种各样的API和工具,是进行Android开发的基础支撑,它包含了丰富的开发资源。
编程语言 :主要使用Java或者Kotlin语言进行开发,这两种语言都提供了大量丰富的库和API,开发者可以利用这些来实现应用的各种功能。
XML配置文件:在Android应用程序中,XML用于定义UI布局、样式以及资源信息等。它承担着界面和资源相关的配置工作,使得开发者能够设计出不同的用户界面。
- 应用程序组件 :Android应用程序由以下四种组件组成:
- Activity(活动):主要用于实现用户界面,代表着一个屏幕或窗口,其中包含了各种UI组件,如按钮、文本、输入框等,是用户与应用进行交互的主要界面载体。
- Service(服务):是一种可以在后台执行长时间运行操作的组件,没有用户界面,通常用于处理和交互无关的逻辑,例如上传、下载、音乐播放等后台任务。
- Broadcast Receiver(广播接收器):主要负责接收系统或者其他应用程序发出的广播消息。这些消息可以来自系统事件,比如网络连接变化、设备启动等,也可以来自其它应用程序。
- Content Provider(内容提供程序):用于管理应用程序数据,既可以让其它应用程序或系统访问本应用中的数据,也能让本应用访问其它应用或系统的数据,例如用于存储应用程序的图片、音频、视频等数据。
在开发Android应用程序时,主要是编写基于这四种组件的逻辑。日常开发中,更多的是利用Android SDK中的API开发Activity活动组件,类似于游戏中UI界面逻辑开发。只有在有其他后台或者拓展功能需求时,才会使用其它三种组件。
(2)AndroidManifest.xml文件的作用
AndroidManifest.xml是Android应用程序的应用清单文件,每个应用程序都必须包含一个,并且文件名必须是AndroidManifest.xml。该文件中包含了应用程序的配置信息,Android系统会根据这些配置来运行应用程序。
以下是该文件中包含的重要信息:
应用程序组件信息 :包含应用程序的四大组件(Activity、Service、Broadcast Receiver、Content Provider)的相关内容。
应用程序权限 :如存储权限、互联网访问权限等等,通过这些权限声明,应用才能在系统中获得相应的操作许可。
应用程序元数据 :包括程序名称、版本号、图标、包名等等,这些信息用于标识和描述应用程序。
应用程序启动信息:指定默认启动哪一个Activity,决定了应用启动时呈现给用户的第一个界面。
(3)常用标签作用
manifest标签 :作为文件的根标签,主要包含包名、版本号等信息,是整个应用配置的基础。
uses-permission标签 :用于声明应用程序所需的权限,例如存储权限、网络访问权限等,明确应用在系统中可以执行的操作。
application标签 :应用程序的各组件都包含在其中,并且还可以配置一些图标、文本、样式等信息,是应用组件的容器。
activity标签 :用于描述Activity组件的具体信息,包括其属性和相关配置。
meta-data标签 :为Activity提供元数据,这些数据可以通过API获取,为Activity添加额外的信息。
intent-filter标签:为组件声明意图(intent),其中包含action(意图类型)和category(意图类别)两个子标签,用于定义组件的意图匹配规则,决定组件在何种情况下被激活。
4.交互项目创建
-
Unity项目:创建项目后切换到Android平台,设置包名和Android版本。
-
Android Studio项目:选择Phone and Tablet,创建Empty Activity项目。确保包名和Minimum SDK版本与Unity项目一致,若版本缺失,在Android Studio中下载。创建完成后,删除工程里两个Test项目和res下的无用资源。
-
build.gradle文件 :在Android Studio的Project页签切换到Project视图,展开app页签,打开build.gradle文件。将
id 'com.android.application'
改为id 'com.android.library'
,删除defaultConfig
中的applicationId
项,点击右上角"Sync Now"同步。 -
导入classes.jar包 :从
Unity安装目录\Data\PlaybackEngines\AndroidPlayer\Variations\mono(il2cpp)\Release\Classes
路径拷贝包到Android Studio的app\libs
下,选中包右键点击"Add As Library"。 -
导入UnityPlayerActivity脚本 :将
Unity安装目录/Data/PlaybackEngines/AndroidPlayer/Source/...
路径下的文件夹拷贝到Android Studio的app/src/main/java
中。 -
修改MainActivity脚本 :让其继承
UnityPlayerActivity
,注释onCreate
函数里的setContentView
代码。
-
修改AndroidManifest.xml配置文件 :删除
application
中的无用内容,在activity
里添加<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
。
8.选中 MainActivity
脚本,通过工具栏"Build" -> "Make Moudle ..." 生成Unity用的aar包。若打包时出现下载提示,等待下载完成即可构建成功。
9.将生成的aar包导入Unity。