# ウェブでの入力

> 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

旧 Input System のウェブゲームコントローラーマッピングは、[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 Player がテキストの入力を予期したときに仮想キーボードをトリガーするために、テキスト入力フィールドをインスタンス化します。テキスト入力フィールドは、他のプラットフォームと同様に仮想キーボードの上に表示されます。仮想キーボードはモバイルテキスト入力フィールドに依存しているため、ウェブプラットフォームで非表示にすることはできません。 |

## モバイルセンサーのサポート##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)
* Attitude と [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 では非表示となり、マウスを動かしても移動しません。これは、一般的にマウスカーソルを使用してプレイヤーの角度の向きをコントロールできる、一人称視点のゲームで特に役立ちます。

**注意**: カーソルロックのブラウザーサポートはさまざまであるため、[要素: 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` プロパティは、一人称視点でのゲームでよく使用されます。これは、ブラウザーの動作に関係なくカーソルロックモードの維持に役立つためです。

[`stickyCursorLock`](/engine/6000.0/script-reference/unity-engine/web-gl-input/sticky-cursor-lock.md) を使用すると、ブラウザーが Unity キャンバスからカーソルロックを (通常は **Esc** キーを使用して) 解除した場合でも、`Cursor.lockState` 状態が必ず永続化されます。この場合、次にキャンバスにフォーカスが戻ったときにカーソルが再びロックされます。

したがって、`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 Player の UI 要素を非表示にします。

Unity ウェブプラットフォームは、HTML5 API の `Element.requestFullscreen` を使用する全画面モードをサポートします。

**注意**: 全画面モードのブラウザーサポートはさまざまであるため、[要素: 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)
