Unity ウェブは、ゲームパッド、ジョイスティック、タッチスクリーン、キーボード、動作センサーなど、さまざまなデバイスからのさまざまなタイプの入力をサポートしています。
ウェブはゲームパッドでの以下の入力をサポートします。
ウェブは HTML5 Gamepad API をサポートするブラウザー用ジョイスティックもサポートします。
一部のブラウザーでは、アプリケーションにフォーカスがある間にユーザーがデバイスを操作した後にのみ、入力デバイスにアクセスできます。これは、ブラウザーフィンガープリントの目的で接続されたデバイスをユーザーが使用できないようにするタイプのセキュリティ対策です。そのため、Input.GetJoystickNames() を呼び出して接続されたデバイスを確認する前に、アプリケーションからユーザーに対してゲームパッド/ジョイスティックのボタンを押すように指示していることを確認してください。
旧 Input System のウェブゲームコントローラーマッピングは、W3 仕様に準拠しています。この仕様では、ボタンマッピングのレイアウトは次のようになります。
| ボタン | 説明 |
|---|---|
| buttons[0] | 右側のクラスタの下部ボタン = バツ (X) |
| buttons[1] | 右側のクラスタの右ボタン = 丸 |
| buttons[2] | 右側のクラスタの左ボタン = 正方形 |
| buttons[3] | 右側のクラスタの上部ボタン = 三角形 |
注意: ウェブは W3 仕様に準拠しているため、他のプラットフォームと一貫性がない可能性があります。また、Windows とウェブなど、複数のプラットフォームを同時にターゲットにする場合は、異なるアプローチが必要です。詳細については、再マッピングに関する W3 ドキュメントを参照してください。
Unity ウェブは、Input.touches やその他の関連 API を、タッチサポートのあるブラウザーやデバイスに実装します。デフォルトでは、ユーザーが UI の入力フィールドにテキストを入力するためのソフトキーボードが、モバイルデバイスの画面に表示されます。この動作を無効にするには、WebGLInput.mobileKeyboardSupport プロパティを使用します。
デフォルトでは、Unity ウェブはウェブキャンバスにフォーカスがあるかどうかにかかわらず、ウェブページが受け取るすべてのキーボード入力を処理します。これにより、ユーザーはウェブキャンバスをクリックしなくてもキーボードベースのアプリケーションを使用できます。
以下の注意は、後述のとおり特定のキーボード入力に適用されます。
| キーボード入力の動作 | 説明 |
|---|---|
| HTML 要素 (テキストフィールドなど) | キーボード入力を受け取る HTML 要素 (テキストフィールドなど) をウェブページに導入すると、エラーが発生する可能性があります。Unity では、ページの残りの部分が入力イベントを受け取る前に、それらが消費されます。 HTML 要素がキーボード入力を受け取るようにするには、 WebGLInput.captureAllKeyboardInput を false に設定します。こうすることで、アプリケーションはウェブキャンバスにフォーカスがある場合にのみ、入力を受け取ります。 |
| Esc キー | Safari などの一部のブラウザーでは、Esc キーを使用して全画面モードに切り替える機能がブロックされます。これは、Esc キーがウェブ環境で保護されているためです。Google Chrome などの他のブラウザーでは、予期しない動作をする場合があります。ブラウザーが全画面モードの場合、ユーザーが全画面モードを終了するために使用できるのは Esc キーのみです。ブラウザーの種類によっては、Esc キーを押しても、必ずしもブラウザーからアプリケーションに移動するためのイベントがトリガーされないことがあります。 |
HideMobileInput |
TextMeshPro (TMP とも呼ばれます) 入力フィールドの HideMobileInput オプションは、ウェブプラットフォームでは効果がありません。このオプションに効果がないのは、ブラウザーで仮想キーボードをトリガーするにはテキスト入力フィールドが必要となるためです。ウェブプラットフォームは、Unity Player がテキストの入力を予期したときに仮想キーボードをトリガーするために、テキスト入力フィールドをインスタンス化します。テキスト入力フィールドは、他のプラットフォームと同様に仮想キーボードの上に表示されます。仮想キーボードはモバイルテキスト入力フィールドに依存しているため、ウェブプラットフォームで非表示にすることはできません。 |
タッチサポートのあるブラウザーとモバイルデバイスの場合、Unity ウェブは以下のセンサーをサポートします。
重要: ブラウザーでは、センサー入力は安全なコンテキストでのみ許可されます。つまり、HTTPS を介してページを提供する必要があります。唯一の例外は http://localhost で、開発時に使用できます。
Unity ウェブプラットフォームは、HTML5 API Element.requestPointerLock を使用するカーソルロックをサポートしています。カーソルロックを使用して、マウスカーソルをゲームウィンドウの中央にロックします。カーソルは、ロックされている場合は Unity では非表示となり、マウスを動かしても移動しません。これは、一般的にマウスカーソルを使用してプレイヤーの角度の向きをコントロールできる、一人称視点のゲームで特に役立ちます。
注意: カーソルロックのブラウザーサポートはさまざまであるため、要素: requestPointerLock() メソッドについては Mozilla のドキュメントを参照してください。
カーソルをロックするには、Cursor.lockState プロパティを使用します。例えば以下のコードは、ユーザーがマウスの左ボタンをクリックしたときにカーソルをロック状態に切り替えます。
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Cursor.lockState = CursorLockMode.Locked;
}
}
カーソルロックは、ユーザーの操作によってアクティベートする必要があります。詳細については、全画面モードとカーソルロックのその他の考慮事項を参照してください。
Esc キーを押すとカーソルロックを解除できます。
stickyCursorLock プロパティは、一人称視点でのゲームでよく使用されます。これは、ブラウザーの動作に関係なくカーソルロックモードの維持に役立つためです。
stickyCursorLock を使用すると、ブラウザーが 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 に設定されています。
ゲーム内で全画面モードを使用して、以下を行います。
画面全体をゲームに使用します。
アドレスバーやタブなどブラウザーのユーザーインターフェース (UI) 要素を非表示にします。
タイトルバーやツールバーなど Unity Player の UI 要素を非表示にします。
Unity ウェブプラットフォームは、HTML5 API の Element.requestFullscreen を使用する全画面モードをサポートします。
注意: 全画面モードのブラウザーサポートはさまざまであるため、要素: requestFullscreen() メソッドについては Mozilla ドキュメントを参照してください。
全画面モードを有効にするには、Screen.fullScreen プロパティを使用します。例えば、以下のコードは、ユーザーが F キーを押すと、ゲームを全画面モードに切り替えます。
void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
Screen.fullScreen = true;
}
}
注意: Screen.fullScreen プロパティはデフォルトで false に設定されています。
全画面モードはユーザーの操作によってアクティベートする必要があります。詳細については、全画面モードとカーソルロックのその他の考慮事項を参照してください。
全画面モードを終了するには、もう一度 Esc キーを押すか、画面上部にマウスポインターを置いてアドレスバーとタブにアクセスします。
セキュリティ上の理由から、ブラウザーでは、マウスクリックやキーの押下などのユーザーが開始したイベントの後にのみカーソルをロックし、全画面モードを有効にできます。
Unity は個別のイベントとレンダリングループをサポートしないため、Unity スクリプティングから送信された全画面リクエストまたはカーソルロックリクエストが、それをトリガーしたイベントへの直接の反応としてブラウザーに確認されなくなるまで、イベント処理を保留します。
したがって、Unity は、カーソルロックや全画面のリクエストをトリガーするイベントではなく、ユーザーが開始した次のイベントでリクエストをトリガーします。
カーソルロックまたは全画面モードを有効にしてより良い結果を得るには、マウス/キーアップイベントの代わりに、マウス/キーダウンイベントを使用して、応答をトリガーします。こうすることで、ユーザーが以前に開始したイベントによってディファードリクエストが発生していない場合でも、対応するマウス/キーアップイベントによってディファードリクエストが必ずトリガーされるようにできます。
Unity の UI.Button コンポーネントを使用して、OnPointerDown メソッドをオーバーライドする Button のサブクラスを作成することで、目的の動作を実現することもできます。
注意: ブラウザーによっては、全画面モードに入る前やカーソルをロックする前に、ユーザーに通知メッセージや権限付与のプロンプトを表示する場合があります。