要向设备模拟器添加新设备,请创建设备定义和设备叠加。
设备定义是 Unity 项目中扩展名为 .device
的文本文件。它包含描述设备属性的 JSON。
设备叠加是一张包含设备屏幕边框、凹口、穿孔以及屏幕矩形任何其他附加内容的图像。可以选择将它与设备定义一起使用,以可视化硬件元素如何遮挡设备屏幕,以及确定触摸输入何时因其而失败。
设备定义是一个表示设备的 JSON 文件。它既有必需属性,也有可选属性。如果设备定义文件包含任何错误,这些错误会在您选择该文件时显示在 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。 更多信息
参见 词汇表 中。
属性 | 必需 | 描述 |
---|---|---|
friendlyName | 是 | 在此设备的 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息 参见 词汇表 中显示的名称。 |
version | 是 | 指示设备定义文件的版本。当前,版本为 1 。 |
screens | 是 | 每个对象描述一个屏幕的列表,用于模拟设备。此列表必须包含至少一个屏幕。有关每个屏幕对象的架构信息,请参见 screen。 |
systemInfo | 是 | 描述设备功能的对象。此对象中的值映射到 SystemInfo。有关 systemInfo 对象的架构信息,请参见 systemInfo。 |
属性 | 必需 | 描述 |
---|---|---|
width | 是 | 屏幕的宽度,以 像素计算机图像中最小的单位。像素大小取决于您的屏幕分辨率。每个屏幕像素都会计算像素灯光。 更多信息 参见 词汇表 为单位。 |
height | 是 | 屏幕的高度,以像素为单位。 |
navigationBarHeight | 否 | 某些设备在非全屏模式下显示的屏幕上 Android 导航栏的高度,以像素为单位。 |
dpi | 是 | 屏幕的 dpi。 |
orientations | 否 | 每个对象描述屏幕可以模拟的一个方向的列表。如果您未为此属性设置值,则屏幕支持所有方向。有关每个方向对象的架构信息,请参见 orientation。 |
presentation | 否 | 描述设备叠加的对象。有关此对象的架构信息,请参见 presentation。 |
属性 | 必需 | 描述 |
---|---|---|
orientation | 是 | 屏幕方向。此属性的值是一个映射到 ScreenOrientation 枚举的数字。 |
safeArea | 否 | 一个 Rect,它确定屏幕的安全区域。如果您未为此属性设置值,则模拟器会假定整个屏幕都是安全的。 |
cutouts | 否 | 一个 Rect 列表,它指定屏幕上不能用于显示内容的区域。 |
属性 | 必需 | 描述 |
---|---|---|
overlayPath | 否 | 从设备定义文件到用作设备叠加的图像的相对路径。 |
borderSize | 否 | 从叠加到屏幕开始位置的距离,以像素为单位。 |
此对象中的属性描述设备的功能和系统信息。由于它们描述了系统信息,因此它们中的许多都映射到 SystemInfo 中的属性。
属性 | 必需 | 描述 |
---|---|---|
deviceModel | 否 | 参见 Device.SystemInfo.deviceModel。 |
deviceType | 否 | 参见 Device.SystemInfo.deviceType。 |
operatingSystem | 是 | 参见 Device.SystemInfo.operatingSystem。 |
operatingSystemFamily | 否 | 参见 Device.SystemInfo.operatingSystemFamily。 |
processorCount | 否 | 参见 Device.SystemInfo.processorCount。 |
processorFrequency | 否 | 参见 Device.SystemInfo.processorFrequency。 |
processorType | 否 | 参见 Device.SystemInfo.processorType。 |
supportsAccelerometer | 否 | 参见 Device.SystemInfo.supportsAccelerometer。 |
supportsAudio | 否 | 参见 Device.SystemInfo.supportsAudio。 |
supportsGyroscope | 否 | 参见 Device.SystemInfo.supportsGyroscope。 |
supportsLocationService | 否 | 参见 Device.SystemInfo.supportsLocationService。 |
supportsVibration | 否 | 参见 Device.SystemInfo.supportsVibration。 |
systemMemorySize | 否 | 参见 Device.SystemInfo.systemMemorySize。 |
unsupportedIdentifier | 否 | 参见 Device.SystemInfo.unsupportedIdentifier。 |
graphicsDependentData | 否 | 每个对象描述设备支持的图形 API 的列表。有关每个对象的架构信息,请参见 graphicsDependentData。 |
对象中的属性描述设备支持的图形 API。
以下设备定义包含所有必需属性,不包含任何可选属性。这是您可以拥有的最小设备定义。
注意:此设备定义不提供方向数据,因此模拟器假设该设备支持所有方向,并且安全区域覆盖整个屏幕。
{
"friendlyName": "Minimal Device",
"version": 1,
"screens": [
{
"width": 1080,
"height": 1920,
"dpi": 450.0
}
],
"systemInfo": {
"operatingSystem": "Android"
}
}
以下设备定义包含所有必需和可选属性。
{
"friendlyName": "Apple iPhone XR",
"version": 1,
"screens": [
{
"width": 828,
"height": 1792,
"navigationBarHeight": 0,
"dpi": 326.0,
"orientations": [
{
"orientation": 1,
"safeArea": {
"serializedVersion": "2",
"x": 0.0,
"y": 68.0,
"width": 828.0,
"height": 1636.0
},
"cutouts": [
{
"serializedVersion": "2",
"x": 184.0,
"y": 1726.0,
"width": 460.0,
"height": 66.0
}
]
},
{
"orientation": 3,
"safeArea": {
"serializedVersion": "2",
"x": 88.0,
"y": 42.0,
"width": 1616.0,
"height": 786.0
},
"cutouts": [
{
"serializedVersion": "2",
"x": 0.0,
"y": 184.0,
"width": 66.0,
"height": 460.0
}
]
},
{
"orientation": 4,
"safeArea": {
"serializedVersion": "2",
"x": 88.0,
"y": 42.0,
"width": 1616.0,
"height": 786.0
},
"cutouts": [
{
"serializedVersion": "2",
"x": 1726.0,
"y": 184.0,
"width": 66.0,
"height": 460.0
}
]
}
],
"presentation": {
"overlayPath": "Apple iPhone 11_Overlay.png",
"borderSize": {
"x": 51.0,
"y": 51.0,
"z": 51.0,
"w": 51.0
}
}
}
],
"systemInfo": {
"deviceModel": "iPhone11,8",
"deviceType": 1,
"operatingSystem": "iOS 12.0",
"operatingSystemFamily": 0,
"processorCount": 6,
"processorFrequency": 0,
"processorType": "arm64e",
"supportsAccelerometer": true,
"supportsAudio": true,
"supportsGyroscope": true,
"supportsLocationService": true,
"supportsVibration": true,
"systemMemorySize": 2813,
"unsupportedIdentifier": "n/a",
"graphicsDependentData": [
{
"graphicsDeviceType": 16,
"graphicsMemorySize": 1024,
"graphicsDeviceName": "Apple A12 GPU",
"graphicsDeviceVendor": "Apple",
"graphicsDeviceID": 0,
"graphicsDeviceVendorID": 0,
"graphicsUVStartsAtTop": true,
"graphicsDeviceVersion": "Metal",
"graphicsShaderLevel": 50,
"graphicsMultiThreaded": true,
"renderingThreadingMode": 0,
"hasHiddenSurfaceRemovalOnGPU": true,
"hasDynamicUniformArrayIndexingInFragmentShaders": true,
"supportsShadows": true,
"supportsRawShadowDepthSampling": true,
"supportsMotionVectors": true,
"supports3DTextures": true,
"supports2DArrayTextures": true,
"supports3DRenderTextures": true,
"supportsCubemapArrayTextures": true,
"copyTextureSupport": 31,
"supportsComputeShaders": true,
"supportsGeometryShaders": false,
"supportsTessellationShaders": true,
"supportsInstancing": true,
"supportsHardwareQuadTopology": false,
"supports32bitsIndexBuffer": true,
"supportsSparseTextures": false,
"supportedRenderTargetCount": 8,
"supportsSeparatedRenderTargetsBlend": true,
"supportedRandomWriteTargetCount": 8,
"supportsMultisampledTextures": 1,
"supportsMultisampleAutoResolve": false,
"supportsTextureWrapMirrorOnce": 0,
"usesReversedZBuffer": true,
"npotSupport": 2,
"maxTextureSize": 16384,
"maxCubemapSize": 16384,
"maxComputeBufferInputsVertex": 8,
"maxComputeBufferInputsFragment": 8,
"maxComputeBufferInputsGeometry": 0,
"maxComputeBufferInputsDomain": 8,
"maxComputeBufferInputsHull": 8,
"maxComputeBufferInputsCompute": 8,
"maxComputeWorkGroupSize": 1024,
"maxComputeWorkGroupSizeX": 1024,
"maxComputeWorkGroupSizeY": 1024,
"maxComputeWorkGroupSizeZ": 1024,
"supportsAsyncCompute": false,
"supportsGraphicsFence": true,
"supportsAsyncGPUReadback": true,
"supportsParallelPSOCreation": true,
"supportsRayTracing": false,
"supportsRayTracingShaders": false,
"supportsInlineRayTracing": false,
"supportsSetConstantBuffer": true,
"hasMipMaxLevel": true,
"supportsMipStreaming": true,
"usesLoadStoreActions": true,
"supportedTextureFormats": [1, 2, 3, 4, 5],
"supportedRenderTextureFormats": [1, 2, 3, 4, 5],
"ldrGraphicsFormat": 59,
"hdrGraphicsFormat": 74
}
]
}
}
设备叠加是一个图像,其中包含设备屏幕的边框和其他功能,例如凹口、穿孔以及对屏幕矩形的任何其他添加。您可以选择将其与设备定义一起使用,以可视化硬件元素如何阻挡设备屏幕,并确定触摸输入何时因硬件元素而失败。
设备模拟器将透明像素解释为您可以点击的屏幕区域,将任何其他颜色的不透明像素解释为硬件阻挡的区域。纹理本身可以是任何形状。
以下示例显示了两种 iPhone 型号的设备叠加。
注意:为了模仿使用设备叠加时看到的内容,这些示例在您可以点击的屏幕区域显示 Unity 的默认 天空盒用于表示天空的特殊材质。通常为六面。 更多信息
参见 术语表。在实际的设备叠加中,这些像素应该是透明的。
Apple iPhone 8 叠加 | Apple iPhone XS 叠加 |
---|---|
创建设备叠加纹理后,要将其与设备定义一起使用,您必须先将设备叠加纹理文件导入项目。
注意:当设备模拟器加载设备叠加纹理时,它会尝试为其启用读/写。如果不可行,设备模拟器会显示纹理,但无法使用纹理来遮罩输入。这意味着,如果您点击设备叠加应该遮罩的凹口和其他屏幕区域,设备模拟器会检测到输入。为了确保这种情况不会发生,当您导入设备叠加纹理时,在纹理导入设置窗口中启用读/写。
当设备叠加纹理位于您的项目中时,打开设备定义文件,并在定义设备支持的屏幕的对象中添加 presentation 属性。在这里,设置图像文件的路径 (overlayPath
) 和边框的大小 (borderSize
)。有关如何执行此操作的示例,请参阅以下设备定义文件
{
"friendlyName": "Minimal Device with Overlay",
"version": 1,
"screens": [
{
"width": 1080,
"height": 1920,
"dpi": 450.0,
"presentation": {
"overlayPath": "Overlays/MinimalDeviceOverlay.png",
"borderSize": {
"x": 51.0,
"y": 51.0,
"z": 51.0,
"w": 130.0
}
}
}
],
"systemInfo": {
"operatingSystem": "Android"
}
}
注意:设备叠加纹理文件的路径可以相对于设备定义文件,也可以相对于包含您 Unity 项目中的Assets 或Packages 目录的目录。例如,如果设备定义文件位于Assets/Devices 目录中,而设备叠加文件位于Assets/Devices/Overlays 目录中,则以下文件路径均有效