On-Screen Control
On-Screen Control を使用すると、ユーザーが画面上で操作できる UI ウィジェットを表示して、Input Device のシミュレーションを行うことができます。特にわかりやすい例が、スティックとボタンのウィジェットをタッチスクリーンで使用して、ジョイスティックやゲームパッドをエミュレートする場合です。
現在、すぐに使用できる Control タイプとして、ボタン と スティック の 2 つが実装されています。OnScreenControl
基本クラスを拡張して、カスタム Control を実装することもできます (詳細については、カスタム On-Screen Control の作成 に関するドキュメントを参照してください)。
ノート: On-Screen Control には、視覚的な表現は事前定義されていません。Control の視覚的要素を設定するのは開発者の役割です (例えば、ゲームオブジェクトにスプライトや UI コンポーネントを加えることができます)。On-Screen Control は、インタラクションロジックと、インタラクションから入力を設定して生成する処理を担当します。
各 On-Screen Control は、Control パス を使用して、入力の報告元とする Control を参照します。例えば、以下の on-screen ボタンは、ゲームパッドの右ショルダーボタンとして入力を報告します。
シーンに存在する On-Screen Control のコレクションにより、1 つ以上の Input Device が形成されます。Input System では、Control が参照している固有の Device タイプごとに 1 つの Input Device が作成されます。例えば、ある on-screen ボタンが <Gamepad>/buttonSouth
を参照し、別の on-screen ボタンが <Keyboard>/a
を参照している場合は、Gamepad
と Keyboard
の両方が 1 つずつ作成されます。これは、コンポーネントが有効化されたときに自動的に行われます。無効になると、これらの Device が自動的に再び削除されます。
On-Screen Control の入力先となる Control (および、暗示的には Device) を照会するには、OnScreenControl.control
プロパティを使用できます。
ノート: この設計により、On-Screen Control を使用して、ジョイスティックとゲームパッドだけでなく、任意の Input Device に対する入力を作成することができます。
On-Screen ボタン
On-Screen ボタンを作成するには、以下のステップを実行します。
- UI
Button
オブジェクトを加えます。 - そのオブジェクトに
OnScreenButton
コンポーネントを加えます。 Control Path
がButtonControl
を参照するように設定します (<Gamepad>/buttonSouth
など)。コントロールパスによって参照されるデバイスのタイプに応じて、コンポーネントによって作成される仮想デバイスのタイプが決まります。
OnScreenButton
コンポーネントでは、ターゲット Control が Button
Control であることが必要です。OnScreenButton
は、ポインター押下 (IPointerDownHandler.OnPointerDown
) イベントを受け取ったときにターゲット Control の値を 1 に設定し、ポインター解放 (IPointerUpHandler.OnPointerUp
) イベントを受け取ったときに 0 に設定します。
On-Screen スティック
On-Screen スティックを作成するには、以下のステップを実行します。
- UI
Image
オブジェクトを作成します。 - そのオブジェクトに
OnScreenStick
コンポーネントを加えます。 Control Path
がVector2Control
を参照するように設定します (<Gamepad>/leftStick
など)。コントロールパスによって参照されるデバイスのタイプに応じて、コンポーネントによって作成される仮想デバイスのタイプが決まります。
OnScreenStick
コンポーネントでは、ターゲット Control が Vector2
Control であることが必要です。OnScreenStick
は、ポインター押下 (IPointerDownHandler.OnPointerDown
) イベントを受け取ると、スティックの Control の移動を開始し、ポインター解放 (IPointerUpHandler.OnPointerUp
) イベントを受け取ると停止します。
その間、スティックは、ポインターが押された画面位置を中心として、コンポーネントの Movement Range プロパティで定義された長さの境界線を持つ四角形の内部を、ドラッグされる (IDragHandler.OnDrag
) ポインターに従って動きます。例えば、移動範囲が 50 の場合、スティックの on-screen 領域は、画面上でポインターが押された位置から上下左右に 25 ピクセルの範囲になります。
ユーザーによる On-Screen スティックのタッチの開始および終了時に通知を受け取るには、コンポーネントに IPointerDownHandler
、IPointerUpHandler
、またはその両方を実装し、それをスティックの GameObject
に加えます。
カスタムの On-Screen Control の作成
OnScreenControl
を拡張すると、新しいタイプの Input Control のサポートを追加できます。わかりやすい例は、OnScreenButton
です。
[AddComponentMenu("Input/On-Screen Button")]
public class OnScreenButton : OnScreenControl, IPointerDownHandler, IPointerUpHandler
{
public void OnPointerUp(PointerEventData data)
{
SendValueToControl(0.0f);
}
public void OnPointerDown(PointerEventData data)
{
SendValueToControl(1.0f);
}
[InputControl(layout = "Button")]
[SerializeField]
private string m_ControlPath;
protected override string controlPathInternal
{
get => m_ControlPath;
set => m_ControlPath = value;
}
}