UM1L4——Player Settings 打包安卓应用程序相关设置
UM1L4——Player Settings 打包安卓应用程序相关设置
Player Settings(打包安卓应用程序相关设置)
Build Settings ——> Player Settings 即可直接进入进行相关设置
基础设置
- 公司名
- 项目名
- 版本号
- 默认图标
- 默认鼠标指针
- 光标贴图偏移
图标设置 Icon
设置在设备上显示的应用图标
- Adaptive:运行在Android8.0及以上版本上的设备显示的应用图标
- Round:运行在Android7.1及以上版本上的设备显示的应用图标
- Legacy icons:运行在Android7.1以下版本上的设备显示的应用图标
里面的细分选项就是不同分辨率下的图标
分辨率和演示设置 Resolution and Presentation
-
分辨率和演示 Resoultion and Presentation
-
Fullscreen Mode 全屏模式
-
Fullscreen Window: 全屏窗口,导航栏始终处于隐藏状态
会缩放应用程序内容,为了匹配纵横比,可能会有黑边
-
Windowed: 窗口模式,窗口大小取决于应用程序分辨率
单位都是像素,多用于PC,而非安卓和IOS
- Default Window Width: 应用程序窗口默认窗口宽度
- Default Window Height: 应用程序窗口默认窗口高度
- Minimum Window Width: 应用程序窗口的最小宽度
- Minimum Window Height: 应用程序窗口的最小高度
-
-
Resizable Window 可调整大小的窗口
设置用户是否可以调整应用程序窗口的大小
此设置可以安卓和平板电脑上的应用程序中启用多窗口功能效果如下:
详情:多窗口支持 | Android 开发者 | Android Developers(可能需要加速工具)
详情:多窗口支持 | Android 开发者 | Android Developers (google.cn)(可以直连)
-
Hide Navigation Bar 是否隐藏顶部显示的导航栏
-
Render outside safe area
是否应使用所有可用的屏幕控件进行渲染 包括刘海区域效果对比(左为启用,右为启用):
-
Optimized frame Pacing
是否应均匀分布帧以减小帧速率的方差,启用后体验更流畅
-
-
分辨率缩放 Resolution Scaling
-
Resolution Scaling Mode:分辨率缩放模式
- Disabled:禁用 不应用分辨率缩放,
应用程序呈现为设备的本机屏幕分辨率 - Fixed DPI:使用API应用分辨率缩放,
使用此选项可优化性能和电池寿命(不常用)
- Disabled:禁用 不应用分辨率缩放,
-
Target DPI:目标DPI(Fixed DPI下使用)
如果设备的本机屏幕DPI高于设置的值,
Unity将降低应用程序的分辨率以匹配此设置,
Resolution Scaling Mode选择Fixed DPI才会出现该选项
计算方式:
其中Factor是在Quality质量设置中
设置的Resolution Scaling Fixed DPI Factor参数
-
Reset resolution on window resize:修改窗口大小重置分辨率
当本机窗口大小更改时,
是否将屏幕分辨率设置为新的本机窗口大小
如果分辨率缩放模式是Fixed DPI,则将重新计算分辨率
常用于Resolution Scaling Mode为Fixed DPI的情况 -
Blit Type: 光高类型 是否使用Blit将最终图像呈现在屏幕上
涉及屏幕后处理相关,一般总是开启
-
Always:总是让Unity渲染到屏幕外的缓冲区,
然后使用Blit将缓冲区的内容复制到设备的帧缓冲区
(这和大部分设备兼容,但比不用Blit慢) -
Nerver:Unity将渲染到设备操作系统提供的帧缓冲区,
如果失败,会有警告信息打印到日志当中。
通常比使用Blit块,但是不兼容所有设备 -
Auto:Unity会渲染到设备操作系统提供的帧缓冲区,
如果失败,会打印到日志中,
并使用Blit将最终图像呈现到屏幕上
-
-
-
Supported Aspect Ratio:支持的纵横比
-
Aspect Ratio Mode:指定应用程序支持的最大纵横比
如果设备的纵横比大于此纵横比,Unity会将此纵横比用于应用程序,并添加黑条,使应用程序不会拉伸,一般不修改默认选项
- Legacy Wide Screen(1.86):支持Android传统宽屏宽高比
- Native Aspect Ratio:支持Android本机宽高比的宽高比
- Custom:自定义纵横比,选择该选项后可以自己设置
-
-
Orientation:屏幕取向,或者说应用程序采用哪个屏幕方向
-
Default Orientation:默认取向,指定应用程序使用的屏幕方向(即横屏、竖屏设置)
-
Portrait:竖屏(应用程序窗口底部和屏幕底部对齐)
-
Portrait Upside Down:竖屏倒置
(应用程序窗口底部和屏幕顶部对齐) -
Landscape Right:右横屏
(应用程序窗口右侧和屏幕底部对齐) -
Landscape Left:左横屏
(应用程序窗口左侧和屏幕底部对齐) -
Auto Rotation:自动旋转,可多选屏幕取向,最常用
可以旋转到你允许的任意方向,在下方勾选即可
对于大部分游戏来说,要么限制竖屏(只选前两个),要么限制横屏(只选后两个)
-
-
-
剩余设置
-
Use 32-bit Display Buffer:
显示缓冲区是否保存32位颜色值而不是16位颜色值
(后期渲染出现效果问题时使用)如果你在后期处理效果中看到了条带效果或者需要Alpha值,请启用此设置,某些后期处理效果需要开启它,因为他们以显示缓冲区相同的格式创建渲染纹理,避免出现闪烁等渲染错误
-
Disable Depth and Stencil:是否禁用深度和模板缓冲区
-
Render Over Native UI:在本机UI上呈现(少用)
设置是否在Android或者IOS的本机UI上进行渲染
如果要该设置生效,需要把相机的清楚标志设置为使用Alpha值低于1的纯色 -
Show Loading Indicator:显示加载指示器,指定加载指示器是否显示以及如何显示
- Don’t Show:不显示加载指示条
- Large:显示大的加载指示条
- Inversed Large:显示大的加载指示条,并带有翻转颜色
- Small:显示小的加载指示条
- Inversed Small:显示小的加载指示条,并带有翻转颜色
-
启动图像设置 Splash Image
-
Virtual Reality Splash Image:虚拟现实的初始屏幕设置
-
Show Splash Screen: 是否显示启动图像
(收费版本才能修改,免费版本不能改) -
Preview: 预览
-
Splash Style: 启动风格
- Dark on Light: 暗到亮
- Light on Dark: 亮到暗
-
Animation:启动图像动画效果
- Static:静态不动的
- Dolly:由小变大
- Custom:自定义
-
Draw Mode:绘制模式
- Unity Logo Below:Unity Logo显示在前
- All Sequential:所有按顺序
-
Logos:可以自己添加Logo图片按顺序显示
-
Background:背景
- Overlay Opacity: 覆盖不透明度
- Background Color: 背景颜色
- Blur Background Image:模糊背景图像
- Background Image:背景图像
- Alternate Portrait Image:备选图像
-
Static Splash Image:静态启动图像
-
Scaling: 缩放比例
-
Center: 居中(仅缩小):除非图像太大,否则以原始大小绘制图像,Unity会缩小图像
-
Scale to fit: 缩放以适应(填充)
缩放图像,使较长尺寸完全适合屏幕大小,以黑色填充两侧空白区域
-
Scale to fit: 缩放以适应(裁剪)
缩放图像,使较短的尺寸完全适合屏幕大小,将图像裁剪为较长的维度
-
-
其他设置 Other Settings
渲染设置相关 Rendering
-
Color Space:色彩空间,可以在此切换Unity中用于渲染的色彩空间(如果游戏主要针对新设备,选择Linear,否则选择Gamma)
详情请看:颜色空间 - Unity 手册
-
Gamman(伽马)和 Linear(线性)区别
Unity的纹理倾向于保存在伽马颜色空间中,
而着色器期望使用线性颜色空间
因此,在着色器中对纹理进行采样时,
基于伽马的值会导致不准确的结果,
我们可以选择线性色彩空间 Linear,
然后通过纹理中的sRGB选项决定是用伽马还是线性,
勾选sRGB是伽马,取消勾选是线性这部分之前在U3L2-1——参数设置—纹理类型讲过
点此查看:线性空间与伽马空间显示差异
详情可见:线性或伽马工作流程 - Unity 手册 -
线性渲染的效果相对较好一些,但并不是所有平台都支持线性渲染
-
支持的平台为:
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
确定你的应用程序运行的主流设备是否支持,
如果支持则选择线性,不支持选择伽马 -
-
-
Auto Graphics API:自动图形接口
(一般选择自动,如果为了保险可选择下方三个副选项)何为Vulkan、OpenGL ES:计算机图形程序接口相关
-
勾选:Unity会自动尝试使用对应图形API接口进行图形处理
默认使用Vulkan,如果设备不支持Vulkan,
Unity会回退到GLES3.2、GLES3.1或GLES3.0 -
不勾选:可以列表中自己对使用的图形API接口进行排序,
设置使用优先级
如果希望所有的设备都可以运行,请需要加上OpenGLES2
下方的副选项:ES3.1、ES3.1+AEP、ES3.2
他们是三个额外的用于配置最低OpenGL ES 3.X次要版本的
当设备不支持Vulkan时,就可以选择下面要求使用哪个版本- Require ES3.1: 要求使用 ES3.1
- Require ES3.1 + AEP: 要求使用 ES3.1 + AEP
- Require ES3.2: 要求使用 ES3.2
注意:只有当GLES2不在列表中的时候,
Unity才会将额外的三个选项要求添加到Android应用清单中,
在这种情况下,如果你的应用发布到GooglePlay应用商店,
它将不会显示在不受支持的设备上 -
-
Color Gamut:色域,可以添加或删除用于 Android 平台渲染的色域
色域定义了可用于给定设备(如监视器或屏幕)的可能颜色范围。sRGB 色域是默认(也是必需的)色域。
当定位具有宽色域显示的设备时,
请使用 DisplayP3 来利用完整的显示功能。
一般的手机使用sRGB即可,
如果是PC主机游戏,可以考虑添加DisplayP3 -
Multithreaded Rendering:多线程渲染(建议开启)
启用此选项可将图形 API 调用从 Unity 的主线程移动到单独的工作线程。缺点是可能在部分设备上出现渲染错误
这有助于提高主线程上 CPU 使用率较高的应用程序的性能。
-
Static Batching:静态批处理 会将静态物体合并处理DC,提升性能
-
Dynamic Batching:动态批处理 可以动态的合并DC,提高性能
当可编程渲染管线(SPR)处于活动状态时,
也就是启用了URP或者HDRP时,动态批处理不起作用
在使用FairyGUI时,就需要开启它,FairyGUI的DC将得到优化 -
Compute Skinning:计算蒙皮(建议开启)
启用此选项可启用 DX11/ES3 GPU 计算蒙皮,
从而释放 CPU 资源 图形接口的版本要求较高,
PC上DX11、移动设备ES3 -
Graphics Jobs(Experimental):图形作业(实验性功能)
启用后,Unity将渲染循环的图形任务移到其它CPU内核上运行的工作线程,可以减少在主线程上花费的时间
-
Texture compression format:纹理压缩格式
(可在Build Settings内设置)
可以在ASTC、ETC2、ETC之间进行选择
-
Normal Map Encoding:法线地图编码(较少修改)
选择 XYZ 或 DXT5nm 样式以设置法线映射编码。
这会影响用于法线贴图的编码方案和压缩格式。
DXT5nm 样式的法线贴图质量更高,但在着色器中解码成本更高 -
Lightmap Encoding:光照贴图编码
选择“正常质量”或“高质量”以设置光照贴图编码。
此设置会影响光照贴图的编码方案和压缩格式 -
Lightmap Streaming:光照贴图流
是否对光照贴图使用 Mipmap 流式处理(增加一定的内存消耗)适用于视角会拉远拉近的3D游戏
-
Streaming Priority:流式传输优先级
设置 Mipmap 流式处理系统中所有光照贴图的优先级。
Unity 在生成光照贴图时会将此设置应用于所有光照贴图。
正数表示更高的优先级。有效值范围为 –128 到 127
-
-
Frame Timing Stats:帧时序统计
启用此属性可收集 CPU 和 GPU 帧时间统计信息
需要和摄像机上的动态分辨率设置结合使用
(Camera组件下的Allow Dynamic Resolution选项),
以确定应用程序是受 CPU 还是 GPU 限制。 -
OpenGL:Profiler GPU Recorders:是否启用OpenGL的探查GPU记录器
在OpenGL上,探查GPU记录器 会 禁用GPU探查器
-
Virtual Texturing:虚拟纹理(不兼容安卓)
可在场景中具有很多高分辨率纹理时
减少 GPU 内存使用量和纹理加载时间。
它将纹理拆分为瓦片,
然后在需要时将这些瓦片逐步上传到 GPU 内存中。注意:虚拟纹理和安卓设备不兼容
-
Shader Precision model:着色器精度模型
控制着色器中使用的采样器的默认精度
-
360 Stereo Capture:360 度立体捕捉(不兼容安卓)
Unity 是否可以捕获立体 360 度全景图像和视频
注意:360 度立体捕捉与 Android 不兼容。
Vulkan设置 Vulkan Setting
注意:安卓平台且无特殊需求时,不要修改这些选项
-
SRGB Write Mode:SRGB 写入模式
允许呈现器在运行时切换 sRGB 写入模式,
如果要暂时关闭线性到 sRGB 写入颜色转换,可以启用该选项注意:建议不要为移动设备启用该选项
它会增加移动设备GPU的负担,产生负面影响 -
Number of swapchain buffers:交换链缓冲区数量
设为2位双缓冲,设为3为三重缓冲可以和Vulkan渲染器一起使用
该设置可以帮助解决移动平台上的延迟问题注意:一般情况下我们不要修改此选项,保持为3,
不要在安卓设备上使用双缓冲,会产生负面影响 -
Acquire swapchain image late as possible:尽可能晚的获取交换链图像
启用后,Vulkan会延迟获取后缓冲器,直到它将帧渲染为屏幕外图像。Vulkan 使用暂存映像来实现此目的。
启用此设置会导致在显示反向缓冲器时产生额外的光圈。
此设置与双缓冲相结合,可以提高性能。
但是,它也可能导致性能问题,因为额外的 blit 会占用带宽。注意:安卓设备上我们不要修改该选项
-
Recycle command buffers:回收命令缓冲区
Unity 执行命令缓冲区后是回收还是释放命令缓冲区
-
Apply display rotation during rendering:在渲染期间应用显示旋转
启用此选项可在显示的本机方向上执行所有渲染。
这在许多设备上具有性能优势,
虽然如此,但是使用它会带来一些限制,
所以还是建议大家不要修改此选项
身份证明设置 Identification
注意:首次发布时,一定要确保包名的正确性
-
Override Default Package Name:是否覆盖默认包名称 (如果你的公司名和游戏名不是英文,请勾选它自行设置包名)
-
Package Name:软件包名,相当于应用程序的ID,用于在设备和安卓应用商店中的唯一标识。
格式:
com.公司名.产品名
,
只能包含字母数字和下划线,每段都必须以字母开头 -
Version:版本号,显示给用户看的,用于标识应用程序包的迭代
格式:
数字.数字.数字...
,比如:1.0、4.3.2、1.2.1等 -
Bundle Version Code:内部版本号,不会显示给用户看
确定一个版本是否比另一个版本新,数字越大表示版本越新,
该值为整数,比如每次发布新版本时可以让数字加一
-
Minimum API Level:最低API级别
决定应用程序运行需要的最低的API级别,
如果用户手机的SDK版本低于该设置,
Android系统会阻止用户安装该应用程序 -
Target API Level:目标API级别
用于指定应用的目标API级别,
主要用于通知Android系统,我们已经针对目标版本进行了测试,
并且系统不应该通过启用任何兼容性行为,
以保持你的应用与目标版本的向前兼容性。
应用程序一样可以在较低版本上运行(取决于Minimum API Level)
配置设置 Configration
-
Scripting Backend:脚本后端,决定Unity如何在项目中编译和执行C#代码(多选择IL2CPP,性能更好)
- Mono:将C#编译为.Net公共中间语言CIL,并使用公共语言运行时执行中间语言
- IL2CPP:将C#编译为CIL,再将CIL转换为C++,再将C++编译为本机代码,
Mono和IL2CPP的具体区别请看:
CS5L3——Unity跨平台的基本原理之IL2CPP -
Api Compatibility Level:API兼容性级别,决定可以在项目中使用的.Net API(尽可能使用)
该设置会影响代码和第三方库的兼容性
- .Net Standard 2.1:和.Net Standard 2.1兼容,生成较小的版本,具有完整的跨平台支持
- .Net Framework:和.Net Framework兼容
(包含.Net Standard 2.1中的所有的内容),
包含更多的API支持,但是会生成更大的包。
如果在使用C#的一些高级功能时遇到报错或无法使用,
可以尝试切换到.Net Framework以便支持这些高级功能的使用,
如果有替代方案,建议使用替代方案(即避免使用高级功能),
尽量使用.Net Standard 2.1可以让包体更小 -
C++ Compiler Configuration:C++编译器配置
只有将Scripting Backend设置为IL2CPP,才能使用该选项
(开发时可选Debug,最终发布时可用Master)- Debug(调试模式): 将关闭所有优化,让代码生成速度更快,
但运行速度较慢,可以在这种模式下进行调试 - Release(发布模式):会对代码进行优化,编译后的代码运行会更快,二进制文件大小更小,但编译时间更长
- Master(大师模式):可实现所有可能的优化,从而压缩每一点可能的优化,发布时间比发布模式还要长,如果接受较长的发布时间,建议在发布最终版本时使用Master模式
- Debug(调试模式): 将关闭所有优化,让代码生成速度更快,
-
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模式可以选择更多的模式ARM就是一种微处理器硬件
Chrome OS是一款Google开发的基于PC的操作系统- ARMv7 32位的ARM
- ARM64 64位的ARM
- x86(Chrome OS) 32位
- x86-64(Chrome OS) 64位
-
Split APKs by target architecture:按目标架构拆分APK(实验性功能)
启用后,可以为目标体系结构中选择的每个CPU架构创建单独的APK,这样在Google Play中为用户提供下载时,它会根据设备的情况下载对应版本的APK,可以让apk更小,用户下载更小的包。
但是主要是针对Google Play,因此面向国内的产品几乎不会使用。 -
Target Devices:目标设备 执行允许运行APK的目标设备
- All Devices(所有设备):允许apk在所有Android和Chrome OS设备上运行
- Phones,Tablets,and TV Devices Only(手机、平板、电视设备):允许apk在Android手机和平板电脑、电视上运行,但是不能在Chrome OS设备上运行
- Chrome OS Devices Only(Chrome OS设备):允许apk在Chrome OS设备上运行,但是不能在Android手机、平板、电视上运行
-
Install Location:安装位置 指定设备上的应用程序安装位置
- Automatic:自动让操作系统决定,用户可以自己移动安装位置
- Prefer External:首选外部安装,如果可以,将应用程序安装到外部存储中(SD卡),如果不能,应用程序安装到手机存储空间中
- Force Internal:强制内部,强制将应用程序安装到手机存储空间中,用户无法将应用程序移动到外部存储中安装
-
Internet Access:互联网接入(一般不修改)
选择是否始终将网络权限添加到Android清单(即使你没有使用任何网路API)
- Auto:仅当使用了网络API时才会添加互联网访问权限
- Require:使用添加互联网访问权限
-
Write Permission:写入权限
是否启用对外部存储(SD卡)的写入访问权限,
并向Android应用清单添加相应的权限- Internal(内部):仅授予对内部存储的写入权限
- External(外置SD卡):启用对外部存储的写入权限
-
Filter Touches When Obscured:遮挡时过滤触摸(可启用)
启用后可以丢弃在另一个可见窗口覆盖Unity应用程序时收到的触摸(触屏事件),可以防止窃听劫持
-
Sustained Performance Mode:持续性能模式(一般不开启)
启用此选项可在较长的时间段内设置可预测且一致的设备性能级别,而无需进行热限制。启用此设置时,整体性能可能会降低
-
Low Accuracy Location:低精度定位
启用后可改为低精度值与Android位置API配合使用 -
Chrome OS Input Emulation: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:活动输入处理(选择新老输入系统)
选择要如何处理来自用户的输入
- Input Manager:老的输入系统,Input相关
- Input System Package:新输入系统
- Both:同时使用
脚本编译模式 Script Compilation
-
Scripting Define Symbols:脚本定义符号,可以在此设置自定义编译标志,控制某些代码是否被编译,例如不同平台编译不同语句
定义
MR_TANG
符号前:
定义
MR_TANG
符号后:
再使用一些第三方内容时有时会在此处添加脚本符号,
比如:Lua热更相关、FairyGUI相关Unity有内置的脚本符号,这些符号能够帮助我们有选择的在编译中包含或排除部分代码
这些脚本符号可以配合多路测试
1
2
3
4
5
6
7
脚本符号1被定义时会编译的代码逻辑
脚本符号2被定义时会编译的代码逻辑
脚本符号1或者2都未被定义时编译的代码逻辑- 平台脚本符号(已有记录,点此查看)
- 编辑器版本脚本符号
- 其它脚本符号
-
Additional Compiler Arguments:其它编译器参数,向此列表添加条目以将其他参数传递给 Roslyn 编译器(C#的编译器)
对每个附加参数使用一个新条目。
要创建新条目,请按“+”按钮,要删除条目,请按“-”按钮。
添加完所有所需参数后,
单击Apply按钮来在将来的编译中包括其他参数
“还原”按钮将此列表重置为最近应用的状态。 -
Suppress Common Warnings:禁止显示常见警告
禁用此设置可显示C#警告
- CS0169:从不使用私有字段,声明了私有变量,但是从没有使用
- CS0649:编译器检测到从未分配值的未初始化的私有或内部字段声明
-
Allow ‘unsafe’ Code:允许使用“不安全”代码
启用对在预定义程序集中编译“
unsafe
”C# 代码的支持,
unsafe
的具体内容请看 ——> unsafe -
Use Deterministic Compilation:使用确定性编译
启用此设置后,编译的程序集在每次编译时都是完全相同的。
禁用此设置可防止使用-确定性 C# 标志
进行编译确定性编译可用于确定二进制文件是否从受信任的源编译
-
Enable Roslyn Analyzers:启用罗斯林分析器
禁用此设置可编译用户编写的脚本,而无需项目中可能存在的 Roslyn 分析器 DLL(Roslyn 就是微软的.Net开源编译器,编译器支持 C# 编译,并提供丰富的代码分析API)
编辑器版本脚本符号
也可有选择地编译代码。可用选项取决于所使用的 Editor 版本。
如果版本号为 X.Y.Z__
(例如,2.6.0
),Unity 将使用以下格式公开三个全局 #define
**指令:** __UNITY_X
、UNITY_X_Y
和 UNITY_X_Y_Z
以下是 Unity 5.0.1 中公开的 #define 指令的示例:
Define |
功能 |
---|---|
UNITY_5 |
用于 Unity 5 发行版的 #define 指令,在每个 5.X.Y 版本中公开。 |
UNITY_5_0 |
用于 Unity 5.0 主要版本的 #define 指令,在每个 5.0.Z 版本中公开。 |
UNITY_5_0_1 |
用于 Unity 5.0.1 次要版本的 #define 指令。 |
从 Unity 5.3.4 开始,可根据编译或执行给定代码部分所需的最早 Unity 版本来有选择地编译代码。
如果采用与上面相同的版本格式 (X.Y.Z),Unity 将以 UNITY_X_Y_OR_NEWER 格式公开一个可用于此目的的全局 #define。
编译示例(以Unity2021版为例子):
其它脚本符号
Define |
功能 |
---|---|
CSHARP_7_3_OR_NEWER |
在构建支持 C# 7.3 或更高版本的脚本时定义。 |
ENABLE_MONO |
用于 Mono 的脚本后端 #define。 |
ENABLE_IL2CPP |
用于 IL2CPP 的脚本后端 #define。 |
NET_2_0 |
在 Mono 和 IL2CPP 上根据 .NET 2.0 API 兼容性级别构建脚本时定义。 |
NET_2_0_SUBSET |
在 Mono 和 IL2CPP 上根据 .NET 2.0 Subset API 兼容性级别构建脚本时定义。 |
NET_LEGACY |
在 Mono 和 IL2CPP 上根据 .NET 2.0 或 .NET 2.0 Subset API 兼容性级别构建脚本时定义。 |
NET_4_6 |
在 Mono 和 IL2CPP 上根据 .NET 4.x API 兼容性级别构建脚本时定义。 |
NET_STANDARD_2_0 |
在 Mono 和 IL2CPP 上根据 .NET 标准 2.0 API 兼容性级别构建脚本时定义。 |
ENABLE_WINMD_SUPPORT |
在 IL2CPP 上启用 Windows 运行时支持时定义。有关更多详细信息,请参阅 Windows 运行时支持。 |
ENABLE_INPUT_SYSTEM |
在 Player Settings 中启用 Input System 包时定义。 |
ENABLE_LEGACY_INPUT_MANAGER |
在 Player Settings 中启用旧版 Input Manager 时定义。 |
优化设置 Optimization
-
Prebake Collision Meshes:预烘焙碰撞到网格,启用该选项可以在构建时将碰撞数据添加到网格(内存换性能)
-
Keep Loaded Shaders Alive(该选项未出现在笔者的编辑器内,原因不明):保持加载的着色器的活动状态,启动后,不能卸载着色器(内存换性能)
着色器加载时会造成性能开销,可能会出现卡顿现象,不允许卸载着色器可以避免卸载后重复加载
-
Preloaded Assets:预装资源(启动游戏时使用)
设置启动时加载的资源数组 将想要预加载的内容拖入框中
-
Strip Engine Code:剥离引擎代码, 选择IL2CPP模式才会出现的字段
如果你希望在IL2CPP模式,能够删除Unity引擎功能中没有使用的代码,可以启用该选项,可以有效的减小包体大小
-
Managed Stripping Level:管理剥离水平
选择Unity如何剥离未使用的C#代码
在发布应用程序时,Unity会自动去除掉没有使用的代码,剥离代码可以使生成的执行文件减小,但是有可能会意外删除需要使用的代码在C#知识补充中讲解IL2CPP相关内容时讲解过
- Disabled:不剥离,只有在Mono模式下才能选择
- Minimal:最小剥离,Unity只会搜索Unity引擎未使用的.Net类库,不会删除任何用户编写的代码,该设置基本不会出现意外剥离,在使用IL2CPP模式后,该模式是默认模式
- Low:低级剥离,处理Unity相关,玩家自己编写的代码也会被剥离,会尽量减小意外剥离发生
- Medium:中级剥离,比起Low更多一些剥离
- High:高级剥离,优先考虑打包大小,会最大限度剥离代码。可以配合link.xml来手动拒绝剥离,或使用
[Preserve]
特性 (在不希望被剥离的函数前加该特性)
-
Enable Internal Profiler:启用内部探查器,已经弃用的功能
用此选项以从Android SDK的设备中获取profiler数据adblogcat测试项目时输出。这仅在开发版本中可用。
-
Vertex Compression:顶点压缩
选择要设置的通道,以便在顶点压缩方法下压缩网格
通常,顶点压缩用于减少内存中网格数据的大小,减小文件大小,提高CPU性能。 -
Optimize Mesh Data:优化网格数据(着色器切换的情况下关闭)
启用后,构建时会从使用的网格中剥离未使用的顶点属性
它可以减少网格中的数量,也可以减小包体大小,可以减小加载时间和运行时的内存使用但是,如果启用了该设置,运行时就不要更改材质或着色器相关设置
也就是说,如果你游戏会在运行时转换一些对象的着色器,就不能开启该选项。
比如游戏中某一个对象,如果网格使用简单漫射着色器,那么 Unity 将删除 切线矢量,因为并不需要它们。
如果您想要在运行时切换到网格上的凹凸贴图着色器 ,那么您将不会得到正确的切线数据,因为此数据已被删除 -
Texture MipMap Stripping:贴图纹理剥离
启用后会启用纹理贴图剥离,在构建时会从纹理中剥离没有使用的纹理贴图。
会根据你发布平台的质量设置进行比较来确定哪些贴图用不到。 mipmap生成的多分辨率图也会被剥离
堆栈跟踪设置 Stack Trace
堆栈跟踪,选择在特定的上下文中允许的日志记录类型,可以选择日志记录的方式
None:不记录、ScriptOnly:只在运行脚本时记录信息、Full:一直记录
- Error:错误信息
- Assert:断言(用于检测非法情况的)信息
- Warning:警告信息
- Log:打印日志信息
- Exception:异常信息
旧版设置相关 Lengcy
- Clamp BlendShapes(Deprecated):钳制混合形状(已废弃)
启用骨骼蒙皮动画中钳制混合旋转权重的范围
发布设置 Publishing Settings
发布设置必备知识
-
Android 中的签名
Android要求所有已安装的应用程序都使用数字证书做数字签名,数字证书的私钥由应用开发者持有,
Android使用证书作为标示应用程序作者的一种方式,并在应用程序之间建立信任的关系。
证书并不用来控制用户能否安装哪个应用。证书不需要由证书认证中心签名;完全可以使用自制签名证书。没有正确签名的应用,Android系统不会安装或运行。
此规则适用于在任何地方运行的Android系统,不管是在模拟器还是真实设备上。
因为这个原因。在真机或模拟器上运行或者调试应用前,必须为其设置好签名。为什么要使用签名?
上图是我们在Unity中发布Android应用程序时,设置的包名
开发Android的人这么多,完全有可能把包名命名成同样的名字,这个时候该如何区分?
这时就需要签名来区分了,由于开发商可能通过使用相同的Package Name(包名)来混淆替换已经安装的程序,
签名可以保证相同名字,但是签名不同的包不被替换。举例:
比如应用程序 A 和 应用程序 B 的包名是相同的,如果没有签名的存在,在同一Android设备上重复安装A和B,
就会导致他们之间的彼此覆盖,不能同时拥有,为了避免这种情况出现,就有了签名机制。我们之后在讲解Publishing Settings(发布设置)中提到的安卓密钥库和密钥,就是用来进行Android签名的。
-
Android 应用程序清单
Android应用程序工程中,有一个叫做
AndroidManifest.xml
的xml文件,
该文件在之后的开发中我们会经常使用和编辑,该配置文件主要用于声明应用程序的组件,并且还有以下的一些重要作用:- 确定应用程序要求的用户权限,比如:网络访问、通讯录访问、信息读取等权限
- 声明应用程序要求的最低API Level
- 声明应用程序将要使用的或要求的硬件和软件特性,比如:摄像头访问、蓝牙服务、多点触碰等
等等
也就是说,如果我们想要在安卓游戏当中使用一些系统功能或硬件访问权限,都需要在该文件当中进行设置。
Unity中如果引入Android第三方SDK,或者需要和Android进行交互,经常会对该文件进行编辑。如果我们没有这些需求,可以忽略它。
-
Gradle
Gradle 是一个自动化构建开源工具,主要面向Java应用为主,也支持其它语言,比如C++、Kotlin、Swift,未来还会支持更多的语言。
它是一个基于JVM(Java虚拟机)的构建工具,是一款通用灵活的构建工具,也可以用于Android 项目的构建工作,它可以让安卓项目变得更加简洁。
在Unity中简单理解Gradle,它就是用于帮助我们打包出安卓应用程序 .apk 的一个工具,在Android Studio中也使用Gradle进行应用程序打包。 -
代码混淆及其实现
代码混淆(Obfuscated code),是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。
代码混淆主要用于程序源代码,也可以用于程序编译而成的中间代码。
执行代码混淆的程序被称作代码混淆器。已经存在许多种功能各异的代码混淆器。将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。
比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。
重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。
比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。
比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。代码混淆的主要目的是提升源代码的安全性,别人反编译你的应用程序代码后,增加他们阅读分析逻辑的难度。
ProGuard 和 R8 是两种不同的代码混淆器
-
ProGuard
ProGuard是一个压缩、优化和混淆Java字节码(Java源代码通常被编译为字节码)文件的免费的工具,
它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。
它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。
常常在Android开发用于混淆最终的项目,增加项目被反编译的难度。Unity发布安卓应用程序时,默认使用的就是ProGuard来进行处理最终的代码。
-
R8
R8是相对ProGuard较新的Android混淆编译器,它可以尽可能的减小应用的大小,
早期的Android Studio版本中,混淆编译器使用的是ProGuard执行编译时的代码优化,
如果我们使用Android Gradle 3.4.0或更高版本构建项目时,不再使用ProGuard进行代码优化,而是采用R8编译器协同工作。Android Sutdio 3.3版本开始,就使用R8作为代码压缩器来对代码进行混淆、压缩、优化了。
R8 相对 ProGuard来说,它可以更快地缩减代码,同时改善输出的大小。Unity发布安卓应用程序时,我们可以选择使用R8混淆编译器进行发布处理。
-
密钥管理器 Keystore Manager
可以通过密钥管理器创建、配置和加载密钥和密钥库,密钥的作用: Android 中的签名
我们可以在 Keystore Manager 窗口 或 Publishing Settings 发布设置中 加载现有密钥库和密钥
-
Keystore:创建新的密钥库 加载现有的密钥库
-
Create New:创建新的密钥库
- Anywhere:任何地方,会打开项目文件夹根目录下的文件资源管理器,这是Unity存储密钥库的默认位置
- In Dedicated Location:专用位置,将密钥库文件保存到计算机中的另一个目录中
注意:为了协同开发方便,建议大家就把密钥库保存在项目文件夹下,避免其它同事无法访问密钥库
-
Select Existing:选择现有密钥库 可以指定加载现有密钥库
-
-
Password:密钥库的密码
-
Confirm password:创建密钥库时 需要重复一次密码
-
Existing Keys:现有密钥,界面的这一部分包含当前密钥库包含的密钥的只读列表(密钥库内创建过密钥才会出现该选项)
-
New Key Values: 新键值(可以在此处在密钥库中添加密钥)
- Alias:密钥的标识名字
- Password:密钥的密码(不是密钥库的密码)
- Confirm password:密钥的确认密码,必须和密码相同
- Validity(years):有效期(年) 默认有效期为50年
一般设置较大就行,可以理解是你管理这个应用程序的有效时间 - First and Last Name:你的名字和姓氏
- Organizational Unit:你所在企业中的部门
- Organization:组织,管理你应用程序的组织,一般就是公司名
- City Or Locality:你个人所在的城市或地区
- State or Province:你个人所在的州或省
- Country Code(XX):你个人的国家代码
中国的国家代码为:86
发布设置的参数
-
Project Keystore:项目密钥库,用于保存签名密钥来实现应用程序安全性的容器(如果不启用将会使用Unity自带的调试用的密钥)
如果想要加载和使用现有密钥库,我们需要:
- 启动 Custom Keystore
- 在 Select 下拉列表中选择 Browse,从文件系统中选择密钥库
- 输入密钥库密码
具体内容:
- Custom Keystore:启用后,可以指定加载和使用现有密钥库
- Select:启用Custom Keystore后,该按钮可以用来选择要使用的密钥库
- Path:你选择的密钥库所在路径
- Password:输入密钥库密码以加载所选的密钥库
-
Project Key:项目密钥
加载密钥库后,Unity会加载该密钥库中的所有密钥
我们可以在项目密钥Project Key中设置从该密钥库中选择哪一个密钥用来作为该项目的活动密钥- Alias:选择用于打开的项目的密钥
- Password:密钥密码
-
Build:构建相关
默认情况下,Unity使用Unity安装提供的清单文件、Gradle模板和文件构建应用程序,如果想要自定义这些内容,你需要:
- 启用Build下方的这些复选框,文件会出现到复选框的下方
- 打开新文件进行更改
- 保存修改的文件,Unity下次构建应用程序时会自动使用的文件
具体内容:
-
Custom Main Manifest:自定义主清单文件
该清单文件是一个xml文件,具体可看:Android 应用程序清单
我们可以在此决定一些权限设置
(比如:网络、定位、拍照等权限配置),
还可以设置是否启用一些安卓功能等等 -
Custom Launcher Manifest:自定义启动器清单
该清单文件是一个xml文件
我们可以在此决定一些应用程序启动之前的外观和行为。
(比如:图标、名称、安装位置等等) -
Custom Main Gradle Template:自定义主Gradle构建模板
Gradle 是一个构建系统,具体可看:Gradle
可自动执行许多构建过程并防止许多常见的构建错误。
Unity将Gradle用于所有Android版本。
您可以在Unity中构建输出包(.apk,.aab),也可以从Unity导出Gradle项目,然后使用Android Studio等外部工具构建它
是一个gradle文件,包含有关如何将Android应用程序构建为库的信息 -
Custom Launcher Gradle Template:自定义启动器Gradle构建模板
是一个gradle文件,包含有关如何构建Android应用程序的说明
-
Custom Base Gradle Template:自定义基础Gradle构建模板
是一个gradle文件,包含在所有其它模板和Gradle项目之间的共享配置
-
Custom Gradle Properties Template:自定义属性Gradle构建模板
属性文件,包含Gradle生成环境的配置设置
比如 JVM(Java虚拟机)内存配置
允许Gradle使用多个JVM构建的属性
用于选择进行缩小的工具的属性
构建应用程序包时不压缩本机库的属性等等 -
Custom Proguard File:自定义Proguard文件
是一个txt文件,包含缩小过程的配置设置
如果缩小删除了一些应该保留的Java代码,你可以添加一条规则来将这些代码保留在此文件中
-
Minify:代码混淆和缩小相关
代码混淆、Proguard、R8具体可看:代码混淆及其实现
是一种缩减、混淆和优化应用程序代码的过程
它可以减小代码大小并使代码更难以反编译
使用 Minify 设置可定义 Unity 应何时以及如何将缩小应用于构建使用该功能会加长发布时间,并且还会让调试变得复杂,所以一般在最终发布时才会使用,平时发布测试应用时不需要开启。
- Use R8:默认情况下,Unity 使用 Proguard 进行缩小。启用此复选框可改为使用 R8
- Release:如果希望 Unity 在发布构建中缩小应用程序的代码,请启用此复选框。
- Debug:如果希望 Unity 在调试构建中缩小应用程序的代码,请启用此复选框。
-
Split Application Binary:拆分应用程序二进制文件
启用 Split Application Binary 选项可将输出包拆分为主包 (APK) 和扩展包 (OBB) 包。
如果要发布大于 100 MB 的应用程序,则 Google Play 应用商店需要此功能。
补充知识
线性和伽马颜色空间之间的差异
使用线性渲染时,光照方程式的输入值与伽玛空间中的输入值不同。这意味着根据不同颜色空间得出不同结果。例如,光线照射表面具有不同的响应曲线,并且图像效果的表现不同。
光衰减
基于距离和基于法线的光照在发生衰减时存在两个方面的差异:
- 在线性模式下渲染时,执行的额外伽马校正会使光源半径变大。
- 光照边缘也显得更清晰。这更准确地模拟了表面上的光照强度衰减。
左:线性空间中的球体光照。右:伽马空间中的球体光照
线性强度响应
使用伽马渲染时,提供给着色器的颜色和纹理已经应用了伽马校正。在着色器中使用它们时,高亮度的颜色实际上比预期亮度值更亮(相对于线性光照)。这意味着,随着光照强度的增加,表面会以非线性方式变亮。这将导致许多位置的光照亮度过高。此外还可能给模型和场景带来褪色的感觉。使用线性渲染时,在表面上产生的响应随着光照强度增加仍保持线性。因此,带来的表面着色真实得多,表面产生的颜色响应也好得多。
下面的无限 3D 头部扫描图像展示了在线性光照和伽马光照模式下人体头部模型上的不同光照强度。
无限 3D 头部扫描,制作者 Lee Perry-Smith,根据 Creative Commons Attribution 3.0 Unported 许可证获得许可(可从 www.ir-ltd.net 获取)
线性和伽马混合
当混入帧缓冲区时,混合发生在帧缓冲区的颜色空间中。
使用伽马空间渲染时,非线性颜色会混合在一起。这种混合颜色的方法在数学上不正确,并可能得出不符合期望的结果,但这种方法是在某些图形硬件上进行混合的唯一方法。
使用线性空间渲染时,混合发生在线性颜色空间中:这在数学上是正确的,并提供精确的结果。
下图显示了不同类型的混合:
上:线性颜色空间中的混合产生预期的混合结果
下:伽马颜色空间中的混合导致过度饱和以及过亮的混合