# Web 中的输入

> The various input types that Unity Web supports.

Unity Web 支持来自不同设备的各种类型的输入，包括游戏手柄、游戏杆、触摸屏、键盘和运动传感器。

* [游戏手柄和游戏杆支持](#gamepad-and-joystick-support)
* [触控支持](#touch-support)
* [键盘输入和焦点处理](#keyboard-input-and-focus-handling)
* [移动传感器支持](#mobile-sensor-support)
* [锁定光标](#cursor-locking-support)
* [全屏模式](#full-screen-mode)

## 游戏手柄和游戏杆支持##gamepad-and-joystick-support

Web 支持游戏手柄的以下输入：

* [Input](/engine/6000.0/script-reference/unity-engine/input.md)
* [InputSystem](https://docs.unity3d.com/Packages/com.unity.inputsystem@latest)

对于支持 [HTML5 Gamepad API](https://developer.mozilla.org/docs/Web/API/Gamepad_API) 的浏览器，Web 还支持游戏杆。

某些浏览器仅在用户在应用程序获得焦点时与设备交互后，才允许访问输入设备。这是一种防止将连接的设备用于浏览器指纹识别的安全措施。因此，在调用 [Input.GetJoystickNames()](/engine/6000.0/script-reference/unity-engine/input/get-joystick-names.md) 检查连接的设备之前，请确保应用程序指示用户按下游戏手柄/游戏杆上的按钮。

### 映射控制器##map-the-controller

旧输入系统的 Web 游戏控制器映射与 [W3 规范](https://www.w3.org/TR/gamepad/#dfn-standard-gamepad)保持一致，其中的按钮映射布局如下所示：

| 按钮     | 描述                 |
| ------ | ------------------ |
| 按钮\[0] | 右集群中的底部按钮 = 叉号 (X) |
| 按钮\[1] | 右集群中的右键 = 圆形       |
| 按钮\[2] | 右集群中的左键 = 方形       |
| 按钮\[3] | 右集群中的顶部按钮 = 三角形    |

\*\*注意：\*\*由于 Web 遵循 W3 规范，因此与其他平台可能不一致，如果您同时面向多个平台（例如 Windows 和 Web），则需要不同的方法。有关更多信息，请参阅关于[重新映射](https://www.w3.org/TR/gamepad/#dfn-standard-gamepad)的 W3 文档。

## 触控支持##touch-support

Unity Web 在支持触控的浏览器和设备中实现 [Input.touches](/engine/6000.0/script-reference/unity-engine/input/touches.md) 和其他相关 API。默认情况下，移动设备会在触摸屏上显示软键盘，让用户在 UI 输入字段中输入文本。要禁用此行为，请使用 [WebGLInput.mobileKeyboardSupport](/engine/6000.0/script-reference/unity-engine/web-gl-input/mobile-keyboard-support.md) 属性。

## 键盘输入和焦点处理##keyboard-input-and-focus-handling

默认情况下，无论 Web 画布是否具有焦点，Unity Web 都会处理网页接收的所有键盘输入。这允许用户使用基于键盘的应用程序，而无需单击 Web 画布。

以下注意事项适用于如下所述的特定键盘输入：

| 键盘输入行为            | 描述                                                                                                                                                                                                                                                                                           |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| HTML 元素（例如文本字段）   | 如果在用于接收键盘输入的网页中引入 HTML 元素（例如文本字段），可能会导致错误。Unity 将消耗输入事件，然后页面的其余部分才会接收这些事件。要使 HTML 元素接收键盘输入，请将 `WebGLInput.captureAllKeyboardInput` 设置为 `false`。这样，仅当 Web 画布具有焦点时，应用程序才会接收输入。                                                                                                                 |
| **Esc** 键         | 某些浏览器（如 Safari）会阻止使用 **Esc** 键切换到全屏模式的功能，因为 **Esc** 键在 Web 环境中受到保护。其他浏览器（如 Google Chrome）的行为可能不可预测。当浏览器处于全屏模式时，用户只能使用 **Esc** 键退出全屏模式。根据浏览器的类型，单击 **Esc** 键可能有时不会触发从浏览器转发到应用程序的事件。                                                                                                           |
| `HideMobileInput` | [TextMeshPro](https://docs.unity3d.com/Packages/com.unity.ugui@2.0/manual/TextMeshPro/index.html)（也称为 TMP）输入字段中的 `HideMobileInput` 选项对 Web 平台没有影响。此选项无效，因为您需要文本输入字段才能在浏览器中触发虚拟键盘。Web 平台将实例化一个文本输入字段，以便在 Unity 玩家期望输入文本时触发虚拟键盘。文本输入字段与其他平台一样显示在虚拟键盘上方。由于虚拟键盘依赖于移动文本输入字段，因此无法在 Web 平台上显示为隐藏状态。 |

## 移动传感器支持##mobile-sensor-support

对于支持触控的浏览器和移动设备，Unity Web 包括对以下传感器的支持：

* 具有 [Input.acceleration](/engine/6000.0/script-reference/unity-engine/input/acceleration.md) 的加速度计
* 具有 [Gyroscope.userAcceleration](/engine/6000.0/script-reference/unity-engine/gyroscope/user-acceleration.md) 的 LinearAcceleration
* 具有 [Gyroscope.rotationRate](/engine/6000.0/script-reference/unity-engine/gyroscope/rotation-rate.md) 的陀螺仪
* 具有 [Gyroscope.gravity](/engine/6000.0/script-reference/unity-engine/gyroscope/gravity.md) 的重力
* 具有 [Gyroscope.attitude](/engine/6000.0/script-reference/unity-engine/gyroscope/attitude.md) 时的姿态
* [Input System](https://docs.unity3d.com/Packages/com.unity.inputsystem@latest) 包也支持这些传感器。

**重要提示**：浏览器只允许在安全上下文中进行传感器输入，这意味着必须通过 [HTTPS](https://en.wikipedia.org/wiki/HTTPS) 为页面提供服务。唯一的例外是 `http://localhost`，您可以在开发期间使用它。

## 光标锁定支持##cursor-lock-support

Unity Web 平台支持使用 HTML5 API `Element.requestPointerLock` 的光标锁定。使用光标锁定可将鼠标光标锁定到游戏窗口的中心。锁定光标后，光标在 Unity 中显示为隐藏状态，在鼠标移动时不会移动。这对于第一人称游戏特别有用，在此类游戏中，鼠标光标通常用于控制玩家角度的方向。

\*\*注意：\*\*由于浏览器对光标锁定的支持不同，请参阅 Mozilla 文档的 [Element: requestPointerLock() 方法](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestPointerLock)。

### 激活光标锁定##activate-cursor-locking

要锁定光标，请使用 [`Cursor.lockState`](/engine/6000.0/script-reference/unity-engine/cursor/lock-state.md) 属性。例如，以下代码会在用户单击鼠标左键时将光标切换到锁定状态：

```
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Cursor.lockState = CursorLockMode.Locked;
    }
}
```

光标锁定需要通过用户交互激活。有关更多信息，请参阅[全屏模式和光标锁定的其他注意事项](#additional-considerations)。

### 停用光标锁定##deactivate-cursor-locking

按 **Esc** 键解锁光标。

### 粘性光标锁定##sticky-cursor-lock

`stickyCursorLock` 属性通常用于第一人称游戏，因为无论浏览器行为如何，保持光标锁定模式都很有用。

使用 [`stickyCursorLock`](/engine/6000.0/script-reference/unity-engine/web-gl-input/sticky-cursor-lock.md) 可确保`Cursor.lockState`状态持久，即使浏览器从 Unity 画布释放光标锁定（通常使用 **Esc** 键），在这种情况下，下次画布获得焦点时光标会再次锁定。

因此，如果将 `WebGLInput._stickyCursorLock` 设置为 `true`，即使 Unity 画布 HTML 元素解锁光标，`Cursor.lockState` 也会保持 `CursorLockMode.Locked` 状态。

如果将 `WebGLInput._stickyCursorLock` 设置为 `false`，则会发生以下情况：

* `Cursor.lockState` 与浏览器的光标锁定状态保持同步。

* 如果用户按 **Esc** 键取消画布光标锁定，则 `Cursor.lockState` 将更改为 `CursorLockMode.None`。

\*\*注意：\*\*默认情况下，在 Web 中 `stickyCursorLock` 设置为 `true`。

## 全屏模式##full-screen-mode

在游戏中使用全屏模式可以执行以下操作：

* 将整个屏幕用于游戏。

* 隐藏浏览器用户界面 (UI) 元素，例如地址栏和选项卡。

* 隐藏 Unity 播放器 UI 元素，例如标题栏和工具栏。

Unity Web 平台支持使用 HTML5 API `Element.requestFullscreen` 的全屏模式。

\*\*注意：\*\*由于浏览器对全屏模式的支持有所不同，请参阅 Mozilla 文档的 [Element: requestFullscreen() 方法](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen)。

### 在 Web 中激活全屏模式##activate-full-screen-mode-in-web

要启用全屏模式，请使用 `Screen.fullScreen` 属性。例如，当用户按 **F** 键时，以下代码会将游戏切换到全屏模式：

```

void Update()
{
    if (Input.GetKeyDown(KeyCode.F))
    {
        Screen.fullScreen = true;
    }
}
```

\*\*注意：\*\*默认情况下，`Screen.fullScreen` 属性设置为 `false`。

全屏模式需要通过用户交互激活。有关更多信息，请参阅[全屏模式和光标锁定的其他注意事项](#additional-considerations)。

### 退出全屏模式##exit-full-screen-mode

要退出全屏模式，请再次按 **Esc** 键，或将鼠标指针悬停在屏幕顶部以访问地址栏和选项卡。

## 全屏模式和光标锁定的其他注意事项##additional-considerations-for-full-screen-mode-and-cursor-locking

出于安全考虑，浏览器只允许在用户发起的事件（例如鼠标单击或按键）之后锁定光标并启用全屏模式。

因为 Unity 不支持单独的事件和渲染循环，所以会将事件处理推迟到以下时间点：浏览器不再确认 Unity 脚本发出的全屏或光标锁定请求（作为对触发该请求的事件的直接响应）。

因此，Unity 会在用户发起的下一个事件（而不是触发光标锁定或全屏请求的事件）时触发该请求。

要启用光标锁定或全屏模式以获得更好的结果，请使用鼠标/按键按下事件而不是鼠标/按键抬起事件来触发响应。这样就可以确保延迟请求由相应的鼠标/按键抬起事件触发（如果不是由用户先前发起的事件触发）。

您还可以使用 Unity 的 [UI.Button](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.Button.html) 组件来达成所需的行为，即创建 `Button` 的子类来覆盖 `OnPointerDown` 方法。

\*\*注意：\*\*某些浏览器可能会在进入全屏模式或锁定光标之前显示通知消息或提示用户授予权限。

## 其他资源##additional-resources

* [WebGLInput.mobileKeyboardSupport](/engine/6000.0/script-reference/unity-engine/web-gl-input/mobile-keyboard-support.md)
* [WebGLInput.captureAllKeyboardInput](/engine/6000.0/script-reference/unity-engine/web-gl-input/capture-all-keyboard-input.md)
