# 웹에서의 입력

> The various input types that Unity Web supports.

Unity 웹은 게임패드, 조이스틱, 터치스크린, 키보드, 움직임 센서와 같은 다양한 기기의 각종 입력 유형을 지원합니다.

* [게임패드 및 조이스틱 지원](#gamepad-and-joystick-support)
* [터치 지원](#touch-support)
* [키보드 입력 및 포커스 처리](#keyboard-input-and-focus-handling)
* [모바일 센서 지원](#mobile-sensor-support)
* [커서 잠금](#cursor-locking-support)
* [전체 화면 모드](#full-screen-mode)

## 게임패드 및 조이스틱 지원##gamepad-and-joystick-support

웹은 게임패드의 다음 입력을 지원합니다.

* [입력](/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)를 지원하는 브라우저용 조이스틱도 지원합니다.

일부 브라우저는 애플리케이션이 활성화된 상태에서 사용자가 기기와 상호 작용한 후에만 입력 기기에 대한 액세스를 허용합니다. 이는 사용자가 브라우저 핑거프린팅을 목적으로 연결된 디바이스를 사용하지 못하게 하는 보안 조치입니다. 따라서 [Input.GetJoystickNames()](/engine/6000.0/script-reference/unity-engine/input/get-joystick-names.md)를 호출하여 연결된 디바이스를 확인하기 전에 애플리케이션을 통해서 사용자에게 게임패드/조이스틱의 버튼을 누르도록 지시해야 합니다.

### 컨트롤러 매핑##map-the-controller

기존 입력 시스템에 대한 웹 게임 컨트롤러 매핑은 [W3 사양](https://www.w3.org/TR/gamepad/#dfn-standard-gamepad)에 부합하며, 구체적인 버튼 매핑 레이아웃은 다음과 같습니다.

| 버튼          | 설명                       |
| ----------- | ------------------------ |
| buttons\[0] | 오른쪽 클러스터의 하단 버튼 = 엑스표(X) |
| buttons\[1] | 오른쪽 클러스터의 오른쪽 버튼 = 원형    |
| buttons\[2] | 오른쪽 클러스터의 왼쪽 버튼 = 사각형    |
| buttons\[3] | 오른쪽 클러스터의 상단 버튼 = 삼각형    |

**참고:** 웹은 W3 사양을 따르므로 다른 플랫폼과 일치하지 않을 수 있으며, Windows및 웹과 같은 여러 플랫폼을 동시에 타게팅할 경우에는 다른 접근 방식을 사용해야 합니다. 자세한 내용은 [리매핑](https://www.w3.org/TR/gamepad/#dfn-standard-gamepad)에 관한 W3 기술 자료를 참조하십시오.

## 터치 지원##touch-support

Unity 웹은 터치를 지원하는 브라우저와 기기에서 [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

기본적으로 Unity 웹은 웹 캔버스의 활성화 여부와는 관계없이 웹 페이지가 수신하는 모든 키보드 입력을 처리합니다. 이를 통해 사용자는 웹 캔버스를 클릭하지 않고서도 키보드 기반 애플리케이션을 사용할 수 있습니다.

아래에 설명된 대로 특정 키보드 입력에 적용되는 참고 사항은 다음과 같습니다.

| 키보드 입력 동작          | 설명                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| HTML 요소(예: 텍스트 필드) | 키보드 입력을 수신해야 하는 웹 페이지에 텍스트 필드와 같은 HTML 요소를 추가하면 오류가 발생할 수 있습니다. Unity는 페이지의 나머지 부분이 입력 이벤트를 수신하기 전에 입력 이벤트를 먼저 소비합니다.HTML 요소가 키보드 입력을 수신하게 하려면 `WebGLInput.captureAllKeyboardInput`을 `false`로 설정합니다. 이렇게 하면 웹 캔버스가 활성화된 경우에만 애플리케이션이 입력을 수신합니다.                                                                                                                                                 |
| **Esc** 키          | Safari와 같은 일부 브라우저는 웹 환경에서 **Esc** 키를 보호하므로 **Esc** 키를 눌러 전체 화면 모드로 전환하는 기능을 차단합니다. Google Chrome과 같은 다른 브라우저는 예측할 수 없는 동작을 할 수 있습니다. 브라우저가 전체 화면 모드에 있을 경우 사용자는 **Esc** 키를 사용해서만 전체 화면 모드를 종료할 수 있습니다. 브라우저 유형에 따라 **Esc** 키를 클릭하더라도 이벤트가 브라우저에서 애플리케이션으로 전달되지 않을 수 있습니다.                                                                                                                      |
| `HideMobileInput`  | [TextMeshPro](https://docs.unity3d.com/Packages/com.unity.ugui@2.0/manual/TextMeshPro/index.html)(TMP라고도 함) 입력 필드의 `HideMobileInput` 옵션은 웹 플랫폼에 영향을 미치지 않습니다. 브라우저에서 가상 키보드를 트리거하려면 텍스트 입력 필드가 필요하므로 이 옵션은 영향을 미치지 않습니다. 웹 플랫폼은 텍스트 입력 필드를 인스턴스화하여 Unity 플레이어가 텍스트 입력을 해야 할 때 가상 키보드를 트리거합니다. 텍스트 입력 필드는 다른 플랫폼과 마찬가지로 가상 키보드 위에 나타납니다. 가상 키보드는 모바일 텍스트 입력 필드에 의존하므로 웹 플랫폼에서 숨겨진 상로 표시할 수 없습니다. |

## 모바일 센서 지원##mobile-sensor-support

터치를 지원하는 브라우저 및 모바일 기기에 대해 Unity 웹은 다음 센서를 지원합니다.

* 가속 센서에 대한 [Input.acceleration](/engine/6000.0/script-reference/unity-engine/input/acceleration.md)
* LinearAcceleration에 대한 [Gyroscope.userAcceleration](/engine/6000.0/script-reference/unity-engine/gyroscope/user-acceleration.md)
* 자이로스코프에 대한 [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 웹 플랫폼은 HTML5 API `Element.requestPointerLock`을 사용하는 커서 잠금을 지원합니다. 커서 잠금을 사용하면 마우스 커서가 게임 창 중앙에 고정됩니다. 잠긴 커서는 Unity에서 숨겨진 상태로 표시되며 마우스를 움직여도 이동하지 않습니다. 이는 일반적으로 마우스 커서를 사용하여 플레이어 각도 방향을 제어하는 1인칭 게임에 특히 유용합니다.

**참고:** 커서 잠금 지원은 브라우저에 따라 달라지므로 [Element: requestPointerLock() 메서드](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestPointerLock)에 대한 Mozilla 기술 자료를 참조하십시오.

### 커서 잠금 활성화##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` 프로퍼티는 브라우저 동작과 관계없이 커서 잠금 모드를 유지하는 데 활용할 수 있어 1인칭 게임에 흔히 사용됩니다.

브라우저가 Unity 캔버스에서 커서 잠금을 해제(일반적으로 **Esc** 키를 사용)하더라도 `Cursor.lockState` 상태가 지속되도록 하려면 [`stickyCursorLock`](/engine/6000.0/script-reference/unity-engine/web-gl-input/sticky-cursor-lock.md)을 사용하십시오. 이 경우 캔버스가 다음에 다시 활성화되면 커서가 다시 잠깁니다.

따라서 `WebGLInput._stickyCursorLock`을 `true`로 설정하면 Unity 캔버스 HTML 요소가 커서의 잠금을 해제하더라도 `Cursor.lockState`는 `CursorLockMode.Locked` 상태로 유지됩니다.

`WebGLInput._stickyCursorLock`을 `false`로 설정하면 다음이 발생합니다.

* `Cursor.lockState`는 브라우저의 커서 잠금 상태와 동기화된 상태로 유지됩니다.

* 사용자가 **Esc** 키를 눌러 캔버스 커서 잠금을 취소하면 `Cursor.lockState`가 `CursorLockMode.None`으로 변경됩니다.

**참고:** 웹에서 `stickyCursorLock`은 기본적으로 `true`로 설정됩니다.

## 전체 화면 모드##full-screen-mode

게임에서 전체 화면 모드를 사용하여 다음을 수행할 수 있습니다.

* 게임에서 전체 화면을 사용합니다.

* 주소 표시줄 및 탭과 같은 브라우저 사용자 인터페이스(UI) 요소를 숨깁니다.

* 제목 표시줄 및 툴바와 같은 Unity 플레이어 UI 요소를 숨깁니다.

Unity 웹 플랫폼은 HTML5 API `Element.requestFullscreen`를 사용하는 전체 화면 모드를 지원합니다.

**참고:** 전체 화면 모드 지원은 브라우저에 따라 달라지므로 [Element: requestFullscreen() 메서드](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen)에 대한 Mozilla 기술 자료를 참조하십시오.

### 웹에서 전체 화면 모드 활성화##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) 컴포넌트를 사용해 `OnPointerDown` 메서드를 오버라이드하는 `Button`의 서브 클래스를 생성하여 원하는 동작을 구현할 수도 있습니다.

**참고:** 일부 브라우저는 전체 화면 모드로 전환하거나 커서를 잠그기 전에 알림 메시지를 표시하거나 사용자에게 권한을 요청하는 프롬프트를 표시할 수 있습니다.

## 추가 리소스##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)
