翻译Unity中文版的初衷是因为官方提供的中文版存在缺陷,而且翻译的不全。现在基于Unity2023.2版本对官方文档进行翻译。
设备模拟器 🔗
本文档部分包含有关Unity设备模拟器的信息。
页面 | 描述 |
---|---|
设备模拟器简介 | 介绍设备模拟器及其功能。 |
模拟器视图 | 解释设备模拟器使用的窗口,用于显示模拟。 |
模拟类 | 包含设备模拟器提供的类的信息,以便您可以测试响应特定设备行为的代码。 |
添加设备 | 解释如何定义新设备进行模拟,并在设备模拟器中使用它。 |
扩展设备模拟器 | 解释如何创建设备模拟器插件来扩展模拟器视图的功能和用户界面。 |
设备模拟器简介 🔗
设备模拟器是Unity编辑器的一个功能,用于模拟应用程序在移动设备上的外观和行为。
设备模拟器由以下组成:
- 模拟器视图:在模拟的移动设备上查看应用程序。
- 模拟类:测试响应特定设备行为的代码。
- 设备定义:描述要模拟的设备。
- 设备模拟器插件:配置模拟器视图的用户界面。
模拟器视图中的控件 🔗
模拟器视图模拟移动设备的许多常见功能,包括:
- 自动旋转
- 屏幕安全区域
- 触摸输入
玩家设置 🔗
设备模拟器会与以下玩家设置具有相同的反应,就像真实设备一样:
- 全屏模式
- 分辨率缩放
- 默认方向
- 图形API
- 超出安全区域渲染
模拟触摸输入 🔗
如果您使用鼠标光标在模拟设备屏幕上点击,设备模拟器将在活动的输入解决方案(根据项目设置,可以是输入管理器、输入系统或两者)中创建触摸事件。
注意:只有在编辑器处于播放模式时,设备模拟器才会模拟输入。设备模拟器不支持多点触控,只能模拟单指触摸。
限制 🔗
设备模拟器的主要目的是查看应用程序在目标设备上的布局,并测试基本交互。它不能准确地表示应用程序在真实设备上的运行情况。
模拟器视图不会模拟以下内容:
- 设备的性能特征,如处理器速度或可用内存。
- 设备的渲染能力。
- 在编辑器中无法使用的原生插件。
- 模拟设备的平台#define指令,如UNITY_IOS。
- 陀螺仪旋转。
只能同时模拟一个模拟器视图。这是活动的模拟器视图。
- 如果只打开一个模拟器视图且没有打开游戏视图,则无论该模拟器视图是否可见,它都是活动的。
- 如果打开了多个模拟器视图且没有打开游戏视图,则上次获取焦点的模拟器视图是活动的。
- 如果同时打开了模拟器视图和游戏视图,如果将焦点放在游戏视图上,Unity将禁用所有模拟器;如果将焦点放在模拟器视图上,只要它具有焦点,模拟器视图始终是活动的。
设备模拟器不会模拟所有模拟类中的API。更多信息,请参阅模拟类。
模拟器视图 🔗
模拟器视图以模拟的移动设备显示您的应用程序。使用它来查看应用程序在该设备上的屏幕形状、分辨率和方向等外观。
使用模拟器视图 🔗
要打开模拟器视图,请执行以下操作之一:
- 在游戏视图中,左上角使用下拉菜单在游戏视图和模拟器视图之间切换。
- 在菜单中选择:Window > General > Device Simulator
Unity在模拟器视图中模拟设备。要控制模拟,请使用工具栏和控制面板。
工具栏 🔗
工具栏位于模拟器视图的顶部,包含与控制面板一起控制模拟的选项。
控制选项 | 说明 | |
---|---|---|
游戏视图/模拟器视图 | 使用此下拉菜单在模拟器视图和游戏视图之间切换。 | |
设备选择下拉菜单 | 从可用的设备定义中选择要模拟的设备。 | |
缩放 | 放大或缩小模拟屏幕的大小。 | |
适应屏幕 | 将显示内容缩放以适应窗口内。 | |
旋转 | 模拟设备的物理旋转。如果启用自动旋转并且设备支持旋转,设备屏幕上的图像将与设备一起旋转。否则,旋转设备将导致图像横向或颠倒。注意:设备模拟器不支持陀螺仪模拟。 | |
安全区域 | 指示视图是否绘制当前设备屏幕的安全区域周围的线条。 | |
播放模式行为 | 此部分根据以下选择描述了播放模式的行为。 | |
聚焦 | 在编辑器处于播放模式时,启用聚焦可将焦点切换到选定的游戏视图。进入播放模式时,只能有一个游戏视图处于焦点状态。使用Display模式中的最大化或全屏模式意味着将焦点放在最大化的游戏视图上。在一个游戏视图上启用聚焦时,其他游戏视图上的聚焦将被禁用。 | |
垂直同步(仅对游戏视图有效) | 启用**垂直同步(仅对游戏视图有效)**以允许同步,这对于录制视频等情况非常有用。Unity尝试以显示器刷新率渲染游戏视图,但不能保证。当启用此选项时,最好在播放模式下将游戏视图最大化,以隐藏其他视图并减少Unity渲染的视图数量。 | |
进入播放模式: | 根据以下选项选择确定编辑器在进入播放模式时的设置。 | |
正常 | 选择此选项以在不强制聚焦或将任何视图最大化到全屏的情况下查看游戏视图。 | |
最大化 | 选择此选项后,Unity会以100%的编辑器窗口大小最大化Simulator视图运行播放模式。注意:如果禁用Play时创建游戏视图的编辑器首选项,此选项不会创建Simulator视图。 | |
控制面板 | 显示或隐藏控制面板。 |
控制面板 🔗
要打开控制面板,请单击工具栏右上角的控制面板。默认情况下,控制面板包含对应用程序模拟类的设置。
属性 | 说明 |
---|---|
System Language | 指定从Device.Application.systemLanguage 接收的值。 |
Internet Reachability | 指定从Device.Application.internetReachability 接收的值。 |
On Low Memory | 调用lowMemory 事件。 |
设备模拟器插件可以更改控制面板的外观,添加内容和控件。某些包(例如自适应性能包)包含设备模拟器插件。如果安装了该包,它们的UI将显示在控制面板中。有关更多信息,请参阅设备模拟器插件。
模拟类 🔗
Device Simulator提供了模拟类,您可以使用它们来测试对Device Simulator中的设备特定行为做出响应的代码。
以下模拟类位于UnityEngine.Device命名空间中:
- Application
- Screen
- SystemInfo
这些模拟类具有与它们的常规UnityEngine命名空间对应类相同的成员。您可以在代码库中的任何位置使用它们,就像正常类一样使用它们。它们不会对性能产生影响,并且可以在发布版本中使用。
在编辑器中,当Device Simulator处于活动状态时,模拟类会模拟模拟设备的特定平台行为;例如,Device.SystemInfo.operatingSystem会返回模拟设备的Android或iOS版本。
在构建的应用程序中或者当Device Simulator不活动时,模拟类的行为与它们在UnityEngine命名空间中的对应类相同。
尽管模拟类具有与常规类相同的成员,但Device Simulator不会模拟每个行为。在Unity编辑器中,Device Simulator不模拟的成员会与它们在UnityEngine命名空间中的等效成员具有相同的行为,这些成员与特定平台无关。例如,Device Simulator不会模拟Device.Screen.brightness。这意味着此成员在编辑器中的行为与UnityEngine.Screen.brightness相同,始终返回1
。有关Device Simulator模拟的成员,请参阅以下API文档:
- Device.Application
- Device.Screen
- Device.SystemInfo
更新脚本以使用模拟类 🔗
如果您想要将现有代码转换为使用UnityEngine.Device命名空间的类,最佳实践是使用别名指令。例如:
using Screen = UnityEngine.Device.Screen;
using Application = UnityEngine.Device.Application;
using SystemInfo = UnityEngine.Device.SystemInfo;
这样,您可以更改整个文件使用的类,而无需更改每个API调用。
添加设备 🔗
要将新设备添加到Device Simulator中,您需要创建设备定义和设备覆盖。
设备定义是Unity项目中以.device
扩展名的文本文件。它包含描述设备属性的JSON数据。
设备覆盖是一个图像,包含设备屏幕的边框,以及刘海、孔洞和屏幕矩形的任何其他元素。您可以选择将其与设备定义一起使用,以可视化硬件元素如何遮挡设备屏幕,并确定触摸输入何时失败。
创建设备定义 🔗
设备定义是一个表示设备的JSON文件。它包含必需的属性和一些可选的属性。如果设备定义文件包含任何错误,选择文件时将在检查器中显示错误信息。
Schema 🔗
属性 | 必需的 | 说明 |
---|---|---|
friendlyName | 是 | 在UI中显示的设备名称。 |
version | 是 | 设备定义文件的版本。当前版本为1 。 |
screens | 是 | 描述要模拟设备的每个屏幕的对象列表。必须至少包含一个屏幕。有关每个屏幕对象的架构信息,请参阅屏幕。 |
systemInfo | 是 | 描述设备的能力的对象。此对象中的值与SystemInfo对应。有关systemInfo对象的架构信息,请参阅systemInfo。 |
screen 🔗
属性 | 必需的 | 说明 |
---|---|---|
width | 是 | 屏幕的宽度,以像素为单位。 |
height | 是 | 屏幕的高度,以像素为单位。 |
navigationBarHeight | 否 | 非全屏模式下,在某些设备上显示的屏幕上的Android导航栏的高度,以像素为单位。 |
dpi | 是 | 屏幕的dpi。 |
orientations | 否 | 描述屏幕可以模拟的每个方向的对象列表。如果不为此属性设置值,则屏幕支持所有方向。有关每个方向对象的架构信息,请参阅orientation。 |
presentation | 否 | 描述设备覆盖层的对象。有关此对象的架构信息,请参阅presentation。 |
orientation 🔗
属性 | 必需的 | 说明 |
---|---|---|
orientation | 是 | 屏幕的方向。此属性的值是一个映射到ScreenOrientation枚举类型的数字。 |
safeArea | 否 | 确定屏幕的安全区域的矩形。如果不为此属性设置值,则模拟器假设整个屏幕都是安全区域。 |
cutouts | 否 | 指定屏幕上不用于显示内容的区域的矩形列表。 |
presentation 🔗
属性 | 必需的 | 说明 |
---|---|---|
overlayPath | 否 | 设备定义文件到要用作设备覆盖的图像的相对路径。 |
borderSize | 否 | 覆盖层到屏幕开始的距离,以像素为单位。 |
systeminfo 🔗
此对象中的属性描述设备的能力和系统信息。由于它们描述系统信息,因此其中的许多属性与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。 |
graphicsDependentData 🔗
该对象中的属性描述设备支持的图形API。
属性 | 必需的 | 说明 |
---|---|---|
graphicsDeviceType | Yes | 参见Device.SystemInfo.graphicsDeviceType。 |
graphicsMemorySize | No | 参见Device.SystemInfo.graphicsMemorySize。 |
graphicsDeviceName | No | 参见Device.SystemInfo.graphicsDeviceName。 |
graphicsDeviceVendor | No | 参见Device.SystemInfo.graphicsDeviceVendor。 |
graphicsDeviceID | No | 参见Device.SystemInfo.graphicsDeviceID。 |
graphicsDeviceVendorID | No | 参见Device.SystemInfo.graphicsDeviceVendorID。 |
graphicsUVStartsAtTop | No | 参见Device.SystemInfo.graphicsUVStartsAtTop。 |
graphicsDeviceVersion | No | 参见Device.SystemInfo.graphicsDeviceVersion。 |
graphicsShaderLevel | No | 参见Device.SystemInfo.graphicsShaderLevel。 |
graphicsMultiThreaded | No | 参见Device.SystemInfo.graphicsMultiThreaded。 |
renderingThreadingMode | No | 参见Device.SystemInfo.renderingThreadingMode。 |
hasHiddenSurfaceRemovalOnGPU | No | 参见Device.SystemInfo.hasHiddenSurfaceRemovalOnGPU。 |
hasDynamicUniformArrayIndexingInFragmentShaders | No | 参见Device.SystemInfo.hasDynamicUniformArrayIndexingInFragmentShaders。 |
supportsShadows | No | 参见Device.SystemInfo.supportsShadows。 |
supportsRawShadowDepthSampling | No | 参见Device.SystemInfo.supportsRawShadowDepthSampling。 |
supportsMotionVectors | No | 参见Device.SystemInfo.supportsMotionVectors。 |
supports3DTextures | No | 参见Device.SystemInfo.supports3DTextures。 |
supports2DArrayTextures | No | 参见Device.SystemInfo.supports2DArrayTextures。 |
supports3DRenderTextures | No | 参见Device.SystemInfo.supports3DRenderTextures。 |
supportsCubemapArrayTextures | No | 参见Device.SystemInfo.supportsCubemapArrayTextures。 |
copyTextureSupport | No | 参见Device.SystemInfo.copyTextureSupport。 |
supportsComputeShaders | No | 参见Device.SystemInfo.supportsComputeShaders。 |
supportsGeometryShaders | No | 参见Device.SystemInfo.supportsGeometryShaders。 |
supportsTessellationShaders | No | 参见Device.SystemInfo.supportsTessellationShaders。 |
supportsInstancing | No | 参见Device.SystemInfo.supportsInstancing。 |
supportsHardwareQuadTopology | No | 参见Device.SystemInfo.supportsHardwareQuadTopology。 |
supports32bitsIndexBuffer | No | 参见Device.SystemInfo.supports32bitsIndexBuffer。 |
supportsSparseTextures | No | 参见Device.SystemInfo.supportsSparseTextures。 |
supportedRenderTargetCount | No | 参见Device.SystemInfo.supportedRenderTargetCount。 |
supportsSeparatedRenderTargetsBlend | No | 参见Device.SystemInfo.supportsSeparatedRenderTargetsBlend。 |
supportedRandomWriteTargetCount | No | 参见Device.SystemInfo.supportedRandomWriteTargetCount。 |
supportsMultisampledTextures | No | 参见Device.SystemInfo.supportsMultisampledTextures。 |
supportsMultisampleAutoResolve | No | 参见Device.SystemInfo.supportsMultisampleAutoResolve。 |
supportsTextureWrapMirrorOnce | No | 参见Device.SystemInfo.supportsTextureWrapMirrorOnce。 |
usesReversedZBuffer | No | 参见Device.SystemInfo.usesReversedZBuffer。 |
npotSupport | No | 参见Device.SystemInfo.npotSupport。 |
maxTextureSize | No | 参见Device.SystemInfo.maxTextureSize。 |
maxCubemapSize | No | 参见Device.SystemInfo.maxCubemapSize。 |
maxComputeBufferInputsVertex | No | 参见Device.SystemInfo.maxComputeBufferInputsVertex。 |
maxComputeBufferInputsFragment | No | 参见Device.SystemInfo.maxComputeBufferInputsFragment。 |
maxComputeBufferInputsGeometry | No | 参见Device.SystemInfo.maxComputeBufferInputsGeometry。 |
maxComputeBufferInputsDomain | No | 参见Device.SystemInfo.maxComputeBufferInputsDomain。 |
maxComputeBufferInputsHull | No | 参见Device.SystemInfo.maxComputeBufferInputsHull。 |
maxComputeBufferInputsCompute | No | 参见Device.SystemInfo.maxComputeBufferInputsCompute。 |
maxComputeWorkGroupSize | No | 参见Device.SystemInfo.maxComputeWorkGroupSize。 |
maxComputeWorkGroupSizeX | No | 参见Device.SystemInfo.maxComputeWorkGroupSizeX。 |
maxComputeWorkGroupSizeY | No | 参见Device.SystemInfo.maxComputeWorkGroupSizeY。 |
maxComputeWorkGroupSizeZ | No | 参见Device.SystemInfo.maxComputeWorkGroupSizeZ。 |
supportsAsyncCompute | No | 参见Device.SystemInfo.supportsAsyncCompute。 |
supportsGraphicsFence | No | 参见Device.SystemInfo.supportsGraphicsFence。 |
supportsAsyncGPUReadback | No | 参见Device.SystemInfo.supportsAsyncGPUReadback。 |
supportsRayTracing | No | 参见Device.SystemInfo.supportsRayTracing。 |
supportsRayTracingShaders | No | 参见Device.SystemInfo.supportsRayTracingShaders。 |
supportsInlineRayTracing | No | 参见Device.SystemInfo.supportsInlineRayTracing。 |
supportsSetConstantBuffer | No | 参见Device.SystemInfo.supportsSetConstantBuffer。 |
hasMipMaxLevel | No | 参见Device.SystemInfo.hasMipMaxLevel。 |
supportsMipStreaming | No | 参见Device.SystemInfo.supportsMipStreaming。 |
usesLoadStoreActions | No | 参见Device.SystemInfo.usesLoadStoreActions。 |
最低设备定义 🔗
以下设备定义包含了每个必需的属性,没有可选的属性。这是您可以拥有的最小设备定义。
注意:该设备定义没有提供方向数据,因此模拟器假设设备支持所有方向,并且安全区域覆盖整个屏幕。
{
"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,
"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的默认天空盒(skybox)。在真实的设备叠加层中,这些像素应该是透明的。
Apple iPhone 8 Overlay | Apple iPhone XS Overlay |
---|---|
使用设备叠加层 🔗
在创建设备叠加层纹理后,要将其与设备定义一起使用,您首先必须将设备叠加层纹理文件导入到项目中。
注意:当设备模拟器加载设备叠加层纹理时,会尝试启用读/写功能。如果这不可能实现,设备模拟器将显示纹理,但无法使用纹理来遮罩输入。这意味着如果您在设备叠加层应该遮挡的凹槽和其他区域上点击,设备模拟器会检测到输入。为确保不发生这种情况,请在导入设备叠加层纹理时,在“纹理导入设置”窗口中启用读/写功能。
当设备叠加层纹理在您的项目中时,打开设备定义文件,在定义设备支持的屏幕的对象中添加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目录中,则以下文件路径都是有效的:
- 相对于设备定义文件:Overlays/MinimalDeviceOverlay.png
- 相对于包含Assets目录的目录:Assets/Devices/Overlays/MinimalDeviceOverlay.png
扩展设备模拟器 🔗
设备模拟器支持插件来扩展其功能并更改模拟器视图中控制面板的UI。
创建插件 🔗
要创建一个设备模拟器插件,需要扩展DeviceSimulatorPlugin类。
要将UI插入到设备模拟器视图中,您的插件必须满足以下条件:
- 重写
title
属性以返回一个非空字符串。 - 重写
OnCreateUI
方法以返回包含UI的VisualElement。
如果您的插件不符合这些条件,设备模拟器会实例化插件,但不会在模拟器视图中显示其UI。
以下示例演示如何创建一个插件,该插件重写title属性并向模拟器视图添加UI。
public class TouchInfoPlugin : DeviceSimulatorPlugin
{
public override string title => "Touch Info";
private Label m_TouchCountLabel;
private Label m_LastTouchEvent;
private Button m_ResetCountButton;
[SerializeField]
private int m_TouchCount = 0;
public override void OnCreate()
{
deviceSimulator.touchScreenInput += touchEvent =>
{
m_TouchCount += 1;
UpdateTouchCounterText();
m_LastTouchEvent.text = $"Last touch event: {touchEvent.phase.ToString()}";
};
}
public override VisualElement OnCreateUI()
{
VisualElement root = new VisualElement();
m_LastTouchEvent = new Label("Last touch event: None");
m_TouchCountLabel = new Label();
UpdateTouchCounterText();
m_ResetCountButton = new Button {text = "Reset Count" };
m_ResetCountButton.clicked += () =>
{
m_TouchCount = 0;
UpdateTouchCounterText();
};
root.Add(m_LastTouchEvent);
root.Add(m_TouchCountLabel);
root.Add(m_ResetCountButton);
return root;
}
private void UpdateTouchCounterText()
{
if (m_TouchCount > 0)
m_TouchCountLabel.text = $"Touches recorded: {m_TouchCount}";
else
m_TouchCountLabel.text = "No taps recorded";
}
}
结论 🔗
搬砖愉快!