diff --git a/Packages/com.unity.inputsystem/Documentation~/ActionAssets.md b/Packages/com.unity.inputsystem/Documentation~/ActionAssets.md
deleted file mode 100644
index def2c2e5e5..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/ActionAssets.md
+++ /dev/null
@@ -1,120 +0,0 @@
----
-uid: input-system-action-assets
----
-# Input Action Assets
-
-- [Creating Input Action Assets](#creating-input-action-assets)
-- [Editing Input Action Assets](#editing-input-action-assets)
-- [Using Input Action Assets](#using-input-action-assets)
-- [Type-safe C# API Generation](#type-safe-c-api-generation)
-
-An Input Action Asset is an Asset which contains a set of [Input Actions](Actions.md) definitions and their associated [Bindings](ActionBindings.md) and [Control Schemes](ActionBindings.md#control-schemes). These Assets have the `.inputactions` file extension and are stored in a plain JSON format.
-
-The input system creates an Action Asset when you set up the [default project-wide actions](ProjectWideActions.md), but you can also create new Action Assets directly in the Project window.
-
-For most common scenarios, you do not need to use more than one Input Action Asset. It is usually simpler to configure your project-wide action definition in the Project Settings window.
-
-
-## Creating Input Action Assets
-
-To create an Asset that contains [Input Actions](Actions.md) in Unity, right-click in the __Project__ window or go to __Assets > Create > Input Actions__ from Unity's main menu.
-
-## Editing Input Action Assets
-
-To bring up the Action editor, double-click an `.inputactions` Asset in the Project Browser, or select the __Edit Asset__ button in the Inspector for that Asset. You can have more than one editor window open at the same time, but not for the same Asset.
-
-The Actions Editor which opens is identical to the [Actions Editor in the Project Settings window](ActionsEditor.md).
-
-
-## Using Input Action Assets
-
-
-## Type-safe C# API Generation
-
-Input Action Assets allow you to **generate a C# class** from your action definitions, which allow you to refer to your actions in a type-safe manner from code. This means you can avoid looking up your actions by string.
-
-### Auto-generating script code for Actions
-
-One of the most convenient ways to work with `.inputactions` Assets in scripts is to automatically generate a C# wrapper class for them. This removes the need to manually look up Actions and Action Maps using their names, and also provides an easier way to set up callbacks.
-
-To enable this option, tick the __Generate C# Class__ checkbox in the importer properties in the Inspector of the `.inputactions` Asset, then select __Apply__.
-
-
-
-You can optionally choose a path name, class name, and namespace for the generated script, or keep the default values.
-
-This generates a C# script that simplifies working with the Asset.
-
-```CSharp
-using UnityEngine;
-using UnityEngine.InputSystem;
-
-// IGameplayActions is an interface generated from the "gameplay" action map
-// we added (note that if you called the action map differently, the name of
-// the interface will be different). This was triggered by the "Generate Interfaces"
-// checkbox.
-public class MyPlayerScript : MonoBehaviour, IGameplayActions
-{
- // MyPlayerControls is the C# class that Unity generated.
- // It encapsulates the data from the .inputactions asset we created
- // and automatically looks up all the maps and actions for us.
- MyPlayerControls controls;
-
- public void OnEnable()
- {
- if (controls == null)
- {
- controls = new MyPlayerControls();
- // Tell the "gameplay" action map that we want to get told about
- // when actions get triggered.
- controls.gameplay.SetCallbacks(this);
- }
- controls.gameplay.Enable();
- }
-
- public void OnDisable()
- {
- controls.gameplay.Disable();
- }
-
- public void OnUse(InputAction.CallbackContext context)
- {
- // 'Use' code here.
- }
-
- public void OnMove(InputAction.CallbackContext context)
- {
- // 'Move' code here.
- }
-
-}
-```
-
->__Note__: To regenerate the .cs file, right-click the .inputactions asset in the Project Browser and choose "Reimport".
-
-### Using Action Assets with `PlayerInput`
-
-The [Player Input](PlayerInput.md) component provides a convenient way to handle input for one or multiple players. You can assign your Action Asset to the Player Input component so that it can then automatically handle activating Action Maps and selecting Control Schemes for you.
-
-
-
-### Modifying Input Action Assets at runtime
-There are several ways to modify an Input Action Asset at runtime. Any modifications that you make during Play mode to an Input Action Asset do not persist in the Input Action Asset after you exit Play mode. This means you can test your application in a realistic manner in the Editor without having to worry about inadvertently modifying the asset. For examples on how to modify an Input Action Asset, see the documentation on [Creating Actions in code](Actions.md#creating-actions-in-code) and [Changing Bindings](ActionBindings.md#changing-bindings).
-
-
-### The Default Actions Asset
-
-An asset called `DefaultInputActions.inputactions` containing a default setup of Actions comes with the Input System Package. You can reference this asset directly in your projects like any other Unity asset. However, the asset is also available in code form through the [`DefaultInputActions`](../api/UnityEngine.InputSystem.DefaultInputActions.html) class.
-
-```CSharp
-void Start()
-{
- // Create an instance of the default actions.
- var actions = new DefaultInputActions();
- actions.Player.Look.performed += OnLook;
- actions.Player.Move.performed += OnMove;
- actions.Enable();
-}
-```
-
-> __Note:__ This default actions asset is older than, and entirely separate from the [default project-wide actions](ProjectWideActions.md). It is a legacy asset that remains included in the package for backward compatibility.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Actions.md b/Packages/com.unity.inputsystem/Documentation~/Actions.md
index 780d0e2ddc..f69239fde7 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Actions.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Actions.md
@@ -3,156 +3,23 @@ uid: input-system-actions
---
# Actions
-**Actions** are an important concept in the Input System. They allow you to separate the purpose of an input from the device controls which perform that input. Actions allow you to associate the purpose and device controls together in a flexible way.
+**Actions** allow you to separate the purpose of an input from the device controls which perform that input, and associate the purpose and device controls together in a flexible way.
-For example, the purpose of an input in a game might be to make the player's character move around. The device control associated with that action might be the motion of the left gamepad stick.
+For example, the purpose of an input in a game might be to make the player's character move. The device control associated with that action might be the left gamepad stick.
-The association between an Action and the device controls which perform that input is a **binding**, and you can set up bindings in the [Input Actions editor](ActionsEditor.md). When you use Actions in your code, you do not need to refer to specific devices because the binding defines which device's controls are used to perform the action.
+The association between an Action and the device controls which perform that input is a **binding**, and you can set up bindings in the [Input Actions editor](actions-editor.md). When you use Actions in your code, you do not need to refer to specific devices because the binding defines which device's controls are used to perform the action.
-To use actions in your code, you must use the [Input Actions editor](ActionsEditor.md) to establish the mapping between the Action and one or more device controls. For example in this screenshot, the "Move" action is displayed, showing its bindings the left gamepad stick, and the keyboard's arrow keys.
+To use actions in your code, you must use the [Input Actions editor](actions-editor.md) to configure the mapping between the Action and one or more device controls. For example in this screenshot, the "Move" action is displayed, showing its bindings the left gamepad stick, and the keyboard's arrow keys.

*The Actions panel of the Input Actions Editor in Project Settings*
-You can then get a reference to this action in your code, and check its value, or attach a callback method to be notified when it is performed. See the [Actions Workflow page](Workflow-Actions.md) for a simple example script demonstrating this.
+You can then get a reference to this action in your code, and check its value, or attach a callback method to be notified when it is performed. See the [Actions Workflow page](using-actions-workflow.md) for a simple example script demonstrating this.
-Actions also make it simpler to create a system that lets your players [customize their bindings at runtime](ActionBindings.md#interactive-rebinding), which is a common requirement for games.
+Actions also make it simpler to create a system that lets your players [customize their bindings at runtime](rebind-action-runtime.md), which is a common requirement for games.
>**Notes:**
> - Actions are a runtime only feature. You can't use them in [Editor window code](https://docs.unity3d.com/ScriptReference/EditorWindow.html).
>
-> - You can read input without using Actions and Bindings by directly reading specific device controls. This is less flexible, but can be quicker to implement for certain situations. Read more about [directly reading devices from script](Workflow-Direct.md).
+> - You can read input without using Actions and Bindings by directly reading specific device controls. This is less flexible, but can be quicker to implement for certain situations. Read more about [directly reading devices from script](using-direct-workflow.md).
>
-> - Although you can reorder actions in this window, the ordering is for visual convenience only, and does not affect the order in which the actions are triggered in your code. If multiple actions are performed in the same frame, the order in which they are reported by the input system is undefined. To avoid problems, you should not write code that assumes they will be reported in a particular order.
->
-
-
-## Overview
-
-When scripting with Actions in the Input System, there are number of important API you can use, which are described here:
-
-|API name|Description|
-|-----|-----------|
-|[`InputSystem.actions`](../api/UnityEngine.InputSystem.InputSystem.html)|A reference to the set of actions assigned as the [project-wide Actions](./ProjectWideActions.md).|
-|[`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html)|A named collection of Actions. The API equivalent to an entry in the "Action Maps" column of the [Input Actions editor](ActionsEditor.md).|
-|[`InputAction`](../api/UnityEngine.InputSystem.InputAction.html)|A named Action that can return the current value of the controls that it is bound to, or can trigger callbacks in response to input. The API equivalent to an entry in the "Actions" column of the [Input Actions editor](ActionsEditor.md).|
-|[`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html)|The relationship between an Action and the specific device controls for which it receives input. For more information about Bindings and how to use them, see [Action Bindings](ActionBindings.md).|
-
-Each Action has a name ([`InputAction.name`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_name)), which must be unique within the Action Map that the Action belongs to, if any (see [`InputAction.actionMap`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_actionMap)). Each Action also has a unique ID ([`InputAction.id`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_id)), which you can use to reference the Action. The ID remains the same even if you rename the Action.
-
-Each Action Map has a name ([`InputActionMap.name`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_name)), which must also be unique with respect to the other Action Maps present, if any. Each Action Map also has a unique ID ([`InputActionMap.id`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_id)), which you can use to reference the Action Map. The ID remains the same even if you rename the Action Map.
-
-## Creating Actions
-
-The simplest way to create actions is to use the [Input Actions editor](ActionsEditor.md) in the Project Settings window. This is the primary recommended workflow and suitable for most scenarios.
-
-However, because the input system API is very open, there are many other ways to create actions which may suit less common scenarios. For example, by loading actions from JSON data, or creating actions entirely in code.
-
-### Creating Actions using the Action editor
-
-For information on how to create and edit Input Actions in the editor, see the [Input Actions editor](ActionsEditor.md). This is the recommended workflow if you want to organise all your input actions and bindings in one place, which applies across the whole of your project. This often the case for most types of game or app.
-
-
-*The Input Actions Editor in the Project Settings window*
-
-
-# Other ways to create Actions
-
-The simplest way to create actions is to use the [Input Actions editor](ActionsEditor.md) to configure a set of actions in an asset, as described above. However, because the Input System package API is open and flexible, you can create actions using alternative techniques. These alternatives might be more suitable if you want to customize your project beyond the standard workflow.
-
-### Creating Actions by declaring them in MonoBehaviours
-
-As an alternative workflow, you can declare individual [Input Action](../api/UnityEngine.InputSystem.InputAction.html) and [Input Action Maps](../api/UnityEngine.InputSystem.InputActionMap.html) as fields directly inside `MonoBehaviour` components.
-
-```CSharp
-using UnityEngine;
-using UnityEngine.InputSystem;
-
-public class ExampleScript : MonoBehaviour
-{
- public InputAction move;
- public InputAction jump;
-}
-```
-
-The result is similar to using an Actions defined in the Input Actions editor, except the Actions are defined in the GameObject's properties and saved as Scene or Prefab data, instead of in a dedicated Asset.
-
-When you embed actions like this, by defining serialized InputAction fields in a MonoBehaviour, the GameObject's Inspector window displays an interface similar to the Actions column of the [Actions Editor](./ActionsEditor.md), which allows you to set up the bindings for those actions. For example:
-
-
-
-* To add or remove Actions or Bindings, click the Add (+) or Remove (-) icon in the header.
-* To edit Bindings, double-click them.
-* To edit Actions, double-click them in an Action Map, or click the gear icon on individual Action properties.
-* You can also right-click entries to bring up a context menu, and you can drag them. Hold the Alt key and drag an entry to duplicate it.
-
-Unlike the project-wide actions in the Project Settings window, you must manually enable and disable Actions and Action Maps that are embedded in MonoBehaviour components.
-
-When you use this workflow, the serialised action configurations are stored with the parent GameObject as part of the scene, opposite to being serialised with an Action Asset. This can be useful if you want to bundle the control bindings and behaviour together in a single monobehaviour or prefab, so it can be distributed together. However, this can also make it harder to organize your full set of control bindings if they are distributed across multiple prefabs or scenes.
-
-### Loading Actions from JSON
-
-You can load Actions as JSON in the form of a set of Action Maps or as a full [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html). This also works at runtime in the Player.
-
-```CSharp
-// Load a set of action maps from JSON.
-var maps = InputActionMap.FromJson(json);
-
-// Load an entire InputActionAsset from JSON.
-var asset = InputActionAsset.FromJson(json);
-```
-
-### Creating Actions in code
-
-You can manually create and configure Actions entirely in code, including assigning the bindings. This also works at runtime in the Player. For example:
-
-```CSharp
-// Create free-standing Actions.
-var lookAction = new InputAction("look", binding: "/leftStick");
-var moveAction = new InputAction("move", binding: "/rightStick");
-
-lookAction.AddBinding("/delta");
-moveAction.AddCompositeBinding("Dpad")
- .With("Up", "/w")
- .With("Down", "/s")
- .With("Left", "/a")
- .With("Right", "/d");
-
-// Create an Action Map with Actions.
-var map = new InputActionMap("Gameplay");
-var lookAction = map.AddAction("look");
-lookAction.AddBinding("/leftStick");
-
-// Create an Action Asset.
-var asset = ScriptableObject.CreateInstance();
-var gameplayMap = new InputActionMap("gameplay");
-asset.AddActionMap(gameplayMap);
-var lookAction = gameplayMap.AddAction("look", "/leftStick");
-```
-
-Any action that you create in this way during Play mode do not persist in the Input Action Asset after you exit Play mode. This means you can test your application in a realistic manner in the Editor without having to worry about inadvertently modifying the asset.
-
-
-## Enabling actions
-
-Actions have an **enabled** state, meaning you can enable or disable them to suit different situations.
-
-If you have an Action Asset assigned as [project-wide](./ProjectWideActions.md), the actions it contains are enabled by default and ready to use.
-
-For actions defined elsewhere, such as in an Action Asset not assigned as project-wide, or defined your own code, they begin in a disabled state, and you must enable them before they will respond to input.
-
-You can enable actions individually, or as a group by enabling the Action Map which contains them.
-
-```CSharp
-// Enable a single action.
-lookAction.Enable();
-
-// Enable an en entire action map.
-gameplayActions.Enable();
-```
-
-When you enable an Action, the Input System resolves its bindings, unless it has done so already, or if the set of devices that the Action can use has not changed. For more details about this process, see the documentation on [binding resolution](ActionBindings.md#binding-resolution).
-
-You can't change certain aspects of the configuration, such Action Bindings, while an Action is enabled. To stop Actions or Action Maps from responding to input, call [`Disable`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_Disable).
-
-While enabled, an Action actively monitors the [Control(s)](Controls.md) it's bound to. If a bound Control changes state, the Action processes the change. If the Control's change represents an [Interaction](Interactions.md) change, the Action creates a response. All of this happens during the Input System update logic. Depending on the [update mode](Settings.md#update-mode) selected in the input settings, this happens once every frame, once every fixed update, or manually if updates are set to manual.
diff --git a/Packages/com.unity.inputsystem/Documentation~/ActionsEditor.md b/Packages/com.unity.inputsystem/Documentation~/ActionsEditor.md
deleted file mode 100644
index 39ac1fe4b6..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/ActionsEditor.md
+++ /dev/null
@@ -1,142 +0,0 @@
----
-uid: input-system-configuring-input
----
-# Configuring Input with the Actions Editor
-
-The **Input Actions Editor** allows you to edit [Action Assets](ActionAssets.md), which contain a saved configuration of [Input Actions](Actions.md) and their associated [Bindings](ActionBindings.md).
-
-It allows you to group collections of Actions into [Action Maps](ActionsEditor.html#configure-action-maps), which represent different input scenarios in your project (such as UI navigation, gameplay, etc.)
-
-It also alows you to define [Control Schemes](ActionBindings.md#control-schemes) which are a way to enable or disable a set of devices, or respond to which type of device is being used. This is often useful if you want to customise your UI based on whether your users are using mouse, keyboard, or gamepad as their chosen input.
-
-### Action Assets and Project-Wide Actions
-
-The typical workflow for most projects is to have a single Action Asset, which is assigned as the **project-wide actions**. If you have not yet created and assigned an Actions Asset as the project-wide actions, the recommended workflow is to do this first. Read more about [project-wide actions](ProjectWideActions.md).
-
-### Opening the Actions Editor
-
-The **Input Actions Editor** is an editor window displayed when you open an Action Asset by double-clicking it.
-
-It is also displayed in the Project Settings window under **Edit** > **Project Settings** > **Input System Package** if you have an Action Asset assigned as project-wide.
-
-
-*The Input Actions editor, displaying the default actions*
-
-### The Actions Editor panels
-
-The Input Actions editor is divided into three panels (marked A, B & C above).
-
-|Name|Description|
-|-|-|
-|**(A) Action Maps**|Displays the list of currently defined Action Maps. Each Action Map is a collection of Actions that you can enable or disable together as a group.|
-|**(B) Actions**|Displays all the actions defined in the currently selected Action Map, and the bindings associated with each Action.|
-|**(C) Properties**|Displays the properties of the currently selected Action or Binding from the Actions panel. The title of this panel changes depending on whether you have an Action or a Binding selected in the Actions panel.|
-
-### Configure Action Maps
-
-* To add a new Action Map, select the Add (+) icon in the header of the Action Map panel.
-* To rename an existing Action Map, either long-click the name, or right-click the Action Map and select __Rename__ from the context menu. Note that Action Map names can't contain slashes (`/`).
-* To delete an existing Action Map, right-click it and select __Delete__ from the context menu.
-* To duplicate an existing Action Map, right-click it and select __Duplicate__ from the context menu.
-
-### Configure Actions
-
-* To add a new Action, select the Add (+) icon in the header of the Action column.
-* To rename an existing Action, either long-click the name, or right-click the Action Map and select __Rename__ from the context menu.
-* To delete an existing Action, either right-click it and select __Delete__ from the context menu.
-* To duplicate an existing Action, either right-click it and select __Duplicate__ from the context menu.
-*
-
-
-## Action type and Control type
-
-If you select an Action, you can edit its properties in the right-hand pane of the window:
-
-
-
-#### Action Type
-
-The Action Type setting allows to to select between **Button**, **Value** or **PassThrough**.
-
-These options relate to whether this action should represent a discrete on/off button-style interaction or a value that can change over time while the control is being used.
-
-For device controls such as keyboard keys, mouse clicks, or gamepad buttons, select **Button**. For device controls such as mouse movement, a joystick or gamepad stick, or device orientation that provide continuously changing input over a period of time, select **Value**.
-
-The Button and Value types of action also provides data about the action such as whether it has started and stopped, and conflict resolution in situations where multiple bindings are mapped to the same action.
-
-The third option, **PassThrough**, is also a value type, and as such is suitable for the same types of device controls as value. The difference is that actions set to PassThrough only provide basic information about the values incoming from the device controls bound to it, and does not provide the extra data relating to the phase of the action, nor does it perform conflict resolution in the case of multiple controls mapped to the same action.
-
-For more detail about how these types work, see [action types](RespondingToActions.html#action-types) and [default interactions](Interactions.html#default-interaction).
-
-#### Control Type
-
-The Control Type setting allows you to select the type of control expected by the action. This limits the controls shown when setting up bindings in the UI and also limits which contols can be bound interactively to the action.
-
-For example, if you select **2D axis**, only those controls that can supply a 2D vector as value are available as options for the binding control path.
-
-There are more specific control types available which futher filter the available bindings, such as "Stick", "Dpad" or "Touch". If you select one of these control types, the list of available controls is further limited to only those controls of those specific types when you select a binding for your action (see directly below).
-
-### Bindings
-
-* To add a new Binding, select the Add (+) icon on the action you want to add it to, and select the binding type from the menu that appears.
-* To delete an existing Binding, either right-click it and select __Delete__ from the context menu.
-* To duplicate an existing Binding, either right-click it and select __Duplicate__ from the context menu.
-
-You can add multiple bindings to an action, which is generally useful for supporting multiple types of input device. For example, in the default set of actions, the "Move" action has a binding to the left gamepad stick and the WSAD keys, which means input through any of these bindings will perform the action.
-
-
-_The default "Move" action in the Actions Editor window, displaying the multiple bindings associated with it._
-
-If you select a Binding, you can edit its properties in the right-hand pane of the window:
-
-
-
-#### Picking Controls
-
-The most important property of any Binding is the [control path](Controls.md#control-paths) it's bound to. To edit it, open the __Path__ drop-down list. This displays a Control picker window.
-
-
-
-In the Control picker window, you can explore a tree of Input Devices and Controls that the Input System recognizes, and bind to these Controls. Unity filters this list by the Action's [`Control Type`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_expectedControlType) property. For example, if the Control type is `Vector2`, you can only select a Control that generates two-dimensional values, like a stick.
-
-The Device and Control tree is organized hierarchically from generic to specific. For example, the __Gamepad__ Control path `/buttonSouth` matches the lower action button on any gamepad. Alternatively, if you navigate to __Gamepad__ > __More Specific Gamepads__ and select __PS4 Controller__, and then choose the Control path `/buttonSouth`, this only matches the "Cross" button on PlayStation gamepads, and doesn't match any other gamepads.
-
-Instead of browsing the tree to find the Control you want, it's easier to let the Input System listen for input. To do that, select the __Listen__ button. At first, the list of Controls is empty. Once you start pressing buttons or actuating Controls on the Devices you want to bind to, the Control picker window starts listing any Bindings that match the controls you pressed. Select any of these Bindings to view them.
-
-Finally, you can choose to manually edit the Binding path, instead of using the Control picker. To do that, select the __T__ button next to the Control path popup. This changes the popup to a text field, where you can enter any Binding string. This also allows you to use wildcard (`*`) characters in your Bindings. For example, you can use a Binding path such as `/touch*/press` to bind to any finger being pressed on the touchscreen, instead of manually binding to `/touch0/press`, `/touch1/press` and so on.
-
-#### Editing Composite Bindings
-
-Composite Bindings are Bindings consisting of multiple parts, which form a Control together. For instance, a [2D Vector Composite](ActionBindings.md#2d-vector) uses four buttons (left, right, up, down) to simulate a 2D stick input. See the [Composite Bindings](ActionBindings.md#composite-bindings) documentation to learn more.
-
-
-
-To create a Composite Binding, in the Input Action Asset editor window, select the Add (+) icon on the Action you want to add it to, and select the Composite Binding type from the popup menu.
-
-
-
-This creates multiple Binding entries for the Action: one for the Composite as a whole, and then, one level below that, one for each Composite part. The Composite itself doesn't have a Binding path property, but its individual parts do, and you can edit these parts like any other Binding. Once you bind all the Composite's parts, the Composite can work together as if you bound a single control to the Action.
-
-**Note**: The set of Composites displayed in the menu is depends on the value type of the Action. This means that, for example, if the Action is set to type "Button", then only Composites able to return values of type `float` will be shown.
-
-To change the type of a Composite retroactively, select the Composite, then select the new type from the **Composite Type** drop-down in the **Properties** pane.
-
-
-
-To change the part of the Composite to which a particular Binding is assigned, use the **Composite Part** drop-down in the Binding's properties.
-
-
-
-You can assign multiple Bindings to the same part. You can also duplicate individual part Bindings: right-click the Binding, then select **Duplicate** to create new part Bindings for the Composite. This can be used, for example, to create a single Composite for both "WASD" style controls and arrow keys.
-
-
-
-### Editing Control Schemes
-
-Input Action Assets can have multiple [Control Schemes](ActionBindings.md#control-schemes), which let you enable or disable different sets of Bindings for your Actions for different types of Devices.
-
-
-
-To see the Control Schemes in the Input Action Asset editor window, open the Control Scheme drop-down list in the top left of the window. This menu lets you add or remove Control Schemes to your Actions Asset. If the Actions Asset contains any Control Schemes, you can select a Control Scheme, and then the window only shows bindings that are associated with that Scheme. If you select a binding, you can now pick the Control Schemes for which this binding should be active in the __Properties__ view to the left of the window.
-
-When you add a new Control Scheme, or select an existing Control Scheme, and then select __Edit Control Scheme__, you can edit the name of the Control Scheme and which devices the Scheme should be active for. When you add a new Control Scheme, the "Device Type" list is empty by default (as shown above). You must add at least one type of device to this list for the Control Scheme to be functional.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Architecture.md b/Packages/com.unity.inputsystem/Documentation~/Architecture.md
index 427ab04ac5..8533d46aa3 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Architecture.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Architecture.md
@@ -9,9 +9,9 @@ The Input System has a layered architecture that consists of a low-level layer a
The foundation of the Input System is the native backend code. This is platform-specific code which collects information about available Devices and input data from Devices. This code is not part of the Input System package, but is included with Unity itself. It has implementations for each runtime platform supported by Unity. This is why some platform-specific input bugs can only be fixed by an update to Unity, rather than a new version of the Input System package.
-The Input System interfaces with the native backend using [events](Events.md) that the native backend sends. These events notify the system of the creation and removal of [Input Devices](Devices.md), as well as any updates to the Device states. For efficiency and to avoid creating any garbage, the native backend reports these events as a simple buffer of raw, unmanaged memory containing a stream of events.
+The Input System interfaces with the native backend using [events](input-events.md) that the native backend sends. These events notify the system of the creation and removal of [Input Devices](devices.md), as well as any updates to the Device states. For efficiency and to avoid creating any garbage, the native backend reports these events as a simple buffer of raw, unmanaged memory containing a stream of events.
-The Input System can also send data back to the native backend in the form of [commands](Devices.md#device-commands) sent to Devices, which are also buffers of memory that the native backend interprets. These commands can have different meanings for different Device types and platforms.
+The Input System can also send data back to the native backend in the form of [commands](device-commands.md) sent to Devices, which are also buffers of memory that the native backend interprets. These commands can have different meanings for different Device types and platforms.
# Input System (low-level)
@@ -19,7 +19,7 @@ The Input System can also send data back to the native backend in the form of [c
The low-level Input System code processes and interprets the memory from the event stream that the native backend provides, and dispatches individual events.
-The Input System creates Device representations for any newly discovered Device in the event stream. The low-level code sees a Device as a block of raw, unmanaged memory. If it receives a state event for a Device, it writes the data from the state event into the Device's [state representation](Controls.md#control-state) in memory, so that the state always contains an up-to-date representation of the Device and all its Controls.
+The Input System creates Device representations for any newly discovered Device in the event stream. The low-level code sees a Device as a block of raw, unmanaged memory. If it receives a state event for a Device, it writes the data from the state event into the Device's [state representation](controls.md#control-state) in memory, so that the state always contains an up-to-date representation of the Device and all its Controls.
The low-level system code also contains structs which describe the data layout of commonly known Devices.
@@ -27,8 +27,8 @@ The low-level system code also contains structs which describe the data layout o

-The high-level Input System code interprets the data in a Device's state buffers by using [layouts](Layouts.md), which describe the data layout of a Device and its Controls in memory. The Input System creates layouts from either the pre-defined structs of commonly known Devices supplied by the low level system, or dynamically at runtime, as in the case of [generic HIDs](HID.md#auto-generated-layouts).
+The high-level Input System code interprets the data in a Device's state buffers by using [layouts](layouts.md), which describe the data layout of a Device and its Controls in memory. The Input System creates layouts from either the pre-defined structs of commonly known Devices supplied by the low level system, or dynamically at runtime, as in the case of [generic HIDs](hid-specification.md).
-Based on the information in the layouts, the Input System then creates [Control](Controls.md) representations for each of the Device's controls, which let you read the state of each individual Control in a Device.
+Based on the information in the layouts, the Input System then creates [Control](controls.md) representations for each of the Device's controls, which let you read the state of each individual Control in a Device.
-As part of the high-level system, you can also build another abstraction layer to map Input Controls to your application mechanics. Use [Actions](Actions.md) to [bind](ActionBindings.md) one or more Controls to an input in your application. The Input System then monitors these Controls for state changes, and notifies your game logic using [callbacks](RespondingToActions.md#responding-to-actions-using-callbacks). You can also specify more complex behaviors for your Actions using [Processors](Processors.md) (which perform processing on the input data before sending it to you) and [Interactions](Interactions.md) (which let you specify patterns of input on a Control to listen to, such as multi-taps).
+As part of the high-level system, you can also build another abstraction layer to map Input Controls to your application mechanics. Use [Actions](actions.md) to [bind](bindings.md) one or more Controls to an input in your application. The Input System then monitors these Controls for state changes, and notifies your game logic using [callbacks](respond-to-input.md#responding-to-actions-using-callbacks). You can also specify more complex behaviors for your Actions using [Processors](processors.md) (which perform processing on the input data before sending it to you) and [Interactions](Interactions.md) (which let you specify patterns of input on a Control to listen to, such as multi-taps).
diff --git a/Packages/com.unity.inputsystem/Documentation~/Concepts.md b/Packages/com.unity.inputsystem/Documentation~/Concepts.md
deleted file mode 100644
index b36cd4fcb0..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Concepts.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-uid: basic-concepts
----
-# Basic Concepts
-
-This page introduces the basic concepts that relate to working with the Input System. They relate to the steps in the sequence of events that occur when a user sends input to your game or app. The Input System provides features which implement these steps, or you can choose to implement some of them yourself.
-
-
-
-|Concept|Description|
-|-------|-----------|
-|[**User**](UserManagement.html)| The person playing your game or using your app, by holding or touching the input device and providing input.|
-|[**Input Device**](SupportedDevices.html)| Often referred to just as a "**device**" within the context of input. A physical piece of hardware, such as a keyboard, gamepad, mouse, or touchscreen which allows the user to send input into Unity.|
-|[**Control**](Controls.html)|The separate individual parts of an input device which each send input values into Unity. For example, a gamepad’s **controls** comprise multiple buttons, sticks and triggers, and a mouse’s controls include the two X and Y sensors on the underside, and the various buttons and scroll wheels on the top side.|
-|[**Action**](Actions.html)| Actions are a high-level concept that describe individual things that a user might want to do in your game or app, such as "Jump" within a game, or "Select" in an on-screen UI. They are things a user can do in your game or app as a result of input, regardless of what device or control they use to perform it. Actions generally have conceptual names that you choose to suit your project, and should usually be verbs. For example "Run", "Jump" "Crouch", "Use", "Start", "Quit".|
-|[**Action Map**](ActionsEditor.html#configure-action-maps) | Action Maps allow you to organise Actions into groups which represent specific situations where a set of actions make sense together. You can simultaneously enable or disable all Actions in an action map, so it is useful to group Actions in Action Maps by the context in which they are relevant. For example, you might have one action map for controlling a player, and another for interacting with your game's UI.|
-|[**Binding**](ActionBindings.html)| A connection defined between an **Action** and specific device controls. For example, your "Move" action might have bindings to the arrow keys and WSAD keys on the keyboard, and the left stick on a joypad, and the primary 2D axis on a VR controller. Multiple bindings like this means your game can accept cross-platform input. |
-|[**Your Action Code**](RespondingToActions.md)| The part of your script which is executed based on the actions you have configured. In your code, you can use references to actions to either read the current value or state of the action (also known as "polling"), or set up a callback to call your own method when actions are performed.|
-|[**Action Asset**](ActionAssets.md) | An asset type which contains a saved configuration of Action Maps, Actions and Bindings. You can specify one Action Asset in your project as the [project-wide actions](ProjectWideActions.md), which allows you to easily reference those actions in code by using [`InputSystem.actions`](../api/UnityEngine.InputSystem.InputSystem.html). |
diff --git a/Packages/com.unity.inputsystem/Documentation~/Contributing.md b/Packages/com.unity.inputsystem/Documentation~/Contributing.md
index ad1e654e45..4d1cb726df 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Contributing.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Contributing.md
@@ -1,7 +1,7 @@
---
uid: input-system-contributing
---
-# Contributing
+# Contribute to the Input System source code
The [full source code](https://github.com/Unity-Technologies/InputSystem) for the Input System is available on GitHub. This is also where most of the Input System's development happens.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Controls.md b/Packages/com.unity.inputsystem/Documentation~/Controls.md
deleted file mode 100644
index 19292386ea..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Controls.md
+++ /dev/null
@@ -1,285 +0,0 @@
----
-uid: input-system-controls
----
-# Controls
-
-* [Hierarchies](#control-hierarchies)
-* [Types](#control-types)
-* [Usages](#control-usages)
-* [Paths](#control-paths)
-* [State](#control-state)
-* [Actuation](#control-actuation)
-* [Noisy Controls](#noisy-controls)
-* [Synthetic Controls](#synthetic-controls)
-* [Performance Optimization](#performance-optimization)
-
-An Input Control represents a source of values. These values can be of any structured or primitive type. The only requirement is that the type is [blittable](https://docs.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types).
-
->__Note__: Controls are for input only. Output and configuration items on Input Devices are not represented as Controls.
-
-Each Control is identified by a name ([`InputControl.name`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_name)) and can optionally have a display name ([`InputControl.displayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_displayName)) that differs from the Control name. For example, the right-hand face button closest to the touchpad on a PlayStation DualShock 4 controller has the control name "buttonWest" and the display name "Square".
-
-Additionally, a Control might have one or more aliases which provide alternative names for the Control. You can access the aliases for a specific Control through its [`InputControl.aliases`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_aliases) property.
-
-Finally, a Control might also have a short display name which can be accessed through the [`InputControl.shortDisplayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_shortDisplayName) property. For example, the short display name for the left mouse button is "LMB".
-
-## Control hierarchies
-
-Controls can form hierarchies. The root of a Control hierarchy is always a [Device](Devices.md).
-
-The setup of hierarchies is exclusively controlled through [layouts](Layouts.md).
-
-You can access the parent of a Control using [`InputControl.parent`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_parent), and its children using [`InputControl.children`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_children). To access the flattened hierarchy of all Controls on a Device, use [`InputDevice.allControls`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_allControls).
-
-## Control types
-
-All controls are based on the [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html) base class. Most concrete implementations are based on [`InputControl`](../api/UnityEngine.InputSystem.InputControl-1.html).
-
-The Input System provides the following types of controls out of the box:
-
-|Control Type|Description|Example|
-|------------|-----------|-------|
-|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|A 1D floating-point axis.|[`Gamepad.leftStick.x`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html#UnityEngine_InputSystem_Controls_Vector2Control_x)|
-|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|A button expressed as a floating-point value. Whether the button can have a value other than 0 or 1 depends on the underlying representation. For example, gamepad trigger buttons can have values other than 0 and 1, but gamepad face buttons generally can't.|[`Mouse.leftButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_leftButton)|
-|[`KeyControl`](../api/UnityEngine.InputSystem.Controls.KeyControl.html)|A specialized button that represents a key on a [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html). Keys have an associated [`keyCode`](../api/UnityEngine.InputSystem.Controls.KeyControl.html#UnityEngine_InputSystem_Controls_KeyControl_keyCode) and, unlike other types of Controls, change their display name in accordance to the currently active system-wide keyboard layout. See the [Keyboard](Keyboard.md) documentation for details.|[`Keyboard.aKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_aKey)|
-|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|A 2D floating-point vector.|[`Pointer.position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position)|
-|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|A 3D floating-point vector.|[`Accelerometer.acceleration`](../api/UnityEngine.InputSystem.Accelerometer.html#UnityEngine_InputSystem_Accelerometer_acceleration)|
-|[`QuaternionControl`](../api/UnityEngine.InputSystem.Controls.QuaternionControl.html)|A 3D rotation.|[`AttitudeSensor.attitude`](../api/UnityEngine.InputSystem.AttitudeSensor.html#UnityEngine_InputSystem_AttitudeSensor_attitude)|
-|[`IntegerControl`](../api/UnityEngine.InputSystem.Controls.IntegerControl.html)|An integer value.|[`Touchscreen.primaryTouch.touchId`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId)|
-|[`StickControl`](../api/UnityEngine.InputSystem.Controls.StickControl.html)|A 2D stick control like the thumbsticks on gamepads or the stick control of a joystick.|[`Gamepad.rightStick`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_rightStick)|
-|[`DpadControl`](../api/UnityEngine.InputSystem.Controls.DpadControl.html)|A 4-way button control like the D-pad on gamepads or hatswitches on joysticks.|[`Gamepad.dpad`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_dpad)|
-|[`TouchControl`](../api/UnityEngine.InputSystem.Controls.TouchControl.html)|A control that represents all the properties of a touch on a [touch screen](Touch.md).|[`Touchscreen.primaryTouch`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_primaryTouch)|
-
-You can browse the set of all registered control layouts in the [input debugger](Debugging.md#debugging-layouts).
-
-## Control usages
-
-A Control can have one or more associated usages. A usage is a string that denotes the Control's intended use. An example of a Control usage is `Submit`, which labels a Control that is commonly used to confirm a selection in the UI. On a gamepad, this usage is commonly found on the `buttonSouth` Control.
-
-You can access a Control's usages using the [`InputControl.usages`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_usages) property.
-
-Usages can be arbitrary strings. However, a certain set of usages is very commonly used and comes predefined in the API in the form of the [`CommonUsages`](../api/UnityEngine.InputSystem.CommonUsages.html) static class. Check out the [`CommonUsages` scripting API page](../api/UnityEngine.InputSystem.CommonUsages.html) for an overview.
-
-## Control paths
-
->Example: `/leftStick/x` means "X Control on left stick of gamepad".
-
-The Input System can look up Controls using textual paths. [Bindings](ActionBindings.md) on Input Actions rely on this feature to identify the Control(s) they read input from. However, you can also use them for lookup directly on Controls and Devices, or to let the Input System search for Controls among all devices using [`InputSystem.FindControls`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_FindControls_System_String_).
-
-```CSharp
-var gamepad = Gamepad.all[0];
-var leftStickX = gamepad["leftStick/x"];
-var submitButton = gamepad["{Submit}"];
-var allSubmitButtons = InputSystem.FindControls("*/{Submit}");
-```
-
-Control paths resemble file system paths. Each path consists of one or more components separated by a forward slash:
-
- component/component...
-
-Each component uses a similar syntax made up of multiple fields. Each field is optional, but at least one field must be present. All fields are case-insensitive.
-
- {usageName}controlName#(displayName)
-
-The following table explains the use of each field:
-
-|Field|Description|Example|
-|-----|-----------|-------|
-|``|Requires the Control at the current level to be based on the given layout. The actual layout of the Control may be the same or a layout *based* on the given layout.|`/buttonSouth`|
-|`{usageName}`|Works differently for Controls and Devices. When used on a Device (the first component of a path), it requires the device to have the given usage. See [Device usages](Devices.md#device-usages) for more details. For looking up a Control, the usage field is currently restricted to the path component immediately following the Device (the second component in the path). It finds the Control on the Device that has the given usage. The Control can be anywhere in the Control hierarchy of the Device.|Device: `{LeftHand}/trigger` Control: `/{Submit}`|
-|`controlName`|Requires the Control at the current level to have the given name. Takes both "proper" names ([`InputControl.name`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_name)) and aliases ([`InputControl.aliases`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_aliases)) into account. This field can also be a wildcard (`*`) to match any name.|`MyGamepad/buttonSouth` `*/{PrimaryAction}` (match `PrimaryAction` usage on Devices with any name)|
-|`#(displayName)`|Requires the Control at the current level to have the given display name (i.e. [`InputControl.displayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_displayName)). The display name may contain whitespace and symbols.|`/#(a)` (matches the key that generates the "a" character, if any, according to the current keyboard layout). `/#(Cross)`|
-
-You can access the literal path of a given control via its [`InputControl.path`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_path) property.
-
-If needed, you can manually parse a control path into its components using the [`InputControlPath.Parse(path)`](../api/UnityEngine.InputSystem.InputControlPath.html#UnityEngine_InputSystem_InputControlPath_Parse_System_String_) API.
-
-```CSharp
-var parsed = InputControlPath.Parse("{LeftHand}/trigger").ToArray();
-
-Debug.Log(parsed.Length); // Prints 2.
-Debug.Log(parsed[0].layout); // Prints "XRController".
-Debug.Log(parsed[0].name); // Prints an empty string.
-Debug.Log(parsed[0].usages.First()); // Prints "LeftHand".
-Debug.Log(parsed[1].layout); // Prints null.
-Debug.Log(parsed[1].name); // Prints "trigger".
-```
-
-## Control state
-
-Each Control is connected to a block of memory that is considered the Control's "state". You can query the size, format, and location of this block of memory from a Control through the [`InputControl.stateBlock`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_stateBlock) property.
-
-The state of Controls is stored in unmanaged memory that the Input System handles internally. All Devices added to the system share one block of unmanaged memory that contains the state of all the Controls on the Devices.
-
-A Control's state might not be stored in the natural format for that Control. For example, the system often represents buttons as bitfields, and axis controls as 8-bit or 16-bit integer values. This format is determined by the combination of platform, hardware, and drivers. Each Control knows the format of its storage and how to translate the values as needed. The Input System uses [layouts](Layouts.md) to understand this representation.
-
-You can access the current state of a Control through its [`ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) method.
-
-```CSharp
-Gamepad.current.leftStick.x.ReadValue();
-```
-
-Each type of Control has a specific type of values that it returns, regardless of how many different types of formats it supports for its state. You can access this value type through the [`InputControl.valueType`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_valueType) property.
-
-Reading a value from a Control might apply one or more value Processors. See documentation on [Processors](Processors.md) for more information.
-
-[//]: # (#### Default State - TODO)
-
-[//]: # (#### Reading State vs Reading Values - TODO)
-
-#### Recording state history
-
-You might want to access the history of value changes on a Control (for example, in order to compute exit velocity on a touch release).
-
-To record state changes over time, you can use [`InputStateHistory`](../api/UnityEngine.InputSystem.LowLevel.InputStateHistory.html) or [`InputStateHistory`](../api/UnityEngine.InputSystem.LowLevel.InputStateHistory-1.html). The latter restricts Controls to those of a specific value type, which in turn simplifies some of the API.
-
-```CSharp
-// Create history that records Vector2 control value changes.
-// NOTE: You can also pass controls directly or use paths that match multiple
-// controls (e.g. "/").
-// NOTE: The unconstrained InputStateHistory class can record changes on controls
-// of different value types.
-var history = new InputStateHistory("/primaryTouch/position");
-
-// To start recording state changes of the controls to which the history
-// is attached, call StartRecording.
-history.StartRecording();
-
-// To stop recording state changes, call StopRecording.
-history.StopRecording();
-
-// Recorded history can be accessed like an array.
-for (var i = 0; i < history.Count; ++i)
-{
- // Each recorded value provides information about which control changed
- // value (in cases state from multiple controls is recorded concurrently
- // by the same InputStateHistory) and when it did so.
-
- var time = history[i].time;
- var control = history[i].control;
- var value = history[i].ReadValue();
-}
-
-// Recorded history can also be iterated over.
-foreach (var record in history)
- Debug.Log(record.ReadValue());
-Debug.Log(string.Join(",\n", history));
-
-// You can also record state changes manually, which allows
-// storing arbitrary histories in InputStateHistory.
-// NOTE: This records a value change that didn't actually happen on the control.
-history.RecordStateChange(Touchscreen.current.primaryTouch.position,
- new Vector2(0.123f, 0.234f));
-
-// State histories allocate unmanaged memory and need to be disposed.
-history.Dispose();
-```
-
-For example, if you want to have the last 100 samples of the left stick on the gamepad available, you can use this code:
-
-```CSharp
-var history = new InputStateHistory(Gamepad.current.leftStick);
-history.historyDepth = 100;
-history.StartRecording();
-```
-
-## Control actuation
-
-A Control is considered actuated when it has moved away from its default state in such a way that it affects the actual value of the Control. You can query whether a Control is currently actuated using [`IsActuated`](../api/UnityEngine.InputSystem.InputControlExtensions.html#UnityEngine_InputSystem_InputControlExtensions_IsActuated_UnityEngine_InputSystem_InputControl_System_Single_).
-
-```CSharp
-// Check if leftStick is currently actuated.
-if (Gamepad.current.leftStick.IsActuated())
- Debug.Log("Left Stick is actuated");
-```
-
-It can be useful to determine not just whether a Control is actuated at all, but also the amount by which it is actuated (that is, its magnitude). For example, for a [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) this would be the length of the vector, whereas for a button it is the raw, absolute floating-point value.
-
-In general, the current magnitude of a Control is always >= 0. However, a Control might not have a meaningful magnitude, in which case it returns -1. Any negative value should be considered an invalid magnitude.
-
-You can query the current amount of actuation using [`EvaluateMagnitude`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude).
-
-```CSharp
-// Check if left stick is actuated more than a quarter of its motion range.
-if (Gamepad.current.leftStick.EvaluateMagnitude() > 0.25f)
- Debug.Log("Left Stick actuated past 25%");
-```
-
-There are two mechanisms that most notably make use of Control actuation:
-
-- [Interactive rebinding](ActionBindings.md#interactive-rebinding) (`InputActionRebindingExceptions.RebindOperation`) uses it to select between multiple suitable Controls to find the one that is actuated the most.
-- [Conflict resolution](ActionBindings.md#conflicting-inputs) between multiple Controls that are bound to the same action uses it to decide which Control gets to drive the action.
-
-## Noisy Controls
-
-The Input System can label a Control as "noisy". You can query this using the [`InputControl.noisy`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_noisy) property.
-
-Noisy Controls are those that can change value without any actual or intentional user interaction required. A good example of this is a gravity sensor in a cellphone. Even if the cellphone is perfectly still, there are usually fluctuations in gravity readings. Another example are orientation readings from an HMD.
-
-If a Control is marked as noisy, it means that:
-
-1. The Control is not considered for [interactive rebinding](ActionBindings.md#interactive-rebinding). [`InputActionRebindingExceptions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) ignores the Control by default (you can bypass this using [`WithoutIgnoringNoisyControls`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithoutIgnoringNoisyControls)).
-2. If enabled in the Project Settings, the system performs additional event filtering, then calls [`InputDevice.MakeCurrent`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_MakeCurrent). If an input event for a Device contains no state change on a Control that is not marked noisy, then the Device will not be made current based on the event. This avoids, for example, a plugged in PS4 controller constantly making itself the current gamepad ([`Gamepad.current`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_current)) due to its sensors constantly feeding data into the system.
-3. When the application loses focus and Devices are [reset](Devices.md#device-resets) as a result, the state of noisy Controls will be preserved as is. This ensures that sensor readinds will remain at their last value rather than being reset to default values.
-
->**Note**: If any Control on a Device is noisy, the Device itself is flagged as noisy.
-
-Parallel to the [`input state`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_currentStatePtr) and the [`default state`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_defaultStatePtr) that the Input System keeps for all Devices currently present, it also maintains a [`noise mask`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_noiseMaskPtr) in which only bits for state that is __not__ noise are set. This can be used to very efficiently mask out noise in input.
-
-## Synthetic Controls
-
-A synthetic Control is a Control that doesn't correspond to an actual physical control on a device (for example the `left`, `right`, `up`, and `down` child Controls on a [`StickControl`](../api/UnityEngine.InputSystem.Controls.StickControl.html)). These Controls synthesize input from other, actual physical Controls and present it in a different way (in this example, they allow you to treat the individual directions of a stick as buttons).
-
-Whether a given Control is synthetic is indicated by its [`InputControl.synthetic`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_synthetic) property.
-
-The system considers synthetic Controls for [interactive rebinding](ActionBindings.md#interactive-rebinding) but always favors non-synthetic Controls. If both a synthetic and a non-synthetic Control that are a potential match exist, the non-synthetic Control wins by default. This makes it possible to interactively bind to `/leftStick/left`, for example, but also makes it possible to bind to `/leftStickPress` without getting interference from the synthetic buttons on the stick.
-
-## Performance Optimization
-
-### Avoiding defensive copies
-
-Use [`InputControl.value`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_value) instead of [`InputControl.ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) to avoid creating a copy of the control state on every call, as the former returns the value as `ref readonly` while the latter always makes a copy. Note that this optimization only applies if the call site assigns the return value to a variable that has been declared 'ref readonly'. Otherwise a copy will be made as before. Additionally, be aware of defensive copies that can be allocated by the compiler when it is unable to determine that it can safely use the readonly reference i.e. if it can't determine that the reference won't be changed, it will create a defensive copy for you. For more details, see https://learn.microsoft.com/en-us/dotnet/csharp/write-safe-efficient-code#use-ref-readonly-return-statements.
-
-
-### Control Value Caching
-
-When the `'USE_READ_VALUE_CACHING'` internal feature flag is set, the Input System will switch to an optimized path for reading control values. This path efficiently marks controls as 'stale' when they have been actuated. Subsequent calls to [`InputControl.ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) will only apply control processing when there have been changes to that control or in case of control processing. Control processing in this case can mean any hard-coded processing that might exist on the control, such as with [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) which has built-in inversion, normalisation, scaling etc, or any processors that have been applied to the controls' [processor stack](Processors.md#processors-on-controls).
-> Note: Performance improvements **are currently not guaranteed** for all use cases. Even though this performance path marks controls as "stale" in an efficient way, it still has an overhead which can degrade performance in some cases.
-
-A positive performance impact has been seen when:
-- Reading from controls that do not change frequently.
-- In case the controls change every frame, are being read and have actions bound to them as well, e.g. on a Gamepad, reading `leftStick`, `leftStick.x` and `leftStick.left` for example when there's a action with composite bindings setup.
-
-On the other hand, it is likely to have a negative performance impact when:
-- No control reads are performed for a control, and there are a lot of changes for that particular control.
-- Reading from controls that change frequently that have no actions bound to those controls.
-
-Moreover, this feature is not enabled by default as it can result in the following minor behavioural changes:
- * Some control processors use global state. Without cached value optimizations, it is possible to read the control value, change the global state, read the control value again, and get a new value due to the fact that the control processor runs on every call. With cached value optimizations, reading the control value will only ever return a new value if the physical control has been actuated. Changing the global state of a control processor will have no effect otherwise.
- * Writing to device state using low-level APIs like [`InputControl.WriteValueIntoState`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_WriteValueIntoState__0_System_Void__) does not set the stale flag and subsequent calls to [`InputControl.value`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_value) will not reflect those changes.
- * After changing properties on [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) the [`ApplyParameterChanges`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_ApplyParameterChanges) has to be called to invalidate cached value.
-
-Processors that need to run on every read can set their respective caching policy to EvaluateOnEveryRead. That will disable caching on controls that are using such processor.
-
-If there are any non-obvious inconsistencies, 'PARANOID_READ_VALUE_CACHING_CHECKS' internal feature flag can be enabled to compare cached and uncached value on every read and log an error if they don't match.
-
-### Optimized control read value
-
-When the `'USE_OPTIMIZED_CONTROLS'` internal feature flag is set, the Input System will use faster way to use state memory for some controls instances. This is very specific optimization and should be used with caution.
-
-> __Please note__: This optimization has a performance impact on `PlayMode` as we do extra checks to ensure that the controls have the correct memory representation during development. Don't be alarmed if you see a performance drop in `PlayMode` when using this optimization as it's expected at this stage.
-
-Most controls are flexible with regards to memory representation, like [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) can be one bit, multiple bits, a float, etc, or in [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) where x and y can have different memory representation.
-Yet for most controls there are common memory representation patterns, for example [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) are floats or single bytes. Or some [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) are two consequitive floats in memory.
-If a control matches a common representation we can bypass reading its children control and cast the memory directly to the common representation. For example if [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) is two consecutive floats in memory we can bypass reading `x` and `y` separately and just cast the state memory to `Vector2`.
-
-> __Please note__: This optimization only works if the controls don't need any processing applied to them, such as `invert`, `clamp`, `normalize`, `scale` or any other processor. If any of these are applied to the control, **there won't be any optimization applied** and the control will be read as usual.
-
-Also, [`InputControl.ApplyParameterChanges()`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_ApplyParameterChanges) **must be explicitly called** in specific changes to ensure [`InputControl.optimizedControlDataType`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_optimizedControlDataType) is updated to the correct memory representation. Make sure to call it when:
-* Configuration changes after [`InputControl.FinishSetup()`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_FinishSetup_) is called.
-* Changing parameters such [`AxisControl.invert`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_invert), [`AxisControl.clamp`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_clamp), [`AxisControl.normalize`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_normalize), [`AxisControl.scale`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_scale) or changing processors. The memory representation needs to be recalculated after these changes so that we know that the control is not optimized anymore. Otherwise, the control will be read with wrong values.
-
-The optimized controls work as follows:
-* A potential memory representation is set using [`InputControl.CalculateOptimizedControlDataType()`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_CalculateOptimizedControlDataType)
-* Its memory representation is stored in [`InputControl.optimizedControlDataType`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_optimizedControlDataType)
-* Finally, [`ReadUnprocessedValueFromState`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadUnprocessedValueFromState_) uses the optimized memory representation to decide if it should cast to memory directly instead of reading every children control on it's own to reconstruct the controls state.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Debugging.md b/Packages/com.unity.inputsystem/Documentation~/Debugging.md
index 28af1b73de..a34b75e43f 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Debugging.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Debugging.md
@@ -1,176 +1,27 @@
---
-uid: input-system-debugging
+uid: input-debugging
---
-# Debugging
-
-- [Debugging](#debugging)
- - [Input Debugger](#input-debugger)
- - [Debugging Devices](#debugging-devices)
- - [Debugging Actions](#debugging-actions)
- - [Debugging users and PlayerInput](#debugging-users-and-playerinput)
- - [Debugging layouts](#debugging-layouts)
- - [Debugging remotely](#debugging-remotely)
- - [Input visualizers](#input-visualizers)
- - [`InputControlVisualizer`](#inputcontrolvisualizer)
- - [`InputActionVisualizer`](#inputactionvisualizer)
- - [Device Simulator](#device-simulator)
- - [Unity Remote (iOS, Android)](#unity-remote)
- - [Other tips:](#other-tips)
-
-When something isn't working as expected, the quickest way to troubleshoot what's wrong is the Input Debugger in the Unity Editor. The Input Debugger provides access to the activity of the Input System in both the Editor and the connected Players.
-
-To open the Input Debugger, go to __Window > Analysis > Input Debugger__ from Unity's main menu.
-
-## Input Debugger
-
-
-
-The Input Debugger displays a tree breakdown of the state of the Input System.
-
-|Item|Description|
-|----|-----------|
-|Devices|A list of all [Input Devices](Devices.md) that are currently in the system, and a list of unsupported/unrecognized Devices.|
-|Layouts|A list of all registered Control and Device layouts. This is the database of supported hardware, and information on how to represent a given piece of input hardware.|
-|Actions|Only visible in Play mode, and only if at least one [Action](Actions.md) is enabled. A list of all currently enabled Actions, and the Controls they are bound to. See [Debugging Actions](#debugging-actions).|
-|Users|Only visible when one or more `InputUser` instances exist. See documentation on [user management](UserManagement.md). A list of all currently active users, along with their active Control Schemes and Devices, all their associated Actions, and the Controls these Actions are bound to. Note that `PlayerInput` uses `InputUser` to run. When using `PlayerInput` components, each player has an entry in this list. See [Debugging users and PlayerInput](#debugging-users-and-playerinput).|
-|Settings|The currently active Input System [settings](Settings.md).|
-|Metrics|Statistics about Input System resource usage.|
-
-### Debugging Devices
-
-In the Input Debugger window, navigate to the __Devices__ list and double-click any [Input Device](Devices.md). This opens a window that displays information about the Device, including real-time state information for its Controls.
-
-
-
-The top of the Device window displays general information about the specific Device, such as name, manufacturer, and serial number.
-
-The __Controls__ section lists the Device's Controls and their individual states. This is useful when debugging input issues, because you can verify whether the data that the Input System receives from the Input Device is what you expect it to be. There are two buttons at the top of this panel:
-
-* __HID Descriptor__: Only displayed for devices that use the HID protocol to connect. This opens a window that displays the detailed [HID](HID.md) specifications for the Device and each of it's logical controls.
-
-* __State__: Display the current state of the Device in a new window. This is identical to the information displayed in this view, but doesn't update in real time, so you can take a snapshot of input state data and take the time to inspect it as needed.
-
-The __Events__ section lists all [input events](Events.md) generated by the Device. You can double-click any event in the list to inspect the full Device state at the time the event occurred. To get a side-by-side difference between the state of the Device at different points in time, select multiple events, right-click them, and click __Compare__ from the context menu.
-
-### Debugging Actions
-
-The Input Debugger window lists all enabled [Actions](Actions.md) in the __Actions__ list. This list only appears if at least one Action is active and the Editor is in Play mode. If an Action has actively bound Controls, you can click the arrow next to the Action to see a list of the Controls. This is useful to debug whether your Bindings correctly map to the Controls you want them to bind to. See documentation on [Binding resolution](ActionBindings.md#binding-resolution) for more information about how Unity maps Bindings to Controls.
-
->__Note__: Actions that belong to [`InputUsers`](UserManagement.md) don't appear here. They appear in the [__Users__](#debugging-users-and-playerinput) list instead.
-
-### Debugging users and PlayerInput
-
-When there are [`InputUser`](UserManagement.md) instances (if you use `PlayerInput`, each `PlayerInput` instance implicitly creates one), the Input Debugger's __Users__ list displays each instance along with its paired Devices and active Actions. The listed Devices and Actions work the same way as those displayed in the [__Devices__](#debugging-devices) and [__Actions__](#debugging-actions) lists in the debugging window.
-
-
-
-### Debugging layouts
-
-The [__Layouts__](Layouts.md) list in the Input Debugger window displays a breakdown of all registered [Control and Device layouts](Layouts.md). This is the database of supported hardware and the knowledge of how to represent a given piece of input hardware. It's useful when you want to [create a new Device mapping](HID.md#creating-a-custom-device-layout) and see how the Input System represents it.
-
-
-
-### Debugging remotely
-
-You can connect the Input Debugger to a Player that runs on a remote computer or device. This makes it possible to observe input activity from the Player in the Editor. This connection uses the `PlayerConnection` mechanism, which is the same one the Unity profiler uses to connect to a Player.
-
->__Note__: At the moment, debugging input in Players is restricted to seeing Devices and events from connected Players. There is no support for seeing other input-related data such as Actions and input users from Players.
-
-To see remote Devices from built Players, open the Input Debugger window's __Remote Devices__ drop-down list. This list displays the remote Player instance you can connect to (if there are any). The same list appears in the Profiler and Console windows, and any connections are shared between those windows. If any Player(s) are connected, you can enable __Show remote devices__ in the same drop-down list. If Players are connected, and __Show remote devices__ is enabled, the [__Devices__](#debugging-devices) list in the Input Debugger window splits into a __Local__ section and a __Remote__ section. The __Remote__ section displays any Input Device from any connected Player, and lets you inspect Device state and events in real time, as if it were a local Device.
-
-## Input visualizers
-
-The Input System package comes with a __Visualizers__ sample, which provides various components which let you monitor the state of various Input System elements in real time using on-screen visualizers.
-
-To install the sample, navigate to the Input System package in the Package Manager window (see [Installation](Installation.md)), and next to the __Visualizers__ sample, click __Import in project__.
-The sample provides two visualizer components:
-
-### `InputControlVisualizer`
-
-Visualizes the current state of a single Control in real time. You can have multiple Control visualizers to visualize the state of multiple Controls. Check the `GamepadVisualizer`, `MouseVisualizer`, or `PenVisualizer` Scenes in the sample for examples.
-
-
-
-### `InputActionVisualizer`
-
-Visualizes the current state of a single Action in real time. You can have multiple Action visualizers to visualize the state of multiple Actions. This can also display the current value of the Action and the Control currently driving the Action, and track the state of [Interactions](Interactions.md) over time. Check the `SimpleControlsVisualizer` Scene in the sample for examples.
-
-
-
-## Device Simulator
-
-When Device Simulator window is in use, mouse and pen inputs on the simulated device screen are turned into touchscreen inputs. Device Simulator uses its own touchscreen device, which it creates and destroys together with the Device Simulator window.
-
-To prevent conflicts between simulated touchscreen inputs and native mouse and pen inputs, Device Simulator disables all native mouse and pen devices.
-
-## Unity Remote
-
-The Unity Remote is an app available for iOS and Android which allows using a mobile device for input while running in the Unity Editor. You can find details about the app and how to install it in the [Unity manual](https://docs.unity3d.com/Manual/UnityRemote5.html).
-
-If you would like to try out the Unity Remote app, you can [install](Installation.md#installing-samples) the "Unity Remote" sample that is provided with the Input System package.
-
->__Note__: Joysticks/gamepads are not yet supported over the Unity Remote. No joystick/gamepad input from the mobile device will come through in the editor.
-
->__Note__: This requires Unity 2021.2.18 or later.
-
-When in play mode in the Editor and connected to the Unity Remote app, you will see a number of Devices have been added with the [`InputDevice.remote`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_remote) flag set to true:
-
-- [`Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html)
-- [`Accelerometer`](../api/UnityEngine.InputSystem.Accelerometer.html)
-
-If a gyro is present on the mobile device:
-
-- [`Gyroscope`](../api/UnityEngine.InputSystem.Gyroscope.html)
-- [`AttitudeSensor`](../api/UnityEngine.InputSystem.AttitudeSensor.html)
-- [`LinearAccelerationSensor`](../api/UnityEngine.InputSystem.LinearAccelerationSensor.html)
-- [`GravitySensor`](../api/UnityEngine.InputSystem.GravitySensor.html)
-
-These Devices can be used just like local Devices. They will receive input from the connected mobile device which in turn will receive the rendered output of the game running in the editor.
-
-The [`Accelerometer`](../api/UnityEngine.InputSystem.Accelerometer.html) device will automatically be enabled and will not need you to call [`InputSystem.EnableDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_) explicitly. Setting the sampling frequency on the accelerometer from the Unity Remote using [`Sensor.samplingFrequency`](../api/UnityEngine.InputSystem.Sensor.html#UnityEngine_InputSystem_Sensor_samplingFrequency) has no effect.
-
-The remaining sensors listed above will need to be explicitly enabled via [`InputSystem.EnableDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_) just like local sensors. Setting the sampling frequency on these sensors from the Unity Remote using [`Sensor.samplingFrequency`](../api/UnityEngine.InputSystem.Sensor.html#UnityEngine_InputSystem_Sensor_samplingFrequency) will be relayed to the device but note that setting the frequency on one of them will set it for all of them.
-
-Touch coordinates from the device will be translated to the screen coordinates of the Game View inside the Editor.
-
-## Other tips:
-
-To record events flowing through the system, use this code:
-
-```C#
-
- // You can also provide a device ID to only
- // trace events for a specific device.
- var trace = new InputEventTrace();
-
- trace.Enable();
-
- var current = new InputEventPtr();
- while (trace.GetNextEvent(ref current))
- {
- Debug.Log("Got some event: " + current);
- }
-
- // Also supports IEnumerable.
- foreach (var eventPtr in trace)
- Debug.Log("Got some event: " + eventPtr);
-
- // Trace consumes unmanaged resources. Make sure you dispose it correctly to avoid memory leaks.
- trace.Dispose();
+# Debugging
-```
+Learn how to investigate and troubleshoot the Input System when something isn't working as expected.
-To see events as they're processed, use this code:
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[The input debugger window](the-input-debugger-window.md)** | Open the Input Debugger to inspect devices, actions, users, and layouts in the Editor and connected players. |
+| **[Debug a device](debug-device.md)** | Inspect a device's controls, state, and events in the Input Debugger. |
+| **[Debug an action](debug-action.md)** | Verify enabled actions, bindings, and mapped controls during Play mode. |
+| **[Debug users and PlayerInput](debug-users-playerinput.md)** | Inspect InputUser and Player Input pairings, devices, and actions in the Users list. |
+| **[Debug layouts](debug-layouts.md)** | Browse registered control and device layouts in the Input Debugger. |
+| **[Trace actions](trace-actions)** |
+Generate a log of all activity that happened on a particular set of Actions. |
+| **[Visualizers](visualizers.md)** | Monitor controls and actions in real time with the Visualizers sample. |
+| **[Device Simulation](device-simulation.md)** | Learn how the Unity Device Simulator feeds touchscreen input into the Input System. |
-```C#
+## Additional resources
- InputSystem.onEvent +=
- (eventPtr, device) =>
- {
- // Can handle events yourself, for example, and then stop them
- // from further processing by marking them as handled.
- eventPtr.handled = true;
- };
+- [See and record input event flow](see-record-input-event-flow.md)
+- [Testing](testing.md)
+- [Binding resolution](binding-resolution.md)
+- [Debug Player Input Component](debug-player-input-component.md)
-```
diff --git a/Packages/com.unity.inputsystem/Documentation~/Devices.md b/Packages/com.unity.inputsystem/Documentation~/Devices.md
deleted file mode 100644
index 53d87bba7a..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Devices.md
+++ /dev/null
@@ -1,625 +0,0 @@
----
-uid: input-system-devices
----
-# Devices
-
-- [Devices](#devices)
- - [Device descriptions](#device-descriptions)
- - [Capabilities](#capabilities)
- - [Matching](#matching)
- - [Hijacking the matching process](#hijacking-the-matching-process)
- - [Device lifecycle](#device-lifecycle)
- - [Device creation](#device-creation)
- - [Device removal](#device-removal)
- - [Device resets](#device-resets)
- - [Device syncs](#device-syncs)
- - [Device enabling and disabling](#device-enabling-and-disabling)
- - [Background and focus change behavior](#background-and-focus-change-behavior)
- - [Domain reloads in the Editor](#domain-reloads-in-the-editor)
- - [Native Devices](#native-devices)
- - [Disconnected Devices](#disconnected-devices)
- - [Device IDs](#device-ids)
- - [Device usages](#device-usages)
- - [Device commands](#device-commands)
- - [Sending commands to Devices](#sending-commands-to-devices)
- - [Adding custom device Commands](#adding-custom-device-commands)
- - [Device state](#device-state)
- - [State changes](#state-changes)
- - [Monitoring state changes](#monitoring-state-changes)
- - [Synthesizing state](#synthesizing-state)
- - [Working with Devices](#working-with-devices)
- - [Monitoring Devices](#monitoring-devices)
- - [Adding and removing Devices](#adding-and-removing-devices)
- - [Creating custom Devices](#creating-custom-devices)
- - [Step 1: The state struct](#step-1-the-state-struct)
- - [Step 2: The Device class](#step-2-the-device-class)
- - [Step 3: The Update method](#step-3-the-update-method)
- - [Step 4: Device registration and creation](#step-4-device-registration-and-creation)
- - [Step 5: `current` and `all` (optional)](#step-5-current-and-all-optional)
- - [Step 6: Device Commands (Optional)](#step-6-device-commands-optional)
-
-Physically, Input Devices represent devices attached to the computer, which a user can use to control the app. Logically, Input Devices are the top-level container for [Controls](Controls.md). The [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) class is itself a specialization of [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html). See [supported Devices](SupportedDevices.md) to see what kind of Devices the Input System currently supports.
-
-To query the set of all currently present Devices, you can use [`InputSystem.devices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_devices).
-
-## Device descriptions
-
-An [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html) describes a Device. The Input System uses this primarily during the Device discovery process. When a new Device is reported (by the runtime or by the user), the report contains a Device description. Based on the description, the system then attempts to find a Device [layout](Layouts.md) that matches the description. This process is based on [Device matchers](#matching).
-
-After a Device has been created, you can retrieve the description it was created from through the [`InputDevice.description`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_description) property.
-
-Every description has a set of standard fields:
-
-|Field|Description|
-|-----|-----------|
-|[`interfaceName`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_interfaceName)|Identifier for the interface/API that is making the Device available. In many cases, this corresponds to the name of the platform, but there are several more specific interfaces that are commonly used: [HID](https://www.usb.org/hid), [RawInput](https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input), [XInput](https://docs.microsoft.com/en-us/windows/desktop/xinput/xinput-game-controller-apis-portal). This field is required.|
-|[`deviceClass`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_deviceClass)|A broad categorization of the Device. For example, "Gamepad" or "Keyboard".|
-|[`product`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_product)|Name of the product as reported by the Device/driver itself.|
-|[`manufacturer`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_manufacturer)|Name of the manufacturer as reported by the Device/driver itself.|
-|[`version`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_version)|If available, provides the version of the driver or hardware for the Device.|
-|[`serial`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_serial)|If available, provides the serial number for the Device.|
-|[`capabilities`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_capabilities)|A string in JSON format that describes Device/interface-specific capabilities. See the [section on capabilities](#capabilities).|
-
-### Capabilities
-
-Aside from a number of standardized fields, such as `product` and `manufacturer`, a Device description can contain a [`capabilities`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_capabilities) string in JSON format. This string describes characteristics which help the Input System to interpret the data from a Device, and map it to Control representations. Not all Device interfaces report Device capabilities. Examples of interface-specific Device capabilities are [HID descriptors](HID.md). WebGL, Android, and Linux use similar mechanisms to report available Controls on connected gamepads.
-
-### Matching
-
-[`InputDeviceMatcher`](../api/UnityEngine.InputSystem.Layouts.InputDeviceMatcher.html) instances handle matching an [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html) to a registered layout. Each matcher loosely functions as a kind of regular expression. Each field in the description can be independently matched with either a plain string or regular expression. Matching is not case-sensitive. For a matcher to apply, all of its individual expressions have to match.
-
-To matchers to any layout, call [`InputSystem.RegisterLayoutMatcher`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayoutMatcher_System_String_UnityEngine_InputSystem_Layouts_InputDeviceMatcher_). You can also supply them when you register a layout.
-
-```CSharp
-// Register a new layout and supply a matcher for it.
-InputSystem.RegisterLayoutMatcher(
- matches: new InputDeviceMatcher()
- .WithInterface("HID")
- .WithProduct("MyDevice.*")
- .WithManufacturer("MyBrand");
-
-// Register an alternate matcher for an already registered layout.
-InputSystem.RegisterLayoutMatcher(
- new InputDeviceMatcher()
- .WithInterface("HID")
-
-```
-
-If multiple matchers are matching the same [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html), the Input System chooses the matcher that has the larger number of properties to match against.
-
-#### Hijacking the matching process
-
-You can overrule the internal matching process from outside to select a different layout for a Device than the system would normally choose. This also makes it possible to quickly build new layouts. To do this, add a custom handler to the [`InputSystem.onFindControlLayoutForDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onFindLayoutForDevice) event. If your handler returns a non-null layout string, then the Input System uses this layout.
-
-### Device lifecycle
-
-#### Device creation
-
-Once the system has chosen a [layout](Layouts.md) for a device, it instantiates an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) and populates it with [`InputControls`](../api/UnityEngine.InputSystem.InputControl.html) as the layout dictates. This process is internal and happens automatically.
-
->__Note__: You can't create valid [`InputDevices`](../api/UnityEngine.InputSystem.InputDevice.html) and [`InputControls`](../api/UnityEngine.InputSystem.InputControl.html) by manually instantiating them with `new`. To guide the creation process, you must use [layouts](Layouts.md).
-
-After the Input System assembles the [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html), it calls [`FinishSetup`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_FinishSetup_) on each control of the device and on the device itself. Use this to finalize the setup of the Controls.
-
-After an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) is fully assembled, the Input System adds it to the system. As part of this process, the Input System calls [`MakeCurrent`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_MakeCurrent_) on the Device, and signals [`InputDeviceChange.Added`](../api/UnityEngine.InputSystem.InputDeviceChange.html#UnityEngine_InputSystem_InputDeviceChange_Added) on [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange). The Input System also calls [`InputDevice.OnAdded`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_OnAdded_).
-
-Once added, the [`InputDevice.added`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_added) flag is set to true.
-
-To add devices manually, you can call one of the `InputSystem.AddDevice` methods such as [`InputSystem.AddDevice(layout)`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice_System_String_System_String_System_String_).
-
-```CSharp
-// Add a gamepad. This bypasses the matching process and creates a device directly
-// with the Gamepad layout.
-InputSystem.AddDevice();
-
-// Add a device such that the matching process is employed:
-InputSystem.AddDevice(new InputDeviceDescription
-{
- interfaceName = "XInput",
- product = "Xbox Controller",
-});
-```
-
-When a device is added, the Input System automatically issues a [sync request](../api/UnityEngine.InputSystem.LowLevel.RequestSyncCommand.html) on the device. This instructs the device to send an event representing its current state. Whether this request succeeds depends on the whether the given device supports the sync command.
-
-#### Device removal
-
-When a Device is disconnected, it is removed from the system. A notification appears for [`InputDeviceChange.Removed`](../api/UnityEngine.InputSystem.InputDeviceChange.html) (sent via [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange)) and the Devices are removed from the [`devices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) list. The system also calls [`InputDevice.OnRemoved`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_OnRemoved_).
-
-The [`InputDevice.added`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_added) flag is reset to false in the process.
-
-Note that Devices are not destroyed when removed. Device instances remain valid and you can still access them in code. However, trying to read values from the controls of these Devices leads to exceptions.
-
-#### Device resets
-
-Resetting a Device resets its Controls to their default state. You can do this manually using [`InputSystem.ResetDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_):
-
-```CSharp
- InputSystem.ResetDevice(Gamepad.current);
-```
-
-There are two types of resets as determined by the second parameter to [`InputSystem.ResetDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_):
-
-|Type|Description|
-|----|-----------|
-|"Soft" Resets|This is the default. With this type, only controls that are *not* marked as [`dontReset`](Layouts.md#control-items) are reset to their default value. This excludes controls such as [`Pointer.position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position) from resets and thus prevents mouse positions resetting to `(0,0)`.|
-|"Hard" Resets|In this type, *all* controls are reset to their default value regardless of whether they have [`dontReset`](Layouts.md#control-items) set or not.|
-
-Resetting Controls this way is visible on [Actions](Actions.md). If you reset a Device that is currently driving one or more Action, the Actions are cancelled. This cancellation is different from sending an event with default state. Whereas the latter may inadvertently [perform](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed) Actions (e.g. a button that was pressed would not appear to have been released), a reset will force clean cancellation.
-
-Resets may be triggered automatically by the Input System depending on [application focus](#background-and-focus-change-behavior).
-
-#### Device syncs
-
-A Device may be requested to send an event with its current state through [`RequestSyncCommand`](../api/UnityEngine.InputSystem.LowLevel.RequestSyncCommand.html). It depends on the platform and type of Device whether this is supported or not.
-
-A synchronization request can be explicitly sent using [`InputSystem.TrySyncDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_TrySyncDevice_UnityEngine_InputSystem_InputDevice_). If the device supports sync requests, the method returns true and an [`InputEvent`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) will have been queued on the device for processing in the next [update](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_).
-
-Synchronization requests are also automatically sent by the Input System in certain situations. See [Background and focus change behavior](#background-and-focus-change-behavior) for more details.
-
-#### Device enabling and disabling
-
-When a Device is added, the Input System sends it an initial [`QueryEnabledStateCommand`](../api/UnityEngine.InputSystem.LowLevel.QueryEnabledStateCommand.html) to find out whether the device is currently enabled or not. The result of this is reflected in the [`InputDevice.enabled`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_enabled) property.
-
-When disabled, no events other than removal ([`DeviceRemoveEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceRemoveEvent.html)) and configuration change ([`DeviceConfigurationEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceConfigurationEvent.html)) events are processed for a Device, even if they are sent.
-
-A Device can be manually disabled and re-enabled via [`InputSystem.DisableDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_) and [`InputSystem.EnableDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_) respectively.
-
-Note that [sensors](Sensors.md) start in a disabled state by default, and you need to enable them in order for them to generate events.
-
-The Input System may automatically disable and re-enable Devices in certain situations, as detailed in the [next section](#background-and-focus-change-behavior).
-
-#### Background and focus change behavior
-
-In general, input is tied to [application focus](https://docs.unity3d.com/ScriptReference/Application-isFocused.html). This means that Devices do not receive input while the application is not in the foreground and thus no [Actions](Actions.md) will receive input either. When the application comes back into focus, all devices will receive a [sync](#device-syncs) request to have them send their current state (which may have changed while the application was in the background) to the application. Devices that do not support sync requests will see a [soft reset](#device-resets) that resets all Controls not marked as [`dontReset`](Layouts.md#control-items) to their default state.
-
-On platforms such as iOS and Android, that do not support running Unity applications in the background, this is the only supported behavior.
-
-If the application is configured to run while in the background (that is, not having focus), input behavior can be selected from several options. This is supported in two scenarios:
-
-* In Unity's [Player Settings](https://docs.unity3d.com/Manual/class-PlayerSettings.html) you can explicity enable `Run In Background` for specific players that support it (such as Windows or Mac standalone players). Note that in these players this setting is always enabled automatically in *development* players.
-* In the editor, application focus is tied to focus on the Game View. If no Game View is focused, the application is considered to be running in the background. However, while in play mode, the editor will *always* keep running the player loop regardless of focus on the Game View window. This means that in the editor, `Run In Background` is considered to always be enabled.
-
-If the application is configured this way to keep running while in the background, the player loop and thus the Input System, too, will keep running even when the application does not have focus. What happens with respect to input then depends on two factors:
-
-1. On the ability of individual devices to receive input while the application is not running in the foreground. This is only supported by a small subset of devices and platforms. VR devices ([`TrackedDevice`](../api/UnityEngine.InputSystem.TrackedDevice.html)) such as HMDs and VR controllers generally support this. To find out whether a specific device supports this, you can query the [`InputDevice.canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) property. This property can also be forced to true or false via a Device's [layout](Layouts.md#control-items).
-2. On two settings you can find in the project-wide [Input Settings](Settings.md). Specifically, [`InputSettings.backgroundBehavior`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_backgroundBehavior) and [`InputSettings.editorInputBehaviorInPlayMode`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_editorInputBehaviorInPlayMode). The table below shows a detailed breakdown of how input behaviors vary based on these two settings and in relation to the `Run In Background` player setting in Unity.
-
->__Note__: [`InputDevice.canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) is overridden by the editor in certain situations (see table below). In general, the value of the property does not have to be the same between the editor and the player and depends on the specific platform and device.
-
-The following table shows the full matrix of behaviors according to the [Input Settings](Settings.md) and whether the game is running in the editor or in the player.
-
-
-
-#### Domain reloads in the Editor
-
-The Editor reloads the C# application domain whenever it reloads and recompiles scripts, or when the Editor goes into Play mode. This requires the Input System to reinitialize itself after each domain reload. During this process, the Input System attempts to recreate devices that were instantiated before the domain reload. However, the state of each Device doesn't carry across, which means that Devices reset to their default state on domain reloads.
-
-Note that layout registrations do not persist across domain reloads. Instead, the Input System relies on all registrations to become available as part of the initialization process (for example, by using `[InitializeOnLoad]` to run registration as part of the domain startup code in the Editor). This allows you to change registrations and layouts in script, and the change to immediately take effect after a domain reload.
-
-## Native Devices
-
-Devices that the [native backend](Architecture.md#native-backend) reports are considered native (as opposed to Devices created from script code). To identify these Devices, you can check the [`InputDevice.native`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_native) property.
-
-The Input System remembers native Devices. For example, if the system has no matching layout when the Device is first reported, but a layout which matches the device is registered later, the system uses this layout to recreate the Device.
-
-You can force the Input System to use your own [layout](Layouts.md) when the native backend discovers a specific Device, by describing the Device in the layout, like this:
-
-```
- {
- "name" : "MyGamepad",
- "extend" : "Gamepad",
- "device" : {
- // All strings in here are regexs and case-insensitive.
- "product" : "MyController",
- "manufacturer" : "MyCompany"
- }
- }
-```
-
-Note: You don't have to restart Unity in order for changes in your layout to take effect on native Devices. The Input System applies changes automatically on every domain reload, so you can just keep refining a layout and your Device is recreated with the most up-to-date version every time scripts are recompiled.
-
-
-### Disconnected Devices
-
-If you want to get notified when Input Devices disconnect, subscribe to the [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) event, and look for events of type [`InputDeviceChange.Disconnected`](../api/UnityEngine.InputSystem.InputDeviceChange.html).
-
-The Input System keeps track of disconnected Devices in [`InputSystem.disconnectedDevices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_disconnectedDevices). If one of these Devices reconnects later, the Input System can detect that the Device was connected before, and reuses its [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) instance. This allows the [`PlayerInputManager`](PlayerInputManager.md) to reassign the Device to the same [user](UserManagement.md) again.
-
-## Device IDs
-
-Each Device that is created receives a unique numeric ID. You can access this ID through [`InputDevice.deviceId`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_deviceId).
-
-All IDs are only used once per Unity session.
-
-## Device usages
-
-Like any [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html), a Device can have usages associated with it. You can query usages with the [`usages`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_usages) property, and use[`InputSystem.SetDeviceUsage()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_SetDeviceUsage_UnityEngine_InputSystem_InputDevice_System_String_) to set them. Usages can be arbitrary strings with arbitrary meanings. One common case where the Input System assigns Devices usages is the handedness of XR controllers, which are tagged with the "LeftHand" or "RightHand" usages.
-
-## Device commands
-
-While input [events](Events.md) deliver data from a Device, commands send data back to the Device. The Input System uses these to retrieve specific information from the Device, to trigger functions on the Device (such as rumble effects), and for a variety of other needs.
-
-### Sending commands to Devices
-
-The Input System sends commands to the Device through [`InputDevice.ExecuteCommand`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_ExecuteCommand__1___0__). To monitor Device commands, use [`InputSystem.onDeviceCommand`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceCommand).
-
-Each Device command implements the [`IInputDeviceCommandInfo`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html) interface, which only requires the [`typeStatic`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html#UnityEngine_InputSystem_LowLevel_IInputDeviceCommandInfo_typeStatic) property to identify the type of the command. The native implementation of the Device should then understand how to handle that command. One common case is the `"HIDO"` command type which is used to send [HID output reports](HID.md#hid-output) to HIDs.
-
-### Adding custom device Commands
-
-To create custom Device commands (for example, to support some functionality for a specific HID), create a `struct` that contains all the data to be sent to the Device, and add a [`typeStatic`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html#UnityEngine_InputSystem_LowLevel_IInputDeviceCommandInfo_typeStatic) property to make that struct implement the [`IInputDeviceCommandInfo`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html) interface. To send data to a HID, this property should return `"HIDO"`.
-
-You can then create an instance of this struct and populate all its fields, then use [`InputDevice.ExecuteCommand`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_ExecuteCommand__1___0__) to send it to the Device. The data layout of the struct must match the native representation of the data as the device interprets it.
-
-## Device state
-
-Like any other type of [Control](Controls.md#control-state), each Device has a block of memory allocated to it which stores the state of all the Controls associated with the Device.
-
-### State changes
-
-State changes are usually initiated through [state events](Events.md#state-events) from the native backend, but you can use [`InputControl<>.WriteValueIntoState()`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_WriteValueIntoState__0_System_Void__) to manually overwrite the state of any Control.
-
-#### Monitoring state changes
-
-You can use [`InputState.AddChangeMonitor()`](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_AddChangeMonitor_UnityEngine_InputSystem_InputControl_System_Action_UnityEngine_InputSystem_InputControl_System_Double_UnityEngine_InputSystem_LowLevel_InputEventPtr_System_Int64__System_Int32_System_Action_UnityEngine_InputSystem_InputControl_System_Double_System_Int64_System_Int32__) to register a callback to be called whenever the state of a Control changes. The Input System uses the same mechanism to implement [input Actions](Actions.md).
-
-#### Synthesizing state
-
-The Input System can synthesize a new state from an existing state. An example of such a synthesized state is the [`press`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_press) button Control that [`Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html) inherits from [`Pointer`](../api/UnityEngine.InputSystem.Pointer.html). Unlike a mouse, which has a physical button, for [`Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html) this is a [synthetic Control](Controls.md#synthetic-controls) that doesn't correspond to actual data coming in from the Device backend. Instead, the Input System considers the button to be pressed if any touch is currently ongoing, and released otherwise.
-
-To do this, the Input System uses [`InputState.Change`](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_Change__1_UnityEngine_InputSystem_InputControl___0_UnityEngine_InputSystem_LowLevel_InputUpdateType_UnityEngine_InputSystem_LowLevel_InputEventPtr_), which allows feeding arbitrary state changes into the system without having to run them through the input event queue. The Input System incorporates state changes directly and synchronously. State change [monitors](#monitoring-state-changes) still trigger as expected.
-
-## Working with Devices
-
-### Monitoring Devices
-
-To be notified when new Devices are added or existing Devices are removed, use [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange).
-
-```CSharp
-InputSystem.onDeviceChange +=
- (device, change) =>
- {
- switch (change)
- {
- case InputDeviceChange.Added:
- // New Device.
- break;
- case InputDeviceChange.Disconnected:
- // Device got unplugged.
- break;
- case InputDeviceChange.Connected:
- // Plugged back in.
- break;
- case InputDeviceChange.Removed:
- // Remove from Input System entirely; by default, Devices stay in the system once discovered.
- break;
- default:
- // See InputDeviceChange reference for other event types.
- break;
- }
- }
-```
-
-[`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) delivers notifications for other device-related changes as well. See the [`InputDeviceChange` enum](../api/UnityEngine.InputSystem.InputDeviceChange.html) for more information.
-
-### Adding and removing Devices
-
-To manually add and remove Devices through the API, use [`InputSystem.AddDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice_UnityEngine_InputSystem_InputDevice_) and [`InputSystem.RemoveDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RemoveDevice_UnityEngine_InputSystem_InputDevice_).
-
-This allows you to create your own Devices, which can be useful for testing purposes, or for creating virtual Input Devices which synthesize input from other events. As an example, see the [on-screen Controls](OnScreen.md) that the Input System provides. The Input Devices used for on-screen Controls are created entirely in code and have no [native representation](#native-devices).
-
-### Creating custom Devices
-
->__Note__: This example deals only with Devices that have fixed layouts (that is, you know the specific model or models that you want to implement). This is different from an interface such as HID, where Devices can describe themselves through the interface and take on a wide variety of forms. A fixed Device layout can't cover self-describing Devices, so you need to use a [layout builder](Layouts.md#generated-layouts) to build Device layouts from information you obtain at runtime.
-
-There are two main situations in which you might need to create a custom Device:
-
-1. You have an existing API that generates input, and which you want to reflect into the Input System.
-2. You have an HID that the Input System ignores, or that the Input system auto-generates a layout for that doesn't work well enough for your needs.
-
-For the second scenario, see [Overriding the HID Fallback](HID.md#creating-a-custom-device-layout).
-
-The steps below deal with the first scenario, where you want to create a new Input Device entirely from scratch and provide input to it from a third-party API.
-
-#### Step 1: The state struct
-
-The first step is to create a C# `struct` that represents the form in which the system receives and stores input, and also describes the `InputControl` instances that the Input System must create for the Device in order to retrieve its state.
-
-```CSharp
-// A "state struct" describes the memory format that a Device uses. Each Device can
-// receive and store memory in its custom format. InputControls then connect to
-// the individual pieces of memory and read out values from them.
-//
-// If it's important for the memory format to match 1:1 at the binary level
-// to an external representation, it's generally advisable to use
-// LayoutLind.Explicit.
-[StructLayout(LayoutKind.Explicit, Size = 32)]
-public struct MyDeviceState : IInputStateTypeInfo
-{
- // You must tag every state with a FourCC code for type
- // checking. The characters can be anything. Choose something that allows
- // you to easily recognize memory that belongs to your own Device.
- public FourCC format => new FourCC('M', 'Y', 'D', 'V');
-
- // InputControlAttributes on fields tell the Input System to create Controls
- // for the public fields found in the struct.
-
- // Assume a 16bit field of buttons. Create one button that is tied to
- // bit #3 (zero-based). Note that buttons don't need to be stored as bits.
- // They can also be stored as floats or shorts, for example. The
- // InputControlAttribute.format property determines which format the
- // data is stored in. If omitted, the system generally infers it from the value
- // type of the field.
- [InputControl(name = "button", layout = "Button", bit = 3)]
- public ushort buttons;
-
- // Create a floating-point axis. If a name is not supplied, it is taken
- // from the field.
- [InputControl(layout = "Axis")]
- public short axis;
-}
-```
-
-The Input System's layout mechanism uses [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html) annotations to add Controls to the layout of your Device. For details, see the [layout system](Layouts.md) documentation.
-
-With the state struct in place, you now have a way to send input data to the Input System and store it there. The next thing you need is an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) that uses your custom state struct and represents your custom Device.
-
-#### Step 2: The Device class
-
-Next, you need a class derived from one of the [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) base classes. You can either base your Device directly on [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html), or you can pick a more specific Device type, like [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html).
-
-This example assumes that your Device doesn't fit into any of the existing Device classes, so it derives directly from [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html).
-
-```CSharp
-// InputControlLayoutAttribute attribute is only necessary if you want
-// to override the default behavior that occurs when you register your Device
-// as a layout.
-// The most common use of InputControlLayoutAttribute is to direct the system
-// to a custom "state struct" through the `stateType` property. See below for details.
-[InputControlLayout(displayName = "My Device", stateType = typeof(MyDeviceState))]
-public class MyDevice : InputDevice
-{
- // In the state struct, you added two Controls that you now want to
- // surface on the Device, for convenience. The Controls
- // get added to the Device either way. When you expose them as properties,
- // it is easier to get to the Controls in code.
-
- public ButtonControl button { get; private set; }
- public AxisControl axis { get; private set; }
-
- // The Input System calls this method after it constructs the Device,
- // but before it adds the device to the system. Do any last-minute setup
- // here.
- protected override void FinishSetup()
- {
- base.FinishSetup();
-
- // NOTE: The Input System creates the Controls automatically.
- // This is why don't do `new` here but rather just look
- // the Controls up.
- button = GetChildControl("button");
- axis = GetChildControl("axis");
- }
-}
-```
-
-#### Step 3: The Update method
-
-You now have a Device in place along with its associated state format. You can call the following method to create a fully set-up Device with your two Controls on it:
-
-```CSharp
-InputSystem.AddDevice();
-```
-
-However, this Device doesn't receive input yet, because you haven't added any code that generates input. To do that, you can use [`InputSystem.QueueStateEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_QueueStateEvent__1_UnityEngine_InputSystem_InputDevice___0_System_Double_) or [`InputSystem.QueueDeltaStateEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_QueueDeltaStateEvent__1_UnityEngine_InputSystem_InputControl___0_System_Double_) from anywhere, including from a thread. The following example uses [`IInputUpdateCallbackReceiver`](../api/UnityEngine.InputSystem.LowLevel.IInputUpdateCallbackReceiver.html), which, when implemented by any [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html), adds an [`OnUpdate()`](../api/UnityEngine.InputSystem.LowLevel.IInputUpdateCallbackReceiver.html#UnityEngine_InputSystem_LowLevel_IInputUpdateCallbackReceiver_OnUpdate) method that automatically gets called during [`InputSystem.onBeforeUpdate`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onBeforeUpdate) and provides input events to the current input update.
-
->__Note__: If you already have a place where input for your device becomes available, you can skip this step and queue input events from there instead of using [`IInputUpdateCallbackReceiver`](../api/UnityEngine.InputSystem.LowLevel.IInputUpdateCallbackReceiver.html).
-
-```CSharp
-public class MyDevice : InputDevice, IInputUpdateCallbackReceiver
-{
- //...
-
- public void OnUpdate()
- {
- // In practice, this would read out data from an external
- // API. This example uses some empty input.
- var state = new MyDeviceState();
- InputSystem.QueueStateEvent(this, state);
- }
-}
-```
-
-#### Step 4: Device registration and creation
-
-You now have a functioning device, but you haven't registered it (added it to the system) yet. This means you can't see the device when, for example, you create bindings in the [Action editor](ActionAssets.md#editing-input-action-assets).
-
-You can register your device type with the system from within the code that runs automatically as part of Unity's startup. To do so, modify the definition of `MyDevice` like so:
-
-```CSharp
-// Add the InitializeOnLoad attribute to automatically run the static
-// constructor of the class after each C# domain load.
-#if UNITY_EDITOR
-[InitializeOnLoad]
-#endif
-public class MyDevice : InputDevice, IInputUpdateCallbackReceiver
-{
- //...
-
- static MyDevice()
- {
- // RegisterLayout() adds a "Control layout" to the system.
- // These can be layouts for individual Controls (like sticks)
- // or layouts for entire Devices (which are themselves
- // Controls) like in our case.
- InputSystem.RegisterLayout();
- }
-
- // You still need a way to trigger execution of the static constructor
- // in the Player. To do this, you can add the RuntimeInitializeOnLoadMethod
- // to an empty method.
- [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
- private static void InitializeInPlayer() {}
-}
-```
-
-This registers the Device type with the system and makes it available in the Control picker. However, you still need a way to add an instance of the Device when it is connected.
-
-In theory, you could call [`InputSystem.AddDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice__1_System_String_) somewhere, but in a real-world setup you likely have to correlate the Input Devices you create with their identities in the third-party API.
-
-It might be tempting to do something like this:
-
-```CSharp
-public class MyDevice : InputDevice, IInputUpdateCallbackReceiver
-{
- //...
-
- // This does NOT work correctly.
- public ThirdPartyAPI.DeviceId externalId { get; set; }
-}
-```
-
-and then set that on the Device after calling [`AddDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice__1_System_String_). However, this doesn't work as expected in the Editor, because the Input System requires Devices to be created solely from their [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html) in combination with the chosen layout (and layout variant). In addition, the system supports a fixed set of mutable per-device properties such as device usages (that is, [`InputSystem.SetDeviceUsage()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_SetDeviceUsage_UnityEngine_InputSystem_InputDevice_System_String_) and related methods). This allows the system to easily recreate Devices after domain reloads in the Editor, as well as to create replicas of remote Devices when connecting to a Player. To comply with this requirement, you must cast that information provided by the third-party API into an [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html) and then use an [`InputDeviceMatcher`](../api/UnityEngine.InputSystem.Layouts.InputDeviceMatcher.html) to match the description to our custom `MyDevice` layout.
-
-This example assumes that the third-party API has two callbacks, like this:
-
-```CSharp
-public static ThirdPartyAPI
-{
- // This example assumes that the argument is a string that
- // contains the name of the Device, and that no two Devices
- // have the same name in the external API.
- public static Action deviceAdded;
- public static Action deviceRemoved;
-}
-```
-
-You can hook into those callbacks and create and destroy devices in response.
-
-```CSharp
-// This example uses a MonoBehaviour with [ExecuteInEditMode]
-// on it to run the setup code. You can do this many other ways.
-[ExecuteInEditMode]
-public class MyDeviceSupport : MonoBehaviour
-{
- protected void OnEnable()
- {
- ThirdPartyAPI.deviceAdded += OnDeviceAdded;
- ThirdPartyAPI.deviceRemoved += OnDeviceRemoved;
- }
-
- protected void OnDisable()
- {
- ThirdPartyAPI.deviceAdded -= OnDeviceAdded;
- ThirdPartyAPI.deviceRemoved -= OnDeviceRemoved;
- }
-
- private void OnDeviceAdded(string name)
- {
- // Feed a description of the Device into the system. In response, the
- // system matches it to the layouts it has and creates a Device.
- InputSystem.AddDevice(
- new InputDeviceDescription
- {
- interfaceName = "ThirdPartyAPI",
- product = name
- });
- }
-
- private void OnDeviceRemoved(string name)
- {
- var device = InputSystem.devices.FirstOrDefault(
- x => x.description == new InputDeviceDescription
- {
- interfaceName = "ThirdPartyAPI",
- product = name,
- });
-
- if (device != null)
- InputSystem.RemoveDevice(device);
- }
-
- // Move the registration of MyDevice from the
- // static constructor to here, and change the
- // registration to also supply a matcher.
- protected void Awake()
- {
- // Add a match that catches any Input Device that reports its
- // interface as "ThirdPartyAPI".
- InputSystem.RegisterLayout(
- matches: new InputDeviceMatcher()
- .WithInterface("ThirdPartyAPI"));
- }
-}
-```
-
-#### Step 5: `current` and `all` (optional)
-
-For convenience, you can quickly access the last used device of a given type, or list all devices of a specific type. To do this, add support for a `current` and for an `all` getter to the API of `MyDevice`.
-
-```CSharp
-public class MyDevice : InputDevice, IInputCallbackReceiver
-{
- //...
-
- public static MyDevice current { get; private set; }
-
- public static IReadOnlyList all => s_AllMyDevices;
- private static List s_AllMyDevices = new List();
-
- public override void MakeCurrent()
- {
- base.MakeCurrent();
- current = this;
- }
-
- protected override void OnAdded()
- {
- base.OnAdded();
- s_AllMyDevices.Add(this);
- }
-
- protected override void OnRemoved()
- {
- base.OnRemoved();
- s_AllMyDevices.Remove(this);
- }
-}
-```
-
-#### Step 6: Device Commands (Optional)
-
-A final, but optional, step is to add support for Device commands. A "device command" is that opposite of input. In other words, it consists of data traveling __to__ the input device, which might also return data as part of the operation (much like a function call). You can use this to communicate with the backend of the device in order to query configuration, or to initiate effects such as haptics. At the moment there isn't a proper interface available for this, however there are still some scenarios that can be solved with the current interfaces.
-
-E.g. the following shows, when implementing a non-hardware-backed device (simulated device), how to simulate hardware reporting that the device can be run in the background and supports sync commands. This is useful to prevent the device from cancelling Actions when application focus is lost and restored. For more info see [Device syncs](#device-syncs)
-
-```CSharp
-public class MyDevice : InputDevice, IInputCallbackReceiver
-{
- //...
-
- protected override unsafe long ExecuteCommand(InputDeviceCommand* commandPtr)
- {
- var type = commandPtr->type;
- if (type == RequestSyncCommand.Type)
- {
- // Report that the device supports the sync command and has handled it.
- // This will prevent device reset during focus changes.
- result = InputDeviceCommand.GenericSuccess;
- return true;
- }
-
- if (type == QueryCanRunInBackground.Type)
- {
- // Notify that the device supports running in the background.
- ((QueryCanRunInBackground*)commandPtr)->canRunInBackground = true;
- result = InputDeviceCommand.GenericSuccess;
- return true;
- }
-
- result = default;
- return false;
- }
-}
-```
diff --git a/Packages/com.unity.inputsystem/Documentation~/EditorFeatures.md b/Packages/com.unity.inputsystem/Documentation~/EditorFeatures.md
index d640a9c621..7c3c4ef320 100644
--- a/Packages/com.unity.inputsystem/Documentation~/EditorFeatures.md
+++ b/Packages/com.unity.inputsystem/Documentation~/EditorFeatures.md
@@ -1,18 +1,22 @@
---
uid: input-system-editor-features
---
-# Input System Editor Features
-This section describes how the Input System integrates with the Unity Editor, which allows you to read input in edit mode, debug input values, and set up automated input tests.
+# Editor features
-### [Using Input in the Editor](UseInEditor.md)
+Use the Input System while developing in the Unity Editor—not only during Play mode in a built player.
-Unlike Unity's old Input Manager, the Input System package allows you to read input from within [Editor window code](https://docs.unity3d.com/Manual/editor-EditorWindows.html) as well. ([Read more](UseInEditor.md))
+Read input from custom Editor windows, stream touch and sensor data from a mobile device with Unity Remote, and trace or record how events flow through the system.
-### [The Input Debugger](Debugging.md)
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Read input in Editor Windows](read-input-editor-windows.md)** | Read pen, keyboard, and other device input from `EditorWindow` code outside Play mode. |
+| **[Use mobile device input in the Editor (Unity Remote)](use-mobile-device-input-editor-unity-remote.md)** | Stream mobile touch and sensor input into the Editor while in Play mode using the Unity Remote app. |
+| **[See and record input event flow](see-record-input-event-flow.md)** | Trace and record events with `InputEventTrace` to inspect how input moves through the system. |
-When something isn't working as expected, the quickest way to troubleshoot what's wrong is the Input Debugger in the Unity Editor. The Input Debugger provides access to the activity of the Input System in both the Editor and the connected Players. ([Read more](Debugging.md))
+## Additional resources
-### [Automated Input Testing](Testing.md)
-
-The Input System has built-in support for writing automated input tests. You can drive input entirely from code, without any dependencies on platform backends and physical hardware devices. The automated input tests you write consider the generated input to be the same as input generated at runtime by actual platform code. ([Read more](Testing.md))
+- [Debugging](debugging.md)
+- [The input debugger window](the-input-debugger-window.md)
+- [Testing](testing.md)
+- [See and record input event flow](see-record-input-event-flow.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/Events.md b/Packages/com.unity.inputsystem/Documentation~/Events.md
index 9560b069b9..f3eb87aca9 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Events.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Events.md
@@ -3,326 +3,7 @@ uid: input-system-events
---
# Input events
-* [Types of events](#types-of-events)
- * [State events](#state-events)
- * [Device events](#device-events)
- * [Text events](#text-events)
-* [Working with events](#working-with-events)
- * [Listening to events](#listening-to-events)
- * [Reading state events](#reading-state-events)
- * [Creating events](#creating-events)
- * [Capturing events](#capturing-events)
-* [Processing events](#processing-events)
- * [Merging of events](#merging-of-events)
+| Topic | Description |
+| --- | --- |
-The Input System is event-driven. All input is delivered as events, and you can generate custom input by injecting events. You can also observe all source input by listening in on the events flowing through the system.
-
->__Note__: Events are an advanced, mostly internal feature of the Input System. Knowledge of the event system is mostly useful if you want to support custom Devices, or change the behavior of existing Devices.
-
-Input events are a low-level mechanism. Usually, you don't need to deal with events if all you want to do is receive input for your app. Events are stored in unmanaged memory buffers and not converted to C# heap objects. The Input System provides wrapper APIs, but unsafe code is required for more involved event manipulations.
-
-Note that there are no routing mechanism. The runtime delivers events straight to the Input System, which then incorporates them directly into the Device state.
-
-Input events are represented by the [`InputEvent`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) struct. Each event has a set of common properties:
-
-|Property|Description|
-|--------|-----------|
-|[`type`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_type)|[`FourCC`](../api/UnityEngine.InputSystem.Utilities.FourCC.html) code that indicates what type of event it is.|
-|[`eventId`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_eventId)|Unique numeric ID of the event.|
-|[`time`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_time)|Timestamp of when the event was generated. This is on the same timeline as [`Time.realtimeSinceStartup`](https://docs.unity3d.com/ScriptReference/Time-realtimeSinceStartup.html).|
-|[`deviceId`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_deviceId)|ID of the Device that the event targets.|
-|[`sizeInBytes`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_sizeInBytes)|Total size of the event in bytes.|
-
-You can observe the events received for a specific input device in the [input debugger](Debugging.md#debugging-devices).
-
-## Types of events
-
-### State events
-
-A state event contains the input state for a Device. The Input System uses these events to feed new input to Devices.
-
-There are two types of state events:
-
-* [`StateEvent`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html) (`'STAT'`)
-* [`DeltaStateEvent`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html) (`'DLTA'`)
-
-[`StateEvent`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html) contains a full snapshot of the entire state of a Device in the format specific to that Device. The [`stateFormat`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html#UnityEngine_InputSystem_LowLevel_StateEvent_stateFormat) field identifies the type of the data in the event. You can access the raw data using the [`state`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html#UnityEngine_InputSystem_LowLevel_StateEvent_state) pointer and [`stateSizeInBytes`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html#UnityEngine_InputSystem_LowLevel_StateEvent_stateSizeInBytes).
-
-A [`DeltaStateEvent`](../api/UnityEngine.InputSystem.LowLevel.DeltaStateEvent.html) is like a [`StateEvent`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html), but only contains a partial snapshot of the state of a Device. The Input System usually sends this for Devices that require a large state record, to reduce the amount of memory it needs to update if only some of the Controls change their state. To access the raw data, you can use the [`deltaState`](../api/UnityEngine.InputSystem.LowLevel.DeltaStateEvent.html#UnityEngine_InputSystem_LowLevel_DeltaStateEvent_deltaState) pointer and [`deltaStateSizeInBytes`](../api/UnityEngine.InputSystem.LowLevel.DeltaStateEvent.html#UnityEngine_InputSystem_LowLevel_DeltaStateEvent_deltaStateSizeInBytes). The Input System should apply the data to the Device's state at the offset defined by [`stateOffset`](../api/UnityEngine.InputSystem.LowLevel.DeltaStateEvent.html#UnityEngine_InputSystem_LowLevel_DeltaStateEvent_stateOffset).
-
-### Device events
-
-Device events indicate a change that is relevant to a Device as a whole. If you're interested in these events, it is usually more convenient to subscribe to the higher-level [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) event rather then processing [`InputEvents`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) yourself.
-
-There are three types of Device events:
-
-* [`DeviceRemoveEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceRemoveEvent.html) (`'DREM'`)
-* [`DeviceConfigurationEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceConfigurationEvent.html) (`'DCFG'`)
-* [`DeviceResetEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceResetEvent.html) (`'DRST'`)
-
-`DeviceRemovedEvent` indicates that a Device has been removed or disconnected. To query the device that has been removed, you can use the common [`deviceId`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_deviceId) field. This event doesn't have any additional data.
-
-`DeviceConfigurationEvent` indicates that the configuration of a Device has changed. The meaning of this is Device-specific. This might signal, for example, that the layout used by the keyboard has changed or that, on a console, a gamepad has changed which player ID(s) it is assigned to. You can query the changed device from the common [`deviceId`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_deviceId) field. This event doesn't have any additional data.
-
-`DeviceResetEvent` indicates that a device should get reset. This will trigger [`InputSystem.ResetDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) to be called on the Device.
-
-### Text events
-
-[Keyboard](Keyboard.md) devices send these events to handle text input. If you're interested in these events, it's usually more convenient to subscribe to the higher-level [callbacks on the Keyboard class](Keyboard.md#text-input) rather than processing [`InputEvents`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) yourself.
-
-There are two types of text events:
-
-* [`TextEvent`](../api/UnityEngine.InputSystem.LowLevel.TextEvent.html) (`'TEXT'`)
-* [`IMECompositionEvent`](../api/UnityEngine.InputSystem.LowLevel.IMECompositionEvent.html) (`'IMES'`)
-
-## Working with events
-
-### Listening to events
-
-If you want to do any monitoring or processing on incoming events yourself, subscribe to the [`InputSystem.onEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onEvent) callback.
-
-```CSharp
-InputSystem.onEvent +=
- (eventPtr, device) =>
- {
- Debug.Log($"Received event for {device}");
- };
-```
-
-An [`IObservable`](https://docs.microsoft.com/en-us/dotnet/api/system.iobservable-1) interface is provided to more conveniently process events.
-
-```CSharp
-// Wait for first button press on a gamepad.
-InputSystem.onEvent
- .ForDevice()
- .Where(e => e.HasButtonPress())
- .CallOnce(ctrl => Debug.Log($"Button {ctrl} pressed"));
-```
-
-To enumerate the controls that have value changes in an event, you can use [`InputControlExtensions.EnumerateChangedControls`](../api/UnityEngine.InputSystem.InputControlExtensions.html#UnityEngine_InputSystem_InputControlExtensions_EnumerateChangedControls_UnityEngine_InputSystem_LowLevel_InputEventPtr_UnityEngine_InputSystem_InputDevice_System_Single_).
-
-```CSharp
-InputSystem.onEvent
- .Call(eventPtr =>
- {
- foreach (var control in eventPtr.EnumerateChangedControls())
- Debug.Log($"Control {control} changed value to {control.ReadValueFromEventAsObject(eventPtr)}");
- };
-```
-
-This is significantly more efficient than manually iterating over [`InputDevice.allControls`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_allControls) and reading out the value of each control from the event.
-
-### Reading state events
-
-State events contain raw memory snapshots for Devices. As such, interpreting the data in the event requires knowledge about where and how individual state is stored for a given Device.
-
-The easiest way to access state contained in a state event is to rely on the Device that the state is meant for. You can ask any Control to read its value from a given event rather than from its own internally stored state.
-
-For example, the following code demonstrates how to read a value for [`Gamepad.leftStick`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_leftStick) from a state event targeted at a [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html).
-
-```CSharp
-InputSystem.onEvent +=
- (eventPtr, device) =>
- {
- // Ignore anything that isn't a state event.
- if (!eventPtr.IsA() && !eventPtr.IsA())
- return;
-
- var gamepad = device as Gamepad;
- if (gamepad == null)
- {
- // Event isn't for a gamepad or device ID is no longer valid.
- return;
- }
-
- var leftStickValue = gamepad.leftStick.ReadValueFromEvent(eventPtr);
- };
-```
-
-### Creating events
-
-Anyone can create and queue new input events against any existing Device. Queueing an input event is thread-safe, which means that event generation can happen in background threads.
-
->__Note__: Unity allocates limited memory to events that come from background threads. If background threads produce too many events, queueing an event from a thread blocks the thread until the main thread flushes out the background event queue.
-
-Note that queuing an event doesn't immediately consume the event. Event processing happens on the next update (depending on [`InputSettings.updateMode`](Settings.md#update-mode), it is triggered either manually via [`InputSystem.Update`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update), or automatically as part of the Player loop).
-
-#### Sending state events
-
-For Devices that have a corresponding "state struct" describing the state of the device, the easiest way of sending input to the Device is to simply queue instances of those structs:
-
-```CSharp
-// Mouse.
-InputSystem.QueueStateEvent(Mouse.current, new MouseState { position = new Vector2(123, 234) });
-
-// Keyboard.
-InputSystem.QueueStateEvent(Keyboard.current, new KeyboardState(Key.LeftCtrl, Key.A));
-```
-
-`Touchscreen` is somewhat special in that it expects its input to be in [`TouchState`](../api/UnityEngine.InputSystem.LowLevel.TouchState.html) format.
-
-```CSharp
-// Start touch.
-InputSystem.QueueStateEvent(Touchscreen.current,
- new TouchState { touchId = 1, phase = TouchPhase.Began, position = new Vector2(123, 234) });
-
-// Move touch.
-InputSystem.QueueStateEvent(Touchscreen.current,
- new TouchState { touchId = 1, phase = TouchPhase.Moved, position = new Vector2(234, 345) });
-
-// End touch.
-InputSystem.QueueStateEvent(Touchscreen.current,
- new TouchState { touchId = 1, phase = TouchPhase.Ended, position = new Vector2(123, 234) });
-```
-
->__IMPORTANT:__ [Touch IDs](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId) cannot be 0! A valid touch must have a non-zero touch ID. Concurrent touches must each have a unique ID. After a touch has ended, its ID can be reused – although it is recommended to not do so.
-
-If the exact format of the state used by a given Device is not known, the easiest way to send input to it is to simply create a [`StateEvent`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html) from the Device itself:
-
-```CSharp
-// `StateEvent.From` creates a temporary buffer in unmanaged memory that holds
-// a state event large enough for the given device and contains a memory
-// copy of the device's current state.
-InputEventPtr eventPtr;
-using (StateEvent.From(myDevice, out eventPtr))
-{
- ((AxisControl) myDevice["myControl"]).WriteValueIntoEvent(0.5f, eventPtr);
- InputSystem.QueueEvent(eventPtr);
-}
-```
-
-Alternatively, you can send events for individual Controls.
-
-```CSharp
-// Send event to update leftStick on the gamepad.
-InputSystem.QueueDeltaStateEvent(Gamepad.current.leftStick,
- new Vector2(0.123f, 0.234f);
-```
-
-Note that delta state events only work for Controls that are both byte-aligned and a multiple of 8 bits in size in memory. You can't send a delta state event for a button Control that is stored as a single bit, for example.
-
-### Capturing Events
-
->NOTE: To download a sample project which contains a reusable MonoBehaviour called `InputRecorder`, which can capture and replay input from arbitrary devices, open the Package Manager, select the Input System Package, and choose the sample project "Input Recorder" to download.
-
-You can use the [`InputEventTrace`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html) class to record input events for later processing:
-
-```CSharp
-var trace = new InputEventTrace(); // Can also give device ID to only
- // trace events for a specific device.
-
-trace.Enable();
-
-//... run stuff
-
-var current = new InputEventPtr();
-while (trace.GetNextEvent(ref current))
-{
- Debug.Log("Got some event: " + current);
-}
-
-// Also supports IEnumerable.
-foreach (var eventPtr in trace)
- Debug.Log("Got some event: " + eventPtr);
-
-// Trace consumes unmanaged resources. Make sure to dispose.
-trace.Dispose();
-```
-
-Dispose event traces after use, so that they do not leak memory on the unmanaged (C++) memory heap.
-
-You can also write event traces out to files/streams, load them back in, and replay recorded streams.
-
-```CSharp
-// Set up a trace with such that it automatically grows in size as needed.
-var trace = new InputEventTrace(growBuffer: true);
-trace.Enable();
-
-// ... capture some input ...
-
-// Write trace to file.
-trace.WriteTo("mytrace.inputtrace.");
-
-// Load trace from same file.
-var loadedTrace = InputEventTrace.LoadFrom("mytrace.inputtrace");
-```
-
-You can replay captured traces directly from [`InputEventTrace`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html) instances using the [`Replay`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html#UnityEngine_InputSystem_LowLevel_InputEventTrace_Replay_) method.
-
-```CSharp
-// The Replay method returns a ReplayController that can be used to
-// configure and control playback.
-var controller = trace.Replay();
-
-// For example, to not replay the events as is but rather create new devices and send
-// the events to them, call WithAllDevicesMappedToNewInstances.
-controller.WithAllDevicessMappedToNewInstances();
-
-// Replay all frames one by one.
-controller.PlayAllFramesOnyByOne();
-
-// Replay events in a way that tries to simulate original event timing.
-controller.PlayAllEventsAccordingToTimestamps();
-```
-
-## Processing events
-
-[Events](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) are collected on a queue by the Unity runtime. This queue is regularly flushed out and the events on it processed. Events can be added to the queue manually by calling [`InputSystem.QueueEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_QueueEvent_UnityEngine_InputSystem_LowLevel_InputEventPtr_).
-
-Each time input is processed, [`InputSystem.Update`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_) is called implicitly by the Unity runtime.
-
-The interval at which this happens is determined by the ["Update Mode"](Settings.md#update-mode) configured in the settings. By default, input is processed in each frame __before__ MonoBehaviour.Update methods are called. If the setting is changed to process input in fixed updates, then this changes to input being processed each time before MonoBehaviour.FixedUpdate methods are called.
-
-Normally, when input is processed, __all__ outstanding input events on the queue will be consumed. There are two exceptions to this, however.
-
-When using [`UpdateMode.ProcessEventsInFixedUpdate`](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html#UnityEngine_InputSystem_InputSettings_UpdateMode_ProcessEventsInFixedUpdate), the Input System attempts to associate events with the timeslice of the corresponding FixedUpdate . This is based on the [timestamps](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_time) of the events and a "best effort" at calculating the corresponding timeslice of the current FixedUpdated .
-
-The other exception are [`BeforeRender`](../api/UnityEngine.InputSystem.LowLevel.InputUpdateType.html#UnityEngine_InputSystem_LowLevel_InputUpdateType_BeforeRender) updates. These updates are run after fixed or dynamic updates but before rendering and used used exclusively to update devices such as VR headsets that need the most up-to-date tracking data. Other input is not consumed from such updates and these updates are only enabled if such devices are actually present. `BeforeRender` updates are not considered separate frames as far as input is concerned.
-
->__Note__: Manually calling [`InputSystem.Update`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_) is strongly advised against except within tests employing [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) or when explicitly setting the system to [manual update mode](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html#UnityEngine_InputSystem_InputSettings_UpdateMode_ProcessEventsManually).
-
-Methods such as [`InputAction.WasPerformedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPerformedThisFrame) and [`InputAction.WasPerformedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPerformedThisFrame) operate implicitly based on the [`InputSystem.Update`] cadence described above. Meaning, that they refer to the state as per the __last__ fixed/dynamic/manual update happened.
-
-You can query the [current/last update type](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_currentUpdateType) and [count](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_updateCount) from [`InputState`](../api/UnityEngine.InputSystem.LowLevel.InputState.html).
-
-### Merging of events
-
-Input system uses event mering to reduce amount of events required to be processed.
-This greatly improves performance when working with high refresh rate devices like 8000 Hz mice, touchscreens and others.
-
-For example let's take a stream of 7 mouse events coming in the same update:
-
-```
-
-Mouse Mouse Mouse Mouse Mouse Mouse Mouse
-Event no1 Event no2 Event no3 Event no4 Event no5 Event no6 Event no7
-Time 1 Time 2 Time 3 Time 4 Time 5 Time 6 Time 7
-Pos(10,20) Pos(12,21) Pos(13,23) Pos(14,24) Pos(16,25) Pos(17,27) Pos(18,28)
-Delta(1,1) Delta(2,1) Delta(1,2) Delta(1,1) Delta(2,1) Delta(1,2) Delta(1,1)
-BtnLeft(0) BtnLeft(0) BtnLeft(0) BtnLeft(1) BtnLeft(1) BtnLeft(1) BtnLeft(1)
-```
-
-To reduce workload we can skip events that are not encoding button state changes:
-
-```
- Mouse Mouse Mouse
- Time 3 Time 4 Time 7
- Event no3 Event no4 Event no7
- Pos(13,23) Pos(14,24) Pos(18,28)
- Delta(3,3) Delta(1,1) Delta(4,4)
- BtnLeft(0) BtnLeft(1) BtnLeft(1)
-```
-
-In that case we combine no1, no2, no3 together into no3 and accumulate the delta,
-then we keep no4 because it stores the transition from button unpressed to button pressed,
-and it's important to keep the exact timestamp of such transition.
-Later we combine no5, no6, no7 together into no7 because it is the last event in the update.
-
-Currently this approach is implemented for:
-- `FastMouse`, combines events unless `buttons` or `clickCount` differ in `MouseState`.
-- `Touchscreen`, combines events unless `touchId`, `phaseId` or `flags` differ in `TouchState`.
-
-You can disable merging of events by:
-```
-InputSystem.settings.disableRedundantEventsMerging = true;
-```
+## Additional resources
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/Gamepad.md b/Packages/com.unity.inputsystem/Documentation~/Gamepad.md
deleted file mode 100644
index ad4acf19cf..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Gamepad.md
+++ /dev/null
@@ -1,234 +0,0 @@
----
-uid: input-system-gamepad
----
-# Gamepad Support
-
-- [Controls](#controls)
- - [Deadzones](#deadzones)
-- [Polling](#polling)
-- [Rumble](#rumble)
- - [Pausing, resuming, and stopping haptics](#pausing-resuming-and-stopping-haptics)
-- [PlayStation controllers](#playstation-controllers)
-- [Xbox controllers](#xbox-controllers)
-- [Switch controllers](#switch-controllers)
-- [Cursor Control](#cursor-control)
-- [Discover all connected devices](#discover-all-connected-devices)
-
-A [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) is narrowly defined as a Device with two thumbsticks, a D-pad, and four face buttons. Additionally, gamepads usually have two shoulder and two trigger buttons. Most gamepads also have two buttons in the middle.
-
-A gamepad can have additional Controls, such as a gyro, which the Device can expose. However, all gamepads are guaranteed to have at least the minimum set of Controls described above.
-
-Gamepad support guarantees the correct location and functioning of Controls across platforms and hardware. For example, a PS4 DualShock controller layout should look identical regardless of which platform it is supported on. A gamepad's south face button should always be the lowermost face button.
-
->NOTE: Generic [HID](./HID.md) gamepads will __not__ be surfaced as [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) devices but rather be created as generic [joysticks](./Joystick.md). This is because the Input System cannot guarantee correct mapping of buttons and axes on the controller (the information is simply not available at the HID level). Only HID gamepads that are explicitly supported by the Input System (like the PS4 controller) will come out as gamepads. Note that you can set up the same kind of support for specific HID gamepads yourself (see ["Overriding the HID Fallback"](./HID.md#creating-a-custom-device-layout)).
-
->NOTE: In case you want to use the gamepad for driving mouse input, there is a sample called `Gamepad Mouse Cursor` you can install from the package manager UI when selecting the Input System package. The sample demonstrates how to set up gamepad input to drive a virtual mouse cursor.
-
-## Controls
-
-Every gamepad has the following Controls:
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`leftStick`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_leftStick)|[`StickControl`](../api/UnityEngine.InputSystem.Controls.StickControl.html)|Thumbstick on the left side of the gamepad. Deadzoned. Provides a normalized 2D motion vector. X is [-1..1] from left to right, Y is [-1..1] from bottom to top. Has up/down/left/right buttons for use like a D-pad.|
-|[`rightStick`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_rightStick)|[`StickControl`](../api/UnityEngine.InputSystem.Controls.StickControl.html)|Thumbstick on the right side of the gamepad. Deadzoned. Provides a normalized 2D motion vector. X is [-1..1] from left to right, Y is [-1..1] from bottom to top. Has up/down/left/right buttons for use like a D-pad.|
-|[`dpad`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_dpad)|[`DpadControl`](../api/UnityEngine.InputSystem.Controls.DpadControl.html)|The D-pad on the gamepad.|
-|[`buttonNorth`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_buttonNorth)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The upper button of the four action buttons, which are usually located on the right side of the gamepad. Labelled "Y" on Xbox controllers and "Triangle" on PlayStation controllers.|
-|[`buttonSouth`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_buttonSouth)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The lower button of the four action buttons, which are usually located on the right side of the gamepad. Labelled "A" on Xbox controllers and "Cross" on PlayStation controllers.|
-|[`buttonWest`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_buttonWest)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The left button of the four action buttons, which are usually located on the right side of the gamepad. Labelled "X" on Xbox controllers and "Square" on PlayStation controllers.|
-|[`buttonEast`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_buttonEast)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The right button of the four action buttons, which are usually located on the right side of the gamepad. Labelled "B" on Xbox controllers and "Circle" on PlayStation controllers.|
-|[`leftShoulder`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_leftShoulder)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The left shoulder button.|
-|[`rightShoulder`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_rightShoulder)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The right shoulder button.|
-|[`leftTrigger`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_leftTrigger)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The left trigger button.|
-|[`rightTrigger`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_rightTrigger)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The right trigger button.|
-|[`startButton`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_startButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The start button.|
-|[`selectButton`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_selectButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The select button.|
-|[`leftStickButton`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_leftStickButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The button pressed when the user presses down the left stick.|
-|[`rightStickButton`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_rightStickButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The button pressed when the user presses down the right stick.|
-
->__Note__: Buttons are also full floating-point axes. For example, the left and right triggers can function as buttons as well as full floating-point axes.
-
-You can also access gamepad buttons using the indexer property on [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_Item_UnityEngine_InputSystem_LowLevel_GamepadButton_) and the [`GamepadButton`](../api/UnityEngine.InputSystem.LowLevel.GamepadButton.html) enumeration:
-
-```CSharp
-Gamepad.current[GamepadButton.LeftShoulder];
-```
-
-Gamepads have both both Xbox-style and PS4-style aliases on buttons. For example, the following four accessors all retrieve the same "north" face button:
-
-```CSharp
-Gamepad.current[GamepadButton.Y]
-Gamepad.current["Y"]
-Gamepad.current[GamepadButton.Triangle]
-Gamepad.current["Triangle"]
-```
-
-### Deadzones
-
-Deadzones prevent accidental input due to slight variations in where gamepad sticks come to rest at their centre point. They allow a certain small inner area where the input is considered to be zero even if it is slightly off from the zero position.
-
-To add a deadzone to gamepad stick, put a [stick deadzone Processor](Processors.md#stick-deadzone) on the sticks, like this:
-
-```JSON
- {
- "name" : "MyGamepad",
- "extend" : "Gamepad",
- "controls" : [
- {
- "name" : "leftStick",
- "processors" : "stickDeadzone(min=0.125,max=0.925)"
- },
- {
- "name" : "rightStick",
- "processors" : "stickDeadzone(min=0.125,max=0.925)"
- }
- ]
- }
-```
-
-You can do the same in your C# state structs.
-
-```C#
- public struct MyDeviceState
- {
- [InputControl(processors = "stickDeadzone(min=0.125,max=0.925)"]
- public StickControl leftStick;
- [InputControl(processors = "stickDeadzone(min=0.125,max=0.925)"]
- public StickControl rightStick;
- }
-```
-
-The gamepad layout already adds stick deadzone processors which take their min and max values from [`InputSettings.defaultDeadzoneMin`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultDeadzoneMin) and [`InputSettings.defaultDeadzoneMax`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultDeadzoneMax).
-
-
-
-## Polling
-
-On Windows (XInput controllers only), Universal Windows Platform (UWP), and Switch, Unity polls gamepads explicitly rather than deliver updates as events.
-
-You can control polling frequency manually. The default polling frequency is 60 Hz. Use [`InputSystem.pollingFrequency`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_pollingFrequency) to get or set the frequency.
-
-```CSharp
-// Poll gamepads at 120 Hz.
-InputSystem.pollingFrequency = 120;
-```
-
-Increased frequency should lead to an increased number of events on the respective Devices. The timestamps provided on the events should roughly follow the spacing dictated by the polling frequency. Note, however, that the asynchronous background polling depends on OS thread scheduling and can vary.
-
-## Rumble
-
-The [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) class implements the [`IDualMotorRumble`](../api/UnityEngine.InputSystem.Haptics.IDualMotorRumble.html) interface that allows you to control the left and right motor speeds. In most common gamepads, the left motor emits a low-frequency rumble, and the right motor emits a high-frequency rumble.
-
-```CSharp
-// Rumble the low-frequency (left) motor at 1/4 speed and the high-frequency
-// (right) motor at 3/4 speed.
-Gamepad.current.SetMotorSpeeds(0.25f, 0.75f);
-```
-
->__Note__: Only the following combinations of Devices/OSes currently support rumble:
->* PS4, Xbox, and Switch controllers, when connected to their respective consoles. Only supported if you install console-specific input packages in your Project.
->* PS4 controllers, when connected to Mac or Windows/UWP computers.
->* Xbox controllers on Windows.
-
-[//]: # (TODO: are we missing any supported configs?)
-
-### Pausing, resuming, and stopping haptics
-
-[`IDualMotorRumble`](../api/UnityEngine.InputSystem.Haptics.IDualMotorRumble.html) is based on [`IHaptics`](../api/UnityEngine.InputSystem.Haptics.IHaptics.html), which is the base interface for any haptics support on any Device. You can pause, resume, and reset haptic feedback using the [`PauseHaptics`](../api/UnityEngine.InputSystem.Haptics.IHaptics.html#UnityEngine_InputSystem_Haptics_IHaptics_PauseHaptics), [`ResumeHaptics`](../api/UnityEngine.InputSystem.Haptics.IHaptics.html#UnityEngine_InputSystem_Haptics_IHaptics_ResumeHaptics), and [`ResetHaptics`](../api/UnityEngine.InputSystem.Haptics.IHaptics.html#UnityEngine_InputSystem_Haptics_IHaptics_ResetHaptics) methods respectively.
-
-In certain situations, you might want to globally pause or stop haptics for all Devices. For example, if the player enters an in-game menu, you can pause haptics while the player is in the menu, and then resume haptics once the player resumes the game. You can use the corresponding methods on [`InputSystem`](../api/UnityEngine.InputSystem.InputSystem.html) to achieve this result. These methods work the same way as Device-specific methods, but affect all Devices:
-
-```CSharp
-// Pause haptics globally.
-InputSystem.PauseHaptics();
-
-// Resume haptics globally.
-InputSystem.ResumeHaptics();
-
-// Stop haptics globally.
-InputSystem.ResetHaptics();
-```
-
-The difference between [`PauseHaptics`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_PauseHaptics) and [`ResetHaptics`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetHaptics) is that the latter resets haptics playback state on each Device to its initial state, whereas [`PauseHaptics`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_PauseHaptics) preserves playback state in memory and only stops playback on the hardware.
-
-## PlayStation controllers
-
-PlayStation controllers are well supported on different Devices. The Input System implements these as different derived types of the [`DualShockGamepad`](../api/UnityEngine.InputSystem.DualShock.DualShockGamepad.html) base class, which derives from [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html)):
-
-* [`DualShock3GamepadHID`](../api/UnityEngine.InputSystem.DualShock.DualShock3GamepadHID.html): A DualShock 3 controller connected to a desktop computer using the HID interface. Currently only supported on macOS. Doesn't support [rumble](#rumble).
-
-* [`DualShock4GamepadHID`](../api/UnityEngine.InputSystem.DualShock.DualShock4GamepadHID.html): A DualShock 4 controller connected to a desktop computer using the HID interface. Supported on macOS, Windows, UWP, and Linux.
-*
-* [`DualSenseGamepadHID`](../api/UnityEngine.InputSystem.DualShock.DualSenseGamepadHID.html): A DualSense controller connected to a desktop computer using the HID interface. Supported on macOS, Windows.
-
-* [`DualShock4GampadiOS`](../api/UnityEngine.InputSystem.iOS.DualShock4GampadiOS.html): A DualShock 4 controller connected to an iOS Device via Bluetooth. Requires iOS 13 or higher.
-
-* [`SetLightBarColor(Color)`](../api/UnityEngine.InputSystem.DualShock.DualShockGamepad.html#UnityEngine_InputSystem_DualShock_DualShockGamepad_SetLightBarColor_UnityEngine_Color_): Used to set the color of the light bar on the controller.
-
-Note that, due to limitations in the USB driver and/or the hardware, only one IOCTL (input/output control) command can be serviced at a time. [`SetLightBarColor(Color)`](../api/UnityEngine.InputSystem.DualShock.DualShockGamepad.html#UnityEngine_InputSystem_DualShock_DualShockGamepad_SetLightBarColor_UnityEngine_Color_) and [`SetMotorSpeeds(Single, Single)`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_SetMotorSpeeds_System_Single_System_Single_) functionality on Dualshock 4 is implemented using IOCTL commands, and so if either method is called in quick succession, it is likely that only the first command will successfully complete. The other commands will be dropped. If there is a need to set both lightbar color and rumble motor speeds at the same time, use the [`SetMotorSpeedsAndLightBarColor(Single, Single, Color)`](../api/UnityEngine.InputSystem.DualShock.DualShock4GamepadHID.html#UnityEngine_InputSystem_DualShock_DualShock4GamepadHID_SetMotorSpeedsAndLightBarColor_System_Single_System_Single_UnityEngine_Color_) method.
-
->__Note__:
->* Unity supports PlayStation controllers on WebGL in some browser and OS configurations, but treats them as basic [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) or [`Joystick`](../api/UnityEngine.InputSystem.Joystick.html) Devices, and doesn't support rumble or any other DualShock-specific functionality.
->* Unity doesn't support connecting a PlayStation controller to a desktop machine using the DualShock 4 USB Wireless Adaptor. Use USB or Bluetooth to connect it.
-
-## Xbox controllers
-
-Xbox controllers are well supported on different Devices. The Input System implements these using the [`XInputController`](../api/UnityEngine.InputSystem.XInput.XInputController.html) class, which derives from [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html). On Windows and UWP, Unity uses the XInput API to connect to any type of supported XInput controller, including all Xbox One or Xbox 360-compatible controllers. These controllers are represented as an [`XInputController`](../api/UnityEngine.InputSystem.XInput.XInputController.html) instance. You can query the [`XInputController.subType`](../api/UnityEngine.InputSystem.XInput.XInputController.html#UnityEngine_InputSystem_XInput_XInputController_subType) property to get information about the type of controller (for example, a wheel or a gamepad).
-
-On other platforms Unity, uses derived classes to represent Xbox controllers:
-
-* [`XboxGamepadMacOS`](../api/UnityEngine.InputSystem.XInput.XboxGamepadMacOS.html): Any Xbox or compatible gamepad connected to a Mac via USB using the [Xbox Controller Driver for macOS](https://github.com/360Controller/360Controller).
-
-* [`XboxOneGampadMacOSWireless`](../api/UnityEngine.InputSystem.XInput.XboxOneGampadMacOSWireless.html): An Xbox One controller connected to a Mac via Bluetooth. Only the latest generation of Xbox One controllers supports Bluetooth. These controllers don't require any additional drivers in this scenario.
-
-* [`XboxOneGampadiOS`](../api/UnityEngine.InputSystem.iOS.XboxOneGampadiOS.html): An Xbox One controller connected to an iOS Device via Bluetooth. Requires iOS 13 or higher.
-
->__Note__:
->* XInput controllers on Mac currently require the installation of the [Xbox Controller Driver for macOS](https://github.com/360Controller/360Controller). This driver only supports USB connections, and doesn't support wireless dongles. However, the latest generation of Xbox One controllers natively support Bluetooth. Macs natively support these controllers as HIDs without any additional drivers when connected via Bluetooth.
->* Unity supports Xbox controllers on WebGL in some browser and OS configurations, but treats them as basic [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) or [`Joystick`](../api/UnityEngine.InputSystem.Joystick.html) Devices, and doesn't support rumble or any other Xbox-specific functionality.
-
-## Switch controllers
-
-The Input System support Switch Pro controllers on desktop computers via the [`SwitchProControllerHID`](../api/UnityEngine.InputSystem.Switch.SwitchProControllerHID.html) class, which implements basic gamepad functionality.
-
->__Note__: This support does not currently work for Switch Pro controllers connected via wired USB. Instead, the Switch Pro controller *must* be connected via Bluetooth. This is due to the controller using a prioprietary communication protocol on top of HID which does not allow treating the controller like any other HID.
-
->__Note__: Switch Joy-Cons are not currently supported on desktop.
-
-## Cursor Control
-
-To give gamepads and joysticks control over a hardware or software cursor, you can use the [`VirtualMouseInput`](../api/UnityEngine.InputSystem.UI.VirtualMouseInput.html) component. See [`VirtualMouseInput` component](UISupport.md#virtual-mouse-cursor-control) in the UI section of the manual.
-
-## Discover all connected devices
-
-There are various ways to discover the currently connected devices, as shown in the code samples below.
-
-To query a list of all connected devices (does not allocate; read-only access):
-```
-InputSystem.devices
-```
-
-To get notified when a device is added or removed:
-```
-InputSystem.onDeviceChange +=
- (device, change) =>
- {
- if (change == InputDeviceChange.Added || change == InputDeviceChange.Removed)
- {
- Debug.Log($"Device '{device}' was {change}");
- }
- }
-```
-
-To find all gamepads and joysticks:
-```
-var devices = InputSystem.devices;
-for (var i = 0; i < devices.Count; ++i)
-{
- var device = devices[i];
- if (device is Joystick || device is Gamepad)
- {
- Debug.Log("Found " + device);
- }
-}
-```
diff --git a/Packages/com.unity.inputsystem/Documentation~/HowDoI.md b/Packages/com.unity.inputsystem/Documentation~/HowDoI.md
index d0490f0546..ffcea25e20 100644
--- a/Packages/com.unity.inputsystem/Documentation~/HowDoI.md
+++ b/Packages/com.unity.inputsystem/Documentation~/HowDoI.md
@@ -7,7 +7,7 @@ A collection of frequently asked questions, and where to find their answers in t
> **Note:**
>
-> If you're new to the Input System and have landed on this page looking for documentation, it's best to read the [QuickStart Guide](QuickStartGuide.md), and the [Concepts](Concepts.md) and [Workflows](Workflows.md) pages, so that you can make sure you're choosing the best workflow for your project's input requirements.
+> If you're new to the Input System and have landed on this page looking for documentation, it's best to read the [QuickStart Guide](quick-start-guide.md), and the [Concepts](understanding-input.md) and [Workflows](workflows.md) pages, so that you can make sure you're choosing the best workflow for your project's input requirements.
>
> This is because there are a number of different ways to read input using the Input System, and many of the answers on this page give you the quickest but least flexible solution, and may not be suitable for a project with more complex requirements.
@@ -22,16 +22,16 @@ How do I...?
- [find the gamepad that the player is currently using?](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_current)
-- [know when a new device was plugged in?](Devices.md#monitoring-devices)
+- [know when a new device was plugged in?](monitor-devices.md)
-- [create my own custom devices?](HID.md#creating-a-custom-device-layout)
+- [create my own custom devices?](hid-create-custom-layout.md)
- create a simple "Fire" type action?
-Use the same techniques shown for the "Jump" action in the [Workflows section](Workflows.md)
+Use the same techniques shown for the "Jump" action in the [Workflows section](workflows.md)
-- [require a button to be held down for some duration before triggering an action?](Interactions.html#hold)
+- [require a button to be held down for some duration before triggering an action?](built-in-interactions.md#hold)
-- [use a "positive" and a "negative" button to drive an axis?](ActionBindings.html#1d-axis)
+- [use a "positive" and a "negative" button to drive an axis?](configure-bindings-from-code.md#1d-axis)
- [create a UI to rebind input in my game?](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html)
@@ -39,18 +39,18 @@ Use the same techniques shown for the "Jump" action in the [Workflows section](W
- [make my left-hand XR controller my right-hand one?](../api/UnityEngine.InputSystem.XR.XRController.html#UnityEngine_InputSystem_XR_XRController_leftHand)
-- [get all current touches from the touchscreen?](Touch.md#reading-all-touches)
+- [get all current touches from the touchscreen?](devices-touch.md#reading-all-touches)
- [deal with my gamepad data arriving in a format different from `GamepadState`?](../api/UnityEngine.InputSystem.LowLevel.GamepadState.html)
-- [force the Input System to use my own layout when the native backend discovers a specific Device?](Devices.md#native-devices)
+- [force the Input System to use my own layout when the native backend discovers a specific Device?](native-devices.md)
-- [add deadzoning to my gamepad sticks?](Gamepad.md#deadzones)
+- [add deadzoning to my gamepad sticks?](query-gamepads.md#add-a-deadzone-to-a-gamepad)
- [give my head tracking an extra update before rendering?](../api/UnityEngine.InputSystem.XR.XRHMD.html)
-- [record events flowing through the system?](Debugging.md#other-tips)
+- [record events flowing through the system?](debugging.md#other-tips)
-- [see events as they're processed?](Debugging.md#other-tips)
+- [see events as they're processed?](debugging.md#other-tips)
-- [see what Devices I have and what state they're in?](Debugging.html#debugging-devices)
+- [see what Devices I have and what state they're in?](debug-device.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/Images/control-hierarchy-example.png b/Packages/com.unity.inputsystem/Documentation~/Images/control-hierarchy-example.png
new file mode 100644
index 0000000000..ef3c4b7da3
Binary files /dev/null and b/Packages/com.unity.inputsystem/Documentation~/Images/control-hierarchy-example.png differ
diff --git a/Packages/com.unity.inputsystem/Documentation~/Interactions.md b/Packages/com.unity.inputsystem/Documentation~/Interactions.md
index e7933342ce..faa9045e69 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Interactions.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Interactions.md
@@ -1,318 +1,22 @@
---
uid: input-system-interactions
---
-# Interactions
-
-- [Interactions](#interactions)
- - [Operation](#operation)
- - [Multiple Controls on an Action](#multiple-controls-on-an-action)
- - [Multiple Interactions on a Binding](#multiple-interactions-on-a-binding)
- - [Timeouts](#timeouts)
- - [Using Interactions](#using-interactions)
- - [Interactions applied to Bindings](#interactions-applied-to-bindings)
- - [Interactions applied to Actions](#interactions-applied-to-actions)
- - [Predefined Interactions](#predefined-interactions)
- - [Default Interaction](#default-interaction)
- - [Press](#press)
- - [Hold](#hold)
- - [Tap](#tap)
- - [SlowTap](#slowtap)
- - [MultiTap](#multitap)
- - [Writing custom Interactions](#writing-custom-interactions)
-
-An Interaction represents a specific input pattern. For example, a [hold](#hold) is an Interaction that requires a Control to be held for at least a minimum amount of time.
-
-Interactions drive responses on Actions. You can place them on individual Bindings or an Action as a whole, in which case they apply to every Binding on the Action. At runtime, when a particular interaction completes, this triggers the Action.
-
-
-
-## Operation
-
-An Interaction has a set of distinct phases it can go through in response to receiving input.
-
-|Phase|Description|
-|-----|-----------|
-|`Waiting`|The Interaction is waiting for input.|
-|`Started`|The Interaction has been started (that is, it received some of its expected input), but is not complete yet.|
-|`Performed`|The Interaction is complete.|
-|`Canceled`|The Interaction was interrupted and aborted. For example, the user pressed and then released a button before the minimum time required for a [hold Interaction](#hold) to complete.|
-
-Not every Interaction triggers every phase, and the pattern in which specific Interactions trigger phases depends on the Interaction type.
-
-While `Performed` is typically the phase that triggers the actual response to an Interaction, `Started` and `Canceled` can be useful for providing UI feedback while the Interaction is in progress. For example, when a [hold](#hold) is `Started`, the app can display a progress bar that fills up until the hold time has been reached. If, however, the hold is `Canceled` before it completes, the app can reset the progress bar to the beginning.
-
-The following example demonstrates this kind of setup with a fire Action that the user can tap to fire immediately, or hold to charge:
-
-```CSharp
-var fireAction = new InputAction("fire");
-fireAction.AddBinding("/buttonSouth")
- // Tap fires, slow tap charges. Both act on release.
- .WithInteractions("tap,slowTap");
-
-fireAction.started +=
- context =>
- {
- if (context.interaction is SlowTapInteraction)
- ShowChargingUI();
- };
-
-fireAction.performed +=
- context =>
- {
- if (context.interaction is SlowTapInteraction)
- ChargedFire();
- else
- Fire();
- };
-
-fireAction.canceled +=
- _ => HideChargingUI();
-fireAction.Enable();
-```
-
-### Multiple Controls on an Action
-
-If you have multiple Controls bound to a Binding or an Action which has an Interaction, then the Input System first applies the [Control conflict resolution](ActionBindings.md#conflicting-inputs) logic to get a single value for the Action, which it then feeds to the Interaction logic. Any of the bound Controls can perform the Interaction.
-
-### Multiple Interactions on a Binding
-
-If multiple Interactions are present on a single Binding or Action, then the Input System checks the Interactions in the order they are present on the Binding. The code example [above](#operation) illustrates this example. The Binding on the `fireAction` Action has two Interactions: `WithInteractions("tap;slowTap")`. The [tap](#tap) Interaction gets a first chance at interpreting the input from the Action. If the button is pressed, the Action calls the `Started` callback on the tap Interaction. If the user keeps holding the button, the tap Interaction times out, and the Action calls the [`Canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled) callback for the tap Interaction and starts processing the [slow tap](#slowtap) Interaction (which now receives a `Started` callback).
-
-At any one time, only one Interaction can be "driving" the action (that is, it gets to determine the action's current [`phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase)). If an Interaction higher up in the stack cancels, Interactions lower down in the stack can take over.
-
-Note that the order of interactions can affect which interaction is passed to your callback function. For example, an action with [Tap](#tap), [MultiTap](#multitap) and [Hold](#hold) interactions will have different behaviour when the interactions are in a different order, such as [Hold](#hold), [MultiTap](#multitap) and [Tap](#tap). If you get unexpected behaviour, you may need to experiment with a different ordering.
-
-### Timeouts
-
-Interactions might need to wait a certain time for a specific input to occur or to not occur. An example of this is the [Hold](#hold) interaction which, after a button is pressed, has to wait for a set [duration](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration) until the "hold" is complete. To do this, an interaction installs a timeout using [`SetTimeout`](../api/UnityEngine.InputSystem.InputInteractionContext.html#UnityEngine_InputSystem_InputInteractionContext_SetTimeout_System_Single_).
-
-It can be useful to know how much of a timeout is left for an interaction to complete. For example, you might want to display a bar in the UI that is charging up while the interaction is waiting to complete. To query the percentage to which a timeout has completed, use [`GetTimeoutCompletionPercentage`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_GetTimeoutCompletionPercentage_).
-
-```CSharp
-// Returns a value between 0 (inclusive) and 1 (inclusive).
-var warpActionCompletion = playerInput.actions["warp"].GetTimeoutCompletionPercentage();
-```
-
-Note that each Interaction can have its own separate timeout (but only a single one at any one time). If [multiple interactions](#multiple-interactions-on-a-binding) are in effect, then [`GetTimeoutCompletionPercentage`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_GetTimeoutCompletionPercentage_) will only use the timeout of the one interaction that is currently driving the action.
-
-Some Interactions might involve multiple timeouts in succession. In this case, knowing only the completion of the currently running timeout (if any) is often not useful. An example is [`MultiTapInteraction`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html), which involves a timeout on each individual tap, as well as a timeout in-between taps. The Interaction is complete only after a full tap sequence has been performed.
-
-An Interaction can use [`SetTotalTimeoutCompletionTime`](../api/UnityEngine.InputSystem.InputInteractionContext.html#UnityEngine_InputSystem_InputInteractionContext_SetTotalTimeoutCompletionTime_System_Single_) to inform the Input System of the total time it will run timeouts for.
-
-## Using Interactions
-
-You can install Interactions on [Bindings](ActionBindings.md) or [Actions](Actions.md).
-
-### Interactions applied to Bindings
-
-When you create Bindings for your [Actions](Actions.md), you can choose to add Interactions to the Bindings.
-
-If you're using [project-wide actions](ActionsEditor.md), or [Input Action Assets](ActionAssets.md), you can add any Interaction to your Bindings in the Input Action editor. Once you [created some Bindings](ActionsEditor.md#bindings), select the Binding you want to add Interactions to, so that the right pane of the window shows the properties for that Binding. Next, click on the plus icon on the __Interactions__ foldout to open a list of all available Interactions types. Choose an Interaction type to add an Interaction instance of that type. The Interaction now appears in the __Interactions__ foldout. If the Interaction has any parameters, you can now edit them here as well:
-
-
-
-To remove an Interaction, click the minus button next to it. To change the [order of Interactions](#multiple-interactions-on-a-binding), click the up and down arrows.
-
-If you create your Bindings in code, you can add Interactions like this:
-
-```CSharp
-var Action = new InputAction();
-action.AddBinding("/leftStick")
- .WithInteractions("tap(duration=0.8)");
-```
-
-### Interactions applied to Actions
-
-Applying Interactions directly to an Action is equivalent to applying them to all Bindings for the Action. It is thus more or less a shortcut that avoids manually adding the same Interaction(s) to each of the Bindings.
-
-If Interactions are applied __both__ to an Action and to its Bindings, then the effect is the same as if the Action's Interactions are *appended* to the list of Interactions on each of the Bindings. This means that the Binding's Interactions are applied *first*, and then the Action's Interactions are applied *after*.
-
-You can add and edit Interactions on Actions in the [Input Action Assets](ActionAssets.md) editor window the [same way](#interactions-applied-to-bindings) as you would do for Bindings: select an Action to Edit, then add the Interactions in the right window pane.
-
-If you create your Actions in code, you can add Interactions like this:
-
-```CSharp
-var Action = new InputAction(Interactions: "tap(duration=0.8)");
-```
-
-## Predefined Interactions
-
-The Input System package comes with a set of basic Interactions you can use. If an Action has no Interactions set, the system uses its [default Interaction](#default-interaction).
->__Note__: The built-in Interactions operate on Control actuation and don't use Control values directly. The Input System evaluates the `pressPoint` parameters against the magnitude of the Control actuation. This means you can use these Interactions on any Control which has a magnitude, such as sticks, and not just on buttons.
-
-The following diagram shows the behavior of the built-in Interactions for a simple button press.
-
-
-
-### Default Interaction
-
-If you haven't specifically added an Interaction to a Binding or its Action, the default Interaction applies to the Binding.
-
-[`Value`](RespondingToActions.md#value) type Actions have the following behavior:
-
-1. As soon as a bound Control becomes [actuated](Controls.md#control-actuation), the Action goes from `Waiting` to `Started`, and then immediately to `Performed` and back to `Started`. One callback occurs on [`InputAction.started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started), followed by one callback on [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed).
-2. For as long as the bound Control remains actuated, the Action stays in `Started` and triggers `Performed` whenever the value of the Control changes (that is, one call occurs to [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)).
-3. When the bound Control stops being actuated, the Action goes to `Canceled` and then back to `Waiting`. One call occurs to [`InputAction.canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
-
-[`Button`](RespondingToActions.md#button) type Actions have the following behavior:
-
-1. As soon as a bound Control becomes [actuated](Controls.md#control-actuation), the Action goes from `Waiting` to `Started`. One callback occurs on [`InputAction.started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started).
-2. If a Control then reaches or exceeds the button press threshold, the Action goes from `Started` to `Performed`. One callback occurs on [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed). The default value of the button press threshold is defined in the [input settings](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint). However, an individual control can [override](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_pressPoint) this value.
-3. Once the Action has `Performed`, if all Controls then go back to a level of actuation at or below the [release threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_buttonReleaseThreshold), the Action goes from `Performed` to `Canceled`. One call occurs to [`InputAction.canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
-4. If the Action never went to `Performed`, it will go to `Canceled` as soon as all Controls are released. One call occurs to [`InputAction.canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
-
-[`PassThrough`](RespondingToActions.md#pass-through) type Actions have a simpler behavior. The Input System doesn't try to track bound Controls as a single source of input. Instead, it triggers a `Performed` callback for each value change.
-
-|__Callback__|[`InputActionType.Value`](RespondingToActions.md#value)|[`InputActionType.Button`](RespondingToActions.md#button)|[`InputActionType.PassThrough`](RespondingToActions.md#pass-through)|
-|-----------|-------------|------------|-----------------|
-|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control(s) changed value away from the default value.|Button started being pressed but has not necessarily crossed the press threshold yet.|not used|
-|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control(s) changed value.|Button was pressed to at least the button [press threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint).|Control changed value.|
-|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control(s) are no longer actuated.|Button was released. If the button was pressed above the press threshold, the button has now fallen to or below the [release threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_buttonReleaseThreshold). If the button was never fully pressed, the button is now back to completely unpressed.|Action is disabled.|
-
-### Press
-
-You can use a [`PressInteraction`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html) to explicitly force button-like interactions. Use the [`behavior`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_behavior) parameter to select if the Interaction should trigger on button press, release, or both.
-
-|__Parameters__|Type|Default value|
-|---|---|---|
-|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
-|[`behavior`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_behavior)|[`PressBehavior`](../api/UnityEngine.InputSystem.Interactions.PressBehavior.html)|`PressOnly`|
-
-
-|__Callbacks__/[`behavior`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_behavior)|`PressOnly`|`ReleaseOnly`|`PressAndRelease`|
-|---|-----------|-------------|-----------------|
-|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|
-|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|- Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint) or - Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|
-|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|not used|not used|not used|
-
-### Hold
-
-A [`HoldInteraction`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html) requires the user to hold a Control for [`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration) seconds before the Input System triggers the Action.
-
-|__Parameters__|Type|Default value|
-|---|---|---|
-|[`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration)|`float`|[`InputSettings.defaultHoldTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultHoldTime)|
-|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
-
-
-To display UI feedback when a button starts being held, use the [`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started) callback.
-
-```C#
-
- action.started += _ => ShowGunChargeUI();
- action.performed += _ => FinishGunChargingAndHideChargeUI();
- action.cancelled += _ => HideChargeUI();
-
-```
-
-|__Callbacks__||
-|---|---|
-|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint).|
-|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude held above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint) for >= [`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration).|
-|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint) before [`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration) (that is, the button was not held long enough).|
-
-### Tap
-
-A [`TapInteraction`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html) requires the user to press and release a Control within [`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration) seconds to trigger the Action.
-
-|__Parameters__|Type|Default value|
-|---|---|---|
-|[`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration)|`float`|[`InputSettings.defaultTapTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultTapTime)|
-|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
-
-|__Callbacks__||
-|---|---|
-|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint).|
-|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint) before [`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration).|
-|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control magnitude held above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint) for >= [`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration) (that is, the tap was too slow).|
-
-### SlowTap
-
-A [`SlowTapInteraction`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html) requires the user to press and hold a Control for a minimum duration of [`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration) seconds, and then release it, to trigger the Action.
-
-|__Parameters__|Type|Default value|
-|---|---|---|
-|[`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration)|`float`|[`InputSettings.defaultSlowTapTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultSlowTapTime)|
-|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
-
-|__Callbacks__||
-|---|---|
-|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint).|
-|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint) after [`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration).|
-|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint) before [`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration) (that is, the tap was too fast).|
-
-### MultiTap
-
-A [`MultiTapInteraction`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html) requires the user to press and release a Control within [`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime) seconds [`tapCount`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapCount) times, with no more then [`tapDelay`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapDelay) seconds passing between taps, for the Interaction to trigger. You can use this to detect double-click or multi-click gestures.
-
-|__Parameters__|Type|Default value|
-|---|---|---|
-|[`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime)|`float`|[`InputSettings.defaultTapTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultTapTime)|
-|[`tapDelay`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapDelay)|`float`|2 * [`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime)|
-|[`tapCount`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapCount)|`int`|2|
-|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
-
-|__Callbacks__||
-|---|---|
-|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint).|
-|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude went back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint) and back up above it repeatedly for [`tapCount`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapCount) times.|
-|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|- After going back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint), Control magnitude did not go back above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint) within [`tapDelay`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapDelay) time (that is, taps were spaced out too far apart). or - After going back above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint), Control magnitude did not go back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint) within [`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime) time (that is, taps were too long).|
-
-## Writing custom Interactions
-
-You can also write a custom Interaction to use in your Project. You can use custom Interactions in the UI and code the same way you use built-in Interactions. Add a class implementing the [`IInputInteraction`](../api/UnityEngine.InputSystem.IInputInteraction.html) interface, like this:
-
-```CSharp
-// Interaction which performs when you quickly move an
-// axis all the way from extreme to the other.
-public class MyWiggleInteraction : IInputInteraction
-{
- public float duration = 0.2;
-
- void Process(ref InputInteractionContext context)
- {
- if (context.timerHasExpired)
- {
- context.Canceled();
- return;
- }
-
- switch (context.phase)
- {
- case InputActionPhase.Waiting:
- if (context.Control.ReadValue() == 1)
- {
- context.Started();
- context.SetTimeout(duration);
- }
- break;
-
- case InputActionPhase.Started:
- if (context.Control.ReadValue() == -1)
- context.Performed();
- break;
- }
- }
-
- // Unlike processors, Interactions can be stateful, meaning that you can keep a
- // local state that mutates over time as input is received. The system might
- // invoke the Reset() method to ask Interactions to reset to the local state
- // at certain points.
- void Reset()
- {
- }
-}
-```
+# Interactions
-Now, you need to tell the Input System about your Interaction. Call this method in your initialization code:
+Use interactions to interpret specific input patterns from controls that define action behavior.
-```CSharp
-InputSystem.RegisterInteraction();
-```
+| **Topic** | **Description** |
+| :--- | :--- |
+| [**Introduction to interactions**](introduction-interactions.md) | Use interactions on bindings and actions to read control input patterns and trigger Actions. |
+| [**Apply interactions to bindings**](apply-interactions-bindings.md) | Apply interactions to individual bindings. |
+| [**Apply interactions to actions**](apply-interactions-actions.md) | Apply Interactions to actions, and all the bindings associated with that action. |
+| [**Predefined interactions**](predefined-interactions.md) | Use the Input System's default and built-in interactions on your actions and bindings. |
+| [**Write custom interactions**](write-custom-interactions.md) | Write your own custom interactions for your actions and bindings. |
-Your new Interaction is now available in the [Input Action Asset Editor window](ActionAssets.md). You can also add it in code like this:
+## Additional resources
-```CSharp
-var Action = new InputAction(Interactions: "MyWiggle(duration=0.5)");
-```
+- [Bindings](bindings.md)
+- [Processors](processors.md)
+- [Configure actions](configure-actions.md)
+- [Responding to input](respond-to-input.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/Joystick.md b/Packages/com.unity.inputsystem/Documentation~/Joystick.md
deleted file mode 100644
index ebbca142a4..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Joystick.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-uid: input-system-joystick
----
-# Joystick support
-
-The Input System currently has limited support for joysticks as generic [HIDs](HID.md) only. The system attempts to identify Controls based on the information provided in the HID descriptor of the Device, but it might not always be accurate. These Devices often work best when you allow the user to [manually remap the Controls](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html).
-
-To better support specific joysticks Devices, you can also [provide your own custom mappings for those Devices](HID.md#creating-a-custom-device-layout). Unity might extend the Input System to include some mappings for common devices in the future. See the [manual page on HID](HID.md) for more information.
-
-## Controls
-
-The Input System supports Generic HID Input Devices which are recognized as joysticks via the [`Joystick`](../api/UnityEngine.InputSystem.Joystick.html) class. Joystick Devices can have any number of Controls as reported by the Device's HID descriptor, but the Input System always tries to at least match these common Controls:
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`stick`](../api/UnityEngine.InputSystem.Joystick.html#UnityEngine_InputSystem_Joystick_stick)|[`StickControl`](../api/UnityEngine.InputSystem.Controls.StickControl.html)|The main stick of the joystick.|
-|[`trigger`](../api/UnityEngine.InputSystem.Joystick.html#UnityEngine_InputSystem_Joystick_trigger)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The primary trigger of the joystick.|
diff --git a/Packages/com.unity.inputsystem/Documentation~/Keyboard.md b/Packages/com.unity.inputsystem/Documentation~/Keyboard.md
deleted file mode 100644
index 4805961eb6..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Keyboard.md
+++ /dev/null
@@ -1,69 +0,0 @@
----
-uid: input-system-keyboard
----
-# Keyboard support
-
-The [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) class defines a [Device](Devices.md) with a set of key Controls defined by the [`Key`](../api/UnityEngine.InputSystem.Key.html) enumeration.
-
-The location of individual keys is agnostic to keyboard layout. This means that, for example, the `A` key is always the key to the right of the `Caps Lock` key, regardless of where the currently active keyboard layout places the key that generates an `a` character, or whether or not the layout doesn't have a key assigned to that character.
-
-To query which (if any) character is generated by a given key, use the key Control's [`displayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_displayName) property. The value of this property changes automatically when the OS changes the keyboard layout.
-
-You can look up keys based on the character they produce using [Control paths](Controls.md#control-paths). For example, you can query the key that produces the producing the `a` character from [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) using [`Keyboard.current["#(a)"]`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_Item_UnityEngine_InputSystem_Key_).
-
->__Note__
->* Keyboards usually have hardware limitations on both the number of simultaneous keypresses they report, and the combinations of keys they support. This means that certain simultaneous keypresses may not register correctly. For example, a given keyboard might report a simultaneous press of the "QWERT" keys correctly, but might not report "QWERA" correctly.
->* At the moment, the new Input System doesn't support on-screen keyboards. For now, please Unity's existing API in `UnityEngine.TouchScreenKeyboard`.
->* At the moment, Unity platform backends generally do not support distinguishing between multiple keyboards. While the Input System supports having many [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) devices at any point, platform backends generally only report a single keyboard and route input from all attached keyboards to the one keyboard device.
-
-## Controls
-
-To retrieve a key from [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html), you can use one of these methods:
-
-* Use the key's accessor property, such [`Keyboard.spaceKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_spaceKey).
-* Use [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html)'s indexer and the [`Key`](../api/UnityEngine.InputSystem.Key.html) enumeration (for example, `keyboard[Key.Space]`).
-
-The [scripting API reference for the `Keyboard` class](../api/UnityEngine.InputSystem.Keyboard.html) lists all the properties for the individual key Controls.
-
-Two special Controls, [`anyKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_anyKey) and [`imeSelected`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_imeSelected), don't directly map to individual keys. [`anyKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_anyKey) is a [synthetic](Controls.md#synthetic-controls) button Control which reports whether any key on the keyboard is pressed, and [`imeSelected`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_imeSelected) reports whether or not [IME](#ime) text processing is enabled.
-
-In addition, [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html)'s indexer and the [`Key`](../api/UnityEngine.InputSystem.Key.html) has three [synthetic](Controls.md#synthetic-controls) controls that represent combinations of modifier keys:
-
-|Control|Description|
-|-------|-----------|
-|[`shiftKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_shiftKey)|A button that is pressed if [`leftShiftKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_leftShiftKey) and/or [`rightShiftKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_rightShiftKey) is pressed.|
-|[`ctrlKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_ctrlKey)|A button that is pressed if [`leftCtrlKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_leftCtrlKey) and/or [`rightCtrlKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_rightCtrlKey) is pressed.|
-|[`altKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_altKey)|A button that is pressed if [`leftAltKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_leftAltKey) and/or [`rightAltKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_rightAltKey) is pressed.|
-
-## Text input
-
-As a best practice, you shouldn't manually translate text input from key presses by trying to string together the characters corresponding to the keys. Instead, to listen to text input, hook into [`Keyboard.onTextInput`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_onTextInput). This delivers character-by-character input as reported by the platform, including input from on-screen keyboards.
-
-Note that the text input API doesn't allocate GC memory because it doesn't deliver fully composed strings.
-
-### IME
-
-Some writing systems, such as some East-Asian scripts, are too complex to represent all characters as individual keys on a keyboard. For these layouts, operating systems implement IMEs (Input Method Editors) to allow composing input strings by other methods, for instance by typing several keys to produce a single character. Unity's UI frameworks for text input support IME without any additional configuration. If you want to build your own UI for text input, the [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) class allows you to work with input from IMEs using the following APIs:
-
-* [`imeSelected`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_imeSelected) is a virtual input Control that reports whether IME text processing is enabled.
-
-* [`SetIMEEnabled()`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_SetIMEEnabled_System_Boolean_) is a method which lets you turn IME processing on or off. Typically, IME processing is useful when the user wants to edit text, but not so much when the user is using the keyboard to control a game.
-
-* [`SetIMECursorPosition()`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_SetIMECursorPosition_UnityEngine_Vector2_). IMEs might open system windows that let users interactively edit the text they want to input. Typically, these open next to the text editing UI. You can use the [`SetIMECursorPosition()`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_SetIMECursorPosition_UnityEngine_Vector2_) method to tell the OS where that is.
-
-* [`onIMECompositionChange`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_onIMECompositionChange) is an event you can subscribe to in order to receive all updates to the IME composition string. The composition string is the text input the user is currently editing using an IME. Typically, any UI dealing with text input displays this text (with some visual indication of it being actively edited, usually an underline) at the current text input cursor position.
-
-## Keyboard layouts
-
-You can query the name of the current keyboard layout using [`Keyboard.keyboardLayout`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_keyboardLayout). Layout names are platform-specific.
-
-There is no support for setting keyboard layouts from your application.
-
-To monitor keyboard layout changes, hook into [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) and check for [`InputDeviceChange.ConfigurationChanged`](../api/UnityEngine.InputSystem.InputDeviceChange.html) on a [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) device.
-
-To find the key control that corresponds to a specific display character sequence, call [`Keyboard.FindKeyOnCurrentKeyboardLayout`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_FindKeyOnCurrentKeyboardLayout_).
-
-```CSharp
-// Find key that generates a 'q' character according to the current keyboard layout.
-Keyboard.current.FindKeyOnCurrentKeyboardLayout("q");
-```
diff --git a/Packages/com.unity.inputsystem/Documentation~/KnownLimitations.md b/Packages/com.unity.inputsystem/Documentation~/KnownLimitations.md
index 77a92ce114..d28dda85e1 100644
--- a/Packages/com.unity.inputsystem/Documentation~/KnownLimitations.md
+++ b/Packages/com.unity.inputsystem/Documentation~/KnownLimitations.md
@@ -1,7 +1,7 @@
---
uid: input-system-known-limitations
---
-# Known Limitations
+# Known limitations
The following is a list of known limitations that the Input System currently has.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Layouts.md b/Packages/com.unity.inputsystem/Documentation~/Layouts.md
index a01f3523b1..0832db1941 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Layouts.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Layouts.md
@@ -3,403 +3,23 @@ uid: input-system-layouts
---
# Layouts
-* [Layout formats](#layout-formats)
- * [Layout from type](#layout-from-type)
- * [Layout from JSON](#layout-from-json)
- * [Generated layouts](#generated-layouts)
-* [Layout inheritance](#layout-inheritance)
-* [Control items](#control-items)
-* [Layout overrides](#layout-overrides)
-* [Precompiled layouts](#precompiled-layouts)
- * [Creating a precompiled layout](#creating-a-precompiled-layout)
+Define how the Input System represents input devices and controls in memory.
-Layouts are the central mechanism by which the Input System learns about types of Input Devices and Input Controls. Each layout represents a specific composition of Input Controls. By matching the description of a Device to a layout, the Input System is able to create the correct type of Device and interpret the incoming input data correctly.
+Layouts are an advanced feature you use when you support custom devices or change how existing devices behave. Each layout describes a memory format for input and the controls that read and write that data. The Input System uses layouts to create the correct device types and interpret incoming input.
->__Note__: Layouts are an advanced, mostly internal feature of the Input System. Knowledge of the layout system is mostly useful if you want to support custom Devices or change the behavior of existing Devices.
+For end-to-end custom device setup, refer to [Custom devices](custom-devices.md).
-A layout describes a memory format for input, and the Input Controls to build in order to read and write data to or from that memory.
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[About layouts](about-layouts.md)** | Learn what layouts are, how the Input System loads them, and when you need them. |
+| **[Layout formats](layout-formats.md)** | Add layouts from C# types, JSON, or the layout builder API. |
+| **[Layout inheritance](layout-inheritance.md)** | Derive a layout from an existing layout to reuse and extend control definitions. |
+| **[Control items](control-items.md)** | Configure the controls in a layout and set their properties. |
+| **[Override layout definitions](override-layout-definitions.md)** | Change an existing layout without replacing the original definition. |
+| **[Precompiled layouts](precompiled-layouts.md)** | Speed up device creation by baking layouts into precompiled C# code. |
-The Input System ships with a large set of layouts for common Control types and common Devices. For other Device types, the system automatically generates layouts based on the Device description that the Device's interface reports.
+## Additional resources
-You can browse the set of currently understood layouts from the Input Debugger.
-
-
-
-A layout has two primary functions:
-
-* Describe a certain memory layout containing input data.
-* Assign names, structure, and meaning to the Controls operating on the data.
-
-A layout can either be for a Control on a Device (for example, `Stick`), or for a Device itself (that is, anything based on [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html)).
-
-The Input System only loads layouts when they are needed (usually, when creating a new Device). To manually load a layout, you can use [`InputSystem.LoadLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_LoadLayout_System_String_). This returns an [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html) instance, which contains the final, fully merged (that is, containing any information inherited from base layouts and/or affected by layout overrides) structure of the layout.
-
-You can register new layouts through [`InputSystem.RegisterLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayout_System_String_System_String_System_Nullable_UnityEngine_InputSystem_Layouts_InputDeviceMatcher__).
-
-## Layout formats
-
-You can add new layouts layouts in one of three ways.
-
-1. Represented by C# structs and classes.
-2. In JSON format.
-3. Built on the fly at runtime using layout builders.
-
-### Layout from type
-
-In its most basic form, a layout can be expressed by a C# class derived from:
-
-* [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html) for a Control layout.
-* [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) for a Device layout.
-
-```CSharp
-// The InputControlLayout attribute is not strictly necessary here.
-// However, you can use it to set additional properties (such as
-// a custom display name for the layout).
-[InputControlLayout]
-public class MyDevice : InputDevice
-{
- public AxisControl axis { get; private set; }
- public ButtonControl button { get; private set; }
-
- protected override void FinishSetup(InputDeviceBuilder builder)
- {
- base.FinishSetup(builder);
-
- axis = builder.GetControl("axis");
- button = builder.GetControl("button");
- }
-}
-```
-
-You can then register the layout with [`InputSystem.RegisterLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayout_System_String_System_String_System_Nullable_UnityEngine_InputSystem_Layouts_InputDeviceMatcher__). This works the same for Control and for Device layouts.
-
-```CSharp
-// Note: This should generally be done from InitializeOnLoad/
-// RuntimeInitializeOnLoad code.
-InputSystem.RegisterLayout();
-```
-
-When the layout is instantiated, the system looks at every field and property defined directly in the type to potentially turn it into one or more [Control items](#control-items).
-
-1. If the field or property is annotated with [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html), the system applies the attribute's properties to the Control item. Some special defaults apply in this case:
- * If no [`offset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_offset) is set, and the attribute is applied to a field, [`offset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_offset) defaults to the offset of the field.
- * If no [`name`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_name) is set, it defaults to the name of the property/field.
- * If no [`layout`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_layout) is set, the system infers it from the type of the field/property.
-2. If the field or property has a struct type which implements [`IInputStateTypeInfo`](../api/UnityEngine.InputSystem.LowLevel.IInputStateTypeInfo.html), the field is considered to be an embedded [state struct](#using-a-state-structure) and the system recurses into the field or property to gather Controls from it.
-3. Otherwise, if the type of the field or property is based on [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html), the system adds a [Control item](#control-items) similar to case 1, where the member is annotated with [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html).
-
-#### Using a state structure
-
-When you implement support for a new Input Device, there's usually an existing data format in which the Input System receives input for the Device. The easiest way to add support for the data format is to describe it with a C# struct annotated with [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html).
-
-```CSharp
-public struct MyDeviceState : IInputStateTypeInfo
-{
- public FourCC format => new FourCC('M', 'D', 'E', 'V');
-
- [InputControl(name = "button1", layout = "Button", bit = 0)]
- [InputControl(name = "button2", layout = "Button", bit = 1)]
- [InputControl(name = "dpad", layout = "Dpad", bit = 2, sizeInBits = 4)]
- [InputControl(name = "dpad/up", bit = 2)]
- [InputControl(name = "dpad/down", bit = 3)]
- [InputControl(name = "dpad/left", bit = 4)]
- [InputControl(name = "dpad/right", bit = 5)]
- public int buttons;
-
- [InputControl(layout = "Stick")]
- public Vector2 stick;
-
- [InputControl(layout = "Axis")] // Automatically converts from byte to float.
- public byte trigger;
-}
-
-// The Device must be directed to the state struct we have created.
-[InputControlLayout(stateType = typeof(MyDeviceState)]
-public class MyDevice : InputDevice
-{
-}
-```
-
-### Layout from JSON
-
-You can also create a layout from a JSON string that contains the same information. This is mostly useful if you want to be able to store and transfer layout information separate from your code - for instance, if you want to be able to add support for new Devices dynamically without making a new build of your application. You can use [`InputControlLayout.ToJson()`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html#UnityEngine_InputSystem_Layouts_InputControlLayout_ToJson) and [`InputControlLayout.FromJson()`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html#UnityEngine_InputSystem_Layouts_InputControlLayout_FromJson_System_String_) to convert layouts to and from the format.
-
-The same layout as above looks like this in JSON format:
-
-```
-{
- "name": "MyDevice",
- "format": "MDEV",
- "controls": [
- {
- "name": "button1",
- "layout": "Button",
- "offset": 0,
- "bit": 0,
- },
- {
- "name": "button2",
- "layout": "Button",
- "offset": 0,
- "bit": 1,
- },
- {
- "name": "dpad",
- "layout": "Dpad",
- "offset": 0,
- "bit": 2,
- "sizeInBits": 4,
- },
- {
- "name": "dpad/up",
- "offset": -1,
- "bit": 2,
- },
- {
- "name": "dpad/down",
- "offset": -1,
- "bit": 3,
- },
- {
- "name": "dpad/left",
- "offset": -1,
- "bit": 4,
- },
- {
- "name": "dpad/right",
- "offset": -1,
- "bit": 5,
- },
- {
- "name": "stick",
- "layout": "Stick",
- "offset": 4,
- "format": "VEC2",
- },
- {
- "name": "trigger",
- "layout": "Axis",
- "offset": 12,
- "format": "BYTE",
-
- }
- ]
-}
-```
-
-### Generated layouts
-
-Finally, the Input System can also build layouts on the fly in code. This is useful for Device interfaces such as [HID](HID.md) that supply descriptive information for each Device.
-
-To build layouts dynamically in code, you can use the [`InputControlLayout.Builder`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.html) API.
-
-Here's the same layout from the previous examples constructed programmatically:
-
-```
-var builder = new InputControlLayout.Builder()
- .WithName("MyDevice")
- .WithFormat("MDEV");
-
-builder.AddControl("button1")
- .WithLayout("Button")
- .WithByteOffset(0)
- .WithBitOffset(0);
-
-builder.AddControl("button2")
- .WithLayout("Button")
- .WithByteOffset(0)
- .WithBitOffset(1);
-
-builder.AddControl("dpad")
- .WithLayout("Dpad")
- .WithByteOffset(0)
- .WithBitOffset(2)
- .WithSizeInBits(4);
-
-builder.AddControl("dpad/up")
- .WithByteOffset(-1)
- .WithBitOffset(2);
-
-builder.AddControl("dpad/down")
- .WithByteOffset(-1)
- .WithBitOffset(3);
-
-builder.AddControl("dpad/left")
- .WithByteOffset(-1)
- .WithBitOffset(4);
-
-builder.AddControl("dpad/right")
- .WithByteOffset(-1)
- .WithBitOffset(5);
-
-builder.AddControl("stick")
- .WithLayout("Stick")
- .WithByteOffset(4)
- .WithFormat("VEC2");
-
-builder.AddControl("trigger")
- .WithLayout("Axis")
- .WithByteOffset(12)
- .WithFormat("BYTE");
-
-var layout = builder.Build();
-```
-
-## Layout inheritance
-
-You can derive a layout from an existing layout. This process is based on merging the information from the derived layout on top of the information that the base layout contains.
-
-* For layouts defined as types, the base layout is the layout of the base type (if any).
-* For layouts defined in JSON, you can specify the base layout in the `extends` property of the root node.
-* For layouts created in code using [`InputControlLayout.Builder`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.html), you can specify a base layout using [`InputControlLayout.Builder.Extend()`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.html#UnityEngine_InputSystem_Layouts_InputControlLayout_Builder_Extend_System_String_).
-
-## Control items
-
-Each layout is comprised of zero or more Control items. Each item either describes a new Control, or modifies the properties of an existing Control. The latter can also reach down into the hierarchy and modify properties of a Control added implicitly as a child by another item.
-
-```CSharp
- // Add a dpad Control.
- [InputControl(layout = "Dpad")]
- // And now modify the properties of the "up" Control that was added by the
- // "Dpad" layout above.
- [InputControl(name = "dpad/up", displayName = "DPADUP")]
- public int buttons;
-```
-
-The following table details the properties that a Control item can have. These can be set as properties on [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html), as properties on the Control in JSON, or through methods on [`InputControlLayout.Builder.ControlBuilder`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.ControlBuilder.html).
-
-|Property|Description|
-|--------|-----------|
-|[`name`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_name)|Name of the Control. By default, this is the name of the field/property that [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html) is applied to.|
-|[`displayName`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_displayName)|Display name of the Control (for use in UI strings).|
-|[`shortDisplayName`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_shortDisplayName)|Short display name of the Control (for use in UI strings).|
-|[`layout`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_layout)|Layout to use for the Control.|
-|[`variants`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_variants)|Variants of the Control.|
-|[`aliases`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_aliases)|Aliases for the Control. These are alternative names the Control can be referred by.|
-|[`usages`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_usages)|[Usages](Controls.md#control-usages) of the Control.|
-|[`offset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_offset)|The byte offset at which the state for the Control is found.|
-|[`bit`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_bit)|The bit offset at which the state of the Control is found within its byte.|
-|[`sizeInBits`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_sizeInBits)|The total size of the Control's state, in bits.|
-|[`arraySize`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_arraySize)|If this is set to a non-zero value, the system will create an array of Controls of this size.|
-|[`parameters`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_parameters)|Any parameters to be passed to the Control. The system will apply these to any fields the Control type might have, such as [`AxisControl.scaleFactor`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_scaleFactor).|
-|[`processors`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_processors)|[Processors](Processors.md) to apply to the Control.|
-|[`noisy`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_noisy)|Whether the Control is to be considered [noisy](Controls.md#noisy-controls).|
-|[`synthetic`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_synthetic)|Whether the Control is to be considered [synthetic](Controls.md#synthetic-controls).|
-|[`defaultState`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_defaultState)|Default initial value of the state __memory__ Control.|
-|[`useStateFrom`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_useStateFrom)|For [synthetic](Controls.md#synthetic-controls) Controls, used to synthesize Control state.|
-|[`minValue`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_minValue)|The minimum value the Control can report. Used for evaluating [Control magnitude](Controls.md#control-actuation).|
-|[`maxValue`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_maxValue)|The maximum value the Control can report. Used for evaluating [Control magnitude](Controls.md#control-actuation).|
-|[`dontReset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_dontReset)|When a device ["soft" reset](Devices.md#device-resets) is performed, the state of this control will not be reset. This is useful for controls such as pointer positions which should not go to `(0,0)` on a reset. When a "hard" reset is performed, the control will still be reset to its default value.|
-
-## Layout overrides
-
-You can non-destructively change aspects of an existing layout using layout overrides. You can call [`InputSystem.RegisterLayoutOverride`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayoutOverride_System_String_System_String_) to register a layout as an override of its [base layout](#layout-inheritance). The system then adds any property present in the override to the base layout or to existing properties.
-
-```CSharp
-// Add an extra Control to the "Mouse" layout
-const string json = @"
- {
- ""name"" : ""Overrides"",
- ""extend"" : ""Mouse"",
- ""controls"" : [
- { ""name"" : ""extraControl"", ""layout"" : ""Button"" }
- ]
- }
-";
-
-InputSystem.RegisterLayoutOverride(json);
-```
-
-## Precompiled layouts
-
-Building a device at runtime from an [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html) is a slow process. The layout instance itself has to be built (which might involve reflection) and then interpreted in order to put the final [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) instance together. This process usually involves the loading of multiple [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html) instances, each of which might be the result of merging multiple layouts together (if the layout involves [inheritance](#layout-inheritance) or [overrides](#layout-overrides)).
-
-You can speed up this process up by "baking" the final form of a layout into a "precompiled layout". A precompiled layout is generated C# code that, when run, will build the corresponding device without relying on loading and interpreting an [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html). Aside from running faster, this will also create far less garbage and will not involve C# reflection (which generally causes runtime overhead by inflating the number of objects internally kept by the C# runtime).
-
->__NOTE__: Precompiled layouts must be device layouts. It is not possible to precompile the layout for an [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html).
-
-### Creating a precompiled layout
-
-The first step in setting up a precompiled layout is to generate it. To do so, open the [Input Debugger](./Debugging.md), navigate to the layout you want to precompile within the **Layouts** branch, right-click it, and select **Generate Precompiled Layout**.
-
-
-
-Unity will ask you where to store the generated code. Pick a directory in your project, enter a file name, and click **Save**.
-
- Once generated, you can register the precompiled layout with the Input System using [`InputSystem.RegisterPrecompiledLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterPrecompiledLayout__1_System_String_). The method expects a string argument containing metadata for the precompiled layout. This string is automatically emitted as a `const` inside the generated class.
-
- ```CSharp
- InputSystem.RegisterPrecompiledLayout(MyPrecompiledDevice.metadata);
- ```
-
->__IMPORTANT__: It is very important that this method is called with all relevant layout registrations being in the same state as at the time the layout was precompiled. There is no internal check whether the precompiled layout will still generate an identical result to the non-precompiled version.
-
-Once registered, a precompiled layout is automatically used whenever the layout that the precompiled layout is based on is instantiated.
-
-```CSharp
-// Let's assume you have a custom device class.
-public class MyDevice : InputDevice
-{
- // Setters for your control getters need to have at least `protected`
- // or `internal` access so the precompiled version can use them.
- [InputControl]
- public ButtonControl button { get; protected set; }
-
- // This method will *NOT* be invoked by the precompiled version. Instead, all the lookups
- // performed here will get hardcoded into the generated C# code.
- protected override void FinishSetup()
- {
- base.FinishSetup();
-
- button = GetChildControl("button1");
- }
-}
-
-// You register the device as a layout somewhere during startup.
-InputSystem.RegisterLayout();
-
-// And you register a precompiled version of it then as well.
-InputSystem.RegisterPrecompiledLayout(PrecompiledMyDevice.metadata);
-
-// Then the following will implicitly use the precompiled version.
-InputSystem.AddDevice();
-```
-
-A precompiled layout will automatically be unregistered in the following cases:
-
-* A [layout override](#layout-overrides) is applied to one of the layouts used by the precompiled Device. This also extends to [controls](Controls.md) used by the Device.
-* A layout with the same name as one of the layouts used by the precompiled Device is registered (which replaces the layout already registered under the name).
-* A [processor](Processors.md) is registered that replaces a processor used by the precompiled Device.
-
-This causes the Input System to fall back to the non-precompiled version of the layout. Note also that a precompiled layout will not be used for layouts [derived](#layout-inheritance) from the layout the precompiled version is based on. In the example above, if someone derives a new layout from `MyDevice`, the precompiled version is unaffected (it will not be unregistered) but is also not used for the newly created type of device.
-
-```CSharp
-// Let's constinue from the example above and assume that sometime
-// later, someone replaces the built-in button with an extended version.
-InputSystem.RegisterLayout("Button");
-
-// PrecompiledMyDevice has implicitly been removed now, because the ButtonControl it uses
-// has now been replaced with ExtendedButtonControl.
-```
-
-If needed, you can add `#if` checks to the generated code, if needed. The code generator will scan the start of an existing file for a line starting with `#if` and, if found, preserve it in newly generated code and generate a corresponding `#endif` at the end of the file. Similarly, you can change the generated class from `public` to `internal` and the modifier will be preserved when regenerating the class. Finally, you can also modify the namespace in the generated file with the change being preserved.
-
-The generated class is marked as `partial`, which means you can add additional overloads and other code by having a parallel, `partial` class definition.
-
-```CSharp
-// The next line will be preserved when regenerating the precompiled layout. A
-// corresponding #endif will be emitted at the end of the file.
-#if UNITY_EDITOR || UNITY_STANDALONE
-
-// If you change the namespace to a different one, the name of the namespace will be
-// preserved when you regenerate the precompiled layout.
-namepace MyNamespace
-{
- // If you change `public` to `internal`, the change will be preserved
- // when regenerating the precompiled layout.
- public partial class PrecompiledMyDevice : MyDevice
- {
- //...
-```
-
-The namespace of the generated layout will correspond to the
+- [Custom devices](custom-devices.md)
+- [Debug layouts](debug-layouts.md)
+- [Human Interface Device specification](hid-specification.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/Mouse.md b/Packages/com.unity.inputsystem/Documentation~/Mouse.md
deleted file mode 100644
index dbcb1122a0..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Mouse.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-uid: input-system-mouse
----
-# Mouse support
-
-The Input System represents mouse input with the [`Mouse`](../api/UnityEngine.InputSystem.Mouse.html) Device layout that the [`Mouse`](../api/UnityEngine.InputSystem.Mouse.html) class implements. Mice are based on the [`Pointer`](Pointers.md) layout.
-
-To query the last used or last added mouse, use [`Mouse.current`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_current).
-
-```
- var mouse = Mouse.current;
-```
-
->__Note__: The Input System does not currently support:
->* Input from multiple mice at the platform level.
->* Identifying the current display a mouse is on.
-
-## Controls
-
-In addition to the [Controls inherited from `Pointer`](Pointers.md#controls), Mouse devices implement the following Controls:
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`leftButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_leftButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The left mouse button. Same as the inherited [`Pointer.press`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_press).|
-|[`rightButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_rightButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The right mouse button.|
-|[`middleButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_middleButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|The middle mouse button.|
-|[`forwardButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_forwardButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Used for other mouse buttons where applicable.|
-|[`backButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_backButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Used for other mouse buttons where applicable.|
-|[`clickCount`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_clickCount)|[`IntegerControl`](../api/UnityEngine.InputSystem.Controls.IntegerControl.html)|A Control which lets you read the number of consecutive clicks the last mouse click belonged to, as reported by the OS. Use this to distinguish double- or multi-clicks.|
-|[`scroll`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_scroll)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|The input from the mouse scrolling control expressed as a delta in pixels since the last frame. Can come from a physical scroll wheel, or from touchpad gestures.|
-
-## Cursor warping
-
-On desktop platforms (Windows, Mac, Linux, and UWP), you can move the mouse cursor via code. Note that this moves the system's actual mouse cursor, not just Unity's internally-stored mouse position. This means that the user sees the cursor jumping to a different position, which is generally considered to be bad UX practice. It's advisable to only do this if the cursor is hidden (see the [`Cursor` API documentation](https://docs.unity3d.com/ScriptReference/Cursor.html) for more information).
-
-To move the cursor to a different position, use [`Mouse.WarpCursorPosition`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_WarpCursorPosition_UnityEngine_Vector2_). The coordinates are expressed as Unity screen coordinates, just like [`Mouse.position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position).
-
-```
- Mouse.current.WarpCursorPosition(new Vector2(123, 234));
-```
-
->__Note__: If the cursor is locked, warping the mouse position is only temporary and Unity resets the cursor to the center of the window every frame.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Pen.md b/Packages/com.unity.inputsystem/Documentation~/Pen.md
deleted file mode 100644
index 1202906f8c..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Pen.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-uid: input-system-pen
----
-# Pen, tablet, and stylus support
-
-Pen support comprises both tablets on desktops (such as the various tablets produced by Wacom), and styluses on mobile devices (such as the stylus on the Samsung Note, the Apple Pencil on iOS, or the Surface Pen on the Microsoft Surface line of notebooks).
-
-Pens generally offer pressure sensitivity, in-range detection (being able to control the cursor while not yet touching the tablet/screen surface), and often the ability to flip the pen for eraser-like behavior.
-
-Pens are represented by the [`Pen`](../api/UnityEngine.InputSystem.Pen.html) Device layout implemented by the [`Pen`](../api/UnityEngine.InputSystem.Pen.html) class. Pens are based on the [`Pointer`](Pointers.md) layout.
-
-You can query the last used or last added pen with [`Pen.current`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_current).
-
->__Note__:
->* Pen/tablet support is currently implemented on Windows, UWP, iOS, and Android. macOS is supported in Unity 2020.1+.
->* Some devices support tracking multiple pens independently. Unity's Input System doesn't support this currently.
->* iOS: The double-tap interaction on the side of the Apple Pencil is not surfaced as input at the moment. Also, no in-range detection is supported and [`inRange`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_inRange) will remain at its default value.
-
-## Controls
-
-In addition to the [Controls inherited from `Pointer`](Pointers.md#controls), pen Devices implement the following Controls:
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`tip`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_tip)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the tip of the pen touches the surface. Same as the inherited [`Pointer.press`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_press).|
-|[`eraser`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_eraser)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the eraser/back end of the pen touches the surface.|
-|[`firstBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_firstBarrelButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the first button on the barrel of the pen is pressed.|
-|[`secondBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_secondBarrelButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the second button on the barrel of the pen is pressed.|
-|[`thirdBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_thirdBarrelButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the third button on the barrel of the pen is pressed.|
-|[`fourthBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_fourthBarrelButton)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the forth button on the barrel of the pen is pressed.|
-|[`inRange`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_inRange)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the pen is currently in detection range of the tablet. If unsupported, this control will remain at a value of 1.|
-|[`tilt`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_tilt)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|Tilt of the pen relative to the surface.|
-|[`twist`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_twist)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|Rotation of the pen around its own axis. Only supported on a limited number of pens, such as the Wacom Art Pen.|
-
-## Pressure, tilt, and twist
-
-**Pressure:** You can access the pen's current pressure via [`Pen.pressure`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_pressure), where 0 means no pressure, and 1 means maximum pressure. However, pressure can go over 1 if the system applies a custom pressure curve where a pressure value of 1 doesn't require pressing the pen down all the way to the maximum force the hardware supports. If a pen doesn't support different pressure levels, the [`pressure`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_pressure) Control always returns 1.
-
-**Tilt:** If supported, the [`Pen.tilt`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_tilt) Control represents the angle at which the pen tilts towards the tablet or screen surface. The X and Y axes correspond to the respective screen axes. A value of 1 on either axis means that the pen is fully parallel to the tablet or screen surface on that axis. A value of 0 means that the pen is perpendicular to the tablet or screen surface on that axis. If a pen doesn't support tilt angles, `Pen.tilt` is always `(0,0)`.
-
-**Twist:** Some pens also support twist detection (the pen rotating around its own axis). If supported, [`Pen.twist`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_twist) represents the current rotation, where 0 means that the pen is facing up towards the Y axis, and values close to 1 mean that the pen is fully rotated clockwise around its own axis.
-
-## In-range detection
-
-A pen might not need to touch the tablet or screen surface in order to be able to control the cursor. You can use the [`inRange`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_inRange) button Control to determine whether the pen is currently in detection range. If [`inRange`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_inRange) reports as pressed, the pen registers with the tablet or screen. For Devices that don't support this feature, [`inRange`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_inRange) always reports as pressed.
-
-## Barrel buttons
-
-Pen Devices often have one or multiple buttons on the side of the pen. These are represented by the [`firstBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_firstBarrelButton), [`secondBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_secondBarrelButton), [`thirdBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_thirdBarrelButton), and [`fourthBarrelButton`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_fourthBarrelButton) where applicable.
diff --git a/Packages/com.unity.inputsystem/Documentation~/PlayerInput.md b/Packages/com.unity.inputsystem/Documentation~/PlayerInput.md
deleted file mode 100644
index f877b89d99..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/PlayerInput.md
+++ /dev/null
@@ -1,171 +0,0 @@
----
-uid: input-system-player-input
----
-# The Player Input component
-
-The Player Input component provides two related but separate features which can be useful in common game scenarios. These are:
-
-- Configuring how [Actions](Actions.md) map to methods or callbacks in the script that controls your player.
-
-- Handling local multiplayer scenarios such as player lobbies, device filtering, and screen-splitting.
-
-## The Player Input component
-
-
-*Above, the Player Input component displayed in the inspector.*
-
-### Connecting actions to methods or callbacks
-
-The **Player Input** component represents a single player, and the connection between that player's associated device, Actions, and methods or callbacks.
-
-You can use a single instance of a Player Input component in a single-player game to set up a mapping between your Input Actions and methods or callbacks in the script that controls your player.
-
-For example, by using the Player Input component, you can set up a mapping between actions such as "Jump" to C# methods in your script such as `public void OnJump()`.
-
-There are a few options for doing exactly how the Player Input component does this, such as using SendMessage, or Unity Events, which is described in more detail below.
-
-### Handling local multiplayer scenarios
-
-You can also have multiple **Player Input** components active at the same time (each on a separate instance of a prefab) along with the [**Player Input Manager**](PlayerInputManager.md) component to implement local multiplayer features, such as device filtering, and screen-splitting.
-
-In these local multiplayer scenarios, the Player Input component should be on a prefab that represents a player in your game, which the [**Player Input Manager**](PlayerInputManager.md) has a reference to. The **Player Input Manager** then instantiates players as they join the game and pairs each player instance to a unique device that the player uses exclusively (for example, one gamepad for each player). You can also manually pair devices in a way that enables two or more players to share a Device (for example, left/right keyboard splits or hot seat use).
-
-Each `PlayerInput` corresponds to one [`InputUser`](UserManagement.md). You can use [`PlayerInput.user`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_user) to query the `InputUser` from the component.
-
-## Getting started
-
-To get started using the Player Input component, use the following steps:
-
-1. [Add](https://docs.unity3d.com/Manual/UsingComponents.html) a **Player Input** component to a GameObject. This would usually be the GameObject that represents the player in your game.
-1. Assign your [Action Asset](ActionAssets.md) to the **Actions** field. This is usually the default project-wide action asset named "InputSystem_Actions"
-1. Set up Action responses, by selecting a **Behaviour** type from the Behaviour menu. The Behaviour type you select affects how you should implement the methods that handle your Action responses. See the [notification behaviors](#notification-behaviors) section further down for details. 
-
-
-## Configuring the Player Input component
-
-You can use the following properties to configure `PlayerInput`:
-
-|Property|Description|
-|--------|-----------|
-|[`Actions`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions)|The set of [Input Actions](Actions.md) associated with the player. Typically you would set this to Project-Wide Actions, however you can assign an [ActionAsset](ActionAssets.md) reference here). To receive input, each player must have an associated set of Actions. See documentation on [Actions](#actions) for details.|
-|[`Default Control Scheme`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_defaultControlScheme)|Which [Control Scheme](ActionBindings.md#control-schemes) (from what is defined in [`Actions`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions)) to enable by default.|
-|[`Default Action Map`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_defaultActionMap)|Which [Action Map](Actions.md#overview) in [`Actions`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions) to enable by default. If set to `None`, then the player starts with no Actions being enabled.|
-|[`Camera`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_camera)|The individual camera associated with the player. This is only required when employing [split-screen](PlayerInputManager.md#split-screen) setups and has no effect otherwise.|
-|[`Behavior`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_notificationBehavior)|How the `PlayerInput` component notifies game code about things that happen with the player. See documentation on [notification behaviors](#notification-behaviors).|
-
-### Actions
-
-To receive input, each player must have an associated set of Input Actions.
-
-#### Specifying the Actions to use
-The simplest workflow is to use the project-wide actions defined in the [Input Actions editor](ActionsEditor.md). However, the Player Input component also allows you to use an [Actions Asset](ActionAssets.md) to specify the actions that should be used by any instance of the component. If you set the **Actions** field to **Actions Asset**, the inspector displays a field into which you can assign an actions asset, and a **Create Actions** button which allows you to create a new actions asset. When you create these via the Player Input inspector's __Create Actions__ button, the Input System creates a default set of Actions. However, the Player Input component places no restrictions on the arrangement of Actions.
-
-#### Enabling and disabling Actions
-
-The Player Input component automatically handles enabling and disabling Actions, and also handles installing [callbacks](RespondingToActions.md#responding-to-actions-using-callbacks) on the Actions. When multiple Player Input components use the same Actions, the components automatically create [private copies of the Actions](RespondingToActions.md#using-actions-with-multiple-players). This is why, when writing input code that works with the PlayerInput component, you should not use `InputSystem.actions` because this references the "singleton" copy of the actions rather than the specific private copy associated with the PlayerInput instance you are coding for.
-
-When first enabled, the Player Input component enables all Actions from the the [`Default Action Map`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_defaultActionMap). If no default Action Map exists, the Player Input component does not enable any Actions. To manually enable Actions, you can call [`Enable`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_Enable) and [`Disable`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_Disable) on the Action Maps or Actions, like you would do [without `PlayerInput`](Actions.md). To check which Action Map is currently enabled, or to switch to a different one, use the [`PlayerInput.currentActionMap`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_currentActionMap) property. To switch Action Maps with an Action Map name, you can also call [`PlayerInput.SwitchCurrentActionMap`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_SwitchCurrentActionMap_System_String_).
-
-To disable a player's input, call [`PlayerInput.DeactivateInput`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_DeactivateInput). To re-enable it, call [`PlayerInput.ActivateInput`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_ActivateInput). The latter enables the default Action Map, if it exists.
-
-When `PlayerInput` is disabled, it automatically disables the currently active Action Map ([`PlayerInput.currentActionMap`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_currentActionMap)) and disassociate any Devices paired to the player.
-
-See the [notification behaviors](#notification-behaviors) section below for how to be notified when player triggers an Action.
-
-### When using **Send Messages** or **Broadcast Messages**
-
-When the [notification behavior](#notification-behaviors) of `PlayerInput` is set to **Send Messages** or **Broadcast Messages**, you can set your app to respond to Actions by defining methods in components like so:
-
-```CSharp
-public class MyPlayerScript : MonoBehaviour
-{
- // "jump" action becomes "OnJump" method.
-
- // If you're not interested in the value from the control that triggers the action, use a method without arguments.
- public void OnJump()
- {
- // your Jump code here
- }
-
- // If you are interested in the value from the control that triggers an action, you can declare a parameter of type InputValue.
- public void OnMove(InputValue value)
- {
- // Read value from control. The type depends on what type of controls.
- // the action is bound to.
- var v = value.Get();
-
- // IMPORTANT:
- // The given InputValue is only valid for the duration of the callback. Storing the InputValue references somewhere and calling Get() later does not work correctly.
- }
-}
-```
-
-The component must be on the same `GameObject` if you are using `Send Messages`, or on the same or any child `GameObject` if you are using `Broadcast Messages`.
-
-### When using **Invoke Unity Events**
-
-When the [notification behavior](#notification-behaviors) of `PlayerInput` is set to `Invoke Unity Events`, each Action has to be routed to a target method. The methods have the same format as the [`started`, `performed`, and `canceled` callbacks](RespondingToActions.md#action-callbacks) on [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html).
-
-```CSharp
-public class MyPlayerScript : MonoBehaviour
-{
- public void OnFire(InputAction.CallbackContext context)
- {
- }
-
- public void OnMove(InputAction.CallbackContext context)
- {
- var value = context.ReadValue();
- }
-}
-```
-
-### Notification behaviors
-
-You can use the [`Behavior`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_notificationBehavior) property in the Inspector to determine how a `PlayerInput` component notifies game code when something related to the player has occurred.
-
-The following options are available:
-
-|Behavior|Description|
-|--------|-----------|
-|[`Send Messages`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Uses [`GameObject.SendMessage`](https://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html) on the `GameObject` that the `PlayerInput` component belongs to.|
-|[`Broadcast Messages`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Uses [`GameObject.BroadcastMessage`](https://docs.unity3d.com/ScriptReference/GameObject.BroadcastMessage.html) on the `GameObject` that the `PlayerInput` component belongs to. This broadcasts the message down the `GameObject` hierarchy.|
-|[`Invoke Unity Events`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Uses a separate [`UnityEvent`](https://docs.unity3d.com/ScriptReference/Events.UnityEvent.html) for each individual type of message. When this is selected, the events available on the `PlayerInput` are accessible from the __Events__ foldout. The argument received by events triggered for Actions is the same as the one received by [`started`, `performed`, and `canceled` callbacks](RespondingToActions.md#action-callbacks). |
-|[`Invoke CSharp Events`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Similar to `Invoke Unity Events`, except that the events are plain C# events available on the `PlayerInput` API. You cannot configure these from the Inspector. Instead, you have to register callbacks for the events in your scripts. The following events are available:[`onActionTriggered`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_onActionTriggered) (collective event for all actions on the player) [`onDeviceLost`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_onDeviceLost) [`onDeviceRegained`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_onDeviceRegained) |
-
-In addition to per-action notifications, `PlayerInput` sends the following general notifications:
-
-|Notification|Description|
-|------------|-----------|
-|[`DeviceLostMessage`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_DeviceLostMessage)|The player has lost one of the Devices assigned to it. This can happen, for example, if a wireless device runs out of battery.|
-|[`DeviceRegainedMessage`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_DeviceRegainedMessage)|Notification that triggers when the player recovers from Device loss and is good to go again.|
-
-### Device assignments
-
-If the `PlayerInput` component has any Devices assigned, it matches these to the [Control Schemes](ActionBindings.md#control-schemes) in the associated Action Asset, and only enables Control Schemes which match its Input Devices.
-
-Each `PlayerInput` can have one or more Devices assigned to it. By default, no two `PlayerInput` components are assigned the same Devices, but you can force this; to do so, manually assign Devices to a player when calling [`PlayerInput.Instantiate`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_Instantiate_UnityEngine_GameObject_System_Int32_System_String_System_Int32_UnityEngine_InputSystem_InputDevice_), or call [`InputUser.PerformPairingWithDevice`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_PerformPairingWithDevice_UnityEngine_InputSystem_InputDevice_UnityEngine_InputSystem_Users_InputUser_UnityEngine_InputSystem_Users_InputUserPairingOptions_) on the `InputUser` of a `PlayerInput`.
-
-### Debug information
-
-When the Editor is in Play mode, each PlayerInput component instance displays a **Debug** section, as shown below.
-
-
-
-The Debug section shows the User number (which starts counting from zero), the control Scheme, and the devices assigned to the PlayerInput instance.
-
-### UI input
-
-The `PlayerInput` component can work together with an [`InputSystemUIInputModule`](UISupport.md#setting-up-ui-input) to drive the [UI system](UISupport.md).
-
-To set this up, assign a reference to a `InputSystemUIInputModule` component in the [`UI Input Module`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_uiInputModule) field of the `PlayerInput` component. The `PlayerInput` and `InputSystemUIInputModule` components should be configured to work with the same [`InputActionAsset`](Actions.md) for this to work.
-
-Once you've completed this setup, when the `PlayerInput` component configures the Actions for a specific player, it assigns the same Action configuration to the `InputSystemUIInputModule`. In other words, the same Action and Device configuration that controls the player now also controls the UI.
-
-If you use [`MultiplayerEventSystem`](UISupport.md#multiplayer-uis) components to dispatch UI events, you can also use this setup to simultaneously have multiple UI instances on the screen, each controlled by a separate player.
-
->**Notes**:
-> - As a general rule, if you are using the PlayerInput workflow, you should read input through callbacks as described above, however if you need to access the input actions asset directly while using the PlayerInput component, you should access the [PlayerInput component's copy of the actions](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions), not `InputSystem.actions`. This is because the PlayerInput component performs device filtering to automatically assign devices to multiple players, so each instance has its own copy of the actions filtered for each player. If you bypass this by reading `InputSystem.actions` directly, the automatic device assignment won't work.
->
-> - This component is built on top of the public Input System API. As such, they don't do anything that you can't program yourself. They are meant primarily as an easy, out-of-the-box setup that eliminates much of the need for custom scripting.
->
diff --git a/Packages/com.unity.inputsystem/Documentation~/Pointers.md b/Packages/com.unity.inputsystem/Documentation~/Pointers.md
deleted file mode 100644
index 3b498c581e..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Pointers.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-uid: input-system-pointers
----
-# Pointers
-
-[`Pointer`](../api/UnityEngine.InputSystem.Pointer.html) Devices are defined as [`InputDevices`](../api/UnityEngine.InputSystem.InputDevice.html) that track positions on a 2D surface. The Input System supports three types of pointers:
-
-* [Touch](Touch.md)
-* [Mouse](Mouse.md)
-* [Pen](Pen.md)
-
-## Controls
-
-Each of these types implements a common set of Controls. For a more detailed descriptions of these Controls, refer to their [scripting reference](../api/UnityEngine.InputSystem.Pointer.html).
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|The current pointer coordinates in window space.|
-|[`delta`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_delta)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|Provides motion delta in pixels accumulated (summed) over the duration of the current frame/update. Resets to `(0,0)` each frame. Note that the resolution of deltas depends on the specific hardware and/or platform.|
-|[`press`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_press)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the pointer or its primary button is pressed down.|
-|[`pressure`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_pressure)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)| The pressure applied with the pointer while in contact with the pointer surface. This value is normalized. This is only relevant for pressure-sensitive devices, such as tablets and some touch screens.|
-|[`radius`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_radius)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|The size of the area where the finger touches the surface. This is only relevant for touch input.|
-
-## Window space
-
-The coordinates within Player code are in the coordinate space of the Player window.
-
-Within Editor code, the coordinates are in the coordinate space of the current [`EditorWindow`](https://docs.unity3d.com/ScriptReference/EditorWindow.html). If you query [`Pointer.current.position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position) in [`UnityEditor.EditorWindow.OnGUI`](https://docs.unity3d.com/ScriptReference/EditorWindow.OnGUI.html), for example, the returned 2D vector will be in the coordinate space of your local GUI (same as [`UnityEngine.Event.mousePosition`](https://docs.unity3d.com/ScriptReference/Event-mousePosition.html)).
diff --git a/Packages/com.unity.inputsystem/Documentation~/Processors.md b/Packages/com.unity.inputsystem/Documentation~/Processors.md
index 05d1740ed3..6330119927 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Processors.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Processors.md
@@ -1,305 +1,22 @@
---
uid: input-system-processors
---
-# Processors
-
-An Input Processor takes a value and returns a processed result for it. The received value and result value must be of the same type. For example, you can use a [clamp](#clamp) Processor to clamp values from a control to a certain range.
-
->__Note__: To convert received input values into different types, see [composite Bindings](ActionBindings.md#composite-bindings).
-
-* [Using Processors](#using-processors)
- * [Processors on Bindings](#processors-on-bindings)
- * [Processors on Actions](#processors-on-actions)
- * [Processors on Controls](#processors-on-controls)
-* [Predefined Processors](#predefined-processors)
- * [Clamp](#clamp)
- * [Invert](#invert)
- * [Invert Vector 2](#invert-vector-2)
- * [Invert Vector 3](#invert-vector-3)
- * [Normalize](#normalize)
- * [Normalize Vector 2](#normalize-vector-2)
- * [Normalize Vector 3](#normalize-vector-3)
- * [Scale](#scale)
- * [Scale Vector 2](#scale-vector-2)
- * [Scale Vector 3](#scale-vector-3)
- * [Axis deadzone](#axis-deadzone)
- * [Stick deadzone](#stick-deadzone)
-* [Writing custom Processors](#writing-custom-processors)
-
-## Using Processors
-
-You can install Processors on [bindings](ActionBindings.md), [actions](Actions.md) or on [controls](Controls.md).
-
-Each Processor is [registered](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterProcessor__1_System_String_) using a unique name. To replace an existing Processor, register your own Processor under an existing name.
-
-Processors can have parameters which can be booleans, integers, or floating-point numbers. When created in data such as [bindings](./ActionBindings.md), processors are described as strings that look like function calls:
-
-```CSharp
- // This references the processor registered as "scale" and sets its "factor"
- // parameter (a floating-point value) to a value of 2.5.
-
- "scale(factor=2.5)"
-
- // Multiple processors can be chained together. They are processed
- // from left to right.
- //
- // Example: First invert the value, then normalize [0..10] values to [0..1].
-
- "invert,normalize(min=0,max=10)"
-```
-
-### Processors on Bindings
-
-When you create Bindings for your [actions](Actions.md), you can choose to add Processors to the Bindings. These process the values from the controls they bind to, before the system applies them to the Action value. For instance, you might want to invert the `Vector2` values from the controls along the Y axis before passing these values to the Action that drives the input logic for your application. To do this, you can add an [Invert Vector2](#invert-vector-2) Processor to your Binding.
-
-If you're using Actions defined in the [Input Actions Editor](ActionsEditor.md), or in an [Action Asset](ActionAssets.md), you can add any Processor to your Bindings in the Input Action editor. Select the Binding you want to add Processors to so that the right pane of the window displays the properties for that Binding. Select the Add (+) icon on the __Processors__ foldout to open a list of all available Processors that match your control type, then choose a Processor type to add a Processor instance of that type. The Processor now appears under the __Processors__ foldout. If the Processor has any parameters, you can edit them in the __Processors__ foldout.
-
-
-
-To remove a Processor, click the Remove (-) icon next to it. You can also use the up and down arrows to change the order of Processors. This affects the order in which the system processes values.
-
-If you create your Bindings in code, you can add Processors like this:
-
-```CSharp
-var action = new InputAction();
-action.AddBinding("/leftStick")
- .WithProcessor("invertVector2(invertX=false)");
-```
-
-### Processors on Actions
-
-Processors on Actions work in the same way as Processors on Bindings, but they affect all controls bound to an Action, rather than just the controls from a specific Binding. If there are Processors on both the Binding and the Action, the system processes the ones from the Binding first.
-
-You can add and edit Processors on Actions in the [Input Actions Editor](ActionsEditor.md), or in an [Action Asset](ActionAssets.md) the [same way](#processors-on-bindings) as you would for Bindings: select an Action to edit, then add one or more Processors in the right window pane.
-
-If you create your Actions in code, you can add Processors like this:
-
-```CSharp
-var action = new InputAction(processors: "invertVector2(invertX=false)");
-```
-
-### Processors on Controls
-
-You can have any number of Processors directly on an [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html), which then process the values read from the Control. Whenever you call [`ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) on a Control, all Processors on that Control process the value before it gets returned to you. You can use [`ReadUnprocessedValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadUnprocessedValue) on a Control to bypass the Processors.
-
-The Input System adds Processors to a Control during device creation, if they're specified in the Control's [layout](Layouts.md). You can't add Processors to existing Controls after they've been created, so you can only add Processors to Controls when you're [creating custom devices](Devices.md#creating-custom-devices). The devices that the Input System supports out of the box already have some useful Processors added on their Controls. For instance, sticks on gamepads have a [Stick Deadzone](#stick-deadzone) Processor.
-
-If you're using a layout generated by the Input System from a [state struct](Devices.md#step-1-the-state-struct) using [`InputControlAttributes`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html), you can specify the Processors you want to use via the [`processors`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_processors) property of the attribute, like this:
-
-```CSharp
-public struct MyDeviceState : IInputStateTypeInfo
-{
- public FourCC format => return new FourCC('M', 'Y', 'D', 'V');
-
- // Add an axis deadzone to the Control to ignore values
- // smaller then 0.2, as our Control does not have a stable
- // resting position.
- [InputControl(layout = "Axis", processors = "AxisDeadzone(min=0.2)")]
- public short axis;
-}
-```
-
-If you [create a layout from JSON](Layouts.md#layout-from-json), you can specify Processors on your Controls like this:
-
-```CSharp
-{
- "name" : "MyDevice",
- "extend" : "Gamepad", // Or some other thing
- "controls" : [
- {
- "name" : "axis",
- "layout" : "Axis",
- "offset" : 4,
- "format" : "FLT",
- "processors" : "AxisDeadzone(min=0.2)"
- }
- ]
-}
-```
-
-## Predefined Processors
-
-The Input System package comes with a set of useful Processors you can use.
-
-### Clamp
-
-|__Name__|[`Clamp`](../api/UnityEngine.InputSystem.Processors.ClampProcessor.html)|
-|---|---|
-|__Operand Type__|`float`|
-|__Parameters__|`float min` `float max`|
-
-Clamps input values to the [`min`..`max`] range.
-
-### Invert
-
-|__Name__|[`Invert`](../api/UnityEngine.InputSystem.Processors.InvertProcessor.html)|
-|---|---|
-|__Operand Type__|`float`|
-
-Inverts the values from a Control (that is, multiplies the values by -1).
-
-### Invert Vector 2
-|__Name__|[`InvertVector2`](../api/UnityEngine.InputSystem.Processors.InvertVector2Processor.html)|
-|---|---|
-|__Operand Type__|`Vector2`|
-|__Parameters__|`bool invertX` `bool invertY`|
-
-Inverts the values from a Control (that is, multiplies the values by -1). Inverts the x axis of the vector if `invertX` is true, and the y axis if `invertY` is true.
-
-### Invert Vector 3
-
-|__Name__|[`Invert Vector 3`](../api/UnityEngine.InputSystem.Processors.InvertVector3Processor.html)|
-|---|---|
-|__Operand Type__|`Vector3`|
-|__Parameters__|`bool invertX` `bool invertY` `bool invertZ`|
-
-Inverts the values from a Control (that is, multiplies the values by -1). Inverts the x axis of the vector if `invertX` is true, the y axis if `invertY` is true, and the z axis if `invertZ` is true.
-
-### Normalize
-
-|__Name__|[`Normalize`](../api/UnityEngine.InputSystem.Processors.NormalizeProcessor.html)|
-|---|---|
-|__Operand Type__|`float`|
-|__Parameters__|`float min` `float max` `float zero`|
-
-Normalizes input values in the range [`min`..`max`] to unsigned normalized form [0..1] if `min` is >= `zero`, and to signed normalized form [-1..1] if `min` < `zero`.
-
-### Normalize Vector 2
-
-|__Name__|[`NormalizeVector2`](../api/UnityEngine.InputSystem.Processors.NormalizeVector2Processor.html)|
-|---|---|
-|__Operand Type__|`Vector2`|
-
-Normalizes input vectors to be of unit length (1). This is the same as calling `Vector2.normalized`.
-
-### Normalize Vector 3
-
-|__Name__|[`NormalizeVector3`](../api/UnityEngine.InputSystem.Processors.NormalizeVector3Processor.html)|
-|---|---|
-|__Operand Type__|`Vector3`|
-
-Normalizes input vectors to be of unit length (1). This is the same as calling `Vector3.normalized`.
-
-### Scale
-
-|__Name__|[`Scale`](../api/UnityEngine.InputSystem.Processors.ScaleProcessor.html)|
-|---|---|
-|__Operand Type__|`float`|
-|__Parameters__|`float factor`|
-
-Multiplies all input values by `factor`.
-
-### Scale Vector 2
-
-|__Name__|[`ScaleVector2`](../api/UnityEngine.InputSystem.Processors.ScaleVector2Processor.html)|
-|---|---|
-|__Operand Type__|`Vector2`|
-|__Parameters__|`float x` `float y`|
-
-Multiplies all input values by `x` along the X axis and by `y` along the Y axis.
-
-### Scale Vector 3
-
-|__Name__|[`ScaleVector3`](../api/UnityEngine.InputSystem.Processors.ScaleVector3Processor.html)|
-|---|---|
-|__Operand Type__|`Vector3`|
-|__Parameters__|`float x` `float y` `float x`|
-
-Multiplies all input values by `x` along the X axis, by `y` along the Y axis, and by `z` along the Z axis.
-
-### Axis deadzone
-
-|__Name__|[`AxisDeadzone`](../api/UnityEngine.InputSystem.Processors.AxisDeadzoneProcessor.html)|
-|---|---|
-|__Operand Type__|`float`|
-|__Parameters__|`float min` `float max`|
-
-An axis deadzone Processor scales the values of a Control so that any value with an absolute value smaller than `min` is 0, and any value with an absolute value larger than `max` is 1 or -1. Many Controls don't have a precise resting point (that is, they don't always report exactly 0 when the Control is in the center). Using the `min` value on a deadzone Processor avoids unintentional input from such Controls. Also, some Controls don't consistently report their maximum values when moving the axis all the way. Using the `max` value on a deadzone Processor ensures that you always get the maximum value in such cases.
-
-### Stick deadzone
-
-|__Name__|[`StickDeadzone`](../api/UnityEngine.InputSystem.Processors.StickDeadzoneProcessor.html)|
-|---|---|
-|__Operand Type__|`Vector2`|
-|__Parameters__|`float min` `float max`|
-
-A stick deadzone Processor scales the values of a Vector2 Control, such as a stick, so that any input vector with a magnitude smaller than `min` results in (0,0), and any input vector with a magnitude greater than `max` is normalized to length 1. Many Controls don't have a precise resting point (that is, they don't always report exactly 0,0 when the Control is in the center). Using the `min` value on a deadzone Processor avoids unintentional input from such Controls. Also, some Controls don't consistently report their maximum values when moving the axis all the way. Using the `max` value on a deadzone Processor ensures that you always get the maximum value in such cases.
-
-## Writing custom Processors
-
-You can also write custom Processors to use in your Project. Custom Processors are available in the UI and code in the same way as the built-in Processors. Add a class derived from [`InputProcessor`](../api/UnityEngine.InputSystem.InputProcessor-1.html), and implement the [`Process`](../api/UnityEngine.InputSystem.InputProcessor-1.html#UnityEngine_InputSystem_InputProcessor_1_Process__0_UnityEngine_InputSystem_InputControl_) method:
-
->__IMPORTANT__: Processors must be __stateless__. This means you cannot store local state in a processor that will change depending on the input being processed. The reason for this is because processors are not part of the [input state](./Controls.md#control-state) that the Input System keeps.
-
-```CSharp
-public class MyValueShiftProcessor : InputProcessor
-{
- [Tooltip("Number to add to incoming values.")]
- public float valueShift = 0;
-
- public override float Process(float value, InputControl control)
- {
- return value + valueShift;
- }
-}
-```
-
-Now, you need to tell the Input System about your Processor. Call [`InputSystem.RegisterProcessor`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterProcessor__1_System_String_) in your initialization code. You can do so locally within the Processor class like this:
-
-```CSharp
-#if UNITY_EDITOR
-[InitializeOnLoad]
-#endif
-public class MyValueShiftProcessor : InputProcessor
-{
- #if UNITY_EDITOR
- static MyValueShiftProcessor()
- {
- Initialize();
- }
- #endif
-
- [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
- static void Initialize()
- {
- InputSystem.RegisterProcessor();
- }
-
- //...
-}
-```
-
-Your new Processor is now available in the in the [Input Actions Editor](ActionsEditor.md) and you can also add it in code like this:
-
-```CSharp
-var action = new InputAction(processors: "myvalueshift(valueShift=2.3)");
-```
+# Processors
-If you want to customize the UI for editing your Processor, create a custom [`InputParameterEditor`](../api/UnityEngine.InputSystem.Editor.InputParameterEditor-1.html) class for it:
+Use an input processor to apply processing to input values and return the result. For example, you can use a [clamp](built-in-processors.md#clamp) processor to clamp values to within a certain range.
-```CSharp
-// No registration is necessary for an InputParameterEditor.
-// The system will automatically find subclasses based on the
-// <..> type parameter.
-#if UNITY_EDITOR
-public class MyValueShiftProcessorEditor : InputParameterEditor
-{
- private GUIContent m_SliderLabel = new GUIContent("Shift By");
+| **Topic** | **Description** |
+| :--- | :--- |
+| [**Introduction to processors**](introduction-to-processors.md) | Learn what processors can do to alter input values, and how they interact with bindings, actions, and controls. |
+| [**Built-in processors**](built-in-processors.md) | Explore the processors that come built into the Input System. |
+| [**Write custom processors**](write-custom-processors.md) | Create and register your own processors for use with bindings, actions, and controls. |
+| [**Add processors to bindings and actions**](add-processors-bindings-actions.md) | Add processors to individual bindings, or to all bindings on an action, via the Editor or via code. |
+| [**Add processors to controls**](add-processors-controls.md) | Add processors to specific control inputs, including custom controls. |
- public override void OnEnable()
- {
- // Put initialization code here. Use 'target' to refer
- // to the instance of MyValueShiftProcessor that is being
- // edited.
- }
+## Additional resources
- public override void OnGUI()
- {
- // Define your custom UI here using EditorGUILayout.
- target.valueShift = EditorGUILayout.Slider(m_SliderLabel,
- target.valueShift, 0, 10);
- }
-}
-#endif
-```
+- [Bindings](bindings.md)
+- [Interactions](Interactions.md)
+- [Configure actions](configure-actions.md)
+- [Configure Bindings from code](configure-bindings-from-code.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/ProjectWideActions.md b/Packages/com.unity.inputsystem/Documentation~/ProjectWideActions.md
deleted file mode 100644
index 6248dea44f..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/ProjectWideActions.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-uid: project-wide-actions
----
-# Project-Wide Actions
-
-The Input System stores your configuration of [Input Actions](Actions.md) and their associated [Bindings](ActionBindings.md), [Action Maps](ActionsEditor.html#configure-action-maps) and [Control Schemes](ActionBindings.md#control-schemes) in an [Action Asset](ActionAssets.md) file.
-
-While it's possible to have more than one Action Asset in a project, most projects only ever need a single Action Asset. This is because an Action Asset can contain multiple [Action Maps](ActionsEditor.html#configure-action-maps), which each containing a set of actions relevant to the various parts of your project (such as UI navigation, gameplay, etc).
-
-The Input System's **project-wide actions** feature allows you to choose an individual Action Asset as being available project-wide, which means the actions within that asset are available more conveniently through the Input System API without needing to set up a reference to the Actions Asset.
-
-The Action Asset assigned as project-wide is also a [preloaded asset](https://docs.unity3d.com/ScriptReference/PlayerSettings.GetPreloadedAssets.html), loaded when your app starts up, and kept available until until it terminates.
-
-Unless you have specific project requirements that require more than one Action Asset, the recommended workflow is to use a single Action Asset assigned as the project-wide actions, as described below.
-
-## Create and Assign a Project-Wide Actions Asset
-
-To create and assign the current project-wide actions, go to **Edit** > **Project Settings** > **Input System Package**.
-
-If you don't yet have an Action Asset assigned as project-wide in your project, the Input System Package settings window displays an empty field for you to assign your action asset, and a button allowing you to create and assign one.
-
-*The Input System Package Project Settings with no project-wide actions assigned*
-
-> **Note:** If you already have an Action Asset assigned, this button is not displayed, and instead the Actions Editor is displayed, allowing you to edit the project-wide actions.
-
-To create an Action Asset with default actions pre-configured, click **"Create a new project-wide Action Asset"**. The asset is created in your project, and automatically assigned as the **project-wide actions**.
-
-The Action Asset appears in your Project view, and is named "InputSystem_Actions". This is where your new configuration of actions is saved, including any changes you make to it.
-
-
-*The new Actions Asset in your Project window*
-
-## Edit project-wide actions
-
-Once you have created and assigned project-wide actions, the Input System Package page in Project Settings displays the **Actions Editor** interface. Read more about how to use the [Actions Editor](ActionsEditor.md) to configure your actions.
-
-
-*The Input System Package Project Settings after creating and assigning the default actions*
-
-## The default actions
-
-When you create and assign default project-wide actions using the method described above, the Action Asset comes pre-configured with some default Actions such as "Move", "Jump", and more, which suit many common app and game scenarios. They are configured to read input from the most common types of input controller such as Keyboard, Mouse, Gamepad, Touchscreen and XR.
-
-These default actions mean that in many cases, you can start scripting with the Input System without any configuration by referring to the names of the default actions that are already configured for you. You can also rename and reconfigure the default actions, or delete these default configurations to suit your needs.
-
-If you’d like to delete all the default actions so that you can start from an empty configuration, you don’t need to delete the individual actions one-by-one. You can delete the each Action Map, which deletes all the Actions contained in the maps in one go.
-
-You can also delete all action maps, or reset all the actions back to the default values from the **more** (⋮) menu at the top right of the Input Actions section of the settings window, below the Project Settings window search field.
-
-
-
-> **Note:** this **more** (⋮) menu is not available when the Actions Editor is open in a separate window, it is only present in the Project Settings window.
-
-## Using project-wide actions in code
-
-The benefit of assign an Action Asset as the project-wide actions is that you can access the actions directly through the [`InputSystem.actions`](../api/UnityEngine.InputSystem.InputSystem.html) property directly, rather than needing to set up a reference to your Action Asset first.
-
-For example, you can get a reference to an action named "Move" in your project-wide actions using a line of code like this:
-
-```
- InputSystem.actions.FindAction("Move");
-```
-
-Project-wide actions are also enabled by default.
diff --git a/Packages/com.unity.inputsystem/Documentation~/RespondingToActions.md b/Packages/com.unity.inputsystem/Documentation~/RespondingToActions.md
deleted file mode 100644
index 4dd5abbd6b..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/RespondingToActions.md
+++ /dev/null
@@ -1,304 +0,0 @@
-
-# Responding to Actions
-
-There are two main techniques you can use to respond to Actions in your project. These are to either use **polling** or an **event-driven** approach.
-
-- The **Polling** approach refers to the technique of repeatedly checking the current state of the Actions you are interested in. Typically you would do this in the `Update()` method of a `MonoBehaviour` script.
-- The **Event-driven** approach involves creating your own methods in code that are automatically called when an action is performed.
-
-For most common scenarios, especially action games where the user's input should have a continuous effect on an in-game character, **Polling** is usually simpler and easier to implement.
-
-For other situations where input is less frequent and directed to various different GameObjects in your scene, an event-driven approach might be more suitable.
-
-
-## Polling Actions
-
-You can poll the current value of an Action using [`InputAction.ReadValue<>()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_ReadValue__1):
-
-```CSharp
-using UnityEngine;
-using UnityEngine.InputSystem;
-
-public class Example : MonoBehaviour
-{
- InputAction moveAction;
-
- private void Start()
- {
- moveAction = InputSystem.actions.FindAction("Move");
- }
-
- void Update()
- {
- Vector2 moveValue = moveAction.ReadValue();
- // your code would then use moveValue to apply movement
- // to your GameObject
- }
-}
-```
-
-Note that the value type has to correspond to the value type of the control that the value is being read from.
-
-There are two methods you can use to poll for `performed` [action callbacks](#action-callbacks) to determine whether an action was performed or stopped performing in the current frame.
-
-These methods differ from [`InputAction.WasPressedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame) and [`InputAction.WasReleasedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame) in that these depend directly on the [Interactions](Interactions.md) driving the action (including the [default Interaction](Interactions.md#default-interaction) if no specific interaction has been added to the action or binding).
-
-|Method|Description|
-|------|-----------|
-|[`InputAction.WasPerformedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPerformedThisFrame)|True if the [`InputAction.phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase) of the action has, at any point during the current frame, changed to [`Performed`](../api/UnityEngine.InputSystem.InputActionPhase.html#UnityEngine_InputSystem_InputActionPhase_Performed).|
-|[`InputAction.WasCompletedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasCompletedThisFrame)|True if the [`InputAction.phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase) of the action has, at any point during the current frame, changed away from [`Performed`](../api/UnityEngine.InputSystem.InputActionPhase.html#UnityEngine_InputSystem_InputActionPhase_Performed) to any other phase. This can be useful for [Button](#button) actions or [Value](#value) actions with interactions like [Press](Interactions.md#press) or [Hold](Interactions.md#hold) when you want to know the frame the interaction stops being performed. For actions with the [default Interaction](Interactions.md#default-interaction), this method will always return false for [Value](#value) and [Pass-Through](#pass-through) actions (since the phase stays in [`Started`](../api/UnityEngine.InputSystem.InputActionPhase.html#UnityEngine_InputSystem_InputActionPhase_Started) for Value actions and stays in [`Performed`](../api/UnityEngine.InputSystem.InputActionPhase.html#UnityEngine_InputSystem_InputActionPhase_Performed) for Pass-Through).|
-
-This example uses the Interact action from the [default actions](./ProjectWideActions.md#the-default-actions), which has a [Hold](Interactions.md#hold) interaction to make it perform only after the bound control is held for a period of time (for example, 0.4 seconds):
-
-```CSharp
-using UnityEngine;
-using UnityEngine.InputSystem;
-
-public class Example : MonoBehaviour
-{
- InputAction interactAction;
-
- private void Start()
- {
- interactAction = InputSystem.actions.FindAction("Interact");
- }
-
- void Update()
- {
- if (interactAction.WasPerformedThisFrame())
- {
- // your code to respond to the first frame that the Interact action is held for enough time
- }
-
- if (interactAction.WasCompletedThisFrame())
- {
- // your code to respond to the frame that the Interact action is released after being held for enough time
- }
- }
-}
-```
-
-Finally, there are three methods you can use to poll for button presses and releases:
-
-|Method|Description|
-|------|-----------|
-|[`InputAction.IsPressed()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_IsPressed)|True if the level of [actuation](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude) on the action has crossed the [press point](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint) and did not yet fall to or below the [release threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_buttonReleaseThreshold).|
-|[`InputAction.WasPressedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame)|True if the level of [actuation](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude) on the action has, at any point during the current frame, reached or gone above the [press point](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint).|
-|[`InputAction.WasReleasedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame)|True if the level of [actuation](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude) on the action has, at any point during the current frame, gone from being at or above the [press point](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint) to at or below the [release threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_buttonReleaseThreshold).|
-
-This example uses three actions called Shield, Teleport and Submit (which are not included in the [default actions](./ProjectWideActions.md#the-default-actions)):
-
-```CSharp
-using UnityEngine;
-using UnityEngine.InputSystem;
-
-public class Example : MonoBehaviour
-{
- InputAction shieldAction;
- InputAction teleportAction;
- InputAction submitAction;
-
- private void Start()
- {
- shieldAction = InputSystem.actions.FindAction("Shield");
- teleportAction = InputSystem.actions.FindAction("Teleport");
- submitAction = InputSystem.actions.FindAction("Submit");
- }
-
- void Update()
- {
- if (shieldAction.IsPressed())
- {
- // shield is active for every frame that the shield action is pressed
- }
-
- if (teleportAction.WasPressedThisFrame())
- {
- // teleport occurs on the first frame that the action is pressed, and not again until the button is released
- }
-
- if (submit.WasReleasedThisFrame())
- {
- // submit occurs on the frame that the action is released, a common technique for buttons relating to UI controls.
- }
- }
-}
-```
-
-
-
-## Responding to Actions using callbacks
-
-When you set up callbacks for your Action, the Action informs your code that a certain type of input has occurred, and your code can then respond accordingly.
-
-There are several ways to do this:
-
-1. You can use the [PlayerInput component](Workflow-PlayerInput.md) to set up callbacks in the inspector.
-1. Each Action has a [`started`, `performed`, and `canceled` callback](#action-callbacks).
-1. Each Action Map has an [`actionTriggered` callback](#inputactionmapactiontriggered-callback).
-1. The Input System has a global [`InputSystem.onActionChange` callback](#inputsystemonactionchange-callback).
-2. [`InputActionTrace`](#inputactiontrace) can record changes happening on Actions.
-
-#### The PlayerInput component
-
-The PlayerInput component is the simplest way to set up Action callbacks. It provides an interface in the inspector that allows you set up callbacks directly to your methods without requiring intermediate code. [Read more about the PlayerInput component](Workflow-PlayerInput.md).
-
-Alternatively, you can implement callbacks entirely from your own code using the following workflow:
-
-
-#### Action callbacks
-
-Every Action has a set of distinct phases it can go through in response to receiving input.
-
-|Phase|Description|
-|-----|-----------|
-|`Disabled`|The Action is disabled and can't receive input.|
-|`Waiting`|The Action is enabled and is actively waiting for input.|
-|`Started`|The Input System has received input that started an Interaction with the Action.|
-|`Performed`|An Interaction with the Action has been completed.|
-|`Canceled`|An Interaction with the Action has been canceled.|
-
-You can read the current phase of an action using [`InputAction.phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase).
-
-The `Started`, `Performed`, and `Canceled` phases each have a callback associated with them:
-
-```CSharp
- var action = new InputAction();
-
- action.started += context => /* Action was started */;
- action.performed += context => /* Action was performed */;
- action.canceled += context => /* Action was canceled */;
-```
-
-Each callback receives an [`InputAction.CallbackContext`](../api/UnityEngine.InputSystem.InputAction.CallbackContext.html) structure, which holds context information that you can use to query the current state of the Action and to read out values from Controls that triggered the Action ([`InputAction.CallbackContext.ReadValue`](../api/UnityEngine.InputSystem.InputAction.CallbackContext.html#UnityEngine_InputSystem_InputAction_CallbackContext_ReadValue__1)).
-
->__Note__: The contents of the structure are only valid for the duration of the callback. In particular, it isn't safe to store the received context and later access its properties from outside the callback.
-
-When and how the callbacks are triggered depends on the [Interactions](Interactions.md) present on the respective Bindings. If the Bindings have no Interactions that apply to them, the [default Interaction](Interactions.md#default-interaction) applies.
-
-##### `InputActionMap.actionTriggered` callback
-
-Instead of listening to individual actions, you can listen on an entire Action Map for state changes on any of the Actions in the Action Map.
-
-```CSharp
-var actionMap = new InputActionMap();
-actionMap.AddAction("action1", "/buttonSouth");
-actionMap.AddAction("action2", "/buttonNorth");
-
-actionMap.actionTriggered +=
- context => { ... };
-```
-
-The argument received is the same `InputAction.CallbackContext` structure that you receive through the [`started`, `performed`, and `canceled` callbacks](#action-callbacks).
-
->__Note__: The Input System calls `InputActionMap.actionTriggered` for all three of the individual callbacks on Actions. That is, you get `started`, `performed`, and `canceled` all on a single callback.
-
-##### `InputSystem.onActionChange` callback
-
-Similar to `InputSystem.onDeviceChange`, your app can listen for any action-related change globally.
-
-```CSharp
-InputSystem.onActionChange +=
- (obj, change) =>
- {
- // obj can be either an InputAction or an InputActionMap
- // depending on the specific change.
- switch (change)
- {
- case InputActionChange.ActionStarted:
- case InputActionChange.ActionPerformed:
- case InputActionChange.ActionCanceled:
- Debug.Log($"{((InputAction)obj).name} {change}");
- break;
- }
- }
-```
-
-
-#### `InputActionTrace`
-
-You can trace Actions to generate a log of all activity that happened on a particular set of Actions. To do so, use [`InputActionTrace`](../api/UnityEngine.InputSystem.Utilities.InputActionTrace.html). This behaves in a similar way to [`InputEventTrace`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html) for events.
-
->__Note__: `InputActionTrace` allocates unmanaged memory and needs to be disposed of so that it doesn't create memory leaks.
-
-```CSharp
-var trace = new InputActionTrace();
-
-// Subscribe trace to single Action.
-// (Use UnsubscribeFrom to unsubscribe)
-trace.SubscribeTo(myAction);
-
-// Subscribe trace to entire Action Map.
-// (Use UnsubscribeFrom to unsubscribe)
-trace.SubscribeTo(myActionMap);
-
-// Subscribe trace to all Actions in the system.
-trace.SubscribeToAll();
-
-// Record a single triggering of an Action.
-myAction.performed +=
- ctx =>
- {
- if (ctx.ReadValue() > 0.5f)
- trace.RecordAction(ctx);
- };
-
-// Output trace to console.
-Debug.Log(string.Join(",\n", trace));
-
-// Walk through all recorded Actions and then clear trace.
-foreach (var record in trace)
-{
- Debug.Log($"{record.action} was {record.phase} by control {record.control}");
-
- // To read out the value, you either have to know the value type or read the
- // value out as a generic byte buffer. Here, we assume that the value type is
- // float.
-
- Debug.Log("Value: " + record.ReadValue());
-
- // If it's okay to accept a GC hit, you can also read out values as objects.
- // In this case, you don't have to know the value type.
-
- Debug.Log("Value: " + record.ReadValueAsObject());
-}
-trace.Clear();
-
-// Unsubscribe trace from everything.
-trace.UnsubscribeFromAll();
-
-// Release memory held by trace.
-trace.Dispose();
-```
-
-Once recorded, a trace can be safely read from multiple threads as long as it is not concurrently being written to and as long as the Action setup (that is, the configuration data accessed by the trace) is not concurrently being changed on the main thread.
-
-### Action types
-
-Each Action can be one of three different [Action types](../api/UnityEngine.InputSystem.InputActionType.html). You can select the Action type in the Input Action editor window, or by specifying the `type` parameter when calling the [`InputAction()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction__ctor_System_String_UnityEngine_InputSystem_InputActionType_System_String_System_String_System_String_System_String_) constructor. The Action type influences how the Input System processes state changes for the Action. The default Action type is `Value`.
-
-#### Value
-
-This is the default Action type. Use this for any inputs which should track continuous changes to the state of a Control.
-
- [`Value`](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_Value) type actions continuously monitor all the Controls which are bound to the Action, and then choose the one which is the most actuated to be the Control driving the Action, and report the values from that Control in callbacks, triggered whenever the value changes. If a different bound Control actuated more, then that Control becomes the Control driving the Action, and the Action starts reporting values from that Control. This process is called [conflict resolution](ActionBindings.md#conflicting-inputs). This is useful if you want to allow different Controls to control an Action in the game, but only take input from one Control at the same time.
-
-When the Action initially enables, it performs an [initial state check](ActionBindings.md#initial-state-check) of all bound Controls. If any of them is actuated, the Action then triggers a callback with the current value.
-
-#### Button
-
-This is very similar to [`Value`](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_Value), but [`Button`](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_Button) type Actions can only be bound to [`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html) Controls, and don't perform an initial state check like [`Value`](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_Value) Actions do (see the Value section above). Use this for inputs that trigger an Action once every time they are pressed. The initial state check is usually not useful in such cases, because it can trigger actions if the button is still held down from a previous press when the Action was enabled.
-
-#### Pass-Through
-
- [`Pass-Through`](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_PassThrough) Actions bypass the [conflict resolution](ActionBindings.md#conflicting-inputs) process described above for `Value` Actions and don't use the concept of a specific Control driving the Action. Instead, any change to any bound Control triggers a callback with that Control's value. This is useful if you want to process all input from a set of Controls.
-
-### Debugging Actions
-
-To see currently enabled Actions and their bound Controls, use the [Input Debugger](Debugging.md#debugging-actions).
-
-You can also use the [`InputActionVisualizer`](Debugging.md#inputactionvisualizer) component from the Visualizers sample to get an on-screen visualization of an Action's value and Interaction state in real-time.
-
-### Using Actions with multiple players
-
-You can use the same Action definitions for multiple local players (for example, in a local co-op game). For more information, see documentation on the [Player Input Manager](PlayerInputManager.md) component.
diff --git a/Packages/com.unity.inputsystem/Documentation~/Sensors.md b/Packages/com.unity.inputsystem/Documentation~/Sensors.md
deleted file mode 100644
index 4bf32b3298..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Sensors.md
+++ /dev/null
@@ -1,202 +0,0 @@
----
-uid: input-system-sensors
----
-# Sensor support
-
-- [Sampling frequency](#sampling-frequency)
-- [`Accelerometer`](#accelerometer)
-- [`Gyroscope`](#gyroscope)
-- [`GravitySensor`](#gravitysensor)
-- [`AttitudeSensor`](#attitudesensor)
-- [`LinearAccelerationSensor`](#linearaccelerationsensor)
-- [`MagneticFieldSensor`](#magneticfieldsensor)
-- [`LightSensor`](#lightsensor)
-- [`PressureSensor`](#pressuresensor)
-- [`ProximitySensor`](#proximitysensor)
-- [`HumiditySensor`](#humiditysensor)
-- [`AmbientTemperatureSensor`](#ambienttemperaturesensor)
-- [`StepCounter`](#stepcounter)
-- [`HingeAngle`](#hingeangle)
-
-Sensors are [`InputDevices`](Devices.md) that measure environmental characteristics of the device that the content is running on. Unity currently supports sensors on iOS and Android. Android supports a wider range of sensors than iOS.
-
->__Note__: To test your app on iOS or Android in the editor with sensor input from your mobile device, you can use the Unity Remote as described [here](Debugging.md#unity-remote). This currently supports [`Accelerometer`](#accelerometer), [`Gyroscope`](#gyroscope), [`GravitySensor`](#gravitysensor), [`AttitudeSensor`](#attitudesensor), and [`LinearAccelerationSensor`](#linearaccelerationsensor).
-
-To determine whether a particular sensor is present, you can use its `.current` getter.
-
-```CSharp
-// Determine if a Gyroscope sensor device is present.
-if (Gyroscope.current != null)
- Debug.Log("Gyroscope present");
-```
-
-Unlike other devices, sensors are disabled by default. To enable a sensor, call [`InputSystem.EnableDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_)).
-
-```CSharp
-InputSystem.EnableDevice(Gyroscope.current);
-```
-
-To disable a sensor, call [`InputSystem.DisableDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_).
-
-```CSharp
-InputSystem.DisableDevice(Gyroscope.current);
-```
-
-To check whether a sensor is currently enabled, use [`InputDevice.enabled`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_enabled).
-
-```CSharp
-if (Gyroscope.current.enabled)
- Debug.Log("Gyroscope is enabled");
-```
-
-Each sensor Device implements a single Control which represents the data read by the sensor. The following sensors are available:
-
-|Device|Android|iOS|**WebGL**|Control|Type|
-|------|-------|---|-------|----|----|
-|[`Accelerometer`](#accelerometer)|Yes|Yes|Yes(1)|[`acceleration`](../api/UnityEngine.InputSystem.Accelerometer.html#UnityEngine_InputSystem_Accelerometer_acceleration)|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|
-|[`Gyroscope`](#gyroscope)|Yes|Yes|Yes(1)|[`angularVelocity`](../api/UnityEngine.InputSystem.Gyroscope.html#UnityEngine_InputSystem_Gyroscope_angularVelocity)|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|
-|[`GravitySensor`](#gravitysensor)|Yes|Yes|Yes(1)|[`gravity`](../api/UnityEngine.InputSystem.GravitySensor.html#UnityEngine_InputSystem_GravitySensor_gravity)|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|
-|[`AttitudeSensor`](#attitudesensor)|Yes|Yes|Yes(1)|[`attitude`](../api/UnityEngine.InputSystem.AttitudeSensor.html#properties)|[`QuaternionControl`](../api/UnityEngine.InputSystem.Controls.QuaternionControl.html)|
-|[`LinearAccelerationSensor`](#linearaccelerationsensor)|Yes|Yes|Yes(1)|[`acceleration`](../api/UnityEngine.InputSystem.LinearAccelerationSensor.html#UnityEngine_InputSystem_LinearAccelerationSensor_acceleration)|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|
-|[`MagneticFieldSensor`](#magneticfieldsensor)|Yes|No|No|[`magneticField`](../api/UnityEngine.InputSystem.MagneticFieldSensor.html#UnityEngine_InputSystem_MagneticFieldSensor_magneticField)|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|
-|[`LightSensor`](#lightsensor)|Yes|No|No|[`lightLevel`](../api/UnityEngine.InputSystem.LightSensor.html#UnityEngine_InputSystem_LightSensor_lightLevel)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|
-|[`PressureSensor`](#pressuresensor)|Yes|No|No|[`atmosphericPressure`](../api/UnityEngine.InputSystem.PressureSensor.html#UnityEngine_InputSystem_PressureSensor_atmosphericPressure)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|
-|[`ProximitySensor`](#proximitysensor)|Yes|No|No|[`distance`](../api/UnityEngine.InputSystem.ProximitySensor.html#UnityEngine_InputSystem_ProximitySensor_distance)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|
-|[`HumiditySensor`](#humiditysensor)|Yes|No|No|[`relativeHumidity`](../api/UnityEngine.InputSystem.HumiditySensor.html#UnityEngine_InputSystem_HumiditySensor_relativeHumidity)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|
-|[`AmbientTemperatureSensor`](#ambienttemperaturesensor)|Yes|No|No|[`ambientTemperature`](../api/UnityEngine.InputSystem.AmbientTemperatureSensor.html#UnityEngine_InputSystem_AmbientTemperatureSensor_ambientTemperature)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|
-|[`StepCounter`](#stepcounter)|Yes|Yes|No|[`stepCounter`](../api/UnityEngine.InputSystem.StepCounter.html#UnityEngine_InputSystem_StepCounter_stepCounter)|[`IntegerControl`](../api/UnityEngine.InputSystem.Controls.IntegerControl.html)|
-|[`HingeAngle`](#hingeangle)|Yes|No|No|[`angle`](../api/UnityEngine.InputSystem.HingeAngle.html#UnityEngine_InputSystem_HingeAngle_angle)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|
-
->__Notes__:
->1. Sensor support for WebGL on Android and iOS devices is available in Unity 2021.2
-
-## Sampling frequency
-
-Sensors sample continuously at a set interval. You can set or query the sampling frequency for each sensor using the [`samplingFrequency`](../api/UnityEngine.InputSystem.Sensor.html#UnityEngine_InputSystem_Sensor_samplingFrequency) property. The frequency is expressed in Hertz (number of samples per second).
-
-```CSharp
-// Get sampling frequency of gyro.
-var frequency = Gyroscope.current.samplingFrequency;
-
-// Set sampling frequency of gyro to sample 16 times per second.
-Gyroscope.current.samplingFrequency = 16;
-```
-
-## [`Accelerometer`](../api/UnityEngine.InputSystem.Accelerometer.html)
-
-Use the accelerometer to measure the acceleration of a device. This is useful to control content by moving a device around. It reports the acceleration measured on a device both due to moving the device around, and due to gravity pulling the device down. You can use `GravitySensor` and `LinearAccelerationSensor` to get separate values for these. Values are affected by the [__Compensate Orientation__](Settings.md#compensate-orientation) setting.
-
- The following code traces all input events on the [`Accelerometer.current`](../api/UnityEngine.InputSystem.Accelerometer.html) device.
-```CSharp
- private InputEventTrace trace;
-
- void StartTrace()
- {
- InputSystem.EnableDevice(Accelerometer.current);
-
- trace = new InputEventTrace(Accelerometer.current);
- trace.Enable();
- }
-
- void Update()
- {
- foreach (var e in trace)
- {
- //...
- }
- trace.Clear();
- }
-```
-
-## [`Gyroscope`](../api/UnityEngine.InputSystem.Gyroscope.html)
-
-Use the gyroscope to measure the angular velocity of a device. This is useful to control content by rotating a device. Values are affected by the [__Compensate Orientation__](Settings.md#compensate-orientation) setting.
-
-## [`GravitySensor`](../api/UnityEngine.InputSystem.GravitySensor.html)
-
-Use the gravity sensor to determine the direction of the gravity vector relative to a device. This is useful to control content by device orientation. This is usually derived from a hardware `Accelerometer`, by subtracting the effect of linear acceleration (see `LinearAccelerationSensor`). Values are affected by the [__Compensate Orientation__](Settings.md#compensate-orientation) setting.
-
-## [`AttitudeSensor`](../api/UnityEngine.InputSystem.AttitudeSensor.html)
-
-Use the attitude sensor to determine the orientation of a device. This is useful to control content by rotating a device. Values are affected by the [__Compensate Orientation__](Settings.md#compensate-orientation) setting.
-
-**Note**: On Android devices, there are two types of attitude sensors: [**RotationVector**](https://developer.android.com/reference/android/hardware/Sensor#TYPE_ROTATION_VECTOR) and [**GameRotationVector**](https://developer.android.com/reference/android/hardware/Sensor#TYPE_GAME_ROTATION_VECTOR). Some Android devices have both types of sensor, while other devices may only have one or the other type available. These two types of attitude sensor behave slightly differently to each other. You can [read about the differences between them here](https://developer.android.com/guide/topics/sensors/sensors_position#sensors-pos-gamerot). Because of this variety in what type of rotation sensors are available across devices, when you require input from a rotation sensor on Android devices, you should include code that checks for your preferred type of rotation sensor with a fallback to the alternative type of rotation sensor if it is not present. For example:
-
-```CSharp
-AttitudeSensor attitudeSensor = InputSystem.GetDevice();
-if (attitudeSensor == null)
-{
- attitudeSensor = InputSystem.GetDevice();
- if (attitudeSensor == null)
- Debug.LogError("AttitudeSensor is not available");
-}
-
-if (attitudeSensor != null)
- InputSystem.EnableDevice(attitudeSensor);
-```
-
-## [`LinearAccelerationSensor`](../api/UnityEngine.InputSystem.LinearAccelerationSensor.html)
-
-Use the accelerometer to measure the acceleration of a device. This is useful to control content by moving a device around. Linear acceleration is the acceleration of a device unaffected by gravity. This is usually derived from a hardware `Accelerometer`, by subtracting the effect of gravity (see `GravitySensor`). Values are affected by the [__Compensate Orientation__](Settings.md#compensate-orientation) setting.
-
-## [`MagneticFieldSensor`](../api/UnityEngine.InputSystem.MagneticFieldSensor.html)
-
-This Input Device represents the magnetic field that affects the device which is running the content. Values are in micro-Tesla (μT) and measure the ambient magnetic field in the X, Y, and Z axis.
-
-## [`LightSensor`](../api/UnityEngine.InputSystem.LightSensor.html)
-
-This Input Device represents the ambient light measured by the device which is running the content. Value is in SI lux units.
-
-## [`PressureSensor`](../api/UnityEngine.InputSystem.PressureSensor.html)
-
-This Input Device represents the atmospheric pressure measured by the device which is running the content. Value is in in hPa (millibar).
-
-## [`ProximitySensor`](../api/UnityEngine.InputSystem.ProximitySensor.html)
-
-This Input Device measures how close the device which is running the content is to the user. Phones typically use the proximity sensor to determine if the user is holding the phone to their ear or not. Values represent distance measured in centimeters.
-
->NOTE: The Samsung devices' proximity sensor is only enabled during calls and not when using speakerphone or Bluetooth earphones. This means the lock screen function won't work, allowing the user to use the display during the call. It is important to note that the proximity sensor only works during non-speakerphone or non-Bluetooth calls, as it is designed to prevent accidental touches during calls. However, the proximity sensor can work slightly differently on different Samsung phones.
-
-## [`HumiditySensor`](../api/UnityEngine.InputSystem.HumiditySensor.html)
-
-This Input Device represents the ambient air humidity measured by the device which is running the content. Values represent the relative ambient air humidity in percent.
-
-## [`AmbientTemperatureSensor`](../api/UnityEngine.InputSystem.AmbientTemperatureSensor.html)
-
-This Input Device represents the ambient air temperature measured by the device which is running the content. Values represent temperature in Celsius degrees.
-
-## [`StepCounter`](../api/UnityEngine.InputSystem.StepCounter.html)
-
-This Input Device represents the user's footstep count as measured by the device which is running the content.
-
->NOTE: To access the pedometer on iOS/tvOS devices, you need to enable the [__Motion Usage__ setting](Settings.md#iostvos) in the [Input Settings](Settings.md).
-
-## [`HingeAngle`](../api/UnityEngine.InputSystem.HingeAngle.html)
-
-This Input Device represents hinge angle for foldable devices. For ex., Google Fold Android phone.
-
-```CSharp
- [Serializable]
- class SensorCapabilities
- {
- public int sensorType;
- public float resolution;
- public int minDelay;
- }
-
- void Start()
- {
- if (HingeAngle.current != null)
- {
- InputSystem.EnableDevice(HingeAngle.current);
- var caps = JsonUtility.FromJson(HingeAngle.current.description.capabilities);
- Debug.Log($"HingeAngle Capabilities: resolution = {caps.resolution}, minDelay = {caps.minDelay}");
- }
- }
-
- void Update()
- {
- if (HingeAngle.current != null)
- Debug.Log($"HingeAngle={HingeAngle.current.angle.ReadValue()}");
- }
-```
diff --git a/Packages/com.unity.inputsystem/Documentation~/Settings.md b/Packages/com.unity.inputsystem/Documentation~/Settings.md
index e7a129913c..dd4dcca998 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Settings.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Settings.md
@@ -1,161 +1,9 @@
---
uid: input-system-settings
---
-# Input settings
-
-- [Create Settings Asset](#create-settings-asset)
-- [Update Mode](#update-mode)
-- [Background Behavior](#background-behavior)
-- [Filter Noise On Current](#filter-noise-on-current)
-- [Compensate Orientation](#compensate-orientation)
-- [Default value properties](#default-value-properties)
-- [Supported Devices](#supported-devices)
-- [Platform-specific settings](#platform-specific-settings)
-
To configure the Input System individually for each project, go to __Edit__ > __Project Settings…__ > __Input System Package__ from Unity's main menu.

-This page describes each input setting in detail.
-
-## Create Settings Asset
-
-When you first view the input settings, they are not editable, and instead a button to __Create settings asset__ is displayed at the top of the input settings window.
-
-
-
-If you want to customise the input settings, you must first click this button, which creates a settings asset in your Project. Once your project contains a settings asset, the __Create settings asset__ is no longer displayed, and the settings fields become editable. Unity saves changes to your settings in the settings asset when you save the project.
-
-If your project contains multiple settings assets, you can use the gear menu in the top-right corner of the window to choose which asset to use. You can also use this menu to create additional settings assets.
-
-
-## Update Mode
-
-This setting determines when the Input System processes input. The Input System can process input in one of three distinct ways:
-
-|Type|Description|
-|----|-----------|
-|[`Process Events In Dynamic Update`](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html)|The Input System processes events at irregular intervals determined by the current framerate.|
-|[`Process Events In Fixed Update`](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html)|The Input System processes events at fixed-length intervals. This corresponds to how [`MonoBehaviour.FixedUpdate`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html) operates. The length of each interval is determined by [`Time.fixedDeltaTime`](https://docs.unity3d.com/ScriptReference/Time-fixedDeltaTime.html).|
-|[`Process Events Manually`](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html)|The Input System does not process events automatically. Instead, it processes them whenever you call [`InputSystem.Update()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update).|
-
->__Note__: The system performs two additional types of updates in the form of [`InputUpdateType.BeforeRender`](../api/UnityEngine.InputSystem.LowLevel.InputUpdateType.html) (late update for XR tracking Devices) and [`InputUpdateType.Editor`](../api/UnityEngine.InputSystem.LowLevel.InputUpdateType.html) (for EditorWindows). Neither of these update types change how the application consumes input.
-
-## Background Behavior
-
-Background Behaviour determines what happens when [application focus](https://docs.unity3d.com/ScriptReference/Application-isFocused.html) is lost or regained, and how input behaves while the application is not in the foreground.
-
-This setting is only relevant when "Run In Background" is enabled in the [Player Settings](https://docs.unity3d.com/Manual/class-PlayerSettings.html) for the project. This setting is only supported on some platforms. On platforms such as Android and iOS, your app will not run when it is not in the foreground.
-
-In the Editor, "Run In Background" is considered to always be enabled as the player loop is kept running regardless of whether a Game View is focused or not. Also, in development players on desktop platforms, the setting is force-enabled during the build process.
-
->__Note__: In the editor, `Background Behavior` is further influenced by [`Play Mode Input Behavior`](#play-mode-input-behavior). See [Background and Focus Change Behavior](Devices.md#background-and-focus-change-behavior) for a detailed breakdown. In particular, which devices are considered as [`canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) partly depends on the [`Play Mode Input Behavior`](#play-mode-input-behavior) setting.
-
-|Setting|Description|
-|----|-----------|
-|[`Reset And Disable Non Background Devices`](../api/UnityEngine.InputSystem.InputSettings.BackgroundBehavior.html#UnityEngine_InputSystem_InputSettings_BackgroundBehavior_ResetAndDisableNonBackgroundDevices)|When focus is lost, perform a [soft reset](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) on all Devices that are not marked as [`canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) and also subsequently [disable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) them. Does not affect Devices marked as being able to run in the background. When focus is regained, [re-enable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_) any Device that has been disabled and also issue a [sync request](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_TrySyncDevice_UnityEngine_InputSystem_InputDevice_) on these Devices in order to update their current state. If a Device is issued a sync request and does not respond to it, [soft-reset](Devices.md#device-resets) the Device. This is the default setting.|
-|[`Reset And Disable All Devices`](../api/UnityEngine.InputSystem.InputSettings.BackgroundBehavior.html#UnityEngine_InputSystem_InputSettings_BackgroundBehavior_ResetAndDisableAllDevices)|When focus is lost, perform a [soft reset](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) on all Devices and also subsequently [disable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) them. When focus is regained, [re-enable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_) all Devices and also issue a [sync request](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_TrySyncDevice_UnityEngine_InputSystem_InputDevice_) on each Device in order to update it to its current state. If a device does not respond to the sync request, [soft-reset](Devices.md#device-resets) it.|
-|[`Ignore Focus`](../api/UnityEngine.InputSystem.InputSettings.BackgroundBehavior.html#UnityEngine_InputSystem_InputSettings_BackgroundBehavior_IgnoreFocus)|Do nothing when focus is lost. When focus is regained, issue a [sync request](Devices.md#device-syncs) on all Devices.|
-
-Focus behavior has implications for how [Actions](./Actions.md) behave on focus changes. When a Device is reset, Actions bound to Controls on the device will be cancelled. This ensures, for example, that a user-controlled character in your game doesn't continue to move when focus is lost while the user is pressing one of the W, A, S or D keys. The cancellation happens in such a way that Actions are guaranteed to not trigger. That is, even if an Action is set to trigger on button release, it will not get triggered when a button is down and gets reset by a [Device reset](Devices.md#device-resets).
-
-## Filter Noise On Current
-
-[//]: # (REVIEW: should this be enabled by default)
-
-This setting is disabled by default, and it's only relevant for apps that use the `.current` properties (such as [`Gamepad.current`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_current)) in the API. If your app doesn't use these properties, leave this setting disabled. Otherwise, it adds needless overhead.
-
-Whenever there is input on a Device, the system make the respective Device `.current`. For example, if a [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) receives new input, [`Gamepad.current`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_current) is assigned to that gamepad.
-
-Some Devices have noise in their input, and receive input even if nothing is interacting with them. For example, the PS4 DualShock controller generates a constant stream of input because of its built-in gyro. This means that if both an Xbox and a PS4 controller are connected, and the user is using the Xbox controller, the PS4 controller still pushes itself to the front continuously and makes itself current.
-
-To counteract this, enable noise filtering. When this setting is enabled and your application receives input, the system determines whether the input comes from a Device that has noisy Controls ([`InputControl.noisy`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_noisy)). If it does, the system also determines whether the given input contains any state changes on a Control that isn't flagged as noisy. If so, that Device becomes current. Otherwise, your application still consumes the input, which is also visible on the Device, but the Device doesn't become current.
-
->__Note__: The system doesn't currently detect most forms of noise, but does detect those on gamepad sticks. This means that if the sticks wiggle a small amount but are still within deadzone limits, the Device still becomes current. This doesn't require actuating the sticks themselves. On most gamepads, there's a small tolerance within which the sticks move when the entire device moves.
-
-## Compensate Orientation
-
-If this setting is enabled, rotation values reported by [sensors](Sensors.md) are rotated around the Z axis as follows:
-
-|Screen orientation|Effect on rotation values|
-|---|---|
-|[`ScreenOrientation.Portrait`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values remain unchanged|
-|[`ScreenOrientation.PortraitUpsideDown`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values rotate by 180 degrees.|
-|[`ScreenOrientation.LandscapeLeft`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values rotate by 90 degrees.|
-|[`ScreenOrientation.LandscapeRight`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values rotate by 270 degrees.|
-
-This setting affects the following sensors:
-* [`Gyroscope`](../api/UnityEngine.InputSystem.Gyroscope.html)
-* [`GravitySensor`](../api/UnityEngine.InputSystem.GravitySensor.html)
-* [`AttitudeSensor`](../api/UnityEngine.InputSystem.AttitudeSensor.html)
-* [`Accelerometer`](../api/UnityEngine.InputSystem.Accelerometer.html)
-* [`LinearAccelerationSensor`](../api/UnityEngine.InputSystem.LinearAccelerationSensor.html)
-
-## Default value properties
-
-|Property|Description|
-|----|-----------|
-|Default Deadzone Min|The default minimum value for [Stick Deadzone](Processors.md#stick-deadzone) or [Axis Deadzone](Processors.md#axis-deadzone) processors when no `min` value is explicitly set on the processor.|
-|Default Deadzone Max|The default maximum value for [Stick Deadzone](Processors.md#stick-deadzone) or [Axis Deadzone](Processors.md#axis-deadzone) processors when no `max` value is explicitly set on the processor.|
-|Default Button Press Point|The default [press point](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_pressPointOrDefault) for [Button Controls](../api/UnityEngine.InputSystem.Controls.ButtonControl.html), and for various [Interactions](Interactions.md). For button Controls which have analog physics inputs (such as triggers on a gamepad), this configures how far they need to be held down for the system to consider them pressed.|
-|Default Tap Time|Default duration for [Tap](Interactions.md#tap) and [MultiTap](Interactions.md#multitap) Interactions. Also used by by touchscreen Devices to distinguish taps from to new touches.|
-|Default Slow Tap Time|Default duration for [SlowTap](Interactions.md#tap) Interactions.|
-|Default Hold Time|Default duration for [Hold](Interactions.md#hold) Interactions.|
-|Tap Radius|Maximum distance between two finger taps on a touchscreen Device for the system to consider this a tap of the same touch (as opposed to a new touch).|
-|Multi Tap Delay Time|Default delay between taps for [MultiTap](Interactions.md#multitap) Interactions. Also used by touchscreen Devices to count multi-taps (See [`TouchControl.tapCount`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_tapCount)).|
-
-## Supported Devices
-
-
-
-A Project usually supports a known set of input methods. For example, a mobile app might support only touch, and a console application might support only gamepads. A cross-platform application might support gamepads, mouse, and keyboard, but might not require XR Device support.
-
-To narrow the options that the Editor UI presents to you, and to avoid creating input Devices and consuming input that your application won't use, you can restrict the set of supported Devices on a per-project basis.
-
-If __Supported Devices__ is empty, no restrictions apply, which means that the Input System adds any Device that Unity recognizes and processes input for it. However, if __Support Devices__ contains one or more entries, the Input System only adds Devices that are of one of the listed types.
-
->__Note__: When the __Support Devices__ list changes, the system removes or re-adds Devices as needed. The system always keeps information about what Devices are available for potential, which means that no Device is permanently lost as long as it stays connected.
-
-To add Devices to the list, click the Add (+) icon and choose a Device from the menu that appears.
-
-### Override in Editor
-
-In the Editor, you might want to use input Devices that the application doesn't support. For example, you might want to use a tablet in the Editor even if your application only supports gamepads.
-
-To force the Editor to add all locally available Devices, even if they're not in the list of __Supported Devices__, open the [Input Debugger](Debugging.md) (menu: __Window > Analysis > Input Debugger__), and select __Options > Add Devices Not Listed in 'Supported Devices'__.
-
-
-
->__Note__: This setting is stored as a user setting, not a project setting. This means other users who open the project in their own Editor do not share the setting.
-
-## Platform-specific settings
-
-### iOS/tvOS
-
-__Motion Usage__
- Governs access to the [pedometer](Sensors.md#stepcounter) on the device. If you enable this setting, the __Description__ field becomes editable. The text you enter into the Description field is added to your application's `Info.plist`.
-
-### Editor
-
-#### Play Mode Input Behavior
-
-__Play Mode Input Behavior__ determines how input is handled in the Editor when in play mode. Unlike in built players, in the Unity Editor the input back-ends keep running for as long as the Editor is active, regardless of whether a Game View window is focused or not. This setting determines how input should behave when focus is __not__ on any Game View – and thus [`Application.isFocused`](https://docs.unity3d.com/ScriptReference/Application-isFocused.html) is false and the player considered to be running in the background.
-
-|Setting|Description|
-|-------|-----------|
-|[`Pointers And Keyboards Respect Game View Focus`](../api/UnityEngine.InputSystem.InputSettings.EditorInputBehaviorInPlayMode.html#UnityEngine_InputSystem_InputSettings_EditorInputBehaviorInPlayMode_PointersAndKeyboardsRespectGameViewFocus)|Only [Pointer](Pointers.md) and [Keyboard](Keyboard.md) Devices require the Game View to be focused. Other Devices will route their input into the application regardless of Game View focus. This setting essentially routes any input into the game that is, by default, not used to operate the Editor UI. So, Devices such as [gamepads](Gamepad.md) will go to the application at all times when in play mode whereas keyboard input, for example, will require explicitly giving focus to a Game View window. This setting is the default.|
-|[`All Devices Respect Game View Focus`](../api/UnityEngine.InputSystem.InputSettings.EditorInputBehaviorInPlayMode.html#UnityEngine_InputSystem_InputSettings_EditorInputBehaviorInPlayMode_AllDevicesRespectGameViewFocus)|Focus on a Game View is required for all Devices. When no Game View window is focused, all input goes to the editor and not to the application. This allows other EditorWindows to receive these inputs (from gamepads, for example).|
-|[`All Device Input Always Goes To Game View`](../api/UnityEngine.InputSystem.InputSettings.EditorInputBehaviorInPlayMode.html#UnityEngine_InputSystem_InputSettings_EditorInputBehaviorInPlayMode_AllDeviceInputAlwaysGoesToGameView)|All editor input is disabled and input is considered to be exclusive to Game Views. Also, [`Background Behavior`](#background-behavior) is to be taken literally and executed like in players. Meaning, if in a certain situation, a Device is disabled in the player, it will get disabled in the editor as well. This setting most closely aligns player behavior with editor behavior. Be aware, however, that no EditorWindows will be able to see input from Devices (this does not effect IMGUI and UITK input in the Editor in general as they do not consume input from the Input System).|
-
-#### Input Action Property Drawer Mode
-
-Determines how the Inspector window displays [`InputActionProperty`](xref:UnityEngine.InputSystem.InputActionProperty) fields.
-
-This setting is not shown in the **Edit** > **Project Settings** window, it is instead only available in the Debug mode of the Inspector window of an Input Settings asset. See the Unity Manual page for [working in the Inspector](https://docs.unity3d.com/Manual/InspectorOptions.html) under section Toggle Debug Mode.
-
-|Setting|Description|
-|-------|-----------|
-|[`Compact`](../api/UnityEngine.InputSystem.InputSettings.InputActionPropertyDrawerMode.html#UnityEngine_InputSystem_InputSettings_InputActionPropertyDrawerMode_Compact)|Display the property in a compact format, using a minimal number of lines. Toggling between a reference to an input action in an asset and a directly serialized input action is done using a dropdown menu.|
-|[`Multiline Effective`](../api/UnityEngine.InputSystem.InputSettings.InputActionPropertyDrawerMode.html#UnityEngine_InputSystem_InputSettings_InputActionPropertyDrawerMode_MultilineEffective)|Display the effective action underlying the property, using multiple lines. Toggling between a reference to an input action in an asset and a directly serialized input action is done using a property that is always visible. This mode could be useful if you want to see or revert prefab overrides and hide the field that is ignored.|
-|[`Multiline Both`](../api/UnityEngine.InputSystem.InputSettings.InputActionPropertyDrawerMode.html#UnityEngine_InputSystem_InputSettings_InputActionPropertyDrawerMode_MultilineBoth)|Display both the input action and external reference underlying the property. Toggling between a reference to an input action in an asset and a directly serialized input action is done using a property that is always visible. This mode could be useful if you want to see both values of the property without needing to toggle Use Reference.|
+This section describes each input setting in detail.
diff --git a/Packages/com.unity.inputsystem/Documentation~/SupportedDevices.md b/Packages/com.unity.inputsystem/Documentation~/SupportedDevices.md
deleted file mode 100644
index a082e82a5a..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/SupportedDevices.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-uid: input-system-supported-devices
----
-# Supported Input Devices
-
-This page lists Input Device types and products that the Input System package supports, and the platforms they're supported on.
-
-## Generic
-
-Support for the following Devices doesn't require specialized support of particular products.
-
-|Device|Windows|Mac|Linux|UWP|Android|iOS|tvOS|Xbox(3)|PS4(3)|Switch(3)|WebGL|
-|------|-------|---|-----|---|-------|---|----|----|---|------|-----|
-|[Mouse](Mouse.md)|Yes|Yes|Yes|Yes|Yes|No|No|Yes|Yes|No|Yes|
-|[Keyboard](Keyboard.md)|Yes|Yes|Yes|Yes|Yes|No|No|Yes|Yes|No|Yes|
-|[Pen](Pen.md)|Yes|No (1)|No|Yes|Yes|Yes|No|No|No|No|No|
-|[Touchscreen](Touch.md)|Yes|No|No|Yes|Yes|Yes|Yes(4)|No|No|No|Yes|
-|[Sensors](Sensors.md)|No|No|No|No|Yes|Yes|No|No|No|No|Yes(5)|
-|[Joystick](#other-gamepads-joysticks-and-racing-wheels) (2)|Yes|Yes|Yes|Yes|Yes|No|No|No|No|No|Yes|
-
->__Notes__:
->1. Tablet support for macOS is coming in Unity 2020.1.
->2. Joysticks are supported as generic HIDs (See [Other gamepads, joysticks, and racing wheels](#other-gamepads-joysticks-and-racing-wheels) below).
->3. Consoles are supported using separate packages. You need to install these packages in your Project to enable console support.
->4. Indirect touches are received from Siri Remote.
->5. Sensor support for WebGL on Android and iOS devices is available in Unity 2021.2
-
-## Gamepads
-
-|Device|Windows|Mac|Linux|UWP(13)|Android|iOS(6)|tvOS(6)|Xbox(7)|PS4/PS5(7)|Switch(7)|WebGL|
-|------|-------|---|-----|---|-------|---|----|----|---|------|-----|
-|Xbox 360 (4)|Yes|Yes (3)|Yes|Yes|No|No|No|Yes|No|No|Sometimes (2)|
-|Xbox One|Yes (1)|Yes (3)|Yes (1)|Yes|Yes (1)|Yes (6)|Yes (6)|Yes|No|No|Sometimes (2)|
-|PS3/PS4|Yes (5)|Yes (5)|Yes (5)|Yes (5)|Yes (5, 8)|Yes (5, 6)|Yes (5, 6)|No|Yes|No|Sometimes (2)|
-|PS5|Yes (11)|Yes (11)|No (11)|Yes (11)|Yes (9, 11)|No (11)|No (11)|No|Yes|No|Sometimes (2)|
-|Switch|Yes (10)|Yes (10)|Yes|Yes|No|No|No|No|No|Yes|Sometimes (2)|
-|MFi (such as SteelSeries)|No|Sometimes (12)|No|No|No|Yes|Yes|No|No|No|No|
-
->__Notes__:
->1. The trigger motors on the Xbox One controller are only supported on UWP and Xbox.
->2. WebGL support varies between browsers, Devices, and operating systems.
->3. XInput controllers on Mac currently require the installation of the [Xbox Controller Driver for macOS](https://github.com/360Controller/360Controller). This driver only supports only USB connections, and doesn't support wireless dongles. However, the latest generation of Xbox One controllers natively support Bluetooth, and are natively supported on Macs as HIDs without any additional drivers when connected via Bluetooth.
->4. This includes any XInput-compatible Device.
->5. Unity doesn't support motor rumble and lightbar color over Bluetooth. Unity doesn't support the gyro or accelerometer on PS4/PS5 controllers on platforms other than the PlayStation consoles. Unity also doesn't support the DualShock 4 USB Wireless Adaptor.
-On UWP only USB connection is supported, motor rumble and lightbar are not working correctly.
->6. Unity supports Made for iOS (Mfi) certified controllers on iOS. Xbox One and PS4 controllers are only supported on iOS 13 or higher.
->7. Consoles are supported using separate packages. You need to install these packages in your Project to enable console support.
->8. Unity supports PS4 controllers on Android devices running [Android 10 or higher](https://playstation.com/en-us/support/hardware/ps4-pair-dualshock-4-wireless-with-sony-xperia-and-android).
->9. Unity supports PS5 controllers on Android devices running [Android 12 or higher](https://playstation.com/en-gb/support/hardware/pair-dualsense-controller-bluetooth/).
->10. Switch Joy-Cons are not currently supported on Windows and Mac. Some of official accessories are supported on Windows and Mac: "Hori Co HORIPAD for Nintendo Switch", "HORI Pokken Tournament DX Pro Pad", "HORI Wireless Switch Pad", "HORI Real Arcade Pro V Hayabusa in Switch Mode", "PowerA NSW Fusion Wired FightPad", "PowerA NSW Fusion Pro Controller (USB only)", "PDP Wired Fight Pad Pro: Mario", "PDP Faceoff Wired Pro Controller for Nintendo Switch", "PDP Faceoff Deluxe Wired Pro Controller for Nintendo Switch", "PDP Afterglow Wireless Switch Controller", "PDP Rockcandy Wired Controller".
->11. PS5 DualSense is supported on Windows and macOS via USB HID, though setting motor rumble and lightbar color when connected over Bluetooth is currently not supported.
->12. SteelSeries Nimbus+ supported via HID on macOS.
-On UWP only USB connection is supported, motor rumble and lightbar are not working correctly.
-On Android it's expected to be working from Android 12.
-On iOS/tvOS it's currently recognized as a generic gamepad and most controls do work.
->13. To ensure all controller types are detected on UWP, enable the HumanInterfaceDevice setting in [UWP Player Settings](https://docs.unity3d.com/Manual/class-PlayerSettingsWSA.html#Capabilities).
-
-### WebGL
-
-The Input System supports the *Standard Gamepad* mapping as specified in the [W3C Gamepad Specification](https://www.w3.org/TR/gamepad/#remapping). It also supports gamepads and joysticks that the browser surfaces without a mapping, but this support is generally limited to detecting the axes and buttons which are present, without any context as to what they mean. This means gamepads and joysticks are generally only useful when [the user manually remaps them](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html). The Input System reports these Devices as generic [`Joysticks`](../api/UnityEngine.InputSystem.Joystick.html).
-
-Support varies between browsers, Devices, and operating systems, and further differs for different browser versions, so it's not feasible to provide an up-to-date compatibility list. At the time of this publication (September 2019), Safari, Chrome, Edge, and Firefox all support the gamepad API, but only Chrome reliably maps common gamepads (Xbox and PlayStation controllers) to the W3C Standard Gamepad mapping, which allows the Input System to correctly identify and map controls.
-
->__Note__: WebGL currently doesn't support rumble.
-
-## Other gamepads, joysticks, and racing wheels
-
-The Input System supports any Device which implements the USB HID specification. However, for Devices which don't have specific [layouts](Layouts.md) implemented in the Input System, the system can only surface the information available from the HID descriptor of the Device, which limits how precisely it can describe a control. These Devices often work best when allowing the user to [manually remap the controls](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html). If you need to support a specific Device, you can also [add your own mapping for it](HID.md#creating-a-custom-device-layout). See documentation on [HID](HID.md) for more information.
diff --git a/Packages/com.unity.inputsystem/Documentation~/TableOfContents.md b/Packages/com.unity.inputsystem/Documentation~/TableOfContents.md
index 7ce975228b..aa538c078b 100644
--- a/Packages/com.unity.inputsystem/Documentation~/TableOfContents.md
+++ b/Packages/com.unity.inputsystem/Documentation~/TableOfContents.md
@@ -1,55 +1,255 @@
-
* [Introduction](index.md)
* [Installation](Installation.md)
- * [Quickstart Guide](QuickStartGuide.md)
- * [Concepts](Concepts.md)
- * [Workflows](Workflows.md)
- * [Workflow - Actions](Workflow-Actions.md)
- * [Workflow - Actions & PlayerInput](Workflow-PlayerInput.md)
- * [Workflow - Direct](Workflow-Direct.md)
-* [Using the Input System]()
- * [Project-Wide Actions](ProjectWideActions.md)
- * [Configuring Input](ActionsEditor.md)
- * [Actions](Actions.md)
- * [Responding to Actions](RespondingToActions.md)
- * [Input Action Assets](ActionAssets.md)
- * [Input Bindings](ActionBindings.md)
- * [Interactions](Interactions.md)
- * [Devices](Devices.md)
- * [Controls](Controls.md)
- * [Processors](Processors.md)
- * [Player Input Component](PlayerInput.md)
- * [Player Input Manager Component](PlayerInputManager.md)
- * [Input settings](Settings.md)
- * [Advanced Topics]()
- * [Events](Events.md)
- * [Layouts](Layouts.md)
- * [User Management](UserManagement.md)
- * [Timing and latency](timing-and-latency.md)
- * [Input events queue](timing-input-events-queue.md)
- * [Select an input processing mode](timing-select-mode.md)
- * [Optimize for dynamic update](timing-optimize-dynamic-update.md)
- * [Optimize for fixed update](timing-optimize-fixed-update.md)
- * [Avoid missed or duplicate events](timing-missed-duplicate-events.md)
- * [Mixed timing scenarios](timing-mixed-scenarios.md)
-* [Supported Input Devices](SupportedDevices.md)
- * [Pointers](Pointers.md)
- * [Touch support](Touch.md)
- * [Mouse support](Mouse.md)
- * [Pen, tablet, and stylus support](Pen.md)
- * [Keyboard support](Keyboard.md)
- * [Gamepad support](Gamepad.md)
- * [Joystick support](Joystick.md)
- * [Sensor support](Sensors.md)
- * [HID support](HID.md)
-* [UI support](UISupport.md)
- * [On-screen Controls](OnScreen.md)
-* [Editor Features](EditorFeatures.md)
- * [Using Input in the Editor](UseInEditor.md)
- * [Debugging](Debugging.md)
- * [Input testing](Testing.md)
+ * [Quick start guide](quick-start-guide.md)
+ * [Understanding Input](understanding-input.md)
+ * [Workflows](workflows.md)
+ * [Using the Actions Workflow](using-actions-workflow.md)
+ * [Using the PlayerInput Workflow](using-playerinput-workflow.md)
+ * [Using the Direct Workflow](using-direct-workflow.md)
+* [Setting up input](setting-up-input.md)
+ * [Actions](actions.md)
+ * [Input action assets](action-assets.md)
+ * [About action assets](about-action-assets.md)
+ * [About project-wide actions](about-project-wide-actions.md)
+ * [Create and assign a default project-wide actions asset](create-project-wide-actions.md)
+ * [Create an empty action asset](create-empty-action-asset.md)
+ * [Assign an existing action asset as project-wide](assign-project-wide-actions.md)
+ * [Default actions](default-actions.md)
+ * [Generate C# API from actions](generate-cs-api-from-actions.md)
+ * [Create action maps](create-edit-delete-action-maps.md)
+ * [Create, edit and delete actions](create-edit-delete-actions.md)
+ * [Configure actions](configure-actions.md)
+ * [Action and control types](action-and-control-types.md)
+ * [About action and control types](about-action-control-types.md)
+ * [Configure action type](configure-action-type.md)
+ * [Action types reference](action-type-reference.md)
+ * [Configure control type](configure-control-type.md)
+ * [Bindings](bindings.md)
+ * [Introduction to bindings](introduction-to-bindings.md)
+ * [Binding types](binding-types.md)
+ * [Composite bindings](composite-bindings.md)
+ * [Add, duplicate or delete a binding](add-duplicate-delete-binding.md)
+ * [Select a control for binding](select-control-binding.md)
+ * [Edit composite bindings](edit-composite-bindings.md)
+ * [Group bindings to control schemes](group-binding-to-control-scheme.md)
+ * [Binding resolution](binding-resolution.md)
+ * [Restrict binding to a specific device](restrict-binding-resolution-to-device.md)
+ * [Binding conflicts](binding-conflicts.md)
+ * [Initial state checks](binding-initial-state-checks.md)
+ * [Controls](controls.md)
+ * [Introduction to controls](introduction-to-controls.md)
+ * [Control hierarchies](control-hierarchies.md)
+ * [Control types reference](control-types-reference.md)
+ * [Control usages](control-usages.md)
+ * [Control paths](control-paths.md)
+ * [Control state](control-state.md)
+ * [Record control state history](record-control-state-history.md)
+ * [Control actuation](control-actuation.md)
+ * [Noisy controls](noisy-controls.md)
+ * [Synthetic controls](synthetic-controls.md)
+ * [Optimizing controls](optimize-controls.md)
+ * [Controls schemes](control-schemes.md)
+ * [Interactions](Interactions.md)
+ * [Introduction to interactions](introduction-interactions.md)
+ * [Apply interactions to Bindings](apply-interactions-bindings.md)
+ * [Apply Interactions to Actions](apply-interactions-actions.md)
+ * [Predefined interactions](predefined-interactions.md)
+ * [Default Interactions](default-interactions.md)
+ * [Built-in Interactions](built-in-interactions.md)
+ * [Write custom interactions](write-custom-interactions.md)
+ * [Processors](processors.md)
+ * [Introduction to processors](introduction-to-processors.md)
+ * [Built-in processors](built-in-processors.md)
+ * [Write custom processors](write-custom-processors.md)
+ * [Add processors to bindings and actions](add-processors-bindings-actions.md)
+ * [Add processors to controls](add-processors-controls.md)
+ * [Input Actions Editor references](actions-editor.md)
+ * [Input Actions Editor window reference](input-actions-editor-window-reference.md)
+ * [Action Properties panel reference](action-properties-panel-reference.md)
+ * [Binding Properties panel reference](binding-properties-panel-reference.md)
+ * [Control Schemes and Devices menu reference](control-schemes-devices-menu-reference.md)
+ * [Configure input from code](configure-input-from-code.md)
+ * [Declare stand alone actions](declare-standalone-actions.md)
+ * [Configure input from JSON](configure-input-from-json.md)
+ * [Configure Bindings from code](configure-bindings-from-code.md)
+* [Responding to input](respond-to-input.md)
+ * [About responding to input](about-responding-to-input.md)
+ * [Enabling actions](enable-actions.md)
+ * [Polling actions](polling-actions.md)
+ * [Set callbacks on actions](set-callbacks-on-actions.md)
+ * [Read devices directly](read-devices-directly.md)
+ * [Scripting with actions API overview](api-overview.md)
+ * [The Player Input component](player-input-component.md)
+ * [About the Player Input Component](about-player-input-component.md)
+ * [Get started with the Player Input component](get-started-player-input-component.md)
+ * [Select a notification behavior](select-notification-behavior.md)
+ * [Configure Unity Events](configure-unity-events.md)
+ * [Device Assignments](device-assignments.md)
+ * [Debug Player Input Component](debug-player-input-component.md)
+ * [Use PlayerInput Component with UI](use-player-input-component-ui.md)
+ * [Local multiplayer scenarios](local-multiplayer-scenarios.md)
+ * [Set up PlayerInput Component for local multiplayer](set-up-player-input-component-local-multiplayer.md)
+ * [The Player Input Manager Component](player-input-manager-component.md)
+ * [Get started with the Player Input Manager component](get-started-player-input-mananger-component.md)
+ * [Configure the Player Input Manager](configure-player-input-manager-component.md)
+ * [Set up split-screen local multiplayer](set-up-split-screen-local-multiplayer.md)
+* [User rebinding at runtime](user-rebinding-runtime.md)
+ * [Look up bindings](look-up-bindings.md)
+ * [Display bindings](display-bindings.md)
+ * [Rebind an action at runtime](rebind-action-runtime.md)
+ * [Save and load rebinds](save-load-rebinds.md)
+ * [Restore original bindings](restore-original-bindings.md)
+* [Input settings](input-settings.md)
+ * [Create a settings asset](create-settings-asset.md)
+ * [Update Mode](update-mode.md)
+ * [Background behavior](background-behavior.md)
+ * [Compensate orientation](compensate-orientation.md)
+ * [Default value properties](default-value-properties.md)
+ * [Supported devices](supported-devices.md)
+ * [Platform-specific settings](platform-specific-settings.md)
+* [Devices](devices.md)
+ * [Types of input devices](devices-overview.md)
+ * [Pointer devices](devices-pointers.md)
+ * [Pointer devices introduction](pointers-introduction.md)
+ * [Touch devices](devices-touch.md)
+ * [Touch devices introduction](touch-introduction.md)
+ * [Touch polling](touch-polling.md)
+ * [Simulate touches](simulate-touch-input.md)
+ * [Bind touch input to an action](bind-touch-input.md)
+ * [Mouse devices](devices-mouse.md)
+ * [Mouse devices introduction](mouse-introduction.md)
+ * [Query and control mouse devices in code](query-mouse-devices.md)
+ * [Pen devices](devices-pen.md)
+ * [Pen devices introduction](pen-introduction.md)
+ * [Query pen devices in code](query-pen-devices.md)
+ * [Keyboards](devices-keyboard.md)
+ * [Keyboard devices introduction](keyboards-introduction.md)
+ * [Query keyboard devices in code](query-keyboards.md)
+ * [Read text input](read-keyboard-text-input.md)
+ * [Joystick support](devices-joysticks.md)
+ * [Gamepads](devices-gamepads.md)
+ * [Gamepads introduction](gamepads-introduction.md)
+ * [PlayStation gamepads](gamepads-playstation.md)
+ * [Switch gamepads](gamepads-switch.md)
+ * [Xbox gamepads](gamepads-xbox.md)
+ * [Query and control gamepads in code](query-gamepads.md)
+ * [Gamepad polling](gamepad-polling.md)
+ * [Gamepad haptics](gamepad-haptics.md)
+ * [Sensors](devices-sensors.md)
+ * [Introduction to sensors](sensors-introduction.md)
+ * [Query sensors in code](query-sensors.md)
+ * [Supported sensors reference](supported-sensors-reference.md)
+ * [Human Interface Device specification](hid-specification.md)
+ * [Human Interface Device specification introduction](hid-specification-introduction.md)
+ * [Create a custom device layout](hid-create-custom-layout.md)
+ * [Use an existing input device to create a layout](hid-create-custom-layout-existing.md)
+ * [Use a custom class to create a layout](hid-create-custom-layout-class.md)
+ * [Supported devices reference](supported-devices-reference.md)
+ * [Devices (scripting)](devices-scripting.md)
+ * [Device descriptions](device-descriptions.md)
+ * [Device capabilities](device-capabilities.md)
+ * [Device matching](device-matching.md)
+ * [Device lifecycle](device-lifecycle.md)
+ * [Create a device](create-device.md)
+ * [Remove a device](remove-device.md)
+ * [Reset a device](reset-device.md)
+ * [Sync a device](sync-device.md)
+ * [Enable and disable devices](enable-disable-devices.md)
+ * [Device background and focus changes](device-background-focus-changes.md)
+ * [Devices and domain reloads](devices-domain-reloads.md)
+ * [Native devices](native-devices.md)
+ * [Device IDs](device-ids.md)
+ * [Device usages](device-usages.md)
+ * [Device commands](device-commands.md)
+ * [Send a command to a device](send-command-to-device.md)
+ * [Add a custom device command](add-custom-device-command.md)
+ * [Device states](device-states.md)
+ * [Monitor device state changes](monitor-device-state-changes.md)
+ * [Synthesize a device state change](synthesize-device-state-change.md)
+ * [Working with devices](working-with-devices.md)
+ * [Monitor devices](monitor-devices.md)
+ * [Manually add and remove devices](manually-add-remove-devices.md)
+ * [Custom devices](custom-devices.md)
+ * [Input events](input-events.md)
+ * [Types of events](types-of-events.md)
+ * [Listen to events](listen-to-events.md)
+ * [Read state events](read-state-events.md)
+ * [Create events](create-events.md)
+ * [Record events](record-events.md)
+ * [Event processing](event-processing.md)
+ * [Event merging](event-merging.md)
+ * [Create a custom device](create-custom-device.md)
+ * [Step 1 The state struct](step-1-state-struct.md)
+ * [Step 2 The Device class](step-2-device-class.md)
+ * [Step 3 The Update method](step-3-update-method.md)
+ * [Step 4 Device registration and creation](step-4-device-registration-creation.md)
+ * [Step 5 current and all (optional)](step-5-current-all-optional.md)
+ * [Step 6 Device Commands (Optional)](step-6-device-commands-optional.md)
+* [Input for user interfaces](ui-input.md)
+ * [Supported UI systems](supported-ui-systems.md)
+ * [Understand UI system compatibility](understand-ui-compatibility.md)
+ * [Using UI Input Module for UI support](using-ui-input-module.md)
+ * [Introduction to the UI Input Module](introduction-ui-input-module.md)
+ * [Supported input types in the UI Input Module](supported-ui-input-types.md)
+ * [Pointer input UI support](supported-ui-input-types-pointer.md)
+ * [Navigation input UI support](supported-ui-input-types-navigation.md)
+ * [Tracked input UI support](supported-ui-input-types-tracked.md)
+ * [Access the UI Input Module](access-ui-input-module.md)
+ * [UI Input Module component reference](ui-input-module-reference.md)
+ * [Use IMGUI alongside the Input System package](use-imgui-alongside-input-system.md)
+ * [Configure UI Input Actions](configure-ui-input-action-map.md)
+ * [Default UI Action Map reference](ui-action-map-reference.md)
+ * [Handling input target ambiguity](handling-input-target-ambiguity.md)
+ * [Use a Virtual Mouse for UI cursor control](virtual-mouse-ui-cursor-control.md)
+ * [Introduction to Virtual Mouse for UI cursor control](introduction-virtual-mouse.md)
+ * [Configure a Virtual Mouse](configure-virtual-mouse-input.md)
+ * [Virtual Mouse component reference](virtual-mouse-component-reference.md)
+ * [Multiplayer UI input](multiplayer-ui-input.md)
+ * [Introduction to multiplayer UI input](introduction-multiplayer-ui-input.md)
+ * [Configure multiplayer UI input](configure-multiplayer-ui-input.md)
+ * [Create on-screen controls](on-screen-controls.md)
+ * [Introduction to on-screen controls](introduction-on-screen-controls.md)
+ * [Create an on-screen button control](create-on-screen-button-control.md)
+ * [Create an on-screen stick control](create-on-screen-stick-control.md)
+ * [Create a custom on-screen control](create-custom-on-screen-control.md)
+* [Editor features](EditorFeatures.md)
+ * [Read input in Editor Windows](read-input-editor-windows.md)
+ * [Use mobile device input in the Editor (Unity Remote)](use-mobile-device-input-editor-unity-remote.md)
+ * [See and record input event flow](see-record-input-event-flow.md)
+* [Debugging](debugging.md)
+ * [The input debugger window](the-input-debugger-window.md)
+ * [Debug a device](debug-device.md)
+ * [Debug an action](debug-action.md)
+ * [Debug users and PlayerInput](debug-users-playerinput.md)
+ * [Debug layouts](debug-layouts.md)
+ * [Trace actions](trace-actions.md)
+ * [Visualizers](visualizers.md)
+ * [Visualise input controls](visualise-input-controls.md)
+ * [Visualise actions](visualise-actions.md)
+ * [Device Simulation](device-simulation.md)
+* [Testing](testing.md)
+ * [Set up test assemblies](set-up-test-assemblies.md)
+ * [Set up test fixtures](set-up-test-fixtures.md)
+ * [Write tests](write-tests.md)
+* [Layouts](layouts.md)
+ * [About layouts](about-layouts.md)
+ * [Layout formats](layout-formats.md)
+ * [Add a layout from C#](add-layout-from-cs.md)
+ * [Add a layout from JSON](add-layout-from-json.md)
+ * [Add a layout using Layout Builder](add-layout-using-layout-builder.md)
+ * [Layout inheritance](layout-inheritance.md)
+ * [Control items](control-items.md)
+ * [Override layout definitions](override-layout-definitions.md)
+ * [Precompiled layouts](precompiled-layouts.md)
+ * [Create a precompiled layout](create-precompiled-layout.md)
+* [User management](user-management.md)
+ * [About user management](about-user-management.md)
+ * [Create a user paired with an input device](create-user-paired-with-input-device.md)
+ * [Handle loss of a device](handle-loss-of-device.md)
+* [Migrate from the old input system](migrate-from-old-input-system.md)
+ * [Enable the correct input system](enable-correct-input-system.md)
+ * [Corresponding old and new APIs](corresponding-old-new-api.md)
* [How do I...?](HowDoI.md)
* [Architecture](Architecture.md)
-* [Migrating from the old Input Manager](Migration.md)
-* [Contributing](Contributing.md)
-* [Known Limitations](KnownLimitations.md)
+* [Contribute to the Input System source code](Contributing.md)
+* [Known limitations](KnownLimitations.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/Testing.md b/Packages/com.unity.inputsystem/Documentation~/Testing.md
index 84dd300451..62d4813878 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Testing.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Testing.md
@@ -1,224 +1,21 @@
---
uid: input-system-testing
---
-# Input testing
-The Input System has built-in support for writing automated input tests. You can drive input entirely from code, without any dependencies on platform backends and physical hardware devices. The automated input tests you write consider the generated input to be the same as input generated at runtime by actual platform code.
+# Testing
-## Setting up test assemblies
+Write automated input tests that drive the Input System from code without physical devices.
-To set up a test assembly that uses the Input System's automation framework, follow these steps:
+The Input System includes support for automated input tests. Generated input in tests is treated the same as input from platform backends at runtime, so you can verify gameplay and UI logic without depending on connected hardware. Work through the topics below in order: configure your test assemblies, set up a test fixture, then write tests.
-1. In the `Packages/manifest.json` file of your project, `com.unity.inputsystem` must be listed in `testables`. This is necessary for test code that comes with the package to be included with test builds of your project. You can, for example, add this after the `dependencies` property like so:
- ```
- },
- "testables" : [
- "com.unity.inputsystem"
- ]
- ```
-2. Create a new assembly definition (menu: __Create > Assembly Definition__) or go to an assembly definition for a test assembly that you have already created.
-3. Add references to `nunit.framework.dll`, `UnityEngine.TestRunner`, and `UnityEditor.TestRunner` (as described in [How to create a new test assembly](https://docs.unity3d.com/Packages/com.unity.test-framework@1.0/manual/workflow-create-test-assembly.html)), as well as `Unity.InputSystem` and `Unity.InputSystem.TestFramework` for the Input System.
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Set up test assemblies](set-up-test-assemblies.md)** | Configure your project so Input System test code is included in test builds. |
+| **[Set up test fixtures](set-up-test-fixtures.md)** | Run each test against an isolated Input System instance using InputTestFixture. |
+| **[Write tests](write-tests.md)** | Add devices and simulate input using the InputTestFixture API. |
-
+## Additional resources
-## Setting up test fixtures
-
-Use [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) to create an isolated version of the Input System for tests. The fixture sets up a blank, default-initialized version of the Input System for each test, and restores the Input System to its original state after the test completes. The default-initialized version has all built-in registrations (such as layout and processors), but doesn't have any pre-existing Input Devices.
-
->__NOTE:__ [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) will not have custom registrations performed from Unity startup code such as `[InitializeOnLoad]` or `[RuntimeInitializeOnLoadMethod]`. Layouts needed during tests have to be manually registered as part of the test setup.
-
-You can use the fixture as a base class for your own fixture:
-
-```CSharp
-class MyTests : InputTestFixture
-{
- [Test]
- public void CanPressButtonOnGamepad()
- {
- var gamepad = InputSystem.AddDevice();
- Press(gamepad.buttonSouth);
- }
-
- // If you need custom setup and tear-down logic, override the methods inherited
- // from InputTestFixture.
- // IMPORTANT: If you use NUnit's [Setup] and [TearDown] attributes on methods in your
- // test fixture, this will *override* the methods inherited from
- // InputTestFixture and thus cause them to not get executed. Either
- // override the methods as illustrated here or call the Setup() and
- // TearDown() methods of InputTestFixture explicitly.
- public override void Setup()
- {
- base.Setup();
- // Add setup code here.
- }
- public override void TearDown()
- {
- // Add teardown code here.
- base.TearDown();
- }
-}
-```
-
->__IMPORTANT:__ If you do this, do __not__ add a `[SetUp]` or `[TearDown]` method. Doing so will cause the methods in [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) to not be called, thus leading to the test fixture not properly initializing or shutting down. Instead, override the `Setup` and/or `TearDown` method inherited from `InputTestFixture`.
-
-Alternatively, you can instantiate it in your fixture:
-
-```CSharp
-[TestFixture]
-class MyTestFixture
-{
- private InputTestFixture input = new InputTestFixture();
-
- // NOTE: You have to manually call Setup() and TearDown() in this scenario.
-
- [SetUp]
- void Setup()
- {
- input.Setup();
- }
-
- [TearDown]
- void TearDown()
- {
- input.TearDown();
- }
-}
-```
-
-This is especially useful when creating a larger setup for game testing using `PrebuiltSetup`.
-
-```CSharp
-[PrebuildSetup("GameTestPrebuildSetup")]
-public class GameTestFixture
-{
- public Game game { get; set; }
- public InputTestFixture input { get; set; }
-
- public Mouse mouse { get; set; }
- public Keyboard keyboard { get; set; }
- public Touchscreen touchscreen { get; set; }
- public Gamepad gamepad { get; set; }
-
- //...
-}
-
-#if UNITY_EDITOR
-public class GameTestPrebuildSetup : IPrebuildSetup
-{
- public void Setup()
- {
- UnityEditor.EditorBuildSettings.scenes = new[]
- {
- new UnityEditor.EditorBuildSettingsScene("Assets/Scenes/Main.unity", true)
- };
- }
-}
-#endif
-```
-
-Note that you do __not__ generally need to clean up any input-related data you set up. This includes devices you add, layouts you registered, [`InputSettings`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_settings) you modify, and any other alteration to the state of [`InputSystem`](../api/UnityEngine.InputSystem.InputSystem.html). [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) will automatically throw away the current state of the Input System and restore the state from before the test was started.
-
-## Writing tests
-
-When writing a test, use [`InputSystem.AddDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice__1_System_String_) to add new Devices.
-
-```CSharp
- [Test]
- public void PlayerInput_CanInstantiatePlayer_WithSpecificControlScheme()
- {
- InputSystem.AddDevice();
- var keyboard = InputSystem.AddDevice();
- var mouse = InputSystem.AddDevice();
-
- var prefab = new GameObject();
- prefab.SetActive(false);
- var prefabPlayerInput = prefab.AddComponent();
- prefabPlayerInput.actions = InputActionAsset.FromJson(kActions);
-
- var player = PlayerInput.Instantiate(prefab, controlScheme: "Keyboard&Mouse");
-
- Assert.That(player.devices, Is.EquivalentTo(new InputDevice[] { keyboard, mouse }));
- Assert.That(player.controlScheme, Is.EqualTo("Keyboard&Mouse"));
- }
-```
-
-To feed input, the easiest way is to use the [`Press(button)`](../api/UnityEngine.InputSystem.InputTestFixture.html#UnityEngine_InputSystem_InputTestFixture_Press_UnityEngine_InputSystem_Controls_ButtonControl_System_Double_System_Double_System_Boolean_), [`Release(button)`](../api/UnityEngine.InputSystem.InputTestFixture.html#UnityEngine_InputSystem_InputTestFixture_Release_UnityEngine_InputSystem_Controls_ButtonControl_System_Double_System_Double_System_Boolean_), [`PressAndRelease(button)`](../api/UnityEngine.InputSystem.InputTestFixture.html#UnityEngine_InputSystem_InputTestFixture_PressAndRelease_UnityEngine_InputSystem_Controls_ButtonControl_System_Double_System_Double_System_Boolean_), `Set(control,value)`, and [`Trigger(action)`](../api/UnityEngine.InputSystem.InputTestFixture.html#UnityEngine_InputSystem_InputTestFixture_Trigger_UnityEngine_InputSystem_InputAction_) helper methods provided by [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html).
-
-```CSharp
- [Test]
- public void Actions_WhenDisabled_CancelAllStartedInteractions()
- {
- var gamepad = InputSystem.AddDevice();
-
- var action1 = new InputAction("action1", binding: "/buttonSouth", interactions: "Hold");
- var action2 = new InputAction("action2", binding: "/leftStick");
-
- action1.Enable();
- action2.Enable();
-
- Press(gamepad.buttonSouth);
- Set(gamepad.leftStick, new Vector2(0.123f, 0.234f));
-
- using (var trace = new InputActionTrace())
- {
- trace.SubscribeTo(action1);
- trace.SubscribeTo(action2);
-
- runtime.currentTime = 0.234f;
- runtime.advanceTimeEachDynamicUpdate = 0;
-
- action1.Disable();
- action2.Disable();
-
- var actions = trace.ToArray();
-
- Assert.That(actions.Length, Is.EqualTo(2));
- //...
- }
- }
-```
-
-Alternatively, you can use code to feed arbitrary input events into the system, and run arbitrary input updates:
-
-```CSharp
- [Test]
- public void PlayerInput_JoiningPlayerThroughButtonPress_WillFailIfDeviceIsNotUsableWithPlayerActions()
- {
- var playerPrefab = new GameObject();
- playerPrefab.SetActive(false);
- playerPrefab.AddComponent();
- playerPrefab.GetComponent().actions = InputActionAsset.FromJson(kActions);
-
- var manager = new GameObject();
- var listener = manager.AddComponent();
- var managerComponent = manager.AddComponent();
- managerComponent.joinBehavior = PlayerJoinBehavior.JoinPlayersWhenButtonIsPressed;
- managerComponent.playerPrefab = playerPrefab;
-
- // Create a Device based on the HID layout with a single button control.
- const string kLayout = @"
- {
- ""name"" : ""TestDevice"",
- ""extend"" : ""HID"",
- ""controls"" : [
- { ""name"" : ""button"", ""layout"" : ""Button"" }
- ]
- }
- ";
-
- InputSystem.RegisterLayout(kLayout);
- var device = InputSystem.AddDevice("TestDevice");
-
- using (StateEvent.From(device, out var eventPtr))
- {
- ((ButtonControl)device["button"]).WriteValueIntoEvent(1f, eventPtr);
- InputSystem.QueueEvent(eventPtr);
- InputSystem.Update();
- }
-
- Assert.That(listener.messages, Is.Empty);
- Assert.That(PlayerInput.all, Is.Empty);
- }
-```
-
->__Note__: For reference, you can find the tests for the Input System itself in its [GitHub repository](https://github.com/Unity-Technologies/InputSystem/tree/stable/Assets/Tests/InputSystem).
+- [Actions](actions.md)
+- [The Player Input component](player-input-component.md)
+- [Layouts](layouts.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/Touch.md b/Packages/com.unity.inputsystem/Documentation~/Touch.md
deleted file mode 100644
index d50809eea8..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/Touch.md
+++ /dev/null
@@ -1,125 +0,0 @@
----
-uid: input-system-touch
----
-# Touch support
-
-- [Touch support](#touch-support)
- - [`Touchscreen` Device](#touchscreen-device)
- - [Controls](#controls)
- - [Using touch with Actions](#using-touch-with-actions)
- - [`EnhancedTouch.Touch` Class](#enhancedtouchtouch-class)
- - [Touch Simulation](#touch-simulation)
- - [Reading all touches](#reading-all-touches)
-
-Touch support is divided into:
-* low-level support implemented in the [`Touchscreen`](#touchscreen-device) class.
-* high-level support implemented in the [`EnhancedTouch.Touch`](#enhancedtouchtouch-class) class.
-
->__Note__: You should not use [`Touchscreen`](#touchscreen-device) for polling. If you want to read out touches similar to [`UnityEngine.Input.touches`](https://docs.unity3d.com/ScriptReference/Input-touches.html), see [`EnhancedTouch`](#enhancedtouchtouch-class). If you read out touch state from [`Touchscreen`](#touchscreen-device) directly inside of the `Update` or `FixedUpdate` methods, your app will miss changes in touch state.
-
-Touch input is supported on Android, iOS, Windows, and the Universal Windows Platform (UWP).
-
->__Note__: To test your app on iOS or Android in the editor with touch input from your mobile device, you can use the Unity Remote as described [here](Debugging.md#unity-remote).
-
-## `Touchscreen` Device
-
-At the lowest level, a touch screen is represented by an [`InputSystem.Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html) Device which captures the touch screen's raw state. Touch screens are based on the [`Pointer`](Pointers.md) layout.
-
-To query the touch screen that was last used or last added, use [`Touchscreen.current`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_current).
-
-### Controls
-
-Additional to the [Controls inherited from `Pointer`](Pointers.md#controls), touch screen Devices implement the following Controls:
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`primaryTouch`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_primaryTouch)|[`TouchControl`](../api/UnityEngine.InputSystem.Controls.TouchControl.html)|A touch Control that represents the primary touch of the screen. The primary touch drives the [`Pointer`](Pointers.md) representation on the Device.|
-|[`touches`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_touches)|[`ReadOnlyArray`](../api/UnityEngine.InputSystem.Controls.TouchControl.html)|An array of touch Controls that represents all the touches on the Device.|
-
-A touch screen Device consists of multiple [`TouchControls`](../api/UnityEngine.InputSystem.Controls.TouchControl.html). Each of these represents a potential finger touching the Device. The [`primaryTouch`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_primaryTouch) Control represents the touch which is currently driving the [`Pointer`](Pointers.md) representation, and which should be used to interact with the UI. This is usually the first finger that touches the screen.
-
- [`primaryTouch`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_primaryTouch) is always identical to one of the entries in the [`touches`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_touches) array. The [`touches`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_touches) array contains all the touches that the system can track. This array has a fixed size, regardless of how many touches are currently active. If you need an API that only represents active touches, see the higher-level [`EnhancedTouch.Touch` class](#enhancedtouchtouch-class).
-
-Each [`TouchControl`](../api/UnityEngine.InputSystem.Controls.TouchControl.html) on the Device, including [`primaryTouch`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_primaryTouch), is made up of the following child Controls:
-
-|Control|Type|Description|
-|-------|----|-----------|
-|[`position`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_position)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|Absolute position on the touch surface.|
-|[`delta`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_delta)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|The difference in `position` since the last frame.|
-|[`startPosition`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_startPosition)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|The `position` where the finger first touched the surface.|
-|[`startTime`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_startTime)|[`DoubleControl`](../api/UnityEngine.InputSystem.Controls.IntegerControl.html)|The time when the finger first touched the surface.|
-|[`press`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_press)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Whether the finger is pressed down.|
-|[`pressure`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_pressure)|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|Normalized pressure with which the finger is currently pressed while in contact with the pointer surface.|
-|[`radius`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_radius)|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|The size of the area where the finger touches the surface.|
-|[`touchId`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId)|[`IntegerControl`](../api/UnityEngine.InputSystem.Controls.IntegerControl.html)|The ID of the touch. This allows you to distinguish individual touches.|
-|[`phase`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_phase)|[`TouchPhaseControl`](../api/UnityEngine.InputSystem.Controls.TouchPhaseControl.html)|A Control that reports the current [`TouchPhase`](../api/UnityEngine.InputSystem.TouchPhase.html) of the touch.|
-|[`tap`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_tap)|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|A button Control that reports whether the OS recognizes a tap gesture from this touch.|
-|[`tapCount`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_tapCount)|[`IntegerControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|Reports the number of consecutive [`tap`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_tap) reports from the OS. You can use this to detect double- and multi-tap gestures.|
-
-### Using touch with Actions
-
-You can use touch input with Actions, like any other [`Pointer`](Pointers.md) Device. To do this, [bind](ActionBindings.md) to the [pointer Controls](Pointers.md#controls), like `/press` or `/delta`. This gets input from the primary touch, and any other non-touch pointer Devices.
-
-However, if you want to get input from multiple touches in your Action, you can bind to individual touches by using Bindings like `/touch3/press`. Alternatively, use a wildcard Binding to bind one Action to all touches: `/touch*/press`.
-
-If you bind a single Action to input from multiple touches, you should set the Action type to [pass-through](RespondingToActions.md#pass-through) so the Action gets callbacks for each touch, instead of just one.
-
-## `EnhancedTouch.Touch` Class
-
-The [`EnhancedTouch.Touch`](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html) class provides a polling API for touches similar to [`UnityEngine.Input.touches`](https://docs.unity3d.com/ScriptReference/Input-touches.html). You can use it to query touches on a frame-by-frame basis.
-
-Because the API comes with a certain overhead due to having to record touches as they happen, you must explicitly enable it. To do this, call [`EnhancedTouchSupport.Enable()`](../api/UnityEngine.InputSystem.EnhancedTouch.EnhancedTouchSupport.html#UnityEngine_InputSystem_EnhancedTouch_EnhancedTouchSupport_Enable):
-
-```
- using UnityEngine.InputSystem.EnhancedTouch;
- // ...
- // Can be called from MonoBehaviour.Awake(), for example. Also from any
- // RuntimeInitializeOnLoadMethod code.
- EnhancedTouchSupport.Enable();
-```
-
->__Note__: [`Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html) does not require [`EnhancedTouchSupport`](../api/UnityEngine.InputSystem.EnhancedTouch.EnhancedTouchSupport.html) to be enabled. You only need to call [`EnhancedTouchSupport.Enable()`](../api/UnityEngine.InputSystem.EnhancedTouch.EnhancedTouchSupport.html#UnityEngine_InputSystem_EnhancedTouch_EnhancedTouchSupport_Enable) if you want to use the [`EnhancedTouch.Touch`](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html) API.
-
-The [`EnhancedTouch.Touch`](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html) API is designed to provide access to touch information along two dimensions:
-
-1. By finger: Each finger is defined as the Nth contact source on a [`Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html). You can use [Touch.activeFingers](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html#UnityEngine_InputSystem_EnhancedTouch_Touch_activeFingers) to get an array of all currently active fingers.
-
-2. By touch: Each touch is a single finger contact with at least a beginning point ([`PointerPhase.Began`](../api/UnityEngine.InputSystem.TouchPhase.html)) and an endpoint ([`PointerPhase.Ended`](../api/UnityEngine.InputSystem.TouchPhase.html) or [`PointerPhase.Cancelled`](../api/UnityEngine.InputSystem.TouchPhase.html)). Between those two points, an arbitrary number of [`PointerPhase.Moved`](../api/UnityEngine.InputSystem.TouchPhase.html) and/or [`PointerPhase.Stationary`](../api/UnityEngine.InputSystem.TouchPhase.html) records exist. All records in a touch have the same [`touchId`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId). You can use [Touch.activeTouches](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html#UnityEngine_InputSystem_EnhancedTouch_Touch_activeTouches) to get an array of all currently active touches. This lets you track how a specific touch moves over the screen, which is useful if you want to implement recognition of specific gestures.
-
-See [`EnhancedTouch.Touch` API documentation](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html) for more details.
-
->__Note__: The [`Touch`](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html) and [`Finger`](../api/UnityEngine.InputSystem.EnhancedTouch.Finger.html) APIs don't generate GC garbage. The bulk of the data is stored in unmanaged memory that is indexed by wrapper structs. All arrays are pre-allocated.
-
-## Touch Simulation
-
-Touch input can be simulated from input on other kinds of [Pointer](./Pointers.md) devices such as [Mouse](./Mouse.md) and [Pen](./Pen.md) devices. To enable this, you can either add the [`TouchSimulation`](../api/UnityEngine.InputSystem.EnhancedTouch.TouchSimulation.html) `MonoBehaviour` to a `GameObject` in your scene or simply call [`TouchSimulation.Enable`](../api/UnityEngine.InputSystem.EnhancedTouch.TouchSimulation.html#UnityEngine_InputSystem_EnhancedTouch_TouchSimulation_Enable) somewhere in your startup code.
-
-```CSharp
- void OnEnable()
- {
- TouchSimulation.Enable();
- }
-```
-
-In the editor, you can also enable touch simulation by toggling "Simulate Touch Input From Mouse or Pen" on in the "Options" dropdown of the [Input Debugger](./Debugging.md).
-
-[`TouchSimulation`](../api/UnityEngine.InputSystem.EnhancedTouch.TouchSimulation.html) will add a [`Touchscreen`](../api/UnityEngine.InputSystem.Touchscreen.html) device and automatically mirror input on any [`Pointer`](../api/UnityEngine.InputSystem.Pointer.html) device to the virtual touchscreen device.
-
-
-## Reading all touches
-
-To get all current touches from the touchscreen, use [`EnhancedTouch.Touch.activeTouches`](../api/UnityEngine.InputSystem.EnhancedTouch.Touch.html#UnityEngine_InputSystem_EnhancedTouch_Touch_activeTouches), as in this example:
-
-```C#
- using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
-
- public void Update()
- {
- foreach (var touch in Touch.activeTouches)
- Debug.Log($"{touch.touchId}: {touch.screenPosition},{touch.phase}");
- }
-```
-
->__Note__: You must first enable enhanced touch support by calling [`InputSystem.EnhancedTouchSupport.Enable()`](../api/UnityEngine.InputSystem.EnhancedTouch.EnhancedTouchSupport.html#UnityEngine_InputSystem_EnhancedTouch_EnhancedTouchSupport_Enable).
-
-You can also use the lower-level [`Touchscreen.current.touches`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_touches) API.
diff --git a/Packages/com.unity.inputsystem/Documentation~/UISupport.md b/Packages/com.unity.inputsystem/Documentation~/UISupport.md
deleted file mode 100644
index a904095279..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/UISupport.md
+++ /dev/null
@@ -1,313 +0,0 @@
----
-uid: input-system-ui-support
----
-# UI support
-
-- [Overview and compatibility](#overview-and-compatibility)
-- [Setting up UI input](#setting-up-ui-input)
-- [Required Actions for UI](#required-actions-for-ui)
-- [The UI Input Module component](#the-ui-input-module-component)
- - [Using the UI Input Module](#using-the-ui-input-module)
- - [UI Input Module properties](#ui-input-module-properties)
- - [How the bindings work](#how-the-bindings-work)
- - [Other notes about the UI Input Module](#other-notes-about-the-ui-input-module)
-- [Multiplayer UIs](#multiplayer-uis)
-- [Virtual mouse cursor control](#virtual-mouse-cursor-control)
- - [Using the Virtual Mouse component](#using-the-virtual-mouse-component)
-- [Distinguishing between UI and game input](#distinguishing-between-ui-and-game-input)
- - [Handling ambiguities for pointer-type input](#handling-ambiguities-for-pointer-type-input)
- - [Handling ambiguities for navigation-type input](#handling-ambiguities-for-navigation-type-input)
-- [Immediate Mode GUI](#immediate-mode-gui)
-
-
-## Overview and compatibility
-
-Unity has [various UI solutions](https://docs.unity3d.com/Manual/UIToolkits.html). The Input System package's compatibility and workflow with these solutions varies depending on which UI solution you are using, and which version of Unity you are using.
-
-In some cases you must use the **UI Input Module** (a component supplied in the Input System package) to define which actions are passed through from the Input System to the UI.
-
-The three main UI solutions are **UI Toolkit**, **Unity UI**, and **IMGUI**. The compatibility and workflow for each of these are as follows:
-
-**For [**UI Toolkit**](https://docs.unity3d.com/Manual/UIElements.html), also known as "UI Elements" (an XML/CSS style UI solution):**
-
-- From Unity 2023.2 and onwards, the UI actions defined in the default [project-wide actions](./ProjectWideActions.md) directly map to UI Toolkit input. You do not need to use the UI Input Module component.
-- In versions of Unity prior to 2023.2, you must use the UI Input Module component to define which actions are passed through from the Input System to the UI.
-- Refer to UI Toolkit [Runtime UI event system and input handling](https://docs.unity3d.com/Manual/UIE-Runtime-Event-System.html) for more information on how to configure UI Toolkit input.
-
-**For [**Unity UI**](https://docs.unity3d.com/Packages/com.unity.ugui@latest), also known as "uGUI" (a GameObject and Component style UI solution):**
-
-When using Unity UI (uGUI), you must always use the UI Input Module component to define which actions are passed through from the Input System to the UI.
-
-**For [**IMGUI**](https://docs.unity3d.com/Manual/GUIScriptingGuide.html) (a script-based "Immediate Mode" UI using the [`OnGUI`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnGUI.html) method):**
-
-The Input System package is **not compatible** with IMGUI, however you can still use the Input System for other parts of your project such as gameplay. See the [Immediate Mode GUI](#immediate-mode-gui) section for more information.
-
-The compatibility above is summarized in the following table:
-
-UI Solution|Compatible|UI Input Module component
--|-|-
-UI Toolkit (2023.2+)|Yes|Not required
-UI Toolkit (pre 2023.2)|Yes|Required
-Unity UI (uGUI)|Yes|Required
-IMGUI|No|n/a
-
-
-## Setting up UI input
-
-The default [project-wide actions](./ProjectWideActions.md) comes with a "**UI**" Action Map, that contains all the actions required for UI interaction (shown in the image below). You can configure the bindings for these actions in the [Actions Editor](./ActionsEditor.md). Go to **Project Settings > Input System Package**, then select "**UI**" in the Action Maps column.
-
-
-
-## Required Actions for UI
-
-The default project-wide actions comes with all the required actions to be compatible with UI Toolkit and Unity UI.
-
-You can modify, add, or remove bindings to the named actions in the UI action map to suit your project, however in order to remain compatible with UI Toolkit, the name of the action map ("**UI**"), the names of the actions it contains, and their respective **Action Types** must remain the same.
-
-These specific actions and types, which are expected by the [UI Input Module](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) class, are as follows:
-
-**Action**|**Action Type**|**Control Type**|**Description**
--|-|-|-
-Navigate|PassThrough|Vector2|A vector used to select the currently active UI [selectable](https://docs.unity3d.com/Manual/script-Selectable.html) in gamepad or arrow-key [navigation-type input](#navigation-type-input).
-Submit|Button|Button|Submits the currently selected UI [selectable](https://docs.unity3d.com/Manual/script-Selectable.html) in [navigation-type input](#navigation-type-input)
-Cancel|Button|Button|Exits any interaction with the currently selected UI [selectable](https://docs.unity3d.com/Manual/script-Selectable.html) in [navigation-type input](#navigation-type-input)
-Point|PassThrough|Vector2|A 2D screen position. The cursor for [pointer-type](#pointer-type-input) interaction.
-Click|PassThrough|Button|The primary button for [pointer-type](#pointer-type-input) interaction.
-RightClick|PassThrough|Button|The secondary button for [pointer-type](#pointer-type-input) interaction.
-MiddleClick|PassThrough|Button|The middle button for [pointer-type](#pointer-type-input) interaction.
-ScrollWheel|PassThrough|Vector2|The scrolling gesture for [pointer-type](#pointer-type-input) interaction.
-Tracked Device Position|PassThrough|Vector3|A 3D position of one or multiple spatial tracking devices, such as XR hand controllers. In combination with Tracked Device Orientation, this allows XR-style UI interactions by pointing at UI [selectables](https://docs.unity3d.com/Manual/script-Selectable.html) in space. See [tracked-type input](#tracked-type-input).
-Tracked Device Orientation|PassThrough|Quaternion|a `Quaternion` representing the rotation of one or multiple spatial tracking devices, such as XR hand controllers. In combination with [Tracked Device Position](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_trackedDevicePosition), this allows XR-style UI interactions by pointing at UI [selectables](https://docs.unity3d.com/Manual/script-Selectable.html) in space. See [tracked-type input](#tracked-type-input).
-
-You can also reset the UI action map to its default bindings by selecting **Reset** from the **More (⋮)** menu, at the top right of the actions editor window. However, this will reset both the 'Player' and 'UI' action maps to their default bindings.
-
-## The UI Input Module component
-
-When working with Unity UI (uGUI), or when using UI Toolkit in versions of Unity prior to Unity 2023.2, you must use the **UI Input Module** component which defines which actions are passed through to your UI, as well as some other UI-related input settings.
-> **Note:**
-> If you have an instance of the [Input System UI Input Module](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) component in your scene, the settings on that component takes priority and are used instead of the UI settings in your project-wide actions. Also, The UI action map will be enabled, along with the default action map specified on any UI Input Module component in the scene.
-
-The UI Input module is implemented in the class [`InputSystemUIInputModule`](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html).
-
-### Using the UI Input Module
-
-The UI Input Module is a component which you must add to a GameObject in your scene in order for your UI to receive input from the Input System. To do this:
-
-1. Create a new empty GameObject
-2. Click [**Add Component**](https://docs.unity3d.com/Manual/UsingComponents.html) in the inspector
-3. In the search field displayed, type "Input System UI Input Module"
-4. Select **Input System UI Input Module** to add it to the GameObject.
-
-
-
-
-### UI Input Module properties
-
-
-
-You can use the following properties to configure [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html):
-
-|**Property**|**Description**|
-|--------|-----------|
-|[Move Repeat Delay](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_moveRepeatDelay)|The initial delay (in seconds) between generating an initial [IMoveHandler.OnMove](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.IMoveHandler.html) navigation event and generating repeated navigation events when the __Move__ Action stays actuated.|
-|[Move Repeat Rate](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_moveRepeatDelay)|The interval (in seconds) between generating repeat navigation events when the __Move__ Action stays actuated. Note that this is capped by the frame rate; there will not be more than one move repeat event each frame so if the frame rate dips below the repeat rate, the effective repeat rate will be lower than this setting.|
-|[Actions Asset](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_actionsAsset)|An [Input Action Asset](ActionAssets.md) containing all the Actions to control the UI. You can choose which Actions in the Asset correspond to which UI inputs using the following properties. By default, this references a built-in Asset named *DefaultInputActions*, which contains common default Actions for driving UI. If you want to set up your own Actions, [create a custom Input Action Asset](ActionAssets.md#creating-input-action-assets) and assign it here. When you assign a new Asset reference to this field in the Inspector, the Editor attempts to automatically map Actions to UI inputs based on common naming conventions.|
-|[Deselect on Background Click](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_deselectOnBackgroundClick)|By default, when the pointer is clicked and does not hit any `GameObject`, the current selection is cleared. This, however, can get in the way of keyboard and gamepad navigation which will want to work off the currently selected object. To prevent automatic deselection, set this property to false.|
-|[Pointer Behavior](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_pointerBehavior)|How to deal with multiple pointers feeding input into the UI. See [pointer-type input](#pointer-type-input).|
-|[Cursor Lock Behavior](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_cursorLockBehavior)|Controls the origin point of UI raycasts when the cursor is locked. |
-
-
-### How the bindings work
-
-The UI input module can deal with three different types of input:
-
-- Pointer-type input
-- Navigation-type input
-- Tracked-type input
-
-For each of these types of input, input is sourced and combined from a specific set of Actions as detailed below.
-
-#### Pointer-type input
-
-To the UI, a pointer is a position from which clicks and scrolls can be triggered to interact with UI elements at the pointer's position. Pointer-type input is sourced from [point](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_point), [leftClick](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_leftClick), [rightClick](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_rightClick), [middleClick](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_middleClick), and [scrollWheel](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_scrollWheel).
-
-The UI input module does not have an association between pointers and cursors. In general, the UI is oblivious to whether a cursor exists for a particular pointer. However, for mouse and pen input, the UI input module will respect [Cusor.lockState](https://docs.unity3d.com/ScriptReference/Cursor-lockState.html) and pin the pointer position at `(-1,-1)` whenever the cursor is locked. This behavior can be changed through the [Cursor Lock Behavior](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_cursorLockBehavior) property of the [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html).
-
-Multiple pointer Devices may feed input into a single UI input module. Also, in the case of [Touchscreen](../api/UnityEngine.InputSystem.Touchscreen.html), a single Device can have the ability to have multiple concurrent pointers (each finger contact is one pointer).
-
-Because multiple pointer Devices can feed into the same set of Actions, it is important to set the [action type](./RespondingToActions.md#action-types) to [PassThrough](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_PassThrough). This ensures that no filtering is applied to input on these actions and that instead every input is relayed as is.
-
-From the perspective of [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html), each [InputDevice](../api/UnityEngine.InputSystem.InputDevice.html) that has one or more controls bound to one of the pointer-type actions is considered a unique pointer. Also, for each [Touchscreen](../api/UnityEngine.InputSystem.Touchscreen.html) devices, each separate [TouchControl](../api/UnityEngine.InputSystem.Controls.TouchControl.html) that has one or more of its controls bound to the those actions is considered its own unique pointer as well. Each pointer receives a unique [pointerId](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.PointerEventData.html#UnityEngine_EventSystems_PointerEventData_pointerId) which generally corresponds to the [deviceId](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_deviceId) of the pointer. However, for touch, this will be a combination of [deviceId](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_deviceId) and [touchId](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId). Use [ExtendedPointerEventData.touchId](../api/UnityEngine.InputSystem.UI.ExtendedPointerEventData.html#UnityEngine_InputSystem_UI_ExtendedPointerEventData_touchId) to find the ID for a touch event.
-
-You can influence how the input module deals with concurrent input from multiple pointers using the [Pointer Behavior](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_pointerBehavior) setting.
-
-|**Pointer Behavior**|**Description**|
-|------------------|-----------|
-|[Single Mouse or Pen But Multi Touch And Track](../api/UnityEngine.InputSystem.UI.UIPointerBehavior.html#UnityEngine_InputSystem_UI_UIPointerBehavior_SingleMouseOrPenButMultiTouchAndTrack)|Behaves like [Single Unified Pointer](../api/UnityEngine.InputSystem.UI.UIPointerBehavior.html#UnityEngine_InputSystem_UI_UIPointerBehavior_SingleUnifiedPointer) for all input that is not classified as touch or tracked input, and behaves like [All Pointers As Is](../api/UnityEngine.InputSystem.UI.UIPointerBehavior.html#UnityEngine_InputSystem_UI_UIPointerBehavior_AllPointersAsIs) for tracked and touch input. If concurrent input is received on a [Mouse](../api/UnityEngine.InputSystem.Mouse.html) and [`Pen`](../api/UnityEngine.InputSystem.Pen.html), for example, the input of both is fed into the same UI pointer instance. The position input of one will overwrite the position of the other. Note that when input is received from touch or tracked devices, the single unified pointer for mice and pens is __removed__ including [IPointerExit](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.IPointerExitHandler.html) events being sent in case the mouse/pen cursor is currently hovering over objects. This is the default behavior.|
-|[Single Unified Pointer](../api/UnityEngine.InputSystem.UI.UIPointerBehavior.html#UnityEngine_InputSystem_UI_UIPointerBehavior_SingleUnifiedPointer)|All pointer input is unified such that there is only ever a single pointer. This includes touch and tracked input. This means, for example, that regardless how many devices feed input into [Point](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_point), only the last such input in a frame will take effect and become the current UI pointer's position.|
-|[All Pointers As Is](../api/UnityEngine.InputSystem.UI.UIPointerBehavior.html#UnityEngine_InputSystem_UI_UIPointerBehavior_AllPointersAsIs)|The UI input module will not unify any pointer input. Any device, including touch and tracked devices that feed input pointer-type actions, will be its own pointer (or multiple pointers for touch input). Note: This might mean that there will be an arbitrary number of pointers in the UI, and several objects might be pointed at concurrently.|
-
-If you bind a device to a pointer-type action such as [Left Click](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_leftClick) without also binding it to [Point](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_point), the UI input module will recognize the device as not being able to point and try to route its input into that of another pointer. For example, if you bind [Left Click](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_leftClick) to the `Space` key and [Point](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_point) to the position of the mouse, then pressing the space bar will result in a left click at the current position of the mouse.
-
-For pointer-type input (as well as for [tracked-type input](#tracked-type-input)), [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) will send [ExtendedPointerEventData](../api/UnityEngine.InputSystem.UI.ExtendedPointerEventData.html) instances which are an extended version of the base `PointerEventData`. These events contain additional data such as the [device](../api/UnityEngine.InputSystem.UI.ExtendedPointerEventData.html#UnityEngine_InputSystem_UI_ExtendedPointerEventData_device) and [pointer type](../api/UnityEngine.InputSystem.UI.ExtendedPointerEventData.html#UnityEngine_InputSystem_UI_ExtendedPointerEventData_pointerType) which the event has been generated from.
-
-#### Navigation-type input
-
-Navigation-type input controls the current selection based on motion read from the [move](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_move) action. Additionally, input from
-[submit](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_submit) will trigger `ISubmitHandler` on the currently selected object and
-[cancel](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_cancel) will trigger `ICancelHandler` on it.
-
-Unlike with [pointer-type](#pointer-type-input), where multiple pointer inputs may exist concurrently (think two touches or left- and right-hand tracked input), navigation-type input does not have multiple concurrent instances. In other words, only a single [move](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_move) vector and a single [submit](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_submit) and [cancel](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_cancel) input will be processed by the UI module each frame. However, these inputs need not necessarily come from one single Device always. Arbitrary many inputs can be bound to the respective actions.
-
-While, [move](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_move) should be set to [PassThrough](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_PassThrough) Action type, it is important that [submit](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_submit) and
-[cancel](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_cancel) be set to the [Button](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_Button) Action type.
-
-Navigation input is non-positional, that is, unlike with pointer-type input, there is no screen position associcated with these actions. Rather, navigation actions always operate on the current selection.
-
-#### Tracked-type input
-
-Input from [tracked devices](../api/UnityEngine.InputSystem.TrackedDevice.html) such as [XR controllers](../api/UnityEngine.InputSystem.XR.XRController.html) and [HMDs](../api/UnityEngine.InputSystem.XR.XRHMD.html) essentially behaves like [pointer-type input](#pointer-type-input). The main difference is that the world-space device position and orientation sourced from [trackedDevicePosition](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_trackedDevicePosition) and [trackedDeviceOrientation](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_trackedDeviceOrientation) is translated into a screen-space position via raycasting.
-
-> **Important:**
->Because multiple tracked Devices can feed into the same set of Actions, it is important to set the [action type](./RespondingToActions.md#action-types) to [PassThrough](../api/UnityEngine.InputSystem.InputActionType.html#UnityEngine_InputSystem_InputActionType_PassThrough). This ensures that no filtering is applied to input on these actions and that instead every input is relayed as is.
-
-For this raycasting to work, you need to add [TrackedDeviceRaycaster](../api/UnityEngine.InputSystem.UI.TrackedDeviceRaycaster.html) to the `GameObject` that has the UI's `Canvas` component. This `GameObject` will usually have a `GraphicRaycaster` component which, however, only works for 2D screen-space raycasting. You can put [TrackedDeviceRaycaster](../api/UnityEngine.InputSystem.UI.TrackedDeviceRaycaster.html) alongside `GraphicRaycaster` and both can be enabled at the same time without advserse effect.
-
-
-
-
-
-Clicks on tracked devices do not differ from other [pointer-type input](#pointer-type-input). Therefore, actions such as [Left Click](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html#UnityEngine_InputSystem_UI_InputSystemUIInputModule_leftClick) work for tracked devices just like they work for other pointers.
-
-### Other notes about the UI Input Module
-
-#### Upgrading from the Input Manager and the older Standalone Input Module
-
-The Unity UI (uGUI) package contains an older equivalent module called "**[Standalone Input Module](https://docs.unity3d.com/Manual/script-StandaloneInputModule.html)**" which performs the same kind of integration between the Unity UI and the legacy Input Manager system.
-
-If you have one of these older Standalone Input Module components on a GameObject in your project, and the Input System is installed, Unity displays a button in the Inspector offering to automatically replace it with the equivalent newer Input System UI Input Module for you.
-
-#### UI Input Module priority
-
-The UI Input Module component is not required with UI Toolkit in Unity 2023.2 and onwards. However, if you do use it, the settings on that component take priority over the UI settings in your project-wide actions.
-
-#### Technical details
-
-Input support for both [Unity UI](https://docs.unity3d.com/Manual/com.unity.ugui.html) and [UI Toolkit](https://docs.unity3d.com/Manual/UIElements.html) is based on the same [EventSystem](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/EventSystem.html) and [BaseInputModule](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/InputModules.html) subsystem. In other words, the same input setup based on [InputSystemUIInputModule](#setting-up-ui-input) supports input in either UI solution and nothing extra needs to be done.
-
-Internally, UI Toolkit installs an event listener in the form of the `PanelEventHandler` component which intercepts events that `InputSystemUIInputModule` sends and translates them into UI Toolkit-specific events that are then routed into the visual tree. If you employ `EventSystem.SetUITookitEventSystemOverride`, this default mechanism is bypassed.
-
->**Note:**
->XR ([tracked-type input](#tracked-type-input)) is not yet supported in combination with UI Toolkit. This means that you cannot use devices such as VR controllers to operate interfaces created with UI Toolkit.
-
-There are some additional things worth noting:
-
-* UI Toolkit handles raycasting internally. No separate raycaster component is needed like for uGUI. This means that [TrackedDeviceRaycaster](../api/UnityEngine.InputSystem.UI.TrackedDeviceRaycaster.html) does not work together with UI Toolkit.
-* A pointer click and a gamepad submit action are distinct at the event level in UI Toolkit. This means that if you, for example, do
- ```CSharp
- button.RegisterCallback(_ => ButtonWasClicked());
- ```
- the handler is not invoked when the button is "clicked" with the gamepad (a `NavigationSubmitEvent` and not a `ClickEvent`). If, however, you do
- ```CSharp
- button.clicked += () => ButtonWasClicked();
- ```
- the handle is invoked in both cases.
-
-
-
-
-## Multiplayer UIs
-
-The Input System can also handle multiple separate UI instances on the screen controlled separately from different input Bindings. This is useful if you want to have multiple local players share a single screen with different controllers, so that every player can control their own UI instance. To allow this, you need to replace the [Event System](https://docs.unity3d.com/Manual/script-EventSystem.html) component from Unity with the Input System's [Multiplayer Event System](../api/UnityEngine.InputSystem.UI.MultiplayerEventSystem.html) component.
-
-
-
-Unlike the Event System component, you can have multiple Multiplayer Event Systems active in the Scene at the same time. That way, you can have multiple players, each with their own UI Input Module and Multiplayer Event System components, and each player can have their own set of Actions driving their own UI instance. If you are using the [Player Input](PlayerInput.md) component, you can also set it to automatically configure the player's UI Input Module to use the player's Actions. See the documentation on [Player Input](PlayerInput.md#ui-input) to learn how.
-
-The properties of the Multiplayer Event System component are identical to those from the Event System component. Additionally, the Multplayer Event System component adds a [Player Root](../api/UnityEngine.InputSystem.UI.MultiplayerEventSystem.html#UnityEngine_InputSystem_UI_MultiplayerEventSystem_playerRoot) property, which you can set to a GameObject that contains all the UI [selectables](https://docs.unity3d.com/Manual/script-Selectable.html) this event system should handle in its hierarchy. Mouse input that this event system processes then ignores any UI selectables which are not on any GameObject in the Hierarchy under [Player Root](../api/UnityEngine.InputSystem.UI.MultiplayerEventSystem.html#UnityEngine_InputSystem_UI_MultiplayerEventSystem_playerRoot).
-
-## Virtual mouse cursor control
-
-If your application uses gamepads and joysticks as an input, you can use the [navigation Actions](#navigation-type-input) to operate the UI. However, it usually involves extra work to make the UI work well with navigation. An alternative way to operate the UI is to allow gamepads and joysticks to drive the cursor from a "virtual mouse cursor".
-
-The Input System package provides a **Virtual Mouse** component for this purpose.
-
-> **Note**: This component is only compatible with the [Unity UI](https://docs.unity3d.com/Manual/com.unity.ugui.html) (uGUI) system, and not UI Toolkit.
-
-To see an example of the Virtual Mouse in a project, see the [Gamepad Mouse Cursor sample](Installation.md#installing-samples) included with the Input System package.
-
-### Using the Virtual Mouse component
-
-To set up the Virtual Mouse component with the Unity UI system:
-
-1. Create a UI GameObject with an **Image** component. This GameObject is the mouse pointer. It can help to rename it "_Pointer_".
-2. Parent the pointer GameObject as a child of your **Canvas** GameObject that contains the UI which the cursor should operate on.
-3. Set the anchor position of the GameObject's `RectTransform` to the bottom left.
-4. Ensure your pointer GameObject is the last child of the Canvas so that the cursor draws on top of everything else.
-5. Add a **Virtual Mouse** component to the GameObject.
-6. Drag the **Image** component of the pointer GameObject into the **Cursor Graphic** field of the Virtual Mouse component.
-7. Drag the **Rect Transform** component of the pointer GameObject to the **Cursor Transform** field of the Virtual Mouse component.
-8. If you want the virtual mouse to control the system mouse cursor, set [Cursor Mode](../api/UnityEngine.InputSystem.UI.VirtualMouseInput.html#UnityEngine_InputSystem_UI_VirtualMouseInput_cursorMode) to **Hardware Cursor If Available**. In this mode, the **Cursor Graphic** is hidden when a system mouse is present and you use [Mouse.WarpCursorPosition](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_WarpCursorPosition_UnityEngine_Vector2_) to move the system mouse cursor instead of the software cursor. The transform linked through **Cursor Transform** is not updated in that case.
-9. To configure the input to drive the virtual mouse, either add bindings on the various actions (such as **Stick Action**), or enable **Use Reference** and link existing actions from an Input Actions asset.
-
-> **Important:**
-> Make sure the UI Input Module component on the UI's **Event System** does not receive navigation input from the same devices that feed into the Virtual Mouse component. If, for example, the Virtual Mouse component is set up to receive input from gamepads, and `Move`, `Submit`, and `Cancel` on the UI Input Module are also linked to the gamepad, then the UI receives input from the gamepad on two channels.
-
-
-
-At runtime, the component adds a virtual [Mouse](../api/UnityEngine.InputSystem.Mouse.html) device which the [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) component picks up. The controls of the `Mouse` are fed input based on the actions configured on the [VirtualMouseInput](../api/UnityEngine.InputSystem.UI.VirtualMouseInput.html) component.
-
-Note that the resulting [Mouse](../api/UnityEngine.InputSystem.Mouse.html) input is visible in all code that picks up input from the mouse device. You can therefore use the component for mouse simulation elsewhere, not just with [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html).
-
-> **Note**:
-> Do not set up gamepads and joysticks for [navigation input](#navigation-type-input) while using the Virtual Mouse component. If both the Virtual Mouse component and navigation are configured, input is triggered twice: once via the pointer input path, and once via the navigation input path. If you encounter problems such as where buttons are pressed twice, this is likely the problem.
-
-## Distinguishing between UI and game input
-
-UI in Unity receives input through the same mechanisms as the input for the rest of your game or app. There is no automatic mechanism that implicitly ensures that if a certain input – such as a click – is consumed by the UI, it is not also received by your gameplay code.
-
-This can create ambiguities between, for example, code that responds to [`UI.Button.onClick`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.Button.html#UnityEngine_UI_Button_onClick) and code that responds to [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed) of an Action bound to `/leftButton`.
-
-Whether such ambiguities exist depends on *how* UIs are used. For example, you can avoid ambiguities by implementing your UI in one of the following ways:
-
-* All interaction is performed through UI elements. A 2D/3D scene is rendered in the background but all interaction is performed through UI events (including those such as 'background' clicks on the `Canvas`).
-* UI is overlaid over a 2D/3D scene but the UI elements cannot be interacted with directly.
-* UI is overlaid over a 2D/3D scene but there is a clear "mode" switch that determines if interaction is picked up by UI or by the game. For example, a first-person game on desktop may employ a [cursor lock](https://docs.unity3d.com/ScriptReference/Cursor-lockState.html) and direct input to the game while it is engaged whereas it may leave all interaction to the UI while the lock is not engaged.
-
-When ambiguities arise, they do so differently for [pointer-type](#pointer-type-input) and [navigation-type](#navigation-type-input).
-
->[!NOTE]
->A sample called "**UI vs Game Input**" is provided with the package and can be installed from the Unity Package Manager UI in the editor. The sample demonstrates how to deal with a situation where ambiguities arise between inputs for UI and inputs for the game.
-
-### Handling ambiguities for pointer-type input
-
-Input from pointers (mice, touchscreens, pens) can be ambiguous depending on whether or not the pointer is over a UI element when initiating an interaction. For example, if there is a button on screen, then clicking on the button may lead to a different outcome than clicking outside of the button and within the game scene.
-
-If all pointer input is handled via UI events, no ambiguities arise as the UI will implicitly route input to the respective receiver. If, however, input within the UI is handled via UI events and input in the game is handled via [Actions](./Actions.md), pointer input will by default lead to *both* being triggered.
-
-The easiest way to resolve such ambiguities is to respond to in-game actions by [polling](RespondingToActions.md#polling-actions) from inside [`MonoBehaviour.Update`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.Update.html) methods and using [`EventSystem.IsPointerOverGameObject`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.EventSystem.html?q=ispointerovergameobject#UnityEngine_EventSystems_EventSystem_IsPointerOverGameObject) to find out whether the pointer is over UI or not. Another way is to use [`EventSystem.RaycastAll`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.EventSystem.html?q=ispointerovergameobj#UnityEngine_EventSystems_EventSystem_RaycastAll_UnityEngine_EventSystems_PointerEventData_System_Collections_Generic_List_UnityEngine_EventSystems_RaycastResult__) to determine if the pointer is currently over UI.
-
->[!NOTE]
->Calling [`EventSystem.IsPointerOverGameObject`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.EventSystem.html?q=ispointerovergameobject#UnityEngine_EventSystems_EventSystem_IsPointerOverGameObject) from within [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html) callbacks such as [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed) will lead to a warning. The UI updates separately *after* input processing and UI state thus corresponds to that of the *last* frame/update while input is being processed.
-
-### Handling ambiguities for navigation-type input
-
-Ambiguities for navigation-type Devices such as gamepads and joysticks (but also keyboards) cannot arise the same way that it does for pointers. Instead, your application has to decide explicitly whether to use input for the UI's `Move`, `Submit`, and `Cancel` inputs or for the game. This can be done by either splitting control on a Device or by having an explicit mode switch.
-
-Splitting input on a Device is done by simply using certain controls for operating the UI while using others to operate the game. For example, you could use the d-pad on gamepads to operate UI selection while using the sticks for in-game character control. This setup requires adjusting the bindings used by the UI Actions accordingly.
-
-An explicit mode switch is implemented by temporarily switching to UI control while suspending in-game Actions. For example, the left trigger on the gamepad could bring up an item selection wheel which then puts the game in a mode where the sticks are controlling UI selection, the A button confirms the selection, and the B button closes the item selection wheel. No ambiguities arise as in-game actions will not respond while the UI is in the "foreground".
-
-
-
-## Immediate Mode GUI
-
-The Input System package does not support [Immediate Mode GUI](https://docs.unity3d.com/Manual/GUIScriptingGuide.html) (IMGUI) methods at runtime.
-
-However, if you need to use IMGUI for your UI, it is possible to use legacy Input Manager input for your IMGUI user interface, while also using the Input System package for your in-game input.
-
-When the Editor's [**Active Input Handling**](https://docs.unity3d.com/Manual/class-PlayerSettings.html) setting is set to "**Input System Package**" (which is the default, when using the Input System package), the `OnGUI` methods in your player code won't receive any input events.
-
-To restore functionality to runtime `OnGUI` methods, you can change the **Active Input Handling** setting to "**Both**". Doing this means that Unity processes the input twice which could introduce a small performance impact.
-
-This only affects runtime (play mode) OnGUI methods. Editor GUI code is unaffected and will receive input events regardless.
diff --git a/Packages/com.unity.inputsystem/Documentation~/UserManagement.md b/Packages/com.unity.inputsystem/Documentation~/UserManagement.md
deleted file mode 100644
index 47fa81c315..0000000000
--- a/Packages/com.unity.inputsystem/Documentation~/UserManagement.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-uid: input-system-user-management
----
-# User Management
-
-The Input System supports multi-user management through the [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) class. This comprises both user account management features on platforms that have these capabilities built into them (such as Xbox and PS4), as well as features to manage Device allocations to one or more local users.
-
->__Note__: The user management API is quite low-level in nature. The stock functionality of Player Input Manager component (see [Player Input Manager](PlayerInputManager.md)) provides an easier way to set up user management. The API described here is useful when you want more control over user management.
-
-In the Input System, each [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) represents a human interacting with the application. For example, you can have multiple users playing a game together on a single computer or device (local multiplayer), where each user has one or more [paired Input Devices](#device-pairing).
-
-The [`PlayerInputManager`](PlayerInputManager.md) class uses [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) internally to handle users.
-
->__Note__: In the editor, all `InputUser` instances are automatically removed when exiting play mode thus also removing any device pairings. In essence, `InputUser` is considered a player-only API.
-
-## Device pairing
-
-You can use the [`InputUser.PerformPairingWithDevice`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_PerformPairingWithDevice_UnityEngine_InputSystem_InputDevice_UnityEngine_InputSystem_Users_InputUser_UnityEngine_InputSystem_Users_InputUserPairingOptions_) method to create a new [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) instance and pair it with an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html). You can also optionally pass in an existing [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) instance to pair it with the Device, if you don't want to create a new user instance.
-
-To query the Devices paired to a specific [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html), use [`InputUser.pairedDevices`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_pairedDevices). To remove the pairing, use [`InputUser.UnpairDevice`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_UnpairDevice_UnityEngine_InputSystem_InputDevice_) or [`InputUser.UnpairDevices`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_UnpairDevices).
-
-### Initial engagement
-
-After you create a user, you can use [`InputUser.AssociateActionsWithUser`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_AssociateActionsWithUser_UnityEngine_InputSystem_IInputActionCollection_) to associate [Input Actions](Actions.md) to it, and use [`InputUser.ActivateControlScheme`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_ActivateControlScheme_System_String_) to associate and activate a [Control Scheme](ActionBindings.md#control-schemes). You can use [`InputControlScheme.FindControlSchemeForDevice`](../api/UnityEngine.InputSystem.InputControlScheme.html#UnityEngine_InputSystem_InputControlScheme_FindControlSchemeForDevice__1_UnityEngine_InputSystem_InputDevice___0_) to pick a control scheme that matches the selected Actions and Device:
-
-```
-var scheme = InputControlScheme.FindControlSchemeForDevice(user.pairedDevices[0], user.actions.controlsSchemes);
-if (scheme != null)
- user.ActivateControlScheme(scheme);
-```
-
-When you activate a Control Scheme, the Input System automatically switches the active Binding mask for the user's Actions to that Control Scheme.
-
-### Loss of Device
-
-If paired Input Devices disconnect during the session, the system notifies the [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) class. It still keeps track of the Device, and automatically re-pairs the Device if it becomes available again.
-
-To get notifications about these changes, subscribe to the [`InputUser.onChange`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_onChange) event.
-
-## Debugging
-
-Check the debugger documentation to learn [how to debug active users](Debugging.md#debugging-users-and-playerinput).
diff --git a/Packages/com.unity.inputsystem/Documentation~/Workflows.md b/Packages/com.unity.inputsystem/Documentation~/Workflows.md
index 2e28018c34..05f84aec6f 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Workflows.md
+++ b/Packages/com.unity.inputsystem/Documentation~/Workflows.md
@@ -13,11 +13,12 @@ You can choose to configure Actions and Bindings in the Editor UI, or you can se
The descriptions below describe these main workflows and link to more detailed description of them.
+
| | |
|---|---|
-|[**Using Actions**](Workflow-Actions.md) This is the **recommended** workflow for most situations. In this workflow, you use the [Actions Editor window](./ActionsEditor.md) to configure sets of actions and bindings, then set up references and read the values for those actions in your code [(read more)](Workflow-Actions.md). ||
-|[**Using Actions and the PlayerInput Component**](Workflow-PlayerInput.html) This workflow provides extra features that allow you to connect up **callbacks** directly from Actions to your own callback handler methods, removing the need to deal with Action references in your code. It also provides features that are useful in **local multiplayer** scenarios such as device assignment and split-screen functionality. [(read more)](Workflow-PlayerInput.html). ||
-|[**Directly read device states**](Workflow-Direct.html) This workflow is a simplified, script-only approach which bypasses the Actions and Bindings features entirely. Instead your script explicitly references specific device controls (such as "left gamepad stick") and reads the values directly. This is suitable for **fast prototyping**, or single fixed platform scenarios. It is a **less flexible** workflow because it bypasses some of the main input system features [(read more)](Workflow-Direct.html). ||
+|[**Using Actions**](using-actions-workflow.md) This is the **recommended** workflow for most situations. In this workflow, you use the [Actions Editor window](./actions-editor.md) to configure sets of actions and bindings, then set up references and read the values for those actions in your code [(read more)](using-actions-workflow.md). ||
+|[**Using Actions and the PlayerInput Component**](using-playerinput-workflow.md) This workflow provides extra features that allow you to connect up **callbacks** directly from Actions to your own callback handler methods, removing the need to deal with Action references in your code. It also provides features that are useful in **local multiplayer** scenarios such as device assignment and split-screen functionality. [(read more)](using-playerinput-workflow.md). ||
+|[**Directly read device states**](using-direct-workflow.md) This workflow is a simplified, script-only approach which bypasses the Actions and Bindings features entirely. Instead your script explicitly references specific device controls (such as "left gamepad stick") and reads the values directly. This is suitable for **fast prototyping**, or single fixed platform scenarios. It is a **less flexible** workflow because it bypasses some of the main input system features [(read more)](using-direct-workflow.md). ||
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-action-assets.md b/Packages/com.unity.inputsystem/Documentation~/about-action-assets.md
new file mode 100644
index 0000000000..619d9561da
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-action-assets.md
@@ -0,0 +1,16 @@
+---
+uid: input-system-about-action-assets
+---
+
+# About action assets
+
+The Input System stores your configuration of [Input Actions](actions.md) and their associated [Bindings](bindings.md), [Action Maps](create-edit-delete-action-maps.md) and [Control Schemes](control-schemes.md) in an [Action Asset](action-assets.md) file. These Assets have the `.inputactions` file extension and are stored in a plain JSON format.
+
+## Project-wide action assets
+
+The Input System creates an Action Asset when you set up the [default project-wide actions](about-project-wide-actions.md), which is the most common and recommended workflow, but you can also [create new empty Action Assets](./create-empty-action-asset.md) directly in the Project window.
+
+## Action maps
+
+Actions assets allow you to group sets of related actions into [action maps](./create-edit-delete-action-maps.md). For example, in an open-world city game, you might create separate action maps for different situations such as exploring on foot, driving a car, flying an aircraft, or navigating UI interfaces. This means, for most common scenarios, you don't need to use more than one Input Action Asset.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-action-control-types.md b/Packages/com.unity.inputsystem/Documentation~/about-action-control-types.md
new file mode 100644
index 0000000000..dd88340983
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-action-control-types.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-about-action-control-types
+---
+
+# About action and control types
+
+Each action has an **action type** and a **control type**. These settings are displayed in the [Action Properties panel](./action-properties-panel-reference.md) when you select an action in the [Actions Editor window](./actions-editor.md).
+
+
+
+When you configure an action, you can select an action type and control type that best represents what your action is for, and how you want it to be activated by the [controls](./controls.md) it is [bound](./bindings.md) to.
+
+## Action type
+
+The **action type** influences how the Input System processes state changes for the action, and relates to whether this action represents a discrete on/off button-style interaction or a value that can change gradually over time.
+
+## Control type
+
+The **control type** determines the type of value that should be sent to the action, such as an in integer or float value, or a 1D, 2D, or 3D axis.
+
+The control type that you select has the effect of filtering the available controls to only those that are capable of providing the values appropriate for that control.
+
+For example, if you select **2D axis** as the control type, only those types of controls that can supply a 2D vector as value are available as options for the binding control path, such as a thumb stick or Dpad.
+
+There are more specific control types available which further filter the available bindings, such as **Stick**, **Dpad** or **Touch**. If you select one of these control types, the list of available controls is further limited to only those controls of those specific types when you [select a binding for your action](add-duplicate-delete-binding.md).
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-layouts.md b/Packages/com.unity.inputsystem/Documentation~/about-layouts.md
new file mode 100644
index 0000000000..c4629e1440
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-layouts.md
@@ -0,0 +1,28 @@
+---
+uid: input-system-about-layouts
+---
+
+# About layouts
+
+Layouts are the central mechanism by which the Input System learns about types of Input Devices and Input Controls. Each layout represents a specific composition of Input Controls. By matching the description of a Device to a layout, the Input System is able to create the correct type of Device and interpret the incoming input data correctly.
+
+>__Note__: Layouts are an advanced, mostly internal feature of the Input System. Knowledge of the layout system is mostly useful if you want to support custom Devices or change the behavior of existing Devices.
+
+A layout describes a memory format for input, and the Input Controls to build in order to read and write data to or from that memory.
+
+The Input System ships with a large set of layouts for common Control types and common Devices. For other Device types, the system automatically generates layouts based on the Device description that the Device's interface reports.
+
+You can browse the set of currently understood layouts from the Input Debugger.
+
+
+
+A layout has two primary functions:
+
+* Describe a certain memory layout containing input data.
+* Assign names, structure, and meaning to the Controls operating on the data.
+
+A layout can either be for a Control on a Device (for example, `Stick`), or for a Device itself (that is, anything based on [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html)).
+
+The Input System only loads layouts when they are needed (usually, when creating a new Device). To manually load a layout, you can use [`InputSystem.LoadLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_LoadLayout_System_String_). This returns an [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html) instance, which contains the final, fully merged (that is, containing any information inherited from base layouts and/or affected by layout overrides) structure of the layout.
+
+You can register new layouts through [`InputSystem.RegisterLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayout_System_String_System_String_System_Nullable_UnityEngine_InputSystem_Layouts_InputDeviceMatcher__).
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-player-input-component.md b/Packages/com.unity.inputsystem/Documentation~/about-player-input-component.md
new file mode 100644
index 0000000000..a812c6dcbf
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-player-input-component.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-about-player-input-component
+---
+
+# About the Player Input component
+
+
+*Above, the Player Input component displayed in the inspector.*
+
+## Connecting actions to methods or callbacks
+
+The **Player Input** component represents a single player, and the connection between that player's associated device, Actions, and methods or callbacks.
+
+You can use a single instance of a Player Input component in a single-player game to set up a mapping between your Input Actions and methods or callbacks in the script that controls your player.
+
+For example, by using the Player Input component, you can set up a mapping between actions such as "Jump" to C# methods in your script such as `public void OnJump()`.
+
+There are a few options for doing exactly how the Player Input component does this, such as using SendMessage, or Unity Events, which is described in more detail below.
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-player-input-component.txt b/Packages/com.unity.inputsystem/Documentation~/about-player-input-component.txt
new file mode 100644
index 0000000000..50643f5908
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-player-input-component.txt
@@ -0,0 +1,2 @@
+# About the PlayerInput component
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-project-wide-actions.md b/Packages/com.unity.inputsystem/Documentation~/about-project-wide-actions.md
new file mode 100644
index 0000000000..1a72139d2a
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-project-wide-actions.md
@@ -0,0 +1,31 @@
+---
+uid: input-system-project-wide-actions
+---
+# About project-wide actions
+
+You can assign an individual Action Asset to be available "project-wide", which means the actions within that asset are available more conveniently through the Input System API without needing to set up references to the asset.
+
+When you [assign an Action Asset as project-wide](assign-project-wide-actions.md), it also becomes automatically [preloaded](https://docs.unity3d.com/ScriptReference/PlayerSettings.GetPreloadedAssets.html) when your app starts up, and is kept available until it terminates.
+
+Unless you have specific project requirements that require more than one Action Asset, the recommended workflow is to use a single Action Asset assigned as the project-wide actions.
+
+
+## Edit project-wide actions
+
+Once you have created and assigned project-wide actions, the Input System Package page in Project Settings displays the **Actions Editor** interface. Read more about how to use the [Actions Editor](actions-editor.md) to configure your actions.
+
+
+*The Input System Package Project Settings after creating and assigning the default actions*
+
+
+## Using project-wide actions in code
+
+The benefit of assign an Action Asset as the project-wide actions is that you can access the actions directly through the [`InputSystem.actions`](../api/UnityEngine.InputSystem.InputSystem.html) property directly, rather than needing to set up a reference to your Action Asset first.
+
+For example, you can get a reference to an action named "Move" in your project-wide actions using a line of code like this:
+
+```
+ InputSystem.actions.FindAction("Move");
+```
+
+Project-wide actions are also enabled by default.
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-responding-to-input.md b/Packages/com.unity.inputsystem/Documentation~/about-responding-to-input.md
new file mode 100644
index 0000000000..8460f5c4ff
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-responding-to-input.md
@@ -0,0 +1,39 @@
+---
+uid: input-system-about-respond-input
+---
+
+# About responding to input
+
+The Input System offers various ways to respond to input at runtime, from the recommended workflow using [actions](actions.md) and [bindings](bindings.md), to more direct techniques such as reading device controls directly.
+
+## Recommended workflow
+
+Working with the Input System's [recommended workflow](workflows.md) in your project involves two phases which you must approach in this order:
+
+1. Configure your project's actions.
+2. Implement responses to actions.
+
+### Configure your project's actions
+
+You must first [configure input for your project](setting-up-input.md) as [actions](actions.md), before you can respond to those actions.
+
+In some situations you might find the configuration in the [default project-wide actions](default-actions.md) covers all your needs, and you can go straight to implementing responses to input. In other cases you might want to start with the default configuration and [add or modify actions](configure-actions.md), or you can [start with an empty configuration and define your own](create-empty-action-asset.md).
+
+### Implement responses to actions
+
+Once you have your actions set up, you can implement responses to those actions.
+
+There are two main techniques you can use to respond to actions in your project. These are to either use **polling** or an **event-driven** approach.
+
+- The **polling** approach refers to the technique of repeatedly checking the current state of your actions. Typically you do this in the `Update()` method of a `MonoBehaviour` script. See [polling actions](polling-actions.md) for further information.
+
+- The **event-driven** approach involves creating your own methods in code that are automatically called when an action is performed. See [Set callbacks on actions](set-callbacks-on-actions.md) for further information.
+
+For most common scenarios, especially action games where the user's input has a continuous centralized effect on an in-game character, **polling** is usually simpler and easier to implement. For other situations where input is less continuous, or directed to many different areas in your scene, an event-driven approach might be more appropriate.
+
+## Other workflows
+
+The Input System also allows you to read device states directly, which bypasses many of the features such as actions and bindings. This workflow is suitable for fast prototyping, or single fixed platform scenarios, but is a less flexible workflow because it bypasses some useful Input System features.
+
+See [Read devices directly](read-devices-directly.md) for further information about this workflow.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/about-user-management.md b/Packages/com.unity.inputsystem/Documentation~/about-user-management.md
new file mode 100644
index 0000000000..441f81e5ab
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/about-user-management.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-user-management-about
+---
+
+# About user management
+
+The Input System supports multi-user management through the [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) class. This comprises both user account management features on platforms that have these capabilities built into them (such as Xbox and PS4), as well as features to manage Device allocations to one or more local users.
+
+>__Note__: The user management API is quite low-level in nature. The stock functionality of Player Input Manager component (see [Player Input Manager](player-input-manager-component.md)) provides an easier way to set up user management. The API described here is useful when you want more control over user management.
+
+In the Input System, each [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) represents a human interacting with the application. For example, you can have multiple users playing a game together on a single computer or device (local multiplayer), where each user has one or more [paired Input Devices](#device-pairing).
+
+The [`PlayerInputManager`](player-input-manager-component.md) class uses [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) internally to handle users.
+
+>__Note__: In the editor, all `InputUser` instances are automatically removed when exiting play mode thus also removing any device pairings. In essence, `InputUser` is considered a player-only API.
diff --git a/Packages/com.unity.inputsystem/Documentation~/access-ui-input-module.md b/Packages/com.unity.inputsystem/Documentation~/access-ui-input-module.md
new file mode 100644
index 0000000000..f6b4c8d3a9
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/access-ui-input-module.md
@@ -0,0 +1,17 @@
+---
+uid: input-system-access-ui-component
+---
+
+# Access the UI Input Module component
+
+The UI Input Module is a component that passes input actions from the Input System to the UI in your scene.
+
+You must add the UI Input Module to a GameObject in your scene, so that the UI can receive input from the Input System. To do this:
+
+1. Create a new empty GameObject
+2. Click [**Add Component**](https://docs.unity3d.com/Manual/UsingComponents.html) in the Inspector
+3. In the search field displayed, type `Input System UI Input Module`
+4. Select **Input System UI Input Module** to add it to the GameObject.
+
+
+
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/action-and-control-types.md b/Packages/com.unity.inputsystem/Documentation~/action-and-control-types.md
new file mode 100644
index 0000000000..0407e889f2
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/action-and-control-types.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-action-control-types
+---
+
+# Action and control types
+
+Actions have an **Action Type** and **Control Type** which you can configure in the [Actions Editor window](actions-editor.md). These settings allow you to configure the basic behaviour of an action.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[About action and control types](about-action-control-types.md)** | Learn about what action types and control types are, and the effects that the different settings can have. |
+| **[Configure action type](configure-action-type.md)** | Configure the action's Action Type, which relates to whether an action represents a discrete on/off button-style interaction or a value that can change gradually over time. |
+| **[Action type reference](action-type-reference.md)** | Information about each of the available action type options. |
+| **[Configure control type](configure-control-type.md)** | Select the type of control expected by the action. |
+
+## Additional resources
+
+- [Control types reference](control-types-reference.md)
+- [Actions](actions.md)
+- [Bindings](bindings.md)
+- [Input Actions Editor references](actions-editor.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/action-assets.md b/Packages/com.unity.inputsystem/Documentation~/action-assets.md
new file mode 100644
index 0000000000..3792412a75
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/action-assets.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-action-assets
+---
+
+# Input action assets
+
+Store actions, bindings, action maps, and control schemes in `.inputactions` assets.
+
+Use project-wide assignment for the recommended single-asset workflow, or create additional assets when you need separate input configurations. Generate a C# API when you want type-safe access from code.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[About action assets](about-action-assets.md)** | See what `.inputactions` assets contain and when to use them. |
+| **[About project-wide actions](about-project-wide-actions.md)** | Assign one asset project-wide for API access without manual references. |
+| **[Create and assign a default project-wide actions asset](create-project-wide-actions.md)** | Create the built-in default actions asset and assign it to your project. |
+| **[Create an empty action asset](create-empty-action-asset.md)** | Create a new `.inputactions` asset in the Project window. |
+| **[Assign an existing action asset as project-wide](assign-project-wide-actions.md)** | Switch which asset is assigned as project-wide actions. |
+| **[Default actions](default-actions.md)** | Built-in actions included in the default project-wide asset. |
+| **[Generate C# API from actions](generate-cs-api-from-actions.md)** | Generate a type-safe C# wrapper class from an action asset. |
+
+## Additional resources
+
+- [Actions](actions.md)
+- [Create action maps](create-edit-delete-action-maps.md)
+- [Input Actions Editor references](actions-editor.md)
+- [Configure input from code](configure-input-from-code.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/action-properties-panel-reference.md b/Packages/com.unity.inputsystem/Documentation~/action-properties-panel-reference.md
new file mode 100644
index 0000000000..9a49fbc3ee
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/action-properties-panel-reference.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-action-properties-panel
+---
+
+# Action Properties panel reference
+
+Use the Action Properties panel to configure actions, and their associated [interactions](Interactions.md) and [processors](processors.md).
+
+The Action Properties panel changes depending on the **Action Type** of the selected Action.
+
+|Property|Description|
+|-|-|
+|**Action Type**| Define whether the action is a **Value**, **Button**, or **Pass Through** action type. Refer to [Action and control types](action-and-control-types.md) for detailed information on action types. |
+|**Control Type**| Define the control type for the selected action. Refer to [Action and control types](action-and-control-types.md) for detailed information on control types. This property is only available when **Action Type** is set to **Value** or **Pass Through**. |
+|**Initial State Check**| Perform an initial state check when the Action is first enabled, to check the current state of any bound Control. This setting is only available when Action Type is set to **Button** or **Pass Through**. It is always enabled for **Value**-type actions. Refer to [binding initial state checks|(binding-initial-state-checks.md) for detailed information.
+
+[!include[Interactions reference](include-interactions-reference)]
+
+[!include[Processors reference](include-processors-reference)]
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/action-type-reference.md b/Packages/com.unity.inputsystem/Documentation~/action-type-reference.md
new file mode 100644
index 0000000000..13a404cd35
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/action-type-reference.md
@@ -0,0 +1,22 @@
+---
+uid: input-system-action-type-ref
+---
+
+# Action types reference
+
+With an action selected in the [Actions Editor window](./actions-editor.md), the **Action Type** setting in the [actions panel](./input-actions-editor-window-reference.md#actions-panel-reference) allows you to [select the action type](./configure-action-type.md) from the following options:
+
+
+| Value | Description |
+| :---------------------------- | :----------------------------- |
+| **Button** | Use this for device controls such as keyboard keys, mouse clicks, or gamepad buttons, which have only an on/off state, and no gradual value changes. Provides phase information and conflict resolution. |
+| **Value** | Use this for device controls such as mouse movement, a joystick or gamepad stick, or device orientation that provides gradually changing input over a range of values. Provides phase information and conflict resolution. |
+| **Pass Through** | Use this for the same types as **Value**, but this type provides no phase information or conflict resolution. |
+
+### Phase information and conflict resolution
+
+For **Button** or **Value** action types, the Input System also provides data about the action such as whether it has started and stopped (known as the **Phase** of the action), and [conflict resolution](./binding-conflicts.md) in situations where you have mapped multiple bindings to the same action.
+
+For **Pass Through** action types, the Input System only provides basic information about the values incoming from the device controls bound to it, and does not provide the extra data relating to the phase of the action, nor does it perform [conflict resolution](./binding-conflicts.md).
+
+Because pass-through actions don't perform conflict resolution, it means they don't use concept of a specific control driving the action. Instead, any change to any of the controls bound to the action triggers a callback with that Control's value. This is useful if you want to process all input from a set of controls at once on the same action, rather than only the most actuated from the set.
diff --git a/Packages/com.unity.inputsystem/Documentation~/actions-editor.md b/Packages/com.unity.inputsystem/Documentation~/actions-editor.md
new file mode 100644
index 0000000000..8708b21ca4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/actions-editor.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-input-actions-editor-landing
+---
+
+# Input Actions Editor references
+
+Use the Input Actions Editor to create action maps, configure actions and bindings, connect controls, and assign interactions and processors.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| [**Input Actions Editor window reference**](input-actions-editor-window-reference.md) | Access and navigate the Input Actions Editor window. |
+| [**Action Properties panel reference**](action-properties-panel-reference.md) | Create and configure actions. |
+| [**Binding Properties panel reference**](binding-properties-panel-reference.md) | Create and configure bindings. |
+| [**Control Schemes and Devices menu reference**](control-schemes-devices-menu-reference.md) | Use the Control Schemes and Devices menus to connect controls and devices with bindings. |
+
+## Additional resources
+
+- [Setting up input](setting-up-input.md)
+- [Input action assets](action-assets.md)
+- [Configure actions](configure-actions.md)
+- [Configure input from code](configure-input-from-code.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-custom-device-command.md b/Packages/com.unity.inputsystem/Documentation~/add-custom-device-command.md
new file mode 100644
index 0000000000..43e5767bb0
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-custom-device-command.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-add-custom-device-command
+---
+
+# Add a custom device command
+
+To create custom Device commands (for example, to support some functionality for a specific HID), create a `struct` that contains all the data to be sent to the Device, and add a [`typeStatic`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html#UnityEngine_InputSystem_LowLevel_IInputDeviceCommandInfo_typeStatic) property to make that struct implement the [`IInputDeviceCommandInfo`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html) interface. To send data to a HID, this property should return `"HIDO"`.
+
+You can then create an instance of this struct and populate all its fields, then use [`InputDevice.ExecuteCommand`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_ExecuteCommand__1___0__) to send it to the Device. The data layout of the struct must match the native representation of the data as the device interprets it.
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-duplicate-delete-binding.md b/Packages/com.unity.inputsystem/Documentation~/add-duplicate-delete-binding.md
new file mode 100644
index 0000000000..412fa6e384
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-duplicate-delete-binding.md
@@ -0,0 +1,38 @@
+---
+uid: input-system-edit-bindings
+---
+
+# Add, duplicate or delete a binding
+
+Open the [Actions Editor window](actions-editor.md) to add, duplicate, or delete bindings.
+
+## Add a binding
+
+To add a new binding to an action:
+
+1. Select the Add (+) icon on the action.
+2. Select the appropriate [binding type](binding-types.md) from the menu that appears.
+
+Once you have added a binding, the next step is usually to configure its [control path](./control-paths.md).
+
+## Delete a binding
+
+To delete an existing binding from an action:
+
+1. Right-click the action.
+2. Select __Delete__ from the context menu.
+
+## Duplicate a binding
+
+To duplicate an existing binding on an action:
+
+1. Right-click the action.
+2. Select __Duplicate__ from the context menu.
+
+## Multiple bindings
+
+You can add multiple bindings to an action, which is generally useful for supporting multiple types of input device. For example, in the default set of actions, the "Move" action has a binding to the left gamepad stick and the WSAD keys, which means input through any of these bindings will perform the action.
+
+
+_The default "Move" action in the Actions Editor window, displaying the multiple bindings associated with it._
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-layout-from-cs.md b/Packages/com.unity.inputsystem/Documentation~/add-layout-from-cs.md
new file mode 100644
index 0000000000..c21a7e7af4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-layout-from-cs.md
@@ -0,0 +1,79 @@
+---
+uid: input-system-add-layout-from-cs
+---
+
+# Add a layout from C#
+
+In its most basic form, a layout can be expressed by a C# class derived from:
+
+* [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html) for a Control layout.
+* [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) for a Device layout.
+
+```CSharp
+// The InputControlLayout attribute is not strictly necessary here.
+// However, you can use it to set additional properties (such as
+// a custom display name for the layout).
+[InputControlLayout]
+public class MyDevice : InputDevice
+{
+ public AxisControl axis { get; private set; }
+ public ButtonControl button { get; private set; }
+
+ protected override void FinishSetup(InputDeviceBuilder builder)
+ {
+ base.FinishSetup(builder);
+
+ axis = builder.GetControl("axis");
+ button = builder.GetControl("button");
+ }
+}
+```
+
+You can then register the layout with [`InputSystem.RegisterLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayout_System_String_System_String_System_Nullable_UnityEngine_InputSystem_Layouts_InputDeviceMatcher__). This works the same for Control and for Device layouts.
+
+```CSharp
+// Note: This should generally be done from InitializeOnLoad/
+// RuntimeInitializeOnLoad code.
+InputSystem.RegisterLayout();
+```
+
+When the layout is instantiated, the system looks at every field and property defined directly in the type to potentially turn it into one or more [Control items](#control-items).
+
+1. If the field or property is annotated with [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html), the system applies the attribute's properties to the Control item. Some special defaults apply in this case:
+ * If no [`offset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_offset) is set, and the attribute is applied to a field, [`offset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_offset) defaults to the offset of the field.
+ * If no [`name`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_name) is set, it defaults to the name of the property/field.
+ * If no [`layout`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_layout) is set, the system infers it from the type of the field/property.
+2. If the field or property has a struct type which implements [`IInputStateTypeInfo`](../api/UnityEngine.InputSystem.LowLevel.IInputStateTypeInfo.html), the field is considered to be an embedded [state struct](#using-a-state-structure) and the system recurses into the field or property to gather Controls from it.
+3. Otherwise, if the type of the field or property is based on [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html), the system adds a [Control item](#control-items) similar to case 1, where the member is annotated with [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html).
+
+## Using a state structure
+
+When you implement support for a new Input Device, there's usually an existing data format in which the Input System receives input for the Device. The easiest way to add support for the data format is to describe it with a C# struct annotated with [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html).
+
+```CSharp
+public struct MyDeviceState : IInputStateTypeInfo
+{
+ public FourCC format => new FourCC('M', 'D', 'E', 'V');
+
+ [InputControl(name = "button1", layout = "Button", bit = 0)]
+ [InputControl(name = "button2", layout = "Button", bit = 1)]
+ [InputControl(name = "dpad", layout = "Dpad", bit = 2, sizeInBits = 4)]
+ [InputControl(name = "dpad/up", bit = 2)]
+ [InputControl(name = "dpad/down", bit = 3)]
+ [InputControl(name = "dpad/left", bit = 4)]
+ [InputControl(name = "dpad/right", bit = 5)]
+ public int buttons;
+
+ [InputControl(layout = "Stick")]
+ public Vector2 stick;
+
+ [InputControl(layout = "Axis")] // Automatically converts from byte to float.
+ public byte trigger;
+}
+
+// The Device must be directed to the state struct we have created.
+[InputControlLayout(stateType = typeof(MyDeviceState)]
+public class MyDevice : InputDevice
+{
+}
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-layout-from-json.md b/Packages/com.unity.inputsystem/Documentation~/add-layout-from-json.md
new file mode 100644
index 0000000000..76e1925f36
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-layout-from-json.md
@@ -0,0 +1,70 @@
+---
+uid: input-system-add-layout-from-json
+---
+
+# Add a layout from JSON
+
+You can also create a layout from a JSON string that contains the same information. This is mostly useful if you want to be able to store and transfer layout information separate from your code - for instance, if you want to be able to add support for new Devices dynamically without making a new build of your application. You can use [`InputControlLayout.ToJson()`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html#UnityEngine_InputSystem_Layouts_InputControlLayout_ToJson) and [`InputControlLayout.FromJson()`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html#UnityEngine_InputSystem_Layouts_InputControlLayout_FromJson_System_String_) to convert layouts to and from the format.
+
+The same layout as above looks like this in JSON format:
+
+```
+{
+ "name": "MyDevice",
+ "format": "MDEV",
+ "controls": [
+ {
+ "name": "button1",
+ "layout": "Button",
+ "offset": 0,
+ "bit": 0,
+ },
+ {
+ "name": "button2",
+ "layout": "Button",
+ "offset": 0,
+ "bit": 1,
+ },
+ {
+ "name": "dpad",
+ "layout": "Dpad",
+ "offset": 0,
+ "bit": 2,
+ "sizeInBits": 4,
+ },
+ {
+ "name": "dpad/up",
+ "offset": -1,
+ "bit": 2,
+ },
+ {
+ "name": "dpad/down",
+ "offset": -1,
+ "bit": 3,
+ },
+ {
+ "name": "dpad/left",
+ "offset": -1,
+ "bit": 4,
+ },
+ {
+ "name": "dpad/right",
+ "offset": -1,
+ "bit": 5,
+ },
+ {
+ "name": "stick",
+ "layout": "Stick",
+ "offset": 4,
+ "format": "VEC2",
+ },
+ {
+ "name": "trigger",
+ "layout": "Axis",
+ "offset": 12,
+ "format": "BYTE",
+
+ }
+ ]
+}
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-layout-using-layout-builder.md b/Packages/com.unity.inputsystem/Documentation~/add-layout-using-layout-builder.md
new file mode 100644
index 0000000000..cb25d603f0
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-layout-using-layout-builder.md
@@ -0,0 +1,61 @@
+---
+uid: input-system-layout-builder
+---
+
+# Add a layout using Layout Builder
+
+Finally, the Input System can also build layouts on the fly in code. This is useful for Device interfaces such as [HID](hid-specification.md) that supply descriptive information for each Device.
+
+To build layouts dynamically in code, you can use the [`InputControlLayout.Builder`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.html) API.
+
+Here's the same layout from the previous examples constructed programmatically:
+
+```
+var builder = new InputControlLayout.Builder()
+ .WithName("MyDevice")
+ .WithFormat("MDEV");
+
+builder.AddControl("button1")
+ .WithLayout("Button")
+ .WithByteOffset(0)
+ .WithBitOffset(0);
+
+builder.AddControl("button2")
+ .WithLayout("Button")
+ .WithByteOffset(0)
+ .WithBitOffset(1);
+
+builder.AddControl("dpad")
+ .WithLayout("Dpad")
+ .WithByteOffset(0)
+ .WithBitOffset(2)
+ .WithSizeInBits(4);
+
+builder.AddControl("dpad/up")
+ .WithByteOffset(-1)
+ .WithBitOffset(2);
+
+builder.AddControl("dpad/down")
+ .WithByteOffset(-1)
+ .WithBitOffset(3);
+
+builder.AddControl("dpad/left")
+ .WithByteOffset(-1)
+ .WithBitOffset(4);
+
+builder.AddControl("dpad/right")
+ .WithByteOffset(-1)
+ .WithBitOffset(5);
+
+builder.AddControl("stick")
+ .WithLayout("Stick")
+ .WithByteOffset(4)
+ .WithFormat("VEC2");
+
+builder.AddControl("trigger")
+ .WithLayout("Axis")
+ .WithByteOffset(12)
+ .WithFormat("BYTE");
+
+var layout = builder.Build();
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-processors-bindings-actions.md b/Packages/com.unity.inputsystem/Documentation~/add-processors-bindings-actions.md
new file mode 100644
index 0000000000..35c7ce4622
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-processors-bindings-actions.md
@@ -0,0 +1,35 @@
+---
+uid: input-system-add-processors-bindings-actions
+---
+
+# Add processors to bindings and actions
+
+To add a processor to an [action](actions.md) or [binding](bindings.md) via the Input Actions Editor:
+
+1. Select the action or binding you want to add processors to. The Properties panel opens in the right pane of the window.
+1. In the Properties panel, navigate to the **Processors** foldout. Select the **Add (+)** icon on the header to open a list of all available processors that match your control type.
+1. From the drop-down list, select a processor type. A processor of that type appears in the __Processors__ foldout.
+1. In the __Processors__ foldout, edit any parameters of the processor.
+
+ 
+
+To remove a processor, select the **Remove (-)** icon next to it. You can also use the up and down arrows to change the order of processors. This affects the order in which the system processes values.
+
+To add a processor to an action or binding via code, use the following code examples as templates:
+
+**Actions:**
+
+```CSharp
+var action = new InputAction(processors: "invertVector2(invertX=false)");
+```
+
+**Bindings:**
+
+```CSharp
+var action = new InputAction();
+action.AddBinding("/leftStick")
+ .WithProcessor("invertVector2(invertX=false)");
+```
+
+>[!NOTE]
+>The received value and result value must be of the same type. To convert received input values into different types, see [composite Bindings](composite-bindings.md).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/add-processors-controls.md b/Packages/com.unity.inputsystem/Documentation~/add-processors-controls.md
new file mode 100644
index 0000000000..eb10b84580
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/add-processors-controls.md
@@ -0,0 +1,42 @@
+---
+uid: input-system-add-processors-controls
+---
+
+# Add processors to controls
+
+The Input System automatically adds processors to a Control during device creation if they're specified in the Control's [layout](layouts.md).
+
+You can't add processors to existing Controls after they've been created. You can only add processors to Controls when you're [creating custom devices](create-custom-device.md).
+
+If you're using a layout generated by the Input System from a [state struct](step-1-state-struct.md) using [`InputControlAttributes`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html), you can specify the processors you want to use via the [`processors`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_processors) property of the attribute, like this:
+
+```CSharp
+public struct MyDeviceState : IInputStateTypeInfo
+{
+ public FourCC format => return new FourCC('M', 'Y', 'D', 'V');
+
+ // Add an axis deadzone to the Control to ignore values
+ // smaller then 0.2, as our Control does not have a stable
+ // resting position.
+ [InputControl(layout = "Axis", processors = "AxisDeadzone(min=0.2)")]
+ public short axis;
+}
+```
+
+If you [create a layout from JSON](layouts.md#layout-from-json), you can specify processors on your Controls like this:
+
+```json
+{
+ "name" : "MyDevice",
+ "extend" : "Gamepad", // Or some other thing
+ "controls" : [
+ {
+ "name" : "axis",
+ "layout" : "Axis",
+ "offset" : 4,
+ "format" : "FLT",
+ "processors" : "AxisDeadzone(min=0.2)"
+ }
+ ]
+}
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/api-overview.md b/Packages/com.unity.inputsystem/Documentation~/api-overview.md
new file mode 100644
index 0000000000..3dabfa9685
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/api-overview.md
@@ -0,0 +1,39 @@
+---
+uid: input-system-action-api-overview
+---
+
+# Scripting with actions API overview
+
+When scripting with actions in the Input System, there are number of important APIs you can use, listed here.
+
+## Namespace
+
+The Input System's API is contained in the `UnityEngine.InputSystem` namespace. To use it, include the namespace as follows:
+
+```
+using UnityEngine.InputSystem;
+```
+
+## Important APIs
+
+|API name|Description|
+|-----|-----------|
+|[`InputSystem.actions`](../api/UnityEngine.InputSystem.InputSystem.html)|A reference to the set of actions assigned as the [project-wide Actions](./about-project-wide-actions.md).|
+|[`InputAction`](../api/UnityEngine.InputSystem.InputAction.html)|The class which represents an action. You can use a reference to an action to read the current value of the controls that it is bound to, or to trigger callbacks in response to input. This class corresponds to an entry in the **Actions**"** column of the [Input Actions editor](actions-editor.md).|
+|[`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html)|The class which represents an [action map](create-edit-delete-action-maps.md). The API equivalent to an entry in the "Action Maps" column of the [Input Actions editor](actions-editor.md).|
+|[`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html)|The relationship between an action and the specific device controls for which it receives input. For more information about Bindings and how to use them, see [bindings](bindings.md).|
+
+## Actions
+
+The [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html) class represents an action in the Input System. These are the same actions that you [create in the actions editor](actions.md).
+
+With a reference to an action, you can then read values and state changes using eeither the [polling](polling-actions.md) or [callbacks](set-callbacks-on-actions.md) workflow.
+
+Each action has a name ([`InputAction.name`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_name)), which must be unique within the Action Map that the Action belongs to, if any (see [`InputAction.actionMap`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_actionMap)). Each Action also has a unique ID ([`InputAction.id`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_id)), which you can use to reference the Action. The ID remains the same even if you rename the Action.
+
+## Action maps
+
+Each Action Map has a name ([`InputActionMap.name`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_name)), which must also be unique with respect to the other Action Maps present, if any. Each Action Map also has a unique ID ([`InputActionMap.id`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_id)), which you can use to reference the Action Map. The ID remains the same even if you rename the Action Map.
+
+With a reference to an action map, you can then read all the [`actions`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_actions) which belong to that map.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/apply-interactions-actions.md b/Packages/com.unity.inputsystem/Documentation~/apply-interactions-actions.md
new file mode 100644
index 0000000000..4a865c0bec
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/apply-interactions-actions.md
@@ -0,0 +1,28 @@
+---
+uid: input-system-apply-interactions-actions
+---
+
+# Apply interactions to actions
+
+Applying Interactions directly to an Action is equivalent to applying them to all Bindings for the Action. You can use this instead of manually adding the same Interaction(s) to multiple Bindings.
+
+To apply Interactions to individual Bindings, refer to [Apply Interactions to Bindings](apply-interactions-bindings.md).
+
+If you apply Interactions to both an Action and its Bindings, then the effect is the same as if the Action's Interactions are on the list of Interactions on each of the Bindings. This means that the Input System applies the Binding's Interactions first, and then the Action's Interactions.
+
+## Apply Interactions to Actions via the Editor
+
+To apply interactions via the Input Action Editor:
+
+1. Select an Action to edit, so that the right pane of the window displays the properties for that Action.
+1. Select the plus icon on the __Interactions__ foldout to open a list of all available Interactions types.
+1. Select an Interaction type to add an Interaction instance of that type. The Interaction now appears in the __Interactions__ foldout.
+1. If the Interaction has any parameters, you can now edit them at this stage.
+
+## Apply Interactions to Actions via code
+
+If you create your Actions in code, you can add Interactions like this:
+
+```CSharp
+var Action = new InputAction(Interactions: "tap(duration=0.8)");
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/apply-interactions-bindings.md b/Packages/com.unity.inputsystem/Documentation~/apply-interactions-bindings.md
new file mode 100644
index 0000000000..8e5dc15b69
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/apply-interactions-bindings.md
@@ -0,0 +1,32 @@
+---
+uid: input-system-apply-interactions-bindings
+---
+
+# Apply interactions to bindings
+
+When you create Bindings for your [Actions](actions.md), you can choose to add Interactions to the Bindings via the Editor, or via code.
+
+To apply Interactions to all Bindings on an Action, refer to [Apply Interactions to Actions](apply-interactions-actions.md).
+
+## Apply Interactions to Bindings via the Editor
+
+If you're using [project-wide actions](actions-editor.md), or [Input Action Assets](action-assets.md), you can add any Interaction to your Bindings via the Input Action editor.
+
+1. Once you have [created some Bindings](actions-editor.md#bindings), select the Binding you want to add Interactions to, so that the right pane of the window displays the properties for that Binding.
+1. Select the plus icon on the __Interactions__ foldout to open a list of all available Interactions types.
+1. Select an Interaction type to add an Interaction instance of that type. The Interaction now appears in the __Interactions__ foldout.
+1. If the Interaction has any parameters, you can now edit them at this stage.
+
+
+
+To remove an Interaction, select the minus (-) button next to it. To change the [order of Interactions](introduction-interactions.md#multiple-interactions-on-a-binding), select the up and down arrows.
+
+## Apply Interactions to Bindings via code
+
+To add Interactions to Bindings that you created in code, you can use the following code sample as a template:
+
+```CSharp
+var Action = new InputAction();
+action.AddBinding("/leftStick")
+ .WithInteractions("tap(duration=0.8)");
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/assign-project-wide-actions.md b/Packages/com.unity.inputsystem/Documentation~/assign-project-wide-actions.md
new file mode 100644
index 0000000000..0e73b87256
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/assign-project-wide-actions.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-existing-project-wide
+---
+
+# Assign an existing action asset as project-wide
+
+To assign an existing Actions Asset as project-wide, do one of the following:
+
+1. Go to **Edit** > **Project Settings** > **Input System Package**
+2. Drag the asset from your Project window into the **Project-wide Actions** field.
+
+
+*The Input System Package Project Settings with no project-wide actions assigned*
+
+or:
+
+1. Select the Asset in your Project window
+2. In the Inspector window, select **Assign as the Project-wide Input Actions**.
+
+
+Only one Actions Asset can be assigned as project-wide. If a different asset was previously assigned as project-wide, it becomes unassigned.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/background-behavior.md b/Packages/com.unity.inputsystem/Documentation~/background-behavior.md
new file mode 100644
index 0000000000..b8a8d3ccfb
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/background-behavior.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-background-behavior
+---
+
+# Background behavior
+
+Background Behaviour determines what happens when [application focus](https://docs.unity3d.com/ScriptReference/Application-isFocused.html) is lost or regained, and how input behaves while the application is not in the foreground.
+
+This setting is only relevant when "Run In Background" is enabled in the [Player Settings](https://docs.unity3d.com/Manual/class-PlayerSettings.html) for the project. This setting is only supported on some platforms. On platforms such as Android and iOS, your app will not run when it is not in the foreground.
+
+In the Editor, "Run In Background" is considered to always be enabled as the player loop is kept running regardless of whether a Game View is focused or not. Also, in development players on desktop platforms, the setting is force-enabled during the build process.
+
+>__Note__: In the editor, `Background Behavior` is further influenced by [`Play Mode Input Behavior`](#play-mode-input-behavior). See [Background and Focus Change Behavior](device-background-focus-changes.md) for a detailed breakdown. In particular, which devices are considered as [`canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) partly depends on the [`Play Mode Input Behavior`](#play-mode-input-behavior) setting.
+
+|Setting|Description|
+|----|-----------|
+|[`Reset And Disable Non Background Devices`](../api/UnityEngine.InputSystem.InputSettings.BackgroundBehavior.html#UnityEngine_InputSystem_InputSettings_BackgroundBehavior_ResetAndDisableNonBackgroundDevices)|When focus is lost, perform a [soft reset](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) on all Devices that are not marked as [`canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) and also subsequently [disable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) them. Does not affect Devices marked as being able to run in the background. When focus is regained, [re-enable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_) any Device that has been disabled and also issue a [sync request](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_TrySyncDevice_UnityEngine_InputSystem_InputDevice_) on these Devices in order to update their current state. If a Device is issued a sync request and does not respond to it, [soft-reset](reset-device.md) the Device. This is the default setting.|
+|[`Reset And Disable All Devices`](../api/UnityEngine.InputSystem.InputSettings.BackgroundBehavior.html#UnityEngine_InputSystem_InputSettings_BackgroundBehavior_ResetAndDisableAllDevices)|When focus is lost, perform a [soft reset](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) on all Devices and also subsequently [disable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_) them. When focus is regained, [re-enable](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_UnityEngine_InputSystem_InputDevice_) all Devices and also issue a [sync request](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_TrySyncDevice_UnityEngine_InputSystem_InputDevice_) on each Device in order to update it to its current state. If a device does not respond to the sync request, [soft-reset](reset-device.md) it.|
+|[`Ignore Focus`](../api/UnityEngine.InputSystem.InputSettings.BackgroundBehavior.html#UnityEngine_InputSystem_InputSettings_BackgroundBehavior_IgnoreFocus)|Do nothing when focus is lost. When focus is regained, issue a [sync request](sync-device.md) on all Devices.|
+
+Focus behavior has implications for how [Actions](actions.md) behave on focus changes. When a Device is reset, Actions bound to Controls on the device will be cancelled. This ensures, for example, that a user-controlled character in your game doesn't continue to move when focus is lost while the user is pressing one of the W, A, S or D keys. The cancellation happens in such a way that Actions are guaranteed to not trigger. That is, even if an Action is set to trigger on button release, it will not get triggered when a button is down and gets reset by a [Device reset](reset-device.md).
diff --git a/Packages/com.unity.inputsystem/Documentation~/bind-touch-input.md b/Packages/com.unity.inputsystem/Documentation~/bind-touch-input.md
new file mode 100644
index 0000000000..32c8958f11
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/bind-touch-input.md
@@ -0,0 +1,20 @@
+---
+uid: input-system-bind-touch-input
+---
+
+# Bind touch input to an action
+
+You can use touch input with [Actions](actions.md), like any other pointer device. To use actions with touch devices:
+
+* Associate [bindings](bindings.md) to the [pointer controls available in the `Pointer` class](xref:UnityEngine.InputSystem.Pointer). For example, `/press` or `/delta`.
+
+This gets input from the primary touch, and any other non-touch pointer devices.
+
+## Get input from multiple touches
+
+If you want to get input from multiple touches in the action:
+
+* Use bindings like `/touch3/press` to bind to individual touches.
+* Alternatively, use a wildcard binding to bind one action to all touches. For example, `/touch*/press`.
+
+If you bind a single action to input from multiple touches, set the action type to [pass-through](respond-to-input.md#pass-through) so the action gets callbacks for each touch, instead of just one.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/binding-conflicts.md b/Packages/com.unity.inputsystem/Documentation~/binding-conflicts.md
new file mode 100644
index 0000000000..a8de4b5169
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/binding-conflicts.md
@@ -0,0 +1,91 @@
+---
+uid: input-system-binding-conflicts
+---
+
+# Binding conflicts
+
+A binding conflict is when an [action](actions.md) with more than one [control](./controls.md) [bound](./bindings.md) to it receives values from multiple controls.
+
+## Conflict situations
+
+Binding conflict situations can arise in two different ways. Either:
+
+- **Multiple concurrent controls**. Several controls are bound to the same action and more than one is feeding input into the Action at the same time. Example: an Action that is bound to both the left and right trigger on a Gamepad and both triggers are pressed.
+
+Or:
+
+- **Multiple input sequences**. The input is part of a sequence of inputs and there are several possible such sequences. Example: one Action is bound to the `B` key and another Action is bound to `Shift-B`.
+
+## Conflict Resolution
+
+For [**value** and **button** type actions](./action-and-control-types.md), the Input System continuously monitors all the controls bound to the action, and then chooses the one which is the **most actuated** to be the control driving the action. Most actuated means the largest absolute value is being reported, whether positive or negative in the case of a 1D axis, and regardless of direction in the case of 2D and 3D axes. The value of the most actuated control is reported in callbacks, and triggered whenever the value changes.
+
+If a different bound control is actuated more, that control becomes the control driving the action. This is useful if you want to allow different Controls to control an Action in the game, but only take input from one Control at the same time.
+
+[Pass-through type actions](./configure-action-type.md) do not perform conflict resolution, and are intended allow multiple concurrent inputs.
+
+## Multiple concurrent controls
+
+For a **Button** or **Value** [action type](./configure-action-type.md), there can only be one control at any time that is "driving" the action. This control is considered the [`activeControl`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl).
+
+When an action is bound to multiple controls, the active control at any point is the one with the greatest level of ["actuation"](./control-actuation.md) (the one with the largest value returned from [`EvaluateMagnitude`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude_)). If a different control exceeds the actuation level of the current active control, it becomes the active control.
+
+For [composite bindings](./composite-bindings.md), magnitudes of the composite as a whole rather than for individual controls are tracked. However, [`activeControl`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl) will still track individual Controls from the composite.
+
+## Multiple input sequences (such as keyboard shortcuts)
+
+>__Note__: The mechanism described here only applies to Actions that are part of the same [action map](./input-actions-editor-window-reference.md#action-maps-panel-reference) or [action assets](./action-assets.md).
+
+Inputs used in combinations with other inputs can also lead to ambiguities. If, for example, the **B** key on the Keyboard is bound both on its own as well as in combination with the **Shift** key, then if you first press **Shift** and then **B**, the latter key press would be a valid input for either of the Actions.
+
+The way the Input System handles this, is that Bindings are processed in the order of decreasing complexity. This metric is derived automatically from the Binding:
+
+* A binding that is *not* part of a [composite](composite-bindings.md) is assigned a complexity of 1.
+* A binding that *is* part of a [composite](composite-bindings.md) is assigned a complexity equal to the number of part bindings in the composite.
+
+In our example, this means that a **one-modifier composite** binding to **Shift** + **B** has a higher complexity than a Binding to **B** and gets processed first.
+
+Additionally, if the [Input Consumption](input-settings.md) setting is enabled, the first Binding that results in the Action changing [phase](./set-callbacks-on-actions.md) will consume the input. This results in other Bindings to the same input not being processed. This means in our example, when the **Shift** + **B** binding consumes the **B** input, the Binding to **B** is skipped.
+
+
+## Disabling Conflict Resolution
+
+Conflict resolution is always applied to **Button** or **Value** [action types](./configure-action-type.md). However, it can be undesirable in situations when an action is simply used to gather all inputs from bound Controls. For example, if you have a **Button** type action bound to the **A** button on all gamepads, a user holding down **A** on one gamepad means that the **A** button on other gamepads is ignored.
+
+By using the **Pass Through** action type, conflict resolution is bypassed, which means pressing the **A** button on one gamepad will not result in presses on other gamepads being ignored.
+
+## API Example
+
+The following example illustrates how this works at the API level.
+
+```CSharp
+// Create two actions in the same map.
+var map = new InputActionMap();
+var bAction = map.AddAction("B");
+var shiftbAction = map.AddAction("ShiftB");
+
+// Bind one of the actions to 'B' and the other to 'SHIFT+B'.
+bAction.AddBinding("/b");
+shiftbAction.AddCompositeBinding("OneModifier")
+ .With("Modifier", "/shift")
+ .With("Binding", "/b");
+
+// Print something to the console when the actions are triggered.
+bAction.performed += _ => Debug.Log("B action performed");
+shiftbAction.performed += _ => Debug.Log("SHIFT+B action performed");
+
+// Start listening to input.
+map.Enable();
+
+// Now, let's assume the left shift key on the keyboard is pressed (here, we manually
+// press it with the InputTestFixture API).
+Press(Keyboard.current.leftShiftKey);
+
+// And then the B is pressed. This is a valid input for both
+// bAction as well as shiftbAction.
+//
+// What will happen now is that shiftbAction will do its processing first. In response,
+// it will *perform* the action (i.e. we see the `performed` callback being invoked) and
+// thus "consume" the input. bAction will stay silent as it will in turn be skipped over.
+Press(keyboard.bKey);
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/binding-initial-state-checks.md b/Packages/com.unity.inputsystem/Documentation~/binding-initial-state-checks.md
new file mode 100644
index 0000000000..78632f0d83
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/binding-initial-state-checks.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-binding-initial-state-checks
+---
+
+# Binding initial state checks
+
+After an action is [enabled](enable-actions.md), it will start reacting to input as it comes in. However, at the time the action is enabled, one or more of the controls that are [bound](./add-duplicate-delete-binding.md) to an action may already have a non-default state, for example if a user was currently pressing a button or pushing a thumb stick.
+
+Using what is referred to as an "initial state check", an Action can be made to respond to such a non-default state as if the state change happened *after* the Action was enabled. The way this works is that in the first input [update](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_) after the Action was enabled, all its bound controls are checked in turn. If any of them has a non-default state, the Action responds right away.
+
+This check is implicitly enabled for actions whose [Action Type](./configure-action-type.md) is set to **Value**. If, for example, you have a "Move" Action bound to the left stick on the gamepad and the stick is already pushed in a direction when "Move" is enabled, the character will immediately start walking.
+
+By default, actions whose [Action Type](./configure-action-type.md) is set to **Button** or **Pass-Through**, do not perform this check. A button that is pressed when its respective Action is enabled first needs to be released and then pressed again for it to trigger the Action. The initial state check is usually not useful in such cases, because it can trigger actions if the button is still held down from a previous press when the action was enabled.
+
+However, you can manually enable initial state checks on these types of actions by doing the following:
+
+1. Select the action in the [Actions panel](./input-actions-editor-window-reference.md#actions-panel-reference) of the [Actions Editor window](./actions-editor.md)
+2. Enable the **Initial State Check** option in the [Actions Properties panel](./action-properties-panel-reference.md) to the right.
diff --git a/Packages/com.unity.inputsystem/Documentation~/binding-properties-panel-reference.md b/Packages/com.unity.inputsystem/Documentation~/binding-properties-panel-reference.md
new file mode 100644
index 0000000000..fe9fd95043
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/binding-properties-panel-reference.md
@@ -0,0 +1,64 @@
+---
+uid: input-system-binding-properties-panel
+---
+
+# Binding Properties panel reference
+
+Use the Binding Properties panel to configure [bindings](bindings.md) and [composite bindings](composite-bindings.md), and their associated [interactions](Interactions.md) and [processors](processors.md).
+
+
+The Binding Properties panel changes depending on whether you are configuring a single [binding](bindings.md) or a [composite binding](composite-bindings.md).
+
+## Binding properties
+
+For each [binding](bindings.md), the Binding Properties panel displays the following properties by default:
+
+|Property|Description|
+|-|-|
+|**Path**| Select the path of the control to assign this binding to. You can select an [input device](devices.md) from the list available, or use the **Usage** menu to select from a list of [usages](control-usages.md). |
+|**Use in control scheme**|Select the [control schemes](control-schemes.md) that you want to apply this binding to. This section only appears if you have control schemes in your project. |
+
+## Composite binding properties
+
+When you create a [composite binding](composite-bindings.md), the Binding Properties panel displays the following properties by default:
+
+|Property|Description|
+|-|-|
+|**Composite Type**|Select the [composite type](composite-bindings.md) of the selected binding. The options are: - **1D Axis**: Create a composite binding made of two buttons: one that pulls a 1D axis in its negative direction, and another that pulls it in its positive direction. - **2D Vector**: Create a composite binding that represents a 4-way button setup like the D-pad on gamepads. - **3D Vector**: Create a composite binding that represents a 6-way button where two combinations each control one axis of a 3D vector. - **One Modifier**: Create a composite binding that requires the user to hold down a "modifier" button in addition to another control from which the actual value of the Binding is determined. - **Two Modifiers**: Create a composite binding that requires the user to hold down a "modifier" button in addition to another control from which the actual value of the Binding is determined. |
+
+For more information on the composite types that are available by default, refer to scripting documentation on [`InputSystem.Composites`](../api/UnityEngine.InputSystem.Composites). Others might also be available if your project contains custom composite binding types.
+
+### Axis binding reference
+
+When **Composite Type** is set to **1D Axis**, the Binding Properties panel displays the following properties by default:
+
+|Property|Description|
+|-|-|
+|**Which Side Wins**|Define what happens when both buttons are triggered at the same time. - **Positive**: Prioritize the Positive binding. - **Negative**: Prioritize the Negative binding. - **Neither**: Do nothing when both bindings are triggered at the same time. |
+
+For more details, refer to scripting reference documentation on [`Composites.AxisComposite`](..api/UnityEngine.InputSystem.Composites.AxisComposite.html).
+
+### Vector binding reference
+
+When **Composite Type** is set to **2D Vector** or **3D Vector**, the Binding Properties panel displays the following properties by default:
+
+|Property|Description|
+|-|-|
+|**Mode**| Select the process that the Input System uses to calculate a Vector2 or Vector3 from the input values provided. - **Analog**: Accept and use the floating-point values from controls. - **Digital**: Treat control values as on/off, and do not normalize the resulting vector. - **Digital Normalized**: Treat control values as on/off, and normalize the resulting vector. |
+
+For more details on each mode, refer to scripting reference documentation on [`Vector2Composite.Mode`](../api/UnityEngine.InputSystem.Composites.Vector2Composite.Mode) and [`Vector3Composite.Mode`](../api/UnityEngine.InputSystem.Composites.Vector3Composite.Mode).
+
+### Binding with modifier reference
+
+When **Composite Type** is set to **One Modifier**, **Two Modifiers**, **Button With One Modifier**, or **Button with Two Modifiers**, the Binding Properties panel displays the following properties by default:
+
+|Property|Description|
+|-|-|
+|**Override Modifiers Need To Be Pressed First**| **Note**: This property is obsolete. Use the **Modifiers Order** property instead. Override the Input Consumption setting, so that the composite binding still triggers if the modifiers are pressed after the button. |
+|**Modifiers order**| Define the order in which buttons and modifiers must be pressed in order to trigger the composite binding. - **Default**: Apply the Input Consumption setting. - **Ordered**: Only trigger the binding if the modifiers are in a pressed state before the button enters a pressed state. - **Unordered**: Allow the binding to trigger regardless of the order in which the buttons and modifiers enter a pressed state. |
+
+For more details, refer to scripting reference documentation on [`OneModifierComposite`](..api/UnityEngine.InputSystem.Composites.OneModifierComposite.html), [`TwoModifiersComposite`](..api/UnityEngine.InputSystem.Composites.TwoModifiersComposite.html), [`ButtonWithOneModifier`](..api/UnityEngine.InputSystem.Composites.ButtonWithOneModifier.html), and [`ButtonWithTwoModifiers`](..api/UnityEngine.InputSystem.Composites.ButtonWithTwoModifiers.html).
+
+[!include[Interactions reference](include-interactions-reference)]
+
+[!include[Processors reference](include-processors-reference)]
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/binding-resolution.md b/Packages/com.unity.inputsystem/Documentation~/binding-resolution.md
new file mode 100644
index 0000000000..cd62a93c55
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/binding-resolution.md
@@ -0,0 +1,43 @@
+---
+uid: input-system-binding-resolution
+---
+
+# Binding resolution
+
+Binding resolution refers to when the Input System looks up which actual controls on connected devices should be used by each action, based on their binding control paths.
+
+## Why bindings are resolved
+
+Each [simple binding](./binding-types.md) has a [control path](./control-paths.md), which determines which [control](controls.md) (or controls) should be associated with the action. For [composite bindings](./composite-bindings.md), each of the composites sub-bindings (or **parts**) has a control path.
+
+Control paths are stored as a string that describes where to find the relevant control or controls for the binding. For example, a control path "`/buttonEast`" refers to the right action button on any connected gamepad.
+
+Because control paths can refer to specific devices, or more broadly to a device type, and can also contain wildcard characters, and there may be any combinations of input hardware connected, the Input System must **resolve** the bindings at runtime to work out which controls on connected devices are valid for each action. This occurs when the Input System accesses an action for the first time.
+
+## What happens during resolution
+
+During binding resolution, the action automatically calls [`InputSystem.FindControls<>()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_FindControls__1_System_String_UnityEngine_InputSystem_InputControlList___0___) (filtering for devices assigned to the InputActionMap, if there are any) for the Binding path of each of the Action's bindings. This creates a list of resolved Controls that are now bound to the Action.
+
+Note that a single [binding control path](control-paths.md) can match multiple Controls. For example:
+
+* A device-specific path such as `/buttonEast` matches the "Circle" button on a [PlayStation controller](devices-gamepads.md#playstation-controllers). If you have multiple PlayStation controllers connected, it resolves to the "Circle" button on each of these controllers.
+
+* An abstract device path such as `/buttonEast` matches the right action button on any connected gamepad. If you have a PlayStation controller and an [Xbox controller](devices-gamepads.md#xbox-controllers) connected, it resolves to the "Circle" button on the PlayStation controller, and to the "B" button on the Xbox controller.
+
+* A Binding path can also contain wildcards, such as `/button*`. This matches any control on any gamepad with a name starting with "button", which matches all the four action buttons on any connected gamepad. A different example: `*/{Submit}` matches any control tagged with the "Submit" [usage](controls.md#control-usages) on any device.
+
+If there are multiple bindings on the same action that all reference the same control(s), the control will effectively feed into the action multiple times. This is to allow, for example, a single control to produce different input on the same action by virtue of being bound in a different fashion ([composites](./composite-bindings.md), [processors](./add-processors-bindings-actions.md), [interactions](Interactions.md), etc). However, regardless of how many times a control is bound on any given action, it will only appear once in the action's [array of `controls`](xref:UnityEngine.InputSystem.InputAction.controls).
+
+To query the Controls that an Action resolves to, you can use [`InputAction.controls`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls). You can also run this query if the Action is disabled.
+
+To be notified when binding resolution happens, you can listen to [`InputSystem.onActionChange`](xref:UnityEngine.InputSystem.InputSystem.onActionChange) which triggers [`InputActionChange.BoundControlsAboutToChange`](xref:UnityEngine.InputSystem.InputActionChange.BoundControlsAboutToChange) before modifying Control lists and triggers [`InputActionChange.BoundControlsChanged`](xref:UnityEngine.InputSystem.InputActionChange.BoundControlsChanged) after having updated them.
+
+## Binding resolution while actions are enabled
+
+In certain situations, the controls bound to an action have to be updated more than once. For example, if a new device is plugged in and becomes usable with an action, the action may now pick up input from additional controls. Also, if bindings are added, removed, or modified, control lists will need to be updated.
+
+This updating of controls usually happens transparently in the background. However, when an action is [enabled](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_enabled) and especially when it is [in progress](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_IsInProgress_), there may be a noticeable effect on the Action.
+
+Adding or removing a device – either [globally](xref:UnityEngine.InputSystem.InputSystem.devices) or to/from the [device list](xref:UnityEngine.InputSystem.InputActionAsset.devices) of an Action – will remain transparent __except__ if an Action is in progress and it is the device of its [active Control](xref:UnityEngine.InputSystem.InputAction.activeControl) that is being removed. In this case, the Action will automatically be [cancelled](xref:UnityEngine.InputSystem.InputAction.canceled).
+
+Modifying the [binding mask](xref:UnityEngine.InputSystem.InputActionAsset.bindingMask) or modifying any of the Bindings (such as through [rebinding](./interactive-rebinding.md) or by adding or removing bindings) will, however, lead to all enabled actions being temporarily disabled and then re-enabled and resumed.
diff --git a/Packages/com.unity.inputsystem/Documentation~/binding-types.md b/Packages/com.unity.inputsystem/Documentation~/binding-types.md
new file mode 100644
index 0000000000..7a3e5d32c4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/binding-types.md
@@ -0,0 +1,20 @@
+---
+uid: input-system-binding-types
+---
+
+# Binding types
+
+You can configure how bindings map to actions with binding types. The following binding types are available:
+
+- **Simple**: A single control maps directly to an action. For example, a gamepad stick to a `Move` action, or a gamepad button to a `Jump` action.
+- **Composite**: Construct a binding from multiple simple bindings.
+
+When you [add a binding](add-duplicate-delete-binding.md) you must select the appropriate binding type for your action.
+
+Some examples of composite bindings are:
+
+- A **four-way** composite binding, where four keyboard keys map to an action whose [control type](control-types-reference.md) is a 2D vector, so that each of the keys maps to up, down, left, and right respectively. In this scenario, the four key bindings are simple bindings grouped together into into the composite four-way binding.
+
+- A **modifier** composite binding, where one control represents the main binding, and a second control represents a modifier key which changes the effect of the main binding - such as holding down the control key on a keyboard before also pressing a letter key. In this scenario, the two separate key bindings are simple bindings grouped together into the composite modifier binding.
+
+For a full list of composite binding types, refer to [Composite bindings](composite-bindings.md).
diff --git a/Packages/com.unity.inputsystem/Documentation~/bindings.md b/Packages/com.unity.inputsystem/Documentation~/bindings.md
new file mode 100644
index 0000000000..c9de008d2a
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/bindings.md
@@ -0,0 +1,30 @@
+---
+uid: input-system-bindings-landing
+---
+
+# Bindings
+
+
+
+A **binding** represents a connection between an [Action](actions.md) and one or more [Controls](controls.md) identified by a [Control path](./control-paths.md).
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Introduction to bindings](introduction-to-bindings.md)** | Learn the basic concepts of bindings. |
+| **[Binding types](binding-types.md)** | Configure how bindings map to actions with binding types. |
+| **[Composite bindings](composite-bindings.md)** | Bindings made up of multiple simple bindings acting together. |
+| **[Add, duplicate or delete a binding](add-duplicate-delete-binding.md)** | Learn how to add, duplicate or delete bindings. |
+| **[Select a control for binding](select-control-binding.md)** | Learn how to choose a specific control that a binding is bound to, such as a specific button or stick on a gamepad, or a specific keyboard key. |
+| **[Edit composite bindings](edit-composite-bindings.md)**| Add, edit, and delete composite bindings in the **Actions Editor** window. |
+| **[Group bindings to control schemes](group-binding-to-control-scheme.md)** | Group types of related bindings together according to their control type, so that you can enable or disable groups of bindings |
+| **[Binding resolution](binding-resolution.md)** | Learn how the Input Systems resolves binding configurations to currently-connected input devices. |
+| **[Restrict binding resolution to a specific device](restrict-binding-resolution-to-device.md)** | Specify which devices a binding should resolve to. |
+| **[Binding conflicts](binding-conflicts.md)** | Learn how the Input System resolves conflicting or ambiguous situations, such as when multiple bindings map to the same action. |
+| **[Initial state checks](binding-initial-state-checks.md)** | Learn how the Input System deals with if a control is already pressed when an action is enabled, and how to modify this behavior. |
+
+## Additional resources
+
+- [Actions](actions.md)
+- [Control paths](control-paths.md)
+- [Control schemes](control-schemes.md)
+- [User rebinding at runtime](user-rebinding-runtime.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/built-in-interactions.md b/Packages/com.unity.inputsystem/Documentation~/built-in-interactions.md
new file mode 100644
index 0000000000..3a004bca42
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/built-in-interactions.md
@@ -0,0 +1,109 @@
+---
+uid: input-system-built-in-interactions
+---
+
+# Built-in interactions
+
+The Input System package comes with a set of built-in Interactions, which you can use on Actions and Bindings:
+
+* [`PressInteraction`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html)
+* [`HoldInteraction`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html)
+* [`TapInteraction`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html)
+* [`SlowTapInteraction`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html)
+* [`MultiTapInteraction`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html)
+
+Each built-in Interaction has its own parameters, and responds differently to Interaction callbacks.
+
+>[!Note]
+>The built-in Interactions operate on Control actuation and don't use Control values directly. The Input System evaluates the `pressPoint` parameters against the magnitude of the Control actuation. This means you can use these Interactions on any Control which has a magnitude, such as sticks, and not just on buttons.
+
+If an Action or Binding has no Interaction set, the system uses its [default Interaction](default-interactions.md).
+
+## Press
+
+You can use a [`PressInteraction`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html) to explicitly force button-like interactions. Use the [`behavior`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_behavior) parameter to select if the Interaction should trigger on button press, release, or both.
+
+|__Parameters__|Type|Default value|
+|---|---|---|
+|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
+|[`behavior`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_behavior)|[`PressBehavior`](../api/UnityEngine.InputSystem.Interactions.PressBehavior.html)|`PressOnly`|
+
+
+|__Callbacks__/[`behavior`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_behavior)|`PressOnly`|`ReleaseOnly`|`PressAndRelease`|
+|---|-----------|-------------|-----------------|
+|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|
+|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|- Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint) or - Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.PressInteraction.html#UnityEngine_InputSystem_Interactions_PressInteraction_pressPoint)|
+|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|not used|not used|not used|
+
+## Hold
+
+A [`HoldInteraction`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html) requires the user to hold a Control for [`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration) seconds before the Input System triggers the Action.
+
+|__Parameters__|Type|Default value|
+|---|---|---|
+|[`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration)|`float`|[`InputSettings.defaultHoldTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultHoldTime)|
+|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
+
+
+To display UI feedback when a button starts being held, use the [`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started) callback.
+
+```C#
+
+ action.started += _ => ShowGunChargeUI();
+ action.performed += _ => FinishGunChargingAndHideChargeUI();
+ action.cancelled += _ => HideChargeUI();
+
+```
+
+|__Callbacks__||
+|---|---|
+|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint).|
+|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude held above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint) for >= [`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration).|
+|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_pressPoint) before [`duration`](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration) (that is, the button was not held long enough).|
+
+## Tap
+
+A [`TapInteraction`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html) requires the user to press and release a Control within [`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration) seconds to trigger the Action.
+
+|__Parameters__|Type|Default value|
+|---|---|---|
+|[`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration)|`float`|[`InputSettings.defaultTapTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultTapTime)|
+|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
+
+|__Callbacks__||
+|---|---|
+|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint).|
+|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint) before [`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration).|
+|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control magnitude held above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_pressPoint) for >= [`duration`](../api/UnityEngine.InputSystem.Interactions.TapInteraction.html#UnityEngine_InputSystem_Interactions_TapInteraction_duration) (that is, the tap was too slow).|
+
+## SlowTap
+
+A [`SlowTapInteraction`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html) requires the user to press and hold a Control for a minimum duration of [`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration) seconds, and then release it, to trigger the Action.
+
+|__Parameters__|Type|Default value|
+|---|---|---|
+|[`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration)|`float`|[`InputSettings.defaultSlowTapTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultSlowTapTime)|
+|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
+
+|__Callbacks__||
+|---|---|
+|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint).|
+|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint) after [`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration).|
+|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control magnitude goes back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_pressPoint) before [`duration`](../api/UnityEngine.InputSystem.Interactions.SlowTapInteraction.html#UnityEngine_InputSystem_Interactions_SlowTapInteraction_duration) (that is, the tap was too fast).|
+
+## MultiTap
+
+A [`MultiTapInteraction`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html) requires the user to press and release a Control within [`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime) seconds [`tapCount`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapCount) times, with no more then [`tapDelay`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapDelay) seconds passing between taps, for the Interaction to trigger. You can use this to detect double-click or multi-click gestures.
+
+|__Parameters__|Type|Default value|
+|---|---|---|
+|[`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime)|`float`|[`InputSettings.defaultTapTime`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultTapTime)|
+|[`tapDelay`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapDelay)|`float`|2 * [`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime)|
+|[`tapCount`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapCount)|`int`|2|
+|[`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint)|`float`|[`InputSettings.defaultButtonPressPoint`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint)|
+
+|__Callbacks__||
+|---|---|
+|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control magnitude crosses [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint).|
+|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control magnitude went back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint) and back up above it repeatedly for [`tapCount`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapCount) times.|
+|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|- After going back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint), Control magnitude did not go back above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint) within [`tapDelay`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapDelay) time (that is, taps were spaced out too far apart). or - After going back above [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint), Control magnitude did not go back below [`pressPoint`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_pressPoint) within [`tapTime`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html#UnityEngine_InputSystem_Interactions_MultiTapInteraction_tapTime) time (that is, taps were too long).|
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/built-in-processors.md b/Packages/com.unity.inputsystem/Documentation~/built-in-processors.md
new file mode 100644
index 0000000000..b134e4b435
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/built-in-processors.md
@@ -0,0 +1,24 @@
+---
+uid: input-system-built-in-processors
+---
+
+# Built-in processors
+
+The Input System package comes with a set of built-in Processors, which you can use with [bindings](bindings.md), [actions](actions.md) and [controls](controls.md).
+
+
+|**Processor name**|**Description**|**Operand type**|**Parameters**|
+|---|---|---|---|
+|[`Clamp`](../api/UnityEngine.InputSystem.Processors.ClampProcessor.html)|Clamps input values to the [`min`..`max`] range.|`float`||
+|[`Invert`](../api/UnityEngine.InputSystem.Processors.InvertProcessor.html)|Inverts the values from a Control (that is, multiplies the values by −1).|`float`|None|
+|[`InvertVector2`](../api/UnityEngine.InputSystem.Processors.InvertVector2Processor.html)|Inverts the values from a Control (that is, multiplies the values by −1). Inverts the x-axis of the vector if `invertX` is true, and the y-axis if `invertY` is true.|`Vector2`|`bool invertX` `bool invertY` |
+|[`Invert Vector 3`](../api/UnityEngine.InputSystem.Processors.InvertVector3Processor.html)|Inverts the values from a Control (that is, multiplies the values by −1). Inverts the x-axis of the vector if `invertX` is true, the y-axis if `invertY` is true, and the z-axis if `invertZ` is true.|`Vector3`|`bool invertX` `bool invertY` `bool invertZ` |
+|[`Normalize`](../api/UnityEngine.InputSystem.Processors.NormalizeProcessor.html)|Normalizes input values in the range [`min`..`max`] to unsigned normalized form [0..1] if `min` is >= `zero`, and to signed normalized form [-1..1] if `min` < `zero`.|`float`|`float min` `float max` `float zero` |
+|[`NormalizeVector2`](../api/UnityEngine.InputSystem.Processors.NormalizeVector2Processor.html)|Normalizes input vectors to be of unit length (1). This is the same as calling `Vector2.normalized`.|`Vector2`|None|
+|[`NormalizeVector3`](../api/UnityEngine.InputSystem.Processors.NormalizeVector3Processor.html)|Normalizes input vectors to be of unit length (1). This is the same as calling `Vector3.normalized`.|`Vector3`|None|
+|[`Scale`](../api/UnityEngine.InputSystem.Processors.ScaleProcessor.html)|Multiplies all input values by `factor`.|`float`|`float factor`|
+|[`ScaleVector2`](../api/UnityEngine.InputSystem.Processors.ScaleVector2Processor.html)|Multiplies all input values by `x` along the x-axis and by `y` along the y-axis.|`Vector2`||
+|[`ScaleVector3`](../api/UnityEngine.InputSystem.Processors.ScaleVector3Processor.html)|Multiplies all input values by `x` along the x-axis, by `y` along the y-axis, and by `z` along the z-axis.|`Vector3`|`float x` `float y` `float z` |
+|[`AxisDeadzone`](../api/UnityEngine.InputSystem.Processors.AxisDeadzoneProcessor.html)|Scales the values of a Control so that any value with an absolute value smaller than `min` is 0, and any value with an absolute value larger than `max` is 1 or −1. Many Controls don't have a precise resting point (that is, they don't always report exactly 0 when the Control is in the center). Using the `min` value on a deadzone Processor avoids unintentional input from such Controls. Also, some Controls don't consistently report their maximum values when moving the axis all the way. Using the `max` value on a deadzone Processor ensures that you always get the maximum value in such cases.|`float`||
+|[`StickDeadzone`](../api/UnityEngine.InputSystem.Processors.StickDeadzoneProcessor.html)|Scales the values of a Vector2 Control, such as a stick, so that any input vector with a magnitude smaller than `min` results in (0,0), and any input vector with a magnitude greater than `max` is normalized to length 1. Many Controls don't have a precise resting point (that is, they don't always report exactly 0,0 when the Control is in the center). Using the `min` value on a deadzone Processor avoids unintentional input from such Controls. Also, some Controls don't consistently report their maximum values when moving the axis all the way. Using the `max` value on a deadzone Processor ensures that you always get the maximum value in such cases.|`Vector2`|
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/compensate-orientation.md b/Packages/com.unity.inputsystem/Documentation~/compensate-orientation.md
new file mode 100644
index 0000000000..fb990c0fe3
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/compensate-orientation.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-compensate-orientation
+---
+
+# Compensate orientation
+
+If this setting is enabled, rotation values reported by [sensors](devices-sensors.md) are rotated around the Z axis as follows:
+
+|Screen orientation|Effect on rotation values|
+|---|---|
+|[`ScreenOrientation.Portrait`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values remain unchanged|
+|[`ScreenOrientation.PortraitUpsideDown`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values rotate by 180 degrees.|
+|[`ScreenOrientation.LandscapeLeft`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values rotate by 90 degrees.|
+|[`ScreenOrientation.LandscapeRight`](https://docs.unity3d.com/ScriptReference/ScreenOrientation.html)|Values rotate by 270 degrees.|
+
+This setting affects the following sensors:
+* [`Gyroscope`](../api/UnityEngine.InputSystem.Gyroscope.html)
+* [`GravitySensor`](../api/UnityEngine.InputSystem.GravitySensor.html)
+* [`AttitudeSensor`](../api/UnityEngine.InputSystem.AttitudeSensor.html)
+* [`Accelerometer`](../api/UnityEngine.InputSystem.Accelerometer.html)
+* [`LinearAccelerationSensor`](../api/UnityEngine.InputSystem.LinearAccelerationSensor.html)
diff --git a/Packages/com.unity.inputsystem/Documentation~/composite-bindings.md b/Packages/com.unity.inputsystem/Documentation~/composite-bindings.md
new file mode 100644
index 0000000000..314f974e20
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/composite-bindings.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-composite-bindings
+---
+
+# Composite Bindings
+
+Sometimes, you might want to have several Controls act in unison to mimic a different type of Control. The most common example of this is using the W, A, S, and D keys on the keyboard to form a 2D vector Control equivalent to mouse deltas or gamepad sticks. Another example is to use two keys to form a 1D axis equivalent to a mouse scroll axis.
+
+Composite Bindings, made up of multiple **sub-bindings** solve this problem. Composites themselves don't bind directly to Controls; instead, they take values from their **sub-bindings** that do, and then synthesize input from those values together into a single virtual control binding.
+
+To create a composite binding, select the appropriate [composite type](binding-types.md) for your action while [adding a binding in the actions editor](./add-duplicate-delete-binding.md). The types of composite bindings available are as follows:
+
+## Types of composite bindings
+
+The **Add binding (+)** menu contains the following options.
+
+| Value | Description |
+| :---------------------------- | :----------------------------- |
+| **Add Binding** | Adds a [simple binding](./binding-types.md) and is not a composite |
+| **Add Positive/Negative Binding** | Adds a 1D axis composite binding made of two button sub-bindings, one that pulls a 1D axis in its negative direction, and another that pulls it in its positive direction. It is implemented in the [`AxisComposite`](../api/UnityEngine.InputSystem.Composites.AxisComposite.html) class. The output is a `float`. If Controls from both the `positive` and the `negative` side are actuated, then the resulting value of the axis Composite depends on the **Which side wins** [binding property](./binding-properties-panel-reference.md). |
+| **Add Up/Down/Left/Right Composite** | Adds a 2D axis composite binding that represents a 4-way button control like the D-pad on gamepads. Each button sub-binding represents a cardinal direction, is most useful for representing up-down-left-right controls, such as WASD keyboard input. It is implemented in the [`Vector2Composite`](../api/UnityEngine.InputSystem.Composites.Vector2Composite.html) class. The output is a `Vector2`. This composite's [**mode** property](./binding-properties-panel-reference.md) allows you to choose whether the inputs should be treated as digital or analog controls. |
+| **Add Up/Down/Left/Right/Forward/Backward Composite** | Adds a 3D composite binding that represents a 6-way button where two combinations each control one axis of a 3D vector. Implemented in the [`Vector3Composite`](../api/UnityEngine.InputSystem.Composites.Vector3Composite.html) class. The output is a `Vector3`. This composite's [**mode** property](./binding-properties-panel-reference.md) allows you to choose whether the inputs should be treated as digital or analog controls. |
+| **Add Binding With One Modifier** | Adds a composite with two sub-bindings, named **Binding** and **Modifier**, which requires the user to hold down the **modifier** button in addition to another control from which the actual value of the binding is determined. This can be used, for example, for bindings such as "SHIFT+1". Implemented in the [`OneModifierComposite`](../api/UnityEngine.InputSystem.Composites.OneModifierComposite.html) class. The buttons can be on any Device, and can be toggle buttons or full-range buttons such as gamepad triggers. The output is a [value of the same type](control-types-reference.md) as the control bound to the sub-binding named **Binding**. |
+| **Add Binding With Two Modifiers** | Adds a composite with three sub-bindings, named **Binding**, **Modifier 1** and **Modifier 2**, which requires the user to hold down two modifier buttons in addition to another control from which the actual value of the binding is determined. This can be used, for example, for bindings such as "SHIFT+CTRL+1". Implemented in the [`TwoModifiersComposite`](../api/UnityEngine.InputSystem.Composites.TwoModifiersComposite.html) class. The buttons can be on any Device, and can be toggle buttons or full-range buttons such as gamepad triggers. The output is a [value of the same type](control-types-reference.md) as the control bound to the sub-binding named **Binding**. |
+
+> **Note**: You can also [create custom composite bindings from code](./create-custom-composite-binding.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-action-type.md b/Packages/com.unity.inputsystem/Documentation~/configure-action-type.md
new file mode 100644
index 0000000000..75e0baf84e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-action-type.md
@@ -0,0 +1,16 @@
+---
+uid: input-system-conf-action-type
+---
+
+# Configure action type
+
+The action type influences how the Input System processes state changes for the action, and relates to whether this action represents a discrete on/off button-style interaction or a value that can change gradually over time.
+
+Configuring an action's **Action Type** is typically done when you create a new action, however you can also change the action type of an existing action.
+
+To configure an action's action type:
+
+1. [Create a new action](./create-edit-delete-actions.md) or select an existing in the [Actions Editor window](./actions-editor.md).
+2. With the action selected, in the right-hand [Action Properties panel](./action-properties-panel-reference.md), under **Action**, click the **Action Type** dropdown menu.
+3. Select the action type from the available [action type options](action-type-reference.md).
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-actions.md b/Packages/com.unity.inputsystem/Documentation~/configure-actions.md
new file mode 100644
index 0000000000..60a0c5c242
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-actions.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-configure-actions
+---
+
+# Configure actions
+
+Configuring an action covers all the ways an action can be set up, the controls it is bound to, and the ways it responds to signals from those controls.
+
+An action's configuration includes its types, bindings, controls, control schemes, and interactions, described in this section.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Action and control types](action-and-control-types.md)** | Configure action and control types in the **Actions Editor** window. |
+| **[Bindings](bindings.md)** | Connect an action and one or more controls identified by a control path. |
+| **[Controls](controls.md)** | Send values to the Input System with the buttons and sticks on a gamepad, the keys on a keyboard, and other devices. |
+| **[Control schemes](control-schemes.md)** | Enable or disable different sets of bindings for your actions for different types of Devices. |
+| **[Interactions](Interactions.md)** | Interpret specific input patterns from controls that define action behavior |
+| **[Processors](processors.md)** | Apply processing to input values and return the result. |
+
+
+## Additional resources
+
+- [Actions Editor references](actions-editor.md)
+- [Setting up input](setting-up-input.md)
+- [Actions](actions.md)
+- [User rebinding at runtime](user-rebinding-runtime.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/ActionBindings.md b/Packages/com.unity.inputsystem/Documentation~/configure-bindings-from-code.md
similarity index 52%
rename from Packages/com.unity.inputsystem/Documentation~/ActionBindings.md
rename to Packages/com.unity.inputsystem/Documentation~/configure-bindings-from-code.md
index 9c164e2439..9f44f40ee7 100644
--- a/Packages/com.unity.inputsystem/Documentation~/ActionBindings.md
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-bindings-from-code.md
@@ -1,54 +1,23 @@
---
-uid: input-system-action-bindings
+uid: input-system-bindings-from-code
---
-# Input Bindings
-
-* [Composite Bindings](#composite-bindings)
- * [1D Axis](#1d-axis)
- * [2D Vector](#2d-vector)
- * [3D Vector](#3d-vector)
- * [One Modifier](#one-modifier)
- * [Two Modifiers](#two-modifiers)
- * [Writing custom Composites](#writing-custom-composites)
-* [Working with Bindings](#working-with-bindings)
- * [Looking up Bindings](#looking-up-bindings)
- * [Changing Bindings](#changing-bindings)
- * [Applying overrides](#applying-overrides)
- * [Erasing Bindings](#erasing-bindings)
- * [Adding Bindings](#adding-bindings)
- * [Setting parameters](#setting-parameters)
- * [Interactive rebinding](#interactive-rebinding)
- * [Saving and loading rebinds](#saving-and-loading-rebinds)
- * [Restoring original Bindings](#restoring-original-bindings)
- * [Displaying Bindings](#displaying-bindings)
-* [Control schemes](#control-schemes)
-* [Details](#details)
- * [Binding resolution](#binding-resolution)
- * [Binding resolution while Actions are enabled](#binding-resolution-while-actions-are-enabled)
- * [Choosing which Devices to use](#choosing-which-devices-to-use)
- * [Conflicting inputs](#conflicting-inputs)
- * [Initial state check](#initial-state-check)
-
-An [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html) represents a connection between an [Action](Actions.md) and one or more [Controls](Controls.md) identified by a [Control path](Controls.md#control-paths). For example, the **right trigger** of a gamepad (a control) might be bound to an an action named "accelerate", so that pulling the right trigger causes a car to accelerate in your game.
-
-You can add multiple bindings to an action, which is generally useful for supporting multiple types of input device. For example, in the default set of actions, the "Move" action has a binding to the left gamepad stick and the WSAD keys, which means input through any of these bindings will perform the action.
-
-You can also bind multiple controls from the same device to an action. For example, both the left and right trigger of a gamepad could be mapped to the same action, so that pulling either trigger has the same result in your game.
-
-
-_The default "Move" action in the Actions Editor window, displaying the multiple bindings associated with it._
+
+# Configure bindings from code
+
+
+[//]: # (TODO: Most of these examples should be moved to API docs and this page should provide an overview linking to those API pages.)
Each Binding has the following properties:
|Property|Description|
|--------|-----------|
-|[`path`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_path)|[Control path](Controls.md#control-paths) that identifies the control(s) from which the Action should receive input. Example: `"/leftStick"`|
-|[`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath)|[Control path](Controls.md#control-paths) that overrides `path`. Unlike `path`, `overridePath` is not persistent, so you can use it to non-destructively override the path on a Binding. If it is set to something other than null, it takes effect and overrides `path`. To get the path which is currently in effect (that is, either `path` or `overridePath`), you can query the [`effectivePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_effectivePath) property.|
+|[`path`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_path)|[Control path](controls.md#control-paths) that identifies the control(s) from which the Action should receive input. Example: `"/leftStick"`|
+|[`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath)|[Control path](controls.md#control-paths) that overrides `path`. Unlike `path`, `overridePath` is not persistent, so you can use it to non-destructively override the path on a Binding. If it is set to something other than null, it takes effect and overrides `path`. To get the path which is currently in effect (that is, either `path` or `overridePath`), you can query the [`effectivePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_effectivePath) property.|
|[`action`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_action)|The name or ID of the Action that the Binding should trigger. Note that this can be null or empty (for instance, for [composites](#composite-bindings)). Not case-sensitive. Example: `"fire"`|
|[`groups`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_groups)|A semicolon-separated list of Binding groups that the Binding belongs to. Can be null or empty. Binding groups can be anything, but are mostly used for [Control Schemes](#control-schemes). Not case-sensitive. Example: `"Keyboard&Mouse;Gamepad"`|
-|[`interactions`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_interactions)|A semicolon-separated list of [Interactions](Interactions.md) to apply to input on this Binding. Note that Unity appends Interactions applied to the [Action](Actions.md) itself (if any) to this list. Not case-sensitive. Example: `"slowTap;hold(duration=0.75)"`|
-|[`processors`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_processors)|A semicolon-separated list of [Processors](Processors.md) to apply to input on this Binding. Note that Unity appends Processors applied to the [Action](Actions.md) itself (if any) to this list. Not case-sensitive. Processors on Bindings apply in addition to Processors on Controls that are providing values. For example, if you put a `stickDeadzone` Processor on a Binding and then bind it to `/leftStick`, you get deadzones applied twice: once from the deadzone Processor sitting on the `leftStick` Control, and once from the Binding. Example: `"invert;axisDeadzone(min=0.1,max=0.95)"`|
+|[`interactions`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_interactions)|A semicolon-separated list of [Interactions](Interactions.md) to apply to input on this Binding. Note that Unity appends Interactions applied to the [Action](actions.md) itself (if any) to this list. Not case-sensitive. Example: `"slowTap;hold(duration=0.75)"`|
+|[`processors`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_processors)|A semicolon-separated list of [Processors](processors.md) to apply to input on this Binding. Note that Unity appends Processors applied to the [Action](actions.md) itself (if any) to this list. Not case-sensitive. Processors on Bindings apply in addition to Processors on Controls that are providing values. For example, if you put a `stickDeadzone` Processor on a Binding and then bind it to `/leftStick`, you get deadzones applied twice: once from the deadzone Processor sitting on the `leftStick` Control, and once from the Binding. Example: `"invert;axisDeadzone(min=0.1,max=0.95)"`|
|[`id`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_id)|Unique ID of the Binding. You can use it to identify the Binding when storing Binding overrides in user settings, for example.|
|[`name`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_name)|Optional name of the Binding. Identifies part names inside [Composites](#composite-bindings). Example: `"Positive"`|
|[`isComposite`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_isComposite)|Whether the Binding acts as a [Composite](#composite-bindings).|
@@ -56,15 +25,154 @@ Each Binding has the following properties:
To query the Bindings to a particular Action, you can use [`InputAction.bindings`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_bindings). To query a flat list of Bindings for all Actions in an Action Map, you can use [`InputActionMap.bindings`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_bindings).
-## Composite Bindings
-Sometimes, you might want to have several Controls act in unison to mimic a different type of Control. The most common example of this is using the W, A, S, and D keys on the keyboard to form a 2D vector Control equivalent to mouse deltas or gamepad sticks. Another example is to use two keys to form a 1D axis equivalent to a mouse scroll axis.
+## Erasing Bindings
+
+You can erase a binding by calling [`Erase`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.BindingSyntax.html#UnityEngine_InputSystem_InputActionSetupExtensions_BindingSyntax_Erase_) on the [binding accessor](../api/UnityEngine.InputSystem.InputActionSetupExtensions.BindingSyntax.html).
+
+```CSharp
+// Erase first binding on "fire" action.
+playerInput.actions["fire"].ChangeBinding(0).Erase();
+
+// Erase "2DVector" composite. This will also erase the part
+// bindings of the composite.
+playerInput.actions["move"].ChangeCompositeBinding("2DVector").Erase();
+
+// Can also do this by using the name given to the composite binding.
+playerInput.actions["move"].ChangeCompositeBinding("WASD").Erase();
+
+// Erase first binding in "gameplay" action map.
+playerInput.actions.FindActionMap("gameplay").ChangeBinding(0).Erase();
+```
+
+## Adding Bindings
-This is difficult to implement with normal Bindings. You can bind a [`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html) to an action expecting a `Vector2`, but doing so results in an exception at runtime when the Input System tries to read a `Vector2` from a Control that can deliver only a `float`.
+New bindings can be added to an Action using [`AddAction`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.html#UnityEngine_InputSystem_InputActionSetupExtensions_AddBinding_UnityEngine_InputSystem_InputAction_System_String_System_String_System_String_System_String_) or [`AddCompositeBinding`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.html#UnityEngine_InputSystem_InputActionSetupExtensions_AddCompositeBinding_UnityEngine_InputSystem_InputAction_System_String_System_String_System_String_).
-Composite Bindings (that is, Bindings that are made up of other Bindings) solve this problem. Composites themselves don't bind directly to Controls; instead, they source values from other Bindings that do, and then synthesize input on the fly from those values.
+```CSharp
+// Add a binding for the left mouse button to the "fire" action.
+playerInput.actions["fire"].AddBinding("/leftButton");
+
+// Add a WASD composite binding to the "move" action.
+playerInput.actions["move"]
+ .AddCompositeBinding("2DVector")
+ .With("Up", "/w")
+ .With("Left", "/a")
+ .With("Down", "/s")
+ .With("Right", "/d");
+```
+
+## Setting parameters
+
+A Binding may, either through itself or through its associated Action, lead to [processor](processors.md), [interaction](Interactions.md), and/or [composite](#composite-bindings) objects being created. These objects can have parameters you can configure through in the [Binding properties view](actions-editor.md#bindings) of the Action editor or through the API. This configuration will give parameters their default value.
+
+```CSharp
+// Create an action with a "Hold" interaction on it.
+// Set the "duration" parameter to 4 seconds.
+var action = new InputAction(interactions: "hold(duration=4)");
+```
+
+You can query the current value of any such parameter using the [`GetParameterValue`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetParameterValue_UnityEngine_InputSystem_InputAction_System_String_UnityEngine_InputSystem_InputBinding_) API.
+
+```CSharp
+// This returns a PrimitiveValue?. It will be null if the
+// parameter is not found. Otherwise, it is a PrimitiveValue
+// which can be converted to a number or boolean.
+var p = action.GetParameterValue("duration");
+Debug.Log("'duration' is set to: " + p.Value);
+```
+
+The above looks for the parameter on any object found on any of the bindings on the action. You can restrict either or both to a more narrow set.
-To see how to create Composites in the editor UI, see documentation on [editing Composite Bindings](ActionsEditor.md#editing-composite-bindings).
+```CSharp
+// Retrieve the value of the "duration" parameter specifically of a
+// "Hold" interaction and only look on bindings in the "Gamepad" group.
+action.GetParameterValue("hold:duration", InputBinding.MaskByGroup("Gamepad"));
+```
+
+Alternatively, you can use an expression parameter to encapsulate both the type and the name of the parameter you want to get the value of. This has the advantage of not needing a string parameter but rather references both the type and the name of the parameter in a typesafe way.
+
+```CSharp
+// Retrieve the value of the "duration" parameter of TapInteraction.
+// This version returns a float? instead of a PrimitiveValue? as it
+// sees the type of "duration" at compile-time.
+action.GetParameterValue((TapInteraction x) => x.duration);
+```
+
+To alter the current value of a parameter, you can use what is referred to as a "parameter override". You can apply these at the level of an individual [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html), or at the level of an entire [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html), or even at the level of an entire [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html). Such overrides are stored internally and applied automatically even on bindings added later.
+
+To add an override, use the [`ApplyParameterOverride`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_ApplyParameterOverride_UnityEngine_InputSystem_InputAction_System_String_UnityEngine_InputSystem_Utilities_PrimitiveValue_UnityEngine_InputSystem_InputBinding_) API or any of its overloads.
+
+```CSharp
+// Set the "duration" parameter on all bindings of the action to 4.
+action.ApplyParameterOverride("duration", 4f);
+
+// Set the "duration" parameter specifically for "tap" interactions only.
+action.ApplyParameterOverride("tap:duration", 0.5f);
+
+// Set the "duration" parameter on tap interactions but only for bindings
+// in the "Gamepad" group.
+action.ApplyParameterOverride("tap:duration", 0.5f, InputBinding.MaskByGroup("Gamepad");
+
+// Set tap duration for all bindings in an action map.
+map.ApplyParameterOverride("tap:duration", 0.5f);
+
+// Set tap duration for all bindings in an entire asset.
+asset.ApplyParameterOverride("tap:duration", 0.5f);
+
+// Like for GetParameterValue, overloads are available that take
+// an expression instead.
+action.ApplyParameterOverride((TapInteraction x) => x.duration, 0.4f);
+map.ApplyParameterOverride((TapInteraction x) => x.duration, 0.4f);
+asset.ApplyParameterOverride((TapInteraction x) => x.duration, 0.4f);
+```
+
+The new value will be applied immediately and affect all composites, processors, and interactions already in use and targeted by the override.
+
+Note that if multiple parameter overrides are applied – especially when applying some directly to actions and some to maps or assets –, there may be conflicts between which override to apply. In this case, an attempt is made to chose the "most specific" override to apply.
+
+```CSharp
+// Let's say you have an InputAction `action` that is part of an InputActionAsset asset.
+var map = action.actionMap;
+var asset = map.asset;
+
+// And you apply a "tap:duration" override to the action.
+action.ApplyParameterOverride("tap:duration", 0.6f);
+
+// But also apply a "tap:duration" override to the action specifically
+// for bindings in the "Gamepad" group.
+action.ApplyParameterOverride("tap:duration", 1f, InputBinding.MaskByGroup("Gamepad"));
+
+// And finally also apply a "tap:duration" override to the entire asset.
+asset.ApplyParameterOverride("tap:duration", 0.3f);
+
+// Now, bindings on `action` in the "Gamepad" group will use a value of 1 for tap durations,
+// other bindings on `action` will use 0.6, and every other binding in the asset will use 0.3.
+```
+
+You can use parameter overrides, for example, to scale mouse delta values on a "Look" action.
+
+```CSharp
+// Set up an example "Look" action.
+var look = new InputAction("look", type: InputActionType.Value);
+look.AddBinding("/delta", groups: "KeyboardMouse", processors: "scaleVector2");
+look.AddBinding("/rightStick", groups: "Gamepad", processors: "scaleVector2");
+
+// Now you can adjust stick sensitivity separately from mouse sensitivity.
+look.ApplyParameterOverride("scaleVector2:x", 0.5f, InputBinding.MaskByGroup("KeyboardMouse"));
+look.ApplyParameterOverride("scaleVector2:y", 0.5f, InputBinding.MaskByGroup("KeyboardMouse"));
+
+look.ApplyParameterOverride("scaleVector2:x", 2f, InputBinding.MaskByGroup("Gamepad"));
+look.ApplyParameterOverride("scaleVector2:y", 2f, InputBinding.MaskByGroup("Gamepad"));
+
+// Alternative to using groups, you can also apply overrides directly to specific binding paths.
+look.ApplyParameterOverride("scaleVector2:x", 0.5f, new InputBinding("/delta"));
+look.ApplyParameterOverride("scaleVector2:y", 0.5f, new InputBinding("/delta"));
+```
+
+>NOTE: Parameter overrides are *not* persisted along with an asset.
+
+## Composite Bindings
To create composites in code, you can use the [`AddCompositeBinding`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.html#UnityEngine_InputSystem_InputActionSetupExtensions_AddCompositeBinding_UnityEngine_InputSystem_InputAction_System_String_System_String_System_String_) syntax.
@@ -87,7 +195,7 @@ myAction.AddCompositeBinding("Axis")
.With("Negative", "/leftShoulder");
```
-Composites can have parameters, just like [Interactions](Interactions.md) and [Processors](Processors.md).
+Composites can have parameters, just like [Interactions](Interactions.md) and [Processors](processors.md).
```CSharp
myAction.AddCompositeBinding("Axis(whichSideWins=1)");
@@ -97,10 +205,6 @@ There are currently five Composite types that come with the system out of the bo
### 1D axis
-
-
-
-
A Composite made of two buttons: one that pulls a 1D axis in its negative direction, and another that pulls it in its positive direction. Implemented in the [`AxisComposite`](../api/UnityEngine.InputSystem.Composites.AxisComposite.html) class. The result is a `float`.
```CSharp
@@ -136,10 +240,6 @@ If Controls from both the `positive` and the `negative` side are actuated, then
### 2D vector
-
-
-
-
A Composite that represents a 4-way button setup like the D-pad on gamepads. Each button represents a cardinal direction. Implemented in the [`Vector2Composite`](../api/UnityEngine.InputSystem.Composites.Vector2Composite.html) class. The result is a `Vector2`.
This Composite is most useful for representing up-down-left-right controls, such as WASD keyboard input.
@@ -178,10 +278,6 @@ In addition, you can set the following parameters on a 2D vector Composite:
### 3D vector
-
-
-
-
A Composite that represents a 6-way button where two combinations each control one axis of a 3D vector. Implemented in the [`Vector3Composite`](../api/UnityEngine.InputSystem.Composites.Vector3Composite.html) class. The result is a `Vector3`.
```CSharp
@@ -218,10 +314,6 @@ In addition, you can set the following parameters on a 3D vector Composite:
### One Modifier
-
-
-
-
A Composite that requires the user to hold down a "modifier" button in addition to another control from which the actual value of the Binding is determined. This can be used, for example, for Bindings such as "SHIFT+1". Implemented in the [`OneModifierComposite`](../api/UnityEngine.InputSystem.Composites.OneModifierComposite.html) class. The buttons can be on any Device, and can be toggle buttons or full-range buttons such as gamepad triggers.
The result is a value of the same type as the controls bound to the [`binding`](../api/UnityEngine.InputSystem.Composites.OneModifierComposite.html#UnityEngine_InputSystem_Composites_OneModifierComposite_binding) part.
@@ -250,10 +342,6 @@ This Composite has no parameters.
### Two Modifiers
-
-
-
-
A Composite that requires the user to hold down two "modifier" buttons in addition to another control from which the actual value of the Binding is determined. This can be used, for example, for Bindings such as "SHIFT+CTRL+1". Implemented in the [`TwoModifiersComposite`](../api/UnityEngine.InputSystem.Composites.TwoModifiersComposite.html) class. The buttons can be on any Device, and can be toggle buttons or full-range buttons such as gamepad triggers.
The result is a value of the same type as the controls bound to the [`binding`](../api/UnityEngine.InputSystem.Composites.TwoModifiersComposite.html#UnityEngine_InputSystem_Composites_TwoModifiersComposite_binding) part.
@@ -283,7 +371,7 @@ You can define new types of Composites, and register them with the API. Unity tr
To define a new type of Composite, create a class based on [`InputBindingComposite`](../api/UnityEngine.InputSystem.InputBindingComposite-1.html).
-> __IMPORTANT__: Composites must be __stateless__. This means that you cannot store local state that changes depending on the input being processed. For __stateful__ processing on Bindings, see [interactions](./Interactions.md#writing-custom-interactions).
+> __IMPORTANT__: Composites must be __stateless__. This means that you cannot store local state that changes depending on the input being processed. For __stateful__ processing on Bindings, see [interactions](write-custom-interactions.md).
```CSharp
// Use InputBindingComposite as a base class for a composite that returns
@@ -376,45 +464,6 @@ public class CustomParameterEditor : InputParameterEditor
#endif
```
-## Working with Bindings
-
-## Looking up Bindings
-
-You can retrieve the bindings of an action using its [`InputAction.bindings`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_bindings) property which returns a read-only array of [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html) structs.
-
-```CSharp
- // Get bindings of "fire" action.
- var fireBindings = playerInput.actions["fire"].bindings;
-```
-
-Also, all the bindings for all actions in an [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) are made available through the [`InputActionMap.bindings`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_bindings) property. The bindings are associated with actions through an [action ID](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_id) or [action name](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_name) stored in the [`InputBinding.action`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_action) property.
-
-```CSharp
- // Get all bindings in "gameplay" action map.
- var gameplayBindings = playerInput.actions.FindActionMap("gameplay").bindings;
-```
-
-You can also look up specific the indices of specific bindings in [`InputAction.bindings`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_bindings) using the [`InputActionRebindingExtensions.GetBindingIndex`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetBindingIndex_UnityEngine_InputSystem_InputAction_UnityEngine_InputSystem_InputBinding_) method.
-
-```CSharp
- // Find the binding in the "Keyboard" control scheme.
- playerInput.actions["fire"].GetBindingIndex(group: "Keyboard");
-
- // Find the first binding to the space key in the "gameplay" action map.
- playerInput.FindActionMap("gameplay").GetBindingIndex(
- new InputBinding { path = "/space" });
-```
-
-Finally, you can look up the binding that corresponds to a specific control through [`GetBindingIndexForControl`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetBindingIndexForControl_). This way, you can, for example, map a control found in the [`controls`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls) array of an [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html) back to an [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html).
-
-```CSharp
- // Find the binding that binds LMB to "fire". If there is no such binding,
- // bindingIndex will be -1.
- var fireAction = playerInput.actions["fire"];
- var bindingIndex = fireAction.GetBindingIndexForControl(Mouse.current.leftButton);
- if (binding == -1)
- Debug.Log("Fire is not bound to LMB of the current mouse.");
-```
## Changing Bindings
@@ -459,15 +508,28 @@ playerInput.actions["move"].ChangeCompositeBinding("2DVector")
playerInput.actions["move"].ChangeBinding("WASD")
```
-### Applying overrides
+
+
+## Set a binding's control scheme from code
+
+Control schemes allow you to group types of bindings together according to their control type, so that you can enable or disable groups of bindings. For example, you might want to enable all keyboard and mouse bindings if the user presses a keyboard button or moves the mouse.
+
+
+Unity stores these on the [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html) class as a semicolon-separated string in the [`InputBinding.groups`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_groups) property, and you can use them for any arbitrary grouping of bindings. To enable different sets of binding groups for an [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) or [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html), you can use the [`InputActionMap.bindingMask`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_bindingMask)/[`InputActionAsset.bindingMask`](../api/UnityEngine.InputSystem.InputActionAsset.html#UnityEngine_InputSystem_InputActionAsset_bindingMask) property. The Input System uses this to implement the concept of grouping Bindings into different [`InputControlSchemes`](../api/UnityEngine.InputSystem.InputControlScheme.html).
+
+Control Schemes use Binding groups to map Bindings in an [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) or [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html) to different types of Devices. The [`PlayerInput`](player-input-component.md) class uses these to enable a matching Control Scheme for a new [user](user-management.md) joining the game, based on the Device they are playing on.
+
+
+
+### Apply binding overrides
You can override aspects of any Binding at run-time non-destructively. Specific properties of [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html) have an `override` variant that, if set, will take precedent over the property that they shadow. All `override` properties are of type `String`.
|Property|Override|Description|
|--------|--------|-----------|
-|[`path`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_path)|[`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath)|Replaces the [Control path](./Controls.md#control-paths) that determines which Control(s) are referenced in the binding. If [`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) is set to an empty string, the binding is effectively disabled. Example: `"/leftStick"`|
-|[`processors`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_processors)|[`overrideProcessors`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overrideProcessors)|Replaces the [processors](./Processors.md) applied to the binding. Example: `"invert,normalize(min=0,max=10)"`|
-|[`interactions`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_interactions)|[`overrideInteractions`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overrideInteractions)|Replaces the [interactions](./Interactions.md) applied to the binding. Example: `"tap(duration=0.5)"`|
+|[`path`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_path)|[`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath)|Replaces the [Control path](./controls.md#control-paths) that determines which Control(s) are referenced in the binding. If [`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) is set to an empty string, the binding is effectively disabled. Example: `"/leftStick"`|
+|[`processors`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_processors)|[`overrideProcessors`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overrideProcessors)|Replaces the [processors](processors.md) applied to the binding. Example: `"invert,normalize(min=0,max=10)"`|
+|[`interactions`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_interactions)|[`overrideInteractions`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overrideInteractions)|Replaces the [interactions](Interactions.md) applied to the binding. Example: `"tap(duration=0.5)"`|
>NOTE: The `override` property values will not be saved along with the Actions (for example, when calling [`InputActionAsset.ToJson()`](../api/UnityEngine.InputSystem.InputActionAsset.html#UnityEngine_InputSystem_InputActionAsset_ToJson)). See [Saving and loading rebinds](#saving-and-loading-rebinds) for details about how to persist user rebinds.
@@ -488,466 +550,3 @@ var bindingIndex = jumpAction.GetBindingIndexForControl(Keyboard.current.spaceKe
// And change it to the enter key.
jumpAction.ApplyBindingOverride(bindingIndex, "/enter");
```
-
-### Erasing Bindings
-
-You can erase a binding by calling [`Erase`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.BindingSyntax.html#UnityEngine_InputSystem_InputActionSetupExtensions_BindingSyntax_Erase_) on the [binding accessor](../api/UnityEngine.InputSystem.InputActionSetupExtensions.BindingSyntax.html).
-
-```CSharp
-// Erase first binding on "fire" action.
-playerInput.actions["fire"].ChangeBinding(0).Erase();
-
-// Erase "2DVector" composite. This will also erase the part
-// bindings of the composite.
-playerInput.actions["move"].ChangeCompositeBinding("2DVector").Erase();
-
-// Can also do this by using the name given to the composite binding.
-playerInput.actions["move"].ChangeCompositeBinding("WASD").Erase();
-
-// Erase first binding in "gameplay" action map.
-playerInput.actions.FindActionMap("gameplay").ChangeBinding(0).Erase();
-```
-
-### Adding Bindings
-
-New bindings can be added to an Action using [`AddAction`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.html#UnityEngine_InputSystem_InputActionSetupExtensions_AddBinding_UnityEngine_InputSystem_InputAction_System_String_System_String_System_String_System_String_) or [`AddCompositeBinding`](../api/UnityEngine.InputSystem.InputActionSetupExtensions.html#UnityEngine_InputSystem_InputActionSetupExtensions_AddCompositeBinding_UnityEngine_InputSystem_InputAction_System_String_System_String_System_String_).
-
-```CSharp
-// Add a binding for the left mouse button to the "fire" action.
-playerInput.actions["fire"].AddBinding("/leftButton");
-
-// Add a WASD composite binding to the "move" action.
-playerInput.actions["move"]
- .AddCompositeBinding("2DVector")
- .With("Up", "/w")
- .With("Left", "/a")
- .With("Down", "/s")
- .With("Right", "/d");
-```
-
-### Setting parameters
-
-A Binding may, either through itself or through its associated Action, lead to [processor](Processors.md), [interaction](Interactions.md), and/or [composite](#composite-bindings) objects being created. These objects can have parameters you can configure through in the [Binding properties view](ActionsEditor.md#bindings) of the Action editor or through the API. This configuration will give parameters their default value.
-
-```CSharp
-// Create an action with a "Hold" interaction on it.
-// Set the "duration" parameter to 4 seconds.
-var action = new InputAction(interactions: "hold(duration=4)");
-```
-
-You can query the current value of any such parameter using the [`GetParameterValue`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetParameterValue_UnityEngine_InputSystem_InputAction_System_String_UnityEngine_InputSystem_InputBinding_) API.
-
-```CSharp
-// This returns a PrimitiveValue?. It will be null if the
-// parameter is not found. Otherwise, it is a PrimitiveValue
-// which can be converted to a number or boolean.
-var p = action.GetParameterValue("duration");
-Debug.Log("'duration' is set to: " + p.Value);
-```
-
-The above looks for the parameter on any object found on any of the bindings on the action. You can restrict either or both to a more narrow set.
-
-```CSharp
-// Retrieve the value of the "duration" parameter specifically of a
-// "Hold" interaction and only look on bindings in the "Gamepad" group.
-action.GetParameterValue("hold:duration", InputBinding.MaskByGroup("Gamepad"));
-```
-
-Alternatively, you can use an expression parameter to encapsulate both the type and the name of the parameter you want to get the value of. This has the advantage of not needing a string parameter but rather references both the type and the name of the parameter in a typesafe way.
-
-```CSharp
-// Retrieve the value of the "duration" parameter of TapInteraction.
-// This version returns a float? instead of a PrimitiveValue? as it
-// sees the type of "duration" at compile-time.
-action.GetParameterValue((TapInteraction x) => x.duration);
-```
-
-To alter the current value of a parameter, you can use what is referred to as a "parameter override". You can apply these at the level of an individual [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html), or at the level of an entire [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html), or even at the level of an entire [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html). Such overrides are stored internally and applied automatically even on bindings added later.
-
-To add an override, use the [`ApplyParameterOverride`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_ApplyParameterOverride_UnityEngine_InputSystem_InputAction_System_String_UnityEngine_InputSystem_Utilities_PrimitiveValue_UnityEngine_InputSystem_InputBinding_) API or any of its overloads.
-
-```CSharp
-// Set the "duration" parameter on all bindings of the action to 4.
-action.ApplyParameterOverride("duration", 4f);
-
-// Set the "duration" parameter specifically for "tap" interactions only.
-action.ApplyParameterOverride("tap:duration", 0.5f);
-
-// Set the "duration" parameter on tap interactions but only for bindings
-// in the "Gamepad" group.
-action.ApplyParameterOverride("tap:duration", 0.5f, InputBinding.MaskByGroup("Gamepad");
-
-// Set tap duration for all bindings in an action map.
-map.ApplyParameterOverride("tap:duration", 0.5f);
-
-// Set tap duration for all bindings in an entire asset.
-asset.ApplyParameterOverride("tap:duration", 0.5f);
-
-// Like for GetParameterValue, overloads are available that take
-// an expression instead.
-action.ApplyParameterOverride((TapInteraction x) => x.duration, 0.4f);
-map.ApplyParameterOverride((TapInteraction x) => x.duration, 0.4f);
-asset.ApplyParameterOverride((TapInteraction x) => x.duration, 0.4f);
-```
-
-The new value will be applied immediately and affect all composites, processors, and interactions already in use and targeted by the override.
-
-Note that if multiple parameter overrides are applied – especially when applying some directly to actions and some to maps or assets –, there may be conflicts between which override to apply. In this case, an attempt is made to chose the "most specific" override to apply.
-
-```CSharp
-// Let's say you have an InputAction `action` that is part of an InputActionAsset asset.
-var map = action.actionMap;
-var asset = map.asset;
-
-// And you apply a "tap:duration" override to the action.
-action.ApplyParameterOverride("tap:duration", 0.6f);
-
-// But also apply a "tap:duration" override to the action specifically
-// for bindings in the "Gamepad" group.
-action.ApplyParameterOverride("tap:duration", 1f, InputBinding.MaskByGroup("Gamepad"));
-
-// And finally also apply a "tap:duration" override to the entire asset.
-asset.ApplyParameterOverride("tap:duration", 0.3f);
-
-// Now, bindings on `action` in the "Gamepad" group will use a value of 1 for tap durations,
-// other bindings on `action` will use 0.6, and every other binding in the asset will use 0.3.
-```
-
-You can use parameter overrides, for example, to scale mouse delta values on a "Look" action.
-
-```CSharp
-// Set up an example "Look" action.
-var look = new InputAction("look", type: InputActionType.Value);
-look.AddBinding("/delta", groups: "KeyboardMouse", processors: "scaleVector2");
-look.AddBinding("/rightStick", groups: "Gamepad", processors: "scaleVector2");
-
-// Now you can adjust stick sensitivity separately from mouse sensitivity.
-look.ApplyParameterOverride("scaleVector2:x", 0.5f, InputBinding.MaskByGroup("KeyboardMouse"));
-look.ApplyParameterOverride("scaleVector2:y", 0.5f, InputBinding.MaskByGroup("KeyboardMouse"));
-
-look.ApplyParameterOverride("scaleVector2:x", 2f, InputBinding.MaskByGroup("Gamepad"));
-look.ApplyParameterOverride("scaleVector2:y", 2f, InputBinding.MaskByGroup("Gamepad"));
-
-// Alternative to using groups, you can also apply overrides directly to specific binding paths.
-look.ApplyParameterOverride("scaleVector2:x", 0.5f, new InputBinding("/delta"));
-look.ApplyParameterOverride("scaleVector2:y", 0.5f, new InputBinding("/delta"));
-```
-
->NOTE: Parameter overrides are *not* persisted along with an asset.
-
-## Interactive rebinding
-
->__Note:__ To download a sample project which demonstrates how to set up a rebinding user interface with Input System APIs, open the Package Manager, select the Input System Package, and choose the sample project "Rebinding UI" to download.
-
-Runtime rebinding allows users of your application to set their own Bindings.
-
-To allow users to choose their own Bindings interactively, use the [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) class. Call the [`PerformInteractiveRebinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_PerformInteractiveRebinding_UnityEngine_InputSystem_InputAction_System_Int32_) method on an Action to create a rebinding operation. This operation waits for the Input System to register any input from any Device which matches the Action's expected Control type, then uses [`InputBinding.overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) to assign the Control path for that Control to the Action's Bindings. If the user actuates multiple Controls, the rebinding operation chooses the Control with the highest [magnitude](Controls.md#control-actuation).
-
->IMPORTANT: You must dispose of [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) instances via `Dispose()`, so that they don't leak memory on the unmanaged memory heap.
-
-```C#
- void RemapButtonClicked(InputAction actionToRebind)
- {
- var rebindOperation = actionToRebind
- .PerformInteractiveRebinding().Start();
- }
-```
-
-The [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) API is highly configurable to match your needs. For example, you can:
-
-* Choose expected Control types ([`WithExpectedControlType()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithExpectedControlType_System_Type_)).
-
-* Exclude certain Controls ([`WithControlsExcluding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithControlsExcluding_System_String_)).
-
-* Set a Control to cancel the operation ([`WithCancelingThrough()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithCancelingThrough_UnityEngine_InputSystem_InputControl_)).
-
-* Choose which Bindings to apply the operation on if the Action has multiple Bindings ([`WithTargetBinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithTargetBinding_System_Int32_), [`WithBindingGroup()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithBindingGroup_System_String_), [`WithBindingMask()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithBindingMask_System_Nullable_UnityEngine_InputSystem_InputBinding__)).
-
-Refer to the scripting API reference for [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) for a full overview.
-
-Note that [`PerformInteractiveRebinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_PerformInteractiveRebinding_UnityEngine_InputSystem_InputAction_System_Int32_) automatically applies a set of default configurations based on the given action and targeted binding.
-
-## Saving and loading rebinds
-
-You can serialize override properties of [Bindings](../api/UnityEngine.InputSystem.InputBinding.html) by serializing them as JSON strings and restoring them from these. Use [`SaveBindingOverridesAsJson`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_SaveBindingOverridesAsJson_UnityEngine_InputSystem_IInputActionCollection2_) to create these strings and [`LoadBindingOverridesFromJson`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_LoadBindingOverridesFromJson_UnityEngine_InputSystem_IInputActionCollection2_System_String_System_Boolean_) to restore overrides from them.
-
-```CSharp
-// Store player rebinds in PlayerPrefs.
-var rebinds = playerInput.actions.SaveBindingOverridesAsJson();
-PlayerPrefs.SetString("rebinds", rebinds);
-
-// Restore player rebinds from PlayerPrefs (removes all existing
-// overrides on the actions; pass `false` for second argument
-// in case you want to prevent that).
-var rebinds = PlayerPrefs.GetString("rebinds");
-playerInput.actions.LoadBindingOverridesFromJson(rebinds);
-```
-
-### Restoring original Bindings
-
-You can remove Binding overrides and thus restore defaults by using [`RemoveBindingOverride`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RemoveBindingOverride_UnityEngine_InputSystem_InputAction_System_Int32_) or [`RemoveAllBindingOverrides`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RemoveAllBindingOverrides_UnityEngine_InputSystem_IInputActionCollection2_).
-
-```CSharp
-// Remove binding overrides from the first binding of the "fire" action.
-playerInput.actions["fire"].RemoveBindingOverride(0);
-
-// Remove all binding overrides from the "fire" action.
-playerInput.actions["fire"].RemoveAllBindingOverrides();
-
-// Remove all binding overrides from a player's actions.
-playerInput.actions.RemoveAllBindingOverrides();
-```
-
-### Displaying Bindings
-
-It can be useful for the user to know what an Action is currently bound to (taking any potentially active rebindings into account) while rebinding UIs, and for on-screen hints while the app is running. You can use [`InputBinding.effectivePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_effectivePath) to get the currently active path for a Binding (which returns [`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) if set, or otherwise returns [`path`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_path)).
-
-The easiest way to retrieve a display string for an action is to call [`InputActionRebindingExtensions.GetBindingDisplayString`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetBindingDisplayString_) which is an extension method for [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html).
-
-```CSharp
- // Get a binding string for the action as a whole. This takes into account which
- // bindings are currently active and the actual controls bound to the action.
- m_RebindButton.GetComponentInChildren().text = action.GetBindingDisplayString();
-
- // Get a binding string for a specific binding on an action by index.
- m_RebindButton.GetComponentInChildren().text = action.GetBindingDisplayString(1);
-
- // Look up binding indices with GetBindingIndex.
- var bindingIndex = action.GetBindingIndex(InputBinding.MaskByGroup("Gamepad"));
- m_RebindButton.GetComponentInChildren().text =
- action.GetBindingDisplayString(bindingIndex);
-```
-
-You can also use this method to replace the text string with images.
-
-```CSharp
- // Call GetBindingDisplayString() such that it also returns information about the
- // name of the device layout and path of the control on the device. This information
- // is useful for reliably associating imagery with individual controls.
- // NOTE: The first argument is the index of the binding within InputAction.bindings.
- var bindingString = action.GetBindingDisplayString(0, out deviceLayout, out controlPath);
-
- // If it's a gamepad, look up an icon for the control.
- Sprite icon = null;
- if (!string.IsNullOrEmpty(deviceLayout)
- && !string.IsNullOrEmpty(controlPath)
- && InputSystem.IsFirstLayoutBasedOnSecond(deviceLayout, "Gamepad"))
- {
- switch (controlPath)
- {
- case "buttonSouth": icon = aButtonIcon; break;
- case "dpad/up": icon = dpadUpIcon; break;
- //...
- }
- }
-
- // If you have an icon, display it instead of the text.
- var text = m_RebindButton.GetComponentInChildren();
- var image = m_RebindButton.GetComponentInChildren();
- if (icon != null)
- {
- // Display icon.
- text.gameObject.SetActive(false);
- image.gameObject.SetActive(true);
- image.sprite = icon;
- }
- else
- {
- // Display text.
- text.gameObject.SetActive(true);
- image.gameObject.SetActive(false);
- text.text = bindingString;
- }
-```
-
-Additionally, each Binding has a [`ToDisplayString`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_ToDisplayString_UnityEngine_InputSystem_InputBinding_DisplayStringOptions_UnityEngine_InputSystem_InputControl_) method, which you can use to turn individual Bindings into display strings. There is also a generic formatting method for Control paths, [`InputControlPath.ToHumanReadableString`](../api/UnityEngine.InputSystem.InputControlPath.html#UnityEngine_InputSystem_InputControlPath_ToHumanReadableString_System_String_UnityEngine_InputSystem_InputControlPath_HumanReadableStringOptions_UnityEngine_InputSystem_InputControl_), which you can use with arbitrary Control path strings.
-
-Note that the Controls a Binding resolves to can change at any time, and the display strings for controls might change dynamically. For example, if the user switches the currently active keyboard layout, the display string for each individual key on the [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) might change.
-
-## Control Schemes
-
-A Binding can belong to any number of Binding groups. Unity stores these on the [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html) class as a semicolon-separated string in the [`InputBinding.groups`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_groups) property, and you can use them for any arbitrary grouping of bindings. To enable different sets of binding groups for an [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) or [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html), you can use the [`InputActionMap.bindingMask`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_bindingMask)/[`InputActionAsset.bindingMask`](../api/UnityEngine.InputSystem.InputActionAsset.html#UnityEngine_InputSystem_InputActionAsset_bindingMask) property. The Input System uses this to implement the concept of grouping Bindings into different [`InputControlSchemes`](../api/UnityEngine.InputSystem.InputControlScheme.html).
-
-Control Schemes use Binding groups to map Bindings in an [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) or [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html) to different types of Devices. The [`PlayerInput`](PlayerInput.md) class uses these to enable a matching Control Scheme for a new [user](UserManagement.md) joining the game, based on the Device they are playing on.
-
-## Details
-
-### Binding resolution
-
-When the Input System accesses the [Controls](Controls.md) bound to an Action for the first time, the Action resolves its Bindings to match them to existing Controls on existing Devices. In this process, the Action calls [`InputSystem.FindControls<>()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_FindControls__1_System_String_UnityEngine_InputSystem_InputControlList___0___) (filtering for devices assigned to the InputActionMap, if there are any) for the Binding path of each of the Action's bindings. This creates a list of resolved Controls that are now bound to the Action.
-
-Note that a single [Binding path](Controls.md#control-paths) can match multiple Controls:
-
-* A specific Device path such as `/buttonEast` matches the "Circle" button on a [PlayStation controller](Gamepad.md#playstation-controllers). If you have multiple PlayStation controllers connected, it resolves to the "Circle" button on each of these controllers.
-
-* An abstract Device path such as `/buttonEast` matches the right action button on any connected gamepad. If you have a PlayStation controller and an [Xbox controller](Gamepad.md#xbox-controllers) connected, it resolves to the "Circle" button on the PlayStation controller, and to the "B" button on the Xbox controller.
-
-* A Binding path can also contain wildcards, such as `/button*`. This matches any Control on any gamepad with a name starting with "button", which matches all the four action buttons on any connected gamepad. A different example: `*/{Submit}` matches any Control tagged with the "Submit" [usage](Controls.md#control-usages) on any Device.
-
-If there are multiple Bindings on the same Action that all reference the same Control(s), the Control will effectively feed into the Action multiple times. This is to allow, for example, a single Control to produce different input on the same Action by virtue of being bound in a different fashion (composites, processors, interactions, etc). However, regardless of how many times a Control is bound on any given action, it will only be mentioned once in the Action's [array of `controls`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls).
-
-To query the Controls that an Action resolves to, you can use [`InputAction.controls`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls). You can also run this query if the Action is disabled.
-
-To be notified when binding resolution happens, you can listen to [`InputSystem.onActionChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onActionChange) which triggers [`InputActionChange.BoundControlsAboutToChange`](../api/UnityEngine.InputSystem.InputActionChange.html#UnityEngine_InputSystem_InputActionChange_BoundControlsAboutToChange) before modifying Control lists and triggers [`InputActionChange.BoundControlsChanged`](../api/UnityEngine.InputSystem.InputActionChange.html#UnityEngine_InputSystem_InputActionChange_BoundControlsChanged) after having updated them.
-
-#### Binding resolution while Actions are enabled
-
-In certain situations, the [Controls](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls) bound to an Action have to be updated more than once. For example, if a new [Device](Devices.md) becomes usable with an Action, the Action may now pick up input from additional controls. Also, if Bindings are added, removed, or modified, Control lists will need to be updated.
-
-This updating of Controls usually happens transparently in the background. However, when an Action is [enabled](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_enabled) and especially when it is [in progress](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_IsInProgress_), there may be a noticeable effect on the Action.
-
-Adding or removing a device – either [globally](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_devices) or to/from the [device list](../api/UnityEngine.InputSystem.InputActionAsset.html#UnityEngine_InputSystem_InputActionAsset_devices) of an Action – will remain transparent __except__ if an Action is in progress and it is the device of its [active Control](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl) that is being removed. In this case, the Action will automatically be [cancelled](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
-
-Modifying the [binding mask](../api/UnityEngine.InputSystem.InputActionAsset.html#UnityEngine_InputSystem_InputActionAsset_bindingMask) or modifying any of the Bindings (such as through [rebinding](#interactive-rebinding) or by adding or removing bindings) will, however, lead to all enabled Actions being temporarily disabled and then re-enabled and resumed.
-
-#### Choosing which Devices to use
-
->__Note__: [`InputUser`](UserManagement.md) and [`PlayerInput`](PlayerInput.md) make use of this facility automatically. They set [`InputActionMap.devices`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_devices) automatically based on the Devices that are paired to the user.
-
-By default, Actions resolve their Bindings against all Devices present in the Input System (that is, [`InputSystem.devices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_devices)). For example, if there are two gamepads present in the system, a Binding to `/buttonSouth` picks up both gamepads and allows the Action to be used from either.
-
-You can override this behavior by restricting [`InputActionAssets`](../api/UnityEngine.InputSystem.InputActionAsset.html) or individual [`InputActionMaps`](../api/UnityEngine.InputSystem.InputActionMap.html) to a specific set of Devices. If you do this, Binding resolution only takes the Controls of the given Devices into account.
-
-```
- var actionMap = new InputActionMap();
-
- // Restrict the action map to just the first gamepad.
- actionMap.devices = new[] { Gamepad.all[0] };
-```
-
-### Conflicting inputs
-
-There are two situations where a given input may lead to ambiguity:
-
-1. Several Controls are bound to the same Action and more than one is feeding input into the Action at the same time. Example: an Action that is bound to both the left and right trigger on a Gamepad and both triggers are pressed.
-2. The input is part of a sequence of inputs and there are several possible such sequences. Example: one Action is bound to the `B` key and another Action is bound to `Shift-B`.
-
-#### Multiple, concurrently used Controls
-
->__Note:__ This section does not apply to [`PassThrough`](RespondingToActions.md#pass-through) Actions as they are by design meant to allow multiple concurrent inputs.
-
-For a [`Button`](RespondingToActions.md#button) or [`Value`](RespondingToActions.md#value) Action, there can only be one Control at any time that is "driving" the Action. This Control is considered the [`activeControl`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl).
-
-When an Action is bound to multiple Controls, the [`activeControl`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl) at any point is the one with the greatest level of ["actuation"](Controls.md#control-actuation), that is, the largest value returned from [`EvaluateMagnitude`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude_). If a Control exceeds the actuation level of the current [`activeControl`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl), it will itself become the active Control.
-
-The following example demonstrates this mechanism with a [`Button`](RespondingToActions.md#button) Action and also demonstrates the difference to a [`PassThrough`](RespondingToActions.md#pass-through) Action.
-
-```CSharp
-// Create a button and a pass-through action and bind each of them
-// to both triggers on the gamepad.
-var buttonAction = new InputAction(type: InputActionType.Button,
- binding: "/*Trigger");
-var passThroughAction = new InputAction(type: InputActionType.PassThrough,
- binding: "/*Trigger");
-
-buttonAction.performed += c => Debug.Log("${c.control.name} pressed (Button)");
-passThroughAction.performed += c => Debug.Log("${c.control.name} changed (Pass-Through)");
-
-buttonAction.Enable();
-passThroughAction.Enable();
-
-// Press the left trigger all the way down.
-// This will trigger both buttonAction and passThroughAction. Both will
-// see leftTrigger becoming the activeControl.
-Set(gamepad.leftTrigger, 1f);
-
-// Will log
-// "leftTrigger pressed (Button)" and
-// "leftTrigger changed (Pass-Through)"
-
-// Press the right trigger halfway down.
-// This will *not* trigger or otherwise change buttonAction as the right trigger
-// is actuated *less* than the left one that is already driving action.
-// However, passThrough action is not performing such tracking and will thus respond
-// directly to the value change. It will perform and make rightTrigger its activeControl.
-Set(gamepad.rightTrigger, 0.5f);
-
-// Will log
-// "rightTrigger changed (Pass-Through)"
-
-// Release the left trigger.
-// For buttonAction, this will mean that now all controls feeding into the action have
-// been released and thus the button releases. activeControl will go back to null.
-// For passThrough action, this is just another value change. So, the action performs
-// and its active control changes to leftTrigger.
-Set(gamepad.leftTrigger, 0f);
-
-// Will log
-// "leftTrigger changed (Pass-Through)"
-```
-
-For [composite bindings](#composite-bindings), magnitudes of the composite as a whole rather than for individual Controls are tracked. However, [`activeControl`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_activeControl) will stick track individual Controls from the composite.
-
-##### Disabling Conflict Resolution
-
-Conflict resolution is always applied to [Button](RespondingToActions.md#button) and [Value](RespondingToActions.md#value) type Actions. However, it can be undesirable in situations when an Action is simply used to gather any and all inputs from bound Controls. For example, the following Action would monitor the A button of all available gamepads:
-
-```CSharp
-var action = new InputAction(type: InputActionType.PassThrough, binding: "/buttonSouth");
-action.Enable();
-```
-
-By using the [Pass-Through](RespondingToActions.md#pass-through) Action type, conflict resolution is bypassed and thus, pressing the A button on one gamepad will not result in a press on a different gamepad being ignored.
-
-#### Multiple input sequences (such as keyboard shortcuts)
-
->__Note__: The mechanism described here only applies to Actions that are part of the same [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) or [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html).
-
-Inputs that are used in combinations with other inputs may also lead to ambiguities. If, for example, the `b` key on the Keyboard is bound both on its own as well as in combination with the `shift` key, then if you first press `shift` and then `b`, the latter key press would be a valid input for either of the Actions.
-
-The way this is handled is that Bindings will be processed in the order of decreasing "complexity". This metric is derived automatically from the Binding:
-
-* A binding that is *not* part of a [composite](#composite-bindings) is assigned a complexity of 1.
-* A binding that *is* part of a [composite](#composite-bindings) is assigned a complexity equal to the number of part bindings in the composite.
-
-In our example, this means that a [`OneModifier`](#one-modifier) composite Binding to `Shift+B` has a higher "complexity" than a Binding to `B` and thus is processed first.
-
-Additionally, the first Binding that results in the Action changing [phase](RespondingToActions.md#action-callbacks) will "consume" the input. This consuming will result in other Bindings to the same input not being processed. So in our example, when `Shift+B` "consumes" the `B` input, the Binding to `B` will be skipped.
-
-The following example illustrates how this works at the API level.
-
-```CSharp
-// Create two actions in the same map.
-var map = new InputActionMap();
-var bAction = map.AddAction("B");
-var shiftbAction = map.AddAction("ShiftB");
-
-// Bind one of the actions to 'B' and the other to 'SHIFT+B'.
-bAction.AddBinding("/b");
-shiftbAction.AddCompositeBinding("OneModifier")
- .With("Modifier", "/shift")
- .With("Binding", "/b");
-
-// Print something to the console when the actions are triggered.
-bAction.performed += _ => Debug.Log("B action performed");
-shiftbAction.performed += _ => Debug.Log("SHIFT+B action performed");
-
-// Start listening to input.
-map.Enable();
-
-// Now, let's assume the left shift key on the keyboard is pressed (here, we manually
-// press it with the InputTestFixture API).
-Press(Keyboard.current.leftShiftKey);
-
-// And then the B is pressed. This is a valid input for both
-// bAction as well as shiftbAction.
-//
-// What will happen now is that shiftbAction will do its processing first. In response,
-// it will *perform* the action (i.e. we see the `performed` callback being invoked) and
-// thus "consume" the input. bAction will stay silent as it will in turn be skipped over.
-Press(keyboard.bKey);
-```
-
-### Initial state check
-
-After an Action is [enabled](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_enabled), it will start reacting to input as it comes in. However, at the time the Action is enabled, one or more of the Controls that are [bound](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls) to an action may already have a non-default state at that point.
-x
-Using what is referred to as an "initial state check", an Action can be made to respond to such a non-default state as if the state change happened *after* the Action was enabled. The way this works is that in the first input [update](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_) after the Action was enabled, all its bound controls are checked in turn. If any of them has a non-default state, the Action responds right away.
-
-This check is implicitly enabled for [Value](RespondingToActions.md#value) actions. If, for example, you have a `Move` Action bound to the left stick on the gamepad and the stick is already pushed in a direction when `Move` is enabled, the character will immediately start walking.
-
-By default, [Button](RespondingToActions.md#button) and [Pass-Through](RespondingToActions.md#pass-through) type Actions, do not perform this check. A button that is pressed when its respective Action is enabled first needs to be released and then pressed again for it to trigger the Action.
-
-However, you can manually enable initial state checks on these types of Actions using the checkbox in the editor:
-
-
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-control-type.md b/Packages/com.unity.inputsystem/Documentation~/configure-control-type.md
new file mode 100644
index 0000000000..432dea1542
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-control-type.md
@@ -0,0 +1,20 @@
+---
+uid: input-system-conf-control-type
+---
+
+# Configure Control type
+
+The **Control Type** setting allows you to select the type of control expected by the action. This limits the types of [composite bindings](composite-bindings.md) and [control types](control-types-reference.md) shown when setting up bindings in the UI, and also limits which controls can be bound interactively to the action. This makes it simpler to select appropriate options when setting up bindings.
+
+Configuring an action's **Control Type** is typically done when you create a new action, however you can also change the control type of an existing action.
+
+To configure an action's action type:
+
+1. [Create a new action](./create-edit-delete-actions.md) or select an existing in the [Actions Editor window](./actions-editor.md).
+2. With the action selected, in the right-hand [Action Properties panel](./action-properties-panel-reference.md), under **Action**, click the **Action Type** dropdown menu.
+3. Select the action type from the available [action type options](action-type-reference.md).
+
+## Additional resources
+
+* [Control types reference](control-types-reference.md)
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-controls-from-code.md b/Packages/com.unity.inputsystem/Documentation~/configure-controls-from-code.md
new file mode 100644
index 0000000000..ab0693975c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-controls-from-code.md
@@ -0,0 +1,6 @@
+---
+uid: input-system-controls-from-code
+---
+
+# Configure controls from code
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-input-directly-from-code.md b/Packages/com.unity.inputsystem/Documentation~/configure-input-directly-from-code.md
new file mode 100644
index 0000000000..d89fe6d822
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-input-directly-from-code.md
@@ -0,0 +1,5 @@
+---
+uid: input-system-input-from-code-direct
+---
+
+# Configure input directly from code
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-input-from-code.md b/Packages/com.unity.inputsystem/Documentation~/configure-input-from-code.md
new file mode 100644
index 0000000000..63cc896ec8
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-input-from-code.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-input-from-code
+---
+
+# Configure input from code
+
+You can set up [actions](actions.md), [bindings](introduction-to-bindings.md), and related settings in the **Input Actions** editor or with code. Use the topics in this section when you want full control in script, need to generate or load definitions at runtime, or prefer not to rely on a dedicated [Input Action asset](action-assets.md).
+
+| **Topic** | **Description** |
+| --- | --- |
+| **[Declare stand-alone actions](declare-standalone-actions.md)** | Expose `InputAction` and `InputActionMap` fields on a `MonoBehaviour` and configure them in the **Inspector** window or in code. |
+| **[Configure input from JSON](configure-input-from-json.md)** | Create or load `InputActionMap` and `InputActionAsset` instances from JSON strings at edit time or runtime. |
+| **[Configure Bindings from code](configure-bindings-from-code.md)** | Work with `InputBinding` in code: add or remove bindings, composites, parameters, overrides, and control schemes. |
+
+For a high-level map of the actions API (enabling, polling, callbacks), refer to [Scripting with actions API overview](api-overview.md).
+
+## Additional resources
+
+* [Setting up input](setting-up-input.md)
+* [Actions](actions.md)
+* [Introduction to bindings](introduction-to-bindings.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-input-from-json.md b/Packages/com.unity.inputsystem/Documentation~/configure-input-from-json.md
new file mode 100644
index 0000000000..3a43a54968
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-input-from-json.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-configure-input-from-json
+---
+
+# Configure input from JSON
+
+You can load Actions as JSON in the form of a set of Action Maps or as a full [`InputActionAsset`](../api/UnityEngine.InputSystem.InputActionAsset.html). This also works at runtime in the Player.
+
+```CSharp
+// Load a set of action maps from JSON.
+var maps = InputActionMap.FromJson(json);
+
+// Load an entire InputActionAsset from JSON.
+var asset = InputActionAsset.FromJson(json);
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-interactions-from-code.md b/Packages/com.unity.inputsystem/Documentation~/configure-interactions-from-code.md
new file mode 100644
index 0000000000..5d6735c6dd
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-interactions-from-code.md
@@ -0,0 +1,6 @@
+---
+uid: input-system-interactions-from-code
+---
+
+# Configure interactions from code
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-multiplayer-ui-input.md b/Packages/com.unity.inputsystem/Documentation~/configure-multiplayer-ui-input.md
new file mode 100644
index 0000000000..ca8179501f
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-multiplayer-ui-input.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-multiplayer-ui-config
+---
+
+# Configure multiplayer UI input
+
+To enable multiplayer UI input:
+
+1. Replace the project’s [Event System](https://docs.unity3d.com/Manual/script-EventSystem.html) component with the Input System's [Multiplayer Event System](../api/UnityEngine.InputSystem.UI.MultiplayerEventSystem.html) component.
+
+
+For information on how to automatically configure the player's UI Input Module to use actions from the [Player Input](player-input-component.md) component, refer to documentation on [Player Input: UI Input](player-input-component.md#ui-input) to learn how.
+
+To define mouse UI input behaviour for a Multiplayer Event System:
+
+1. Create an empty GameObject.
+1. In the Multiplayer Event System, set **Player Root** to the new GameObject.
+1. For any UI selectables that you want the Multiplayer Event System to interact with, move their GameObjects in the hierarchy so that they are child GameObjects of the **Player Root** GameObject.
diff --git a/Packages/com.unity.inputsystem/Documentation~/PlayerInputManager.md b/Packages/com.unity.inputsystem/Documentation~/configure-player-input-manager-component.md
similarity index 53%
rename from Packages/com.unity.inputsystem/Documentation~/PlayerInputManager.md
rename to Packages/com.unity.inputsystem/Documentation~/configure-player-input-manager-component.md
index e7a581cdbd..aa92dc53d1 100644
--- a/Packages/com.unity.inputsystem/Documentation~/PlayerInputManager.md
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-player-input-manager-component.md
@@ -1,25 +1,22 @@
---
-uid: input-system-player-input-manager
+uid: input-system-configure-player-input-manager
---
-# The Player Input Manager component
->NOTE: The Input System package comes with a sample called `Simple Multiplayer` which you can install from the package manager UI in the Unity editor. The sample demonstrates how to use [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) to set up a simple local multiplayer scenario.
-
-The [`Player Input`](PlayerInput.md) system facilitates setting up local multiplayer games, where multiple players share a single screen and multiple controllers. You can set this up using the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) component, which automatically manages the creation and lifetime of `PlayerInput` instances as players join and leave the game.
+# Configure the Player Input Manager component

|Property|Description|
|--------|-----------|
-|[`Notification Behavior`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_notificationBehavior)|How the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInput.html) component notifies game code about changes to the connected players. [This works the same way as for the `PlayerInput` component](PlayerInput.md#notification-behaviors).|
+|[`Notification Behavior`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_notificationBehavior)|How the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInput.html) component notifies game code about changes to the connected players. [This works the same way as for the `PlayerInput` component](player-input-component.md#notification-behaviors).|
|[`Join Behavior`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_joinBehavior)|Determines the mechanism by which players can join when joining is enabled. See documentation on [join behaviors](#join-behaviors).|
-|[`Player Prefab`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_playerPrefab)|A prefab that represents a player in the game. The [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) component creates an instance of this prefab whenever a new player joins. This prefab must have one [`PlayerInput`](PlayerInput.md) component in its hierarchy.|
+|[`Player Prefab`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_playerPrefab)|A prefab that represents a player in the game. The [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) component creates an instance of this prefab whenever a new player joins. This prefab must have one [`PlayerInput`](player-input-component.md) component in its hierarchy.|
|[`Joining Enabled By Default`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_joiningEnabled)|While this is enabled, new players can join via the mechanism determined by [`Join Behavior`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_joinBehavior).|
|[`Limit Number of Players`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_maxPlayerCount)|Enable this if you want to limit the number of players who can join the game.|
|[`Max Player Count`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_maxPlayerCount)(Only shown when `Limit number of Players` is enabled.)|The maximum number of players allowed to join the game.|
|[`Enable Split-Screen`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreen)|If enabled, each player is automatically assigned a portion of the available screen area. See documentation on [split-screen](#split-screen) multiplayer.|
-### Join behaviors
+## Join behaviors
You can use the [`Join Behavior`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_joinBehavior) property in the Inspector to determine how a [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) component decides when to add new players to the game. The following options are available to choose the specific mechanism that [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) employs.
@@ -27,29 +24,15 @@ You can use the [`Join Behavior`](../api/UnityEngine.InputSystem.PlayerInputMana
|--------|-----------|
|[`Join Players When Button IsPressed`](../api/UnityEngine.InputSystem.PlayerJoinBehavior.html)|Listen for button presses on Devices that are not paired to any player. If a player presses a button and joining is allowed, join the new player using the Device they pressed the button on.|
|[`Join Players When Join Action Is Triggered`](../api/UnityEngine.InputSystem.PlayerJoinBehavior.html)|Similar to `Join Players When Button IsPressed`, but this only joins a player if the control they triggered matches a specific action you define. For example, you can set up players to join when pressing a specific gamepad button.|
-|[`Join Players Manually`](../api/UnityEngine.InputSystem.PlayerJoinBehavior.html)|Don't join players automatically. Call [`JoinPlayer`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_JoinPlayer_System_Int32_System_Int32_System_String_UnityEngine_InputSystem_InputDevice_) explicitly to join new players. Alternatively, create GameObjects with [`PlayerInput`](PlayerInput.md) components directly and the Input System will automatically join them.|
-
-### Split-screen
-
-If you enable the [`Split-Screen`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreen) option, the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) automatically splits the available screen space between the active players. For this to work, you must set the [`Camera`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_camera) property on the `PlayerInput` prefab. The [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) then automatically resizes and repositions each camera instance to let each player have their own part of the screen.
-
-If you enable the [`Split-Screen`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreen) option, you can configure the following additional properties in the Inspector:
-
-|Property|Description|
-|--------|-----------|
-|[`Maintain Aspect Ratio`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_maintainAspectRatioInSplitScreen)|A `false` value enables the game to produce screen areas that have an aspect ratio different from the screen resolution when subdividing the screen.|
-|[`Set Fixed Number`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_fixedNumberOfSplitScreens)|If this value is greater than zero, the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) always splits the screen into a fixed number of rectangles, regardless of the actual number of players.|
-|[`Screen Rectangle`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreenArea)|The normalized screen rectangle available for allocating player split-screens into.|
-
-By default, any player in the game can interact with any UI elements. However, in split-screen setups, your game can have screen-space UIs that are restricted to just one specific camera. See the [UI Input](PlayerInput.md#ui-input) section on the Player Input component page on how to set this up using the Player Input component, [`InputSystemUIInputModule`](UISupport.md#setting-up-ui-input) and [`MultiplayerEventSystem`](UISupport.md#multiplayer-uis) components.
+|[`Join Players Manually`](../api/UnityEngine.InputSystem.PlayerJoinBehavior.html)|Don't join players automatically. Call [`JoinPlayer`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_JoinPlayer_System_Int32_System_Int32_System_String_UnityEngine_InputSystem_InputDevice_) explicitly to join new players. Alternatively, create GameObjects with [`PlayerInput`](player-input-component.md) components directly and the Input System will automatically join them.|
-### `PlayerInputManager` notifications
+## `PlayerInputManager` notifications
-`PlayerInputManager` sends notifications when something notable happens with the current player setup. These notifications are delivered according to the `Notification Behavior` property, in the [same way as for `PlayerInput`](PlayerInput.md#notification-behaviors).
+`PlayerInputManager` sends notifications when something notable happens with the current player setup. These notifications are delivered according to the `Notification Behavior` property, in the [same way as for `PlayerInput`](player-input-component.md#notification-behaviors).
Your game can listen to the following notifications:
|Notification|Description|
|------------|-----------|
-|[`PlayerJoinedMessage`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_PlayerJoinedMessage)|A new player joined the game. Passes the [`PlayerInput`](PlayerInput.md`PlayerInputManager` sends a `Player Joined` notification for each of these.|
-|[`PlayerLeftMessage`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_PlayerLeftMessage)|A player left the game. Passes the [`PlayerInput`](PlayerInput.md) instance of the player who left.|
+|[`PlayerJoinedMessage`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_PlayerJoinedMessage)|A new player joined the game. Passes the [`PlayerInput`](player-input-component.md) instance of the player who joined. `PlayerInputManager` sends a `Player Joined` notification for each of these.|
+|[`PlayerLeftMessage`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_PlayerLeftMessage)|A player left the game. Passes the [`PlayerInput`](player-input-component.md) instance of the player who left.|
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-processors-from-code.md b/Packages/com.unity.inputsystem/Documentation~/configure-processors-from-code.md
new file mode 100644
index 0000000000..6d4bee2b03
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-processors-from-code.md
@@ -0,0 +1,6 @@
+---
+uid: input-system-processors-from-code
+---
+
+# Configure processors from code
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-ui-input-action-map.md b/Packages/com.unity.inputsystem/Documentation~/configure-ui-input-action-map.md
new file mode 100644
index 0000000000..2dcf39783a
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-ui-input-action-map.md
@@ -0,0 +1,40 @@
+---
+uid: input-system-configure-ui-actions
+---
+
+# Configure UI Input Actions
+
+The default [project-wide actions asset](./about-project-wide-actions.md) comes with a built-in action map named **UI**, which contains all the actions required for UI interaction. To configure the bindings for these actions, use the [Actions Editor](./actions-editor.md).
+
+To open the UI action map:
+
+1. Go to **Project Settings > Input System Package**
+1. In the **Action Maps** column, select **UI**.
+
+
+
+The default [project-wide actions asset](./about-project-wide-actions.md) comes with all the required actions to be compatible with UI Toolkit and Unity UI.
+
+## Modify UI input actions
+
+You can modify, add, or remove bindings to the named actions in the UI action map to suit your project. However, to remain compatible with UI Toolkit, you must not change:
+
+* The name of the action map (**UI**)
+* The names of the actions it contains
+* Their respective **Action Types**.
+
+To see the specific actions and types that the [UI Input Module](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) class expects, refer to the [UI action map reference](ui-action-map-reference).
+
+## Reset the UI action map
+
+>[!IMPORTANT]
+>These instructions reset both the UI action map and the Player action map to their default bindings.
+
+To reset the UI action map to its default bindings:
+
+1. Open the **More (⋮)** menu, at the top-right of the Input Actions Editor window.
+1. Select **Reset**.
+
+To restore functionality to runtime `OnGUI` methods, you can change the **Active Input Handling** setting to **Both**. Doing this means that Unity processes the input twice, which could introduce a small performance impact.
+
+This only affects runtime (play mode) `OnGUI` methods. Editor GUI code is unaffected and continues to receive input events.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-unity-events.md b/Packages/com.unity.inputsystem/Documentation~/configure-unity-events.md
new file mode 100644
index 0000000000..d3da21ec65
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-unity-events.md
@@ -0,0 +1,83 @@
+---
+uid: input-system-configure-unity-events
+---
+
+# Configure Unity events
+
+You can use the following properties to configure `PlayerInput`:
+
+|Property|Description|
+|--------|-----------|
+|[`Actions`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions)|The set of [Input Actions](actions.md) associated with the player. Typically you would set this to Project-Wide Actions, however you can assign an [ActionAsset](action-assets.md) reference here). To receive input, each player must have an associated set of Actions. See documentation on [Actions](#actions) for details.|
+|[`Default Control Scheme`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_defaultControlScheme)|Which [Control Scheme](control-schemes.md) (from what is defined in [`Actions`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions)) to enable by default.|
+|[`Default Action Map`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_defaultActionMap)|Which [Action Map](actions.md) in [`Actions`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_actions) to enable by default. If set to `None`, then the player starts with no Actions being enabled.|
+|[`Camera`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_camera)|The individual camera associated with the player. This is only required when employing [split-screen](player-input-manager-component.md#split-screen) setups and has no effect otherwise.|
+|[`Behavior`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_notificationBehavior)|How the `PlayerInput` component notifies game code about things that happen with the player. See documentation on [notification behaviors](#notification-behaviors).|
+
+## Actions
+
+To receive input, each player must have an associated set of Input Actions.
+
+### Specifying the Actions to use
+
+The simplest workflow is to use the project-wide actions defined in the [Input Actions editor](actions-editor.md). However, the Player Input component also allows you to use an [Actions Asset](action-assets.md) to specify the actions that should be used by any instance of the component. If you set the **Actions** field to **Actions Asset**, the inspector displays a field into which you can assign an actions asset, and a **Create Actions** button which allows you to create a new actions asset. When you create these via the Player Input inspector's __Create Actions__ button, the Input System creates a default set of Actions. However, the Player Input component places no restrictions on the arrangement of Actions.
+
+### Enabling and disabling Actions
+
+The Player Input component automatically handles enabling and disabling Actions, and also handles installing [callbacks](respond-to-input.md#responding-to-actions-using-callbacks) on the Actions. When multiple Player Input components use the same Actions, the components automatically create [private copies of the Actions](respond-to-input.md#using-actions-with-multiple-players). This is why, when writing input code that works with the PlayerInput component, you should not use `InputSystem.actions` because this references the "singleton" copy of the actions rather than the specific private copy associated with the PlayerInput instance you are coding for.
+
+When first enabled, the Player Input component enables all Actions from the the [`Default Action Map`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_defaultActionMap). If no default Action Map exists, the Player Input component does not enable any Actions. To manually enable Actions, you can call [`Enable`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_Enable) and [`Disable`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_Disable) on the Action Maps or Actions, like you would do [without `PlayerInput`](actions.md). To check which Action Map is currently enabled, or to switch to a different one, use the [`PlayerInput.currentActionMap`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_currentActionMap) property. To switch Action Maps with an Action Map name, you can also call [`PlayerInput.SwitchCurrentActionMap`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_SwitchCurrentActionMap_System_String_).
+
+To disable a player's input, call [`PlayerInput.DeactivateInput`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_DeactivateInput). To re-enable it, call [`PlayerInput.ActivateInput`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_ActivateInput). The latter enables the default Action Map, if it exists.
+
+When `PlayerInput` is disabled, it automatically disables the currently active Action Map ([`PlayerInput.currentActionMap`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_currentActionMap)) and disassociate any Devices paired to the player.
+
+See the [notification behaviors](#notification-behaviors) section below for how to be notified when player triggers an Action.
+
+## When using **Send Messages** or **Broadcast Messages**
+
+When the [notification behavior](#notification-behaviors) of `PlayerInput` is set to **Send Messages** or **Broadcast Messages**, you can set your app to respond to Actions by defining methods in components like so:
+
+```CSharp
+public class MyPlayerScript : MonoBehaviour
+{
+ // "jump" action becomes "OnJump" method.
+
+ // If you're not interested in the value from the control that triggers the action, use a method without arguments.
+ public void OnJump()
+ {
+ // your Jump code here
+ }
+
+ // If you are interested in the value from the control that triggers an action, you can declare a parameter of type InputValue.
+ public void OnMove(InputValue value)
+ {
+ // Read value from control. The type depends on what type of controls.
+ // the action is bound to.
+ var v = value.Get();
+
+ // IMPORTANT:
+ // The given InputValue is only valid for the duration of the callback. Storing the InputValue references somewhere and calling Get() later does not work correctly.
+ }
+}
+```
+
+The component must be on the same `GameObject` if you are using `Send Messages`, or on the same or any child `GameObject` if you are using `Broadcast Messages`.
+
+## When using **Invoke Unity Events**
+
+When the [notification behavior](#notification-behaviors) of `PlayerInput` is set to `Invoke Unity Events`, each Action has to be routed to a target method. The methods have the same format as the [`started`, `performed`, and `canceled` callbacks](respond-to-input.md#action-callbacks) on [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html).
+
+```CSharp
+public class MyPlayerScript : MonoBehaviour
+{
+ public void OnFire(InputAction.CallbackContext context)
+ {
+ }
+
+ public void OnMove(InputAction.CallbackContext context)
+ {
+ var value = context.ReadValue();
+ }
+}
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/configure-virtual-mouse-input.md b/Packages/com.unity.inputsystem/Documentation~/configure-virtual-mouse-input.md
new file mode 100644
index 0000000000..9e7bf4d96e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/configure-virtual-mouse-input.md
@@ -0,0 +1,32 @@
+---
+uid: input-system-virtual-mouse-config
+---
+
+# Configure a Virtual Mouse
+
+To configure the Virtual Mouse component with the Unity UI system:
+
+1. Create a UI GameObject with an **Image** component. This GameObject is the mouse pointer. It can help to rename it "_Pointer_".
+2. Parent the pointer GameObject as a child of your **Canvas** GameObject that contains the UI which the cursor should operate on.
+3. Set the anchor position of the GameObject's `RectTransform` to the bottom left.
+4. Ensure your pointer GameObject is the last child of the Canvas so that the cursor draws on top of everything else.
+5. Add a **Virtual Mouse** component to the GameObject.
+6. Drag the **Image** component of the pointer GameObject into the **Cursor Graphic** field of the Virtual Mouse component.
+7. Drag the **Rect Transform** component of the pointer GameObject to the **Cursor Transform** field of the Virtual Mouse component.
+
+>[!NOTE]
+> Do not set up gamepads and joysticks for [navigation input](supported-ui-input-types-navigation.md) while using the Virtual Mouse component. If, for example, the Virtual Mouse component is configured to receive input from gamepads, and `Move`, `Submit`, and `Cancel` on the UI Input Module are also linked to the gamepad, then the UI receives input from the gamepad on two channels, and triggers the input twice.
+
+## Control the virtual mouse via the Input System
+
+To configure the input to drive the virtual mouse, do one of the following:
+
+* Add bindings on the various actions (such as **Stick Action**).
+* Enable **Use Reference** and link existing actions from an input actions asset.
+
+## Control the system mouse cursor with the virtual mouse
+
+To set the virtual mouse to control the system mouse cursor:
+1. Set [Cursor Mode](../api/UnityEngine.InputSystem.UI.VirtualMouseInput.html#UnityEngine_InputSystem_UI_VirtualMouseInput_cursorMode) to **Hardware Cursor If Available**.
+
+In this mode, the **Cursor Graphic** is hidden when a system mouse is present, and you use [Mouse.WarpCursorPosition](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_WarpCursorPosition_UnityEngine_Vector2_) to move the system mouse cursor instead of the software cursor. The transform linked through **Cursor Transform** is not updated.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-actuation.md b/Packages/com.unity.inputsystem/Documentation~/control-actuation.md
new file mode 100644
index 0000000000..3db17fd567
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-actuation.md
@@ -0,0 +1,40 @@
+---
+uid: input-system-control-actuation
+---
+
+# Control actuation
+
+Control actuation refers to whether or not a [control](controls.md) is currently being used by the user.
+
+A control is considered actuated when it has moved away from its default state in such a way that it affects the value of the control.
+
+The recommended workflow is to [bind controls to actions](add-duplicate-delete-binding.md), and then [respond to input at runtime](./respond-to-input.md) by polling or recieving callbacks from those actions. For this reason, it is not typically necessary to directly check whether a control is actuated. Instead, actuation of a control bound to an action causes the action to be performed (according to its [interaction pattern](Interactions.md), if an interaction has been assigned).
+
+However in some scenarios you might want to directly read the actuation of a control.
+
+## Directly read the actuation of a control
+
+You can query whether a control is currently actuated using [`IsActuated`](../api/UnityEngine.InputSystem.InputControlExtensions.html#UnityEngine_InputSystem_InputControlExtensions_IsActuated_UnityEngine_InputSystem_InputControl_System_Single_).
+
+```CSharp
+// Check if leftStick is currently actuated.
+if (Gamepad.current.leftStick.IsActuated())
+ Debug.Log("Left Stick is actuated");
+```
+
+It can be useful to determine not just whether a control is actuated at all, but also the amount by which it is actuated (that is, its magnitude). For example, for a [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) this is the length of the vector, whereas for a button it is the raw, absolute floating-point value.
+
+In general, the current magnitude of a control is always greater than or equal to zero. However, a control might not have a meaningful magnitude, in which case it returns -1. Any negative value should be considered an invalid magnitude.
+
+You can query the current amount of actuation using [`EvaluateMagnitude`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_EvaluateMagnitude).
+
+```CSharp
+// Check if left stick is actuated more than a quarter of its motion range.
+if (Gamepad.current.leftStick.EvaluateMagnitude() > 0.25f)
+ Debug.Log("Left Stick actuated past 25%");
+```
+
+There are two mechanisms within the Input System that most notably make use of control actuation:
+
+- [Interactive rebinding](interactive-rebinding.md) (`InputActionRebindingExceptions.RebindOperation`) uses it to select between multiple suitable controls to find the one that is actuated the most.
+- [Conflict resolution](binding-conflicts.md) between multiple controls that are bound to the same action uses it to decide which control gets to drive the action.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-hierarchies.md b/Packages/com.unity.inputsystem/Documentation~/control-hierarchies.md
new file mode 100644
index 0000000000..de81371b2a
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-hierarchies.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-control-hierarchies
+---
+
+# Control hierarchies
+
+Controls can be arranged in hierarchies. The root of a control hierarchy is always a [device](devices.md). You can find examples of hierarchies when browsing controls in the **Path** dropdown menu of the [Binding properties panel](./binding-properties-panel-reference.md).
+
+For example, the Dpad control of a gamepad has a has child controls of left, right, up, down, and the separate horizontal and vertical 1D axes.
+
+ *The Dpad control as viewed in the [Input Debugger window](the-input-debugger-window.md), showing its child controls of down, left, right, up, x, and y.*
+
+The arrangement of control hierarchies are defined in [layouts](layouts.md).
+
+## Access hierarchies with code
+
+You can access the parent of a Control using [`InputControl.parent`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_parent), and its children using [`InputControl.children`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_children). To access the flattened hierarchy of all Controls on a Device, use [`InputDevice.allControls`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_allControls).
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-items.md b/Packages/com.unity.inputsystem/Documentation~/control-items.md
new file mode 100644
index 0000000000..366a181c97
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-items.md
@@ -0,0 +1,41 @@
+---
+uid: input-system-control-items
+---
+
+# Control items
+
+Each layout is comprised of zero or more Control items. Each item either describes a new Control, or modifies the properties of an existing Control. The latter can also reach down into the hierarchy and modify properties of a Control added implicitly as a child by another item.
+
+```CSharp
+ // Add a dpad Control.
+ [InputControl(layout = "Dpad")]
+ // And now modify the properties of the "up" Control that was added by the
+ // "Dpad" layout above.
+ [InputControl(name = "dpad/up", displayName = "DPADUP")]
+ public int buttons;
+```
+
+The following table details the properties that a Control item can have. These can be set as properties on [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html), as properties on the Control in JSON, or through methods on [`InputControlLayout.Builder.ControlBuilder`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.ControlBuilder.html).
+
+|Property|Description|
+|--------|-----------|
+|[`name`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_name)|Name of the Control. By default, this is the name of the field/property that [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html) is applied to.|
+|[`displayName`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_displayName)|Display name of the Control (for use in UI strings).|
+|[`shortDisplayName`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_shortDisplayName)|Short display name of the Control (for use in UI strings).|
+|[`layout`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_layout)|Layout to use for the Control.|
+|[`variants`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_variants)|Variants of the Control.|
+|[`aliases`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_aliases)|Aliases for the Control. These are alternative names the Control can be referred by.|
+|[`usages`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_usages)|[Usages](controls.md#control-usages) of the Control.|
+|[`offset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_offset)|The byte offset at which the state for the Control is found.|
+|[`bit`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_bit)|The bit offset at which the state of the Control is found within its byte.|
+|[`sizeInBits`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_sizeInBits)|The total size of the Control's state, in bits.|
+|[`arraySize`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_arraySize)|If this is set to a non-zero value, the system will create an array of Controls of this size.|
+|[`parameters`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_parameters)|Any parameters to be passed to the Control. The system will apply these to any fields the Control type might have, such as [`AxisControl.scaleFactor`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_scaleFactor).|
+|[`processors`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_processors)|[Processors](processors.md) to apply to the Control.|
+|[`noisy`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_noisy)|Whether the Control is to be considered [noisy](controls.md#noisy-controls).|
+|[`synthetic`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_synthetic)|Whether the Control is to be considered [synthetic](controls.md#synthetic-controls).|
+|[`defaultState`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_defaultState)|Default initial value of the state __memory__ Control.|
+|[`useStateFrom`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_useStateFrom)|For [synthetic](controls.md#synthetic-controls) Controls, used to synthesize Control state.|
+|[`minValue`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_minValue)|The minimum value the Control can report. Used for evaluating [Control magnitude](controls.md#control-actuation).|
+|[`maxValue`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_maxValue)|The maximum value the Control can report. Used for evaluating [Control magnitude](controls.md#control-actuation).|
+|[`dontReset`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html#UnityEngine_InputSystem_Layouts_InputControlAttribute_dontReset)|When a device ["soft" reset](reset-device.md) is performed, the state of this control will not be reset. This is useful for controls such as pointer positions which should not go to `(0,0)` on a reset. When a "hard" reset is performed, the control will still be reset to its default value.|
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-paths.md b/Packages/com.unity.inputsystem/Documentation~/control-paths.md
new file mode 100644
index 0000000000..42560a8469
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-paths.md
@@ -0,0 +1,85 @@
+---
+uid: input-system-control-paths
+---
+
+# Control paths
+
+Control paths represent the way to describe a control or group of controls on a device, when [binding](bindings.md) them to an [action](actions.md).
+
+An example of a control path is `/leftStick/x`, which refers to the X-axis of the left stick of any gamepad.
+
+At runtime, the Input System performs a look-up of all control paths against the currently connected devices to discover which controls match the ones specified in the paths. This process is called [binding resolution](binding-resolution.md).
+
+
+## Specificity
+
+When [selecting a control path for binding](select-control-binding.md), there are various levels of specificity you can use. These are available in the **Control paths** menu, in the [Binding Properties panel](binding-properties-panel-reference.md).
+
+These levels of specificity depend on whether you want to refer to a certain type of device, specific models of device, or certain usages of a control regardless of device type.
+
+### By generic device
+
+You can refer to a generic type of device, for example referring to a common control across all types of gamepad (such as the left stick on a gamepad). In this case, this matches the left stick on all types of gamepad.
+
+### By specific device
+
+You can refer to a specific control on a specific model of gamepad (such as the `A` button on an Xbox controller). In this case, the path does not match any controls on any other type of gamepad even if they're similar in position or usage.
+
+### By usage
+
+You can also refer to controls by usage, which allows you to use a variety of common names that controls are associated with by convention, such as a `Back` button, or a `Submit` button. Refer to [control usages](control-usages.md) for more information about these.
+
+## The device and control tree
+
+The device and control tree is organized hierarchically from generic to specific. For example, the __Gamepad__ control path `/buttonSouth` matches the lower action button on any gamepad. Alternatively, if you navigate to __Gamepad__ > __More Specific Gamepads__ and select __PS4 Controller__, and then choose the control path `/buttonSouth`, this only matches the "Cross" button on PlayStation gamepads, and doesn't match any other gamepads.
+
+
+## Format
+
+Control paths are strings, which resemble file system paths. Each path consists of one or more components separated by a forward slash:
+
+ component/component...
+
+Each component uses a similar syntax made up of multiple fields. Each field is optional, but at least one field must be present. All fields are case-insensitive.
+
+ {usageName}controlName#(displayName)
+
+The following table explains the use of each field:
+
+|Field|Description|Example|
+|-----|-----------|-------|
+|``|Requires the control at the current level to be based on the given layout. The actual layout of the control may be the same or a layout *based* on the given layout.|`/buttonSouth`|
+|`{usageName}`|Works differently for controls and Devices. When used on a Device (the first component of a path), it requires the device to have the given usage. Refer to [Device usages](device-usages.md) for more details. For looking up a control, the usage field is currently restricted to the path component immediately following the Device (the second component in the path). It finds the control on the Device that has the given usage. The control can be anywhere in the control hierarchy of the Device.|Device: `{LeftHand}/trigger` Control: `/{Submit}`|
+|`controlName`|Requires the control at the current level to have the given name. Takes both "proper" names ([`InputControl.name`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_name)) and aliases ([`InputControl.aliases`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_aliases)) into account. This field can also be a wildcard (`*`) to match any name.|`MyGamepad/buttonSouth` `*/{PrimaryAction}` (match `PrimaryAction` usage on Devices with any name)|
+|`#(displayName)`|Requires the control at the current level to have the given display name (i.e. [`InputControl.displayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_displayName)). The display name may contain whitespace and symbols.|`/#(a)` (matches the key that generates the "a" character, if any, according to the current keyboard layout). `/#(Cross)`|
+
+### Wildcard characters
+
+If you enter a control path as text, you can use the wildcard asterisk character (`*`) to match multiple controls in the hierarchy specified. For example, you can use `/touch*/press` to bind to any finger pressed on the touchscreen, instead of individually binding to `/touch0/press`, `/touch1/press` and each other numbered touch separately.
+
+
+## Access from code
+
+You can access the literal path of a given control via its [`InputControl.path`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_path) property.
+
+If needed, you can manually parse a control path into its components using the [`InputControlPath.Parse(path)`](../api/UnityEngine.InputSystem.InputControlPath.html#UnityEngine_InputSystem_InputControlPath_Parse_System_String_) API.
+
+```CSharp
+var parsed = InputControlPath.Parse("{LeftHand}/trigger").ToArray();
+
+Debug.Log(parsed.Length); // Prints 2.
+Debug.Log(parsed[0].layout); // Prints "XRController".
+Debug.Log(parsed[0].name); // Prints an empty string.
+Debug.Log(parsed[0].usages.First()); // Prints "LeftHand".
+Debug.Log(parsed[1].layout); // Prints null.
+Debug.Log(parsed[1].name); // Prints "trigger".
+```
+
+You can use control paths to directly reference controls, or to let the Input System search for Controls among all devices using [`InputSystem.FindControls`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_FindControls_System_String_).
+
+```CSharp
+var gamepad = Gamepad.all[0];
+var leftStickX = gamepad["leftStick/x"];
+var submitButton = gamepad["{Submit}"];
+var allSubmitButtons = InputSystem.FindControls("*/{Submit}");
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-schemes-devices-menu-reference.md b/Packages/com.unity.inputsystem/Documentation~/control-schemes-devices-menu-reference.md
new file mode 100644
index 0000000000..b91f6f02e1
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-schemes-devices-menu-reference.md
@@ -0,0 +1,45 @@
+---
+uid: input-system-control-scheme-devices-menu
+---
+
+# Control Scheme and Devices menu reference
+
+Use the Control Scheme and Device drop-down menus to manage [control schemes](control-schemes.md) and [devices](devices.md), and to filter their view in the Input Actions Editor.
+
+## Control Scheme menu reference
+
+Use the Control Scheme drop-down menu to filter the **Action Maps** and **Actions** panels to only show actions and bindings relevant to that control scheme.
+
+|Option|Description|
+|-|-|
+|**All control schemes**|Show actions and bindings for all control schemes.|
+|Specific control scheme names|Only show actions and bindings that are applicable to the selected control scheme.|
+
+The Control Scheme drop-down menu also contains properties for creating, editing, and removing control schemes:
+
+|Property|Description|
+|-|-|
+|**Add Control Scheme**| Add a new control scheme to your project. This option opens the [Add Control Scheme](#add-control-scheme-window-reference) window.|
+|**Edit Control Scheme**| Edit the selected control scheme. This option opens the [Add Control Scheme](#add-control-scheme-window-reference) window. |
+|**Duplicate Control Scheme**| Duplicate the selected control scheme. This option opens the [Add Control Scheme](#add-control-scheme-window-reference) window.|
+|**Delete Control Scheme**|Delete the selected control scheme. This option opens a pop-up confirmation window.|
+
+### Add Control Scheme window reference
+
+The following properties appear in a window when you select **Add Control Scheme**, **Edit Control Scheme**, or **Duplicate Control Scheme**.
+
+|Property|Description|
+|-|-|
+|**Scheme Name**| Define the name of this control scheme.|
+|**Device Type**| Add and remove the devices that this control scheme is configured for.|
+
+## Devices menu reference
+
+Use the Devices drop-down menu to filter the **Action Maps** and **Actions** panels to only show actions and bindings relevant to that device.
+
+|Option|Description|
+|-|-|
+|**All devices**|Show actions and bindings for all devices.|
+|Specific device names|Only show actions and bindings that are applicable to the selected device.|
+
+The Devices menu only displays devices that are in the selected control scheme. If the Control Scheme menu is set to **All Control Schemes**, the Devices drop-down menu is greyed out.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-schemes.md b/Packages/com.unity.inputsystem/Documentation~/control-schemes.md
new file mode 100644
index 0000000000..cadbe97141
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-schemes.md
@@ -0,0 +1,13 @@
+---
+uid: input-system-control-schemes
+---
+
+# Control schemes
+
+Input Action Assets can have multiple [Control Schemes](control-schemes.md), which let you enable or disable different sets of Bindings for your Actions for different types of Devices.
+
+
+
+To see the Control Schemes in the Input Action Asset editor window, open the Control Scheme drop-down list in the top left of the window. This menu lets you add or remove Control Schemes to your Actions Asset. If the Actions Asset contains any Control Schemes, you can select a Control Scheme, and then the window only shows bindings that are associated with that Scheme. If you select a binding, you can now pick the Control Schemes for which this binding should be active in the __Properties__ view to the left of the window.
+
+When you add a new Control Scheme, or select an existing Control Scheme, and then select __Edit Control Scheme__, you can edit the name of the Control Scheme and which devices the Scheme should be active for. When you add a new Control Scheme, the "Device Type" list is empty by default (as shown above). You must add at least one type of device to this list for the Control Scheme to be functional.
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-state.md b/Packages/com.unity.inputsystem/Documentation~/control-state.md
new file mode 100644
index 0000000000..be1e04ab12
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-state.md
@@ -0,0 +1,30 @@
+---
+uid: input-system-control-state
+---
+
+# Control state
+
+A control's **state** is the current value stored by the Input System based on the control's [actuation](control-actuation.md).
+
+The recommended workflow is to [bind controls to actions](add-duplicate-delete-binding.md), and then [respond to input at runtime](./respond-to-input.md) by polling or recieving callbacks from those actions. For this reason, it is not typically necessary to directly read control states.
+
+However, the documentation on this page gives information about the details of how controls states are stored, and how to directly access the state, which may be useful if you are using a different workflow for a specialized situation.
+
+## Details
+
+Each control is connected to a block of memory that is considered the control's "state". You can query the size, format, and location of this block of memory from a control through the [`InputControl.stateBlock`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_stateBlock) property.
+
+The state of controls is stored in unmanaged memory that the Input System handles internally. All Devices added to the system share one block of unmanaged memory that contains the state of all the controls on the Devices.
+
+A control's state might not be stored in the natural format for that control. For example, the system often represents buttons as bitfields, and axis controls as 8-bit or 16-bit integer values. This format is determined by the combination of platform, hardware, and drivers. Each control knows the format of its storage and how to translate the values as needed. The Input System uses [layouts](layouts.md) to understand this representation.
+
+You can access the current state of a control through its [`ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) method.
+
+```CSharp
+Gamepad.current.leftStick.x.ReadValue();
+```
+
+Each type of control has a specific type of values that it returns, regardless of how many different types of formats it supports for its state. You can access this value type through the [`InputControl.valueType`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_valueType) property.
+
+Reading a value from a control might apply one or more value Processors. Refer to [Processors](processors.md) for more information.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-types-reference.md b/Packages/com.unity.inputsystem/Documentation~/control-types-reference.md
new file mode 100644
index 0000000000..afd21da79e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-types-reference.md
@@ -0,0 +1,24 @@
+---
+uid: input-system-control-types-ref
+---
+
+# Control types reference
+
+The Input System provides the following types of controls. These are available to select in the drop-down menu when you [configure the control type of an action](./configure-control-type.md).
+
+|Control Type|Value Type|Description|Example|
+|-|-|-|-|
+|[`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html)|`float`|A 1D floating-point axis.|[`Gamepad.leftStick.x`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html#UnityEngine_InputSystem_Controls_Vector2Control_x)|
+|[`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html)|`float`|A button expressed as a floating-point value. Whether the button can have a value other than 0 or 1 depends on the underlying representation. For example, gamepad trigger buttons can have values other than 0 and 1, but gamepad face buttons generally can't.|[`Mouse.leftButton`](../api/UnityEngine.InputSystem.Mouse.html#UnityEngine_InputSystem_Mouse_leftButton)|
+|[`KeyControl`](../api/UnityEngine.InputSystem.Controls.KeyControl.html)|N/A|A specialized button that represents a key on a [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html). Keys have an associated [`keyCode`](../api/UnityEngine.InputSystem.Controls.KeyControl.html#UnityEngine_InputSystem_Controls_KeyControl_keyCode) and, unlike other types of Controls, change their display name in accordance to the currently active system-wide keyboard layout. Refer to the [Keyboard](keyboards-introduction.md) documentation for details.|[`Keyboard.aKey`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_aKey)|
+|[`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html)|`Vector2`|A 2D floating-point vector.|[`Pointer.position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position)|
+|[`Vector3Control`](../api/UnityEngine.InputSystem.Controls.Vector3Control.html)|`Vector3`|A 3D floating-point vector.|[`Accelerometer.acceleration`](../api/UnityEngine.InputSystem.Accelerometer.html#UnityEngine_InputSystem_Accelerometer_acceleration)|
+|[`QuaternionControl`](../api/UnityEngine.InputSystem.Controls.QuaternionControl.html)|`Quaternion`|A 3D rotation.|[`AttitudeSensor.attitude`](../api/UnityEngine.InputSystem.AttitudeSensor.html#UnityEngine_InputSystem_AttitudeSensor_attitude)|
+|[`IntegerControl`](../api/UnityEngine.InputSystem.Controls.IntegerControl.html)|`int`|An integer value.|[`Touchscreen.primaryTouch.touchId`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId)|
+|[`StickControl`](../api/UnityEngine.InputSystem.Controls.StickControl.html)|`Vector2`|A 2D stick control like the thumbsticks on gamepads or the stick control of a joystick.|[`Gamepad.rightStick`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_rightStick)|
+|[`DpadControl`](../api/UnityEngine.InputSystem.Controls.DpadControl.html)|`Vector2`|A 4-way button control like the D-pad on gamepads or hatswitches on joysticks.|[`Gamepad.dpad`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_dpad)|
+|[`TouchControl`](../api/UnityEngine.InputSystem.Controls.TouchControl.html)|`TouchState`|A control that represents all the properties of a touch on a [touch screen](devices-touch.md).|[`Touchscreen.primaryTouch`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_primaryTouch)|
+
+You can browse the set of all registered control layouts in the [input debugger](debug-layouts.md).
+
+All controls are based on the [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html) base class. Most concrete implementations are based on [`InputControl`](../api/UnityEngine.InputSystem.InputControl-1.html).
diff --git a/Packages/com.unity.inputsystem/Documentation~/control-usages.md b/Packages/com.unity.inputsystem/Documentation~/control-usages.md
new file mode 100644
index 0000000000..c34b8401ac
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/control-usages.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-control-usages
+---
+
+# Control usages
+
+**Control usage** refers to the meaning of a control. In contrast to the name of a control which describes its physical end point on a device (such as `Button south`), the usage identifies the particular role of a control. For example, the usage `Back` identifies a control generally used to move backwards in the navigation history of a UI, and the usage `Submit` identifies a control generally used to confirm a selection in the UI.
+
+On a keyboard, the escape key that generally fulfills this role of `Back`, whereas on a gamepad, it is generally the `B` or `Circle` button.
+
+Some devices might not have a control that generally fulfills this function and so might not have any control with the `Back` usage.
+
+By looking up controls by usage rather than by name when [selecting a control for a binding](select-control-binding.md), you can locate the correct control to use for certain standardized situation without needing to know the specific details of the device or platform.
+
+You can access a control's usages using the [`InputControl.usages`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_usages) property.
+
+Usages can be arbitrary strings. However, there is a particular set of common usages, which predefined in the API in the form of the [`CommonUsages`](../api/UnityEngine.InputSystem.CommonUsages.html) static class. Refer to [`CommonUsages`](../api/UnityEngine.InputSystem.CommonUsages.html) for an overview.
+
+## Additional resources
+
+- [Select a control for binding](select-control-binding.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/controls.md b/Packages/com.unity.inputsystem/Documentation~/controls.md
new file mode 100644
index 0000000000..a1a46c6e41
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/controls.md
@@ -0,0 +1,31 @@
+---
+uid: input-system-controls
+---
+
+# Controls
+
+
+
+A **control** is a part of a [device](devices.md) that sends values to the Input System when [actuated](control-actuation.md), such as the buttons and sticks on a gamepad, or the keys on a keyboard.
+
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Introduction to controls](introduction-to-controls.md)** | An introduction to the concept of controls. |
+| **[Control hierarchies](control-hierarchies.md)** | Learn about how controls are arranged hierarchically. |
+| **[Control types reference](control-types-reference.md)** | The types of control defined in the Input System. |
+| **[Control usages](control-usages.md)** | Understand what a control usage is. |
+| **[Control paths](control-paths.md)** | Learn about control paths and how to use them to refer to controls. |
+| **[Control state](control-state.md)** | Details about how a control's state is stored and accessed. |
+| **[Record control state history](record-control-state-history.md)** | How to record a control's state history over time. |
+| **[Control actuation](control-actuation.md)** | Whether or not a control is currently being used by the user. |
+| **[Noisy controls](noisy-controls.md)** | Controls which can change value without any actual or intentional user interaction such as the accelerometer. |
+| **[Synthetic controls](synthetic-controls.md)** | A type of virtual control with values synthesized from input from a physical control on the device. |
+| **[Optimize controls](optimize-controls.md)** | Detailed information about increasing input performance in some specialized scenarios. |
+
+## Additional resources
+
+- [Bindings](bindings.md)
+- [Devices](devices.md)
+- [Layouts](layouts.md)
+- [Device states](device-states.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/Migration.md b/Packages/com.unity.inputsystem/Documentation~/corresponding-old-new-api.md
similarity index 85%
rename from Packages/com.unity.inputsystem/Documentation~/Migration.md
rename to Packages/com.unity.inputsystem/Documentation~/corresponding-old-new-api.md
index 8f313acd08..d86fb4ae66 100644
--- a/Packages/com.unity.inputsystem/Documentation~/Migration.md
+++ b/Packages/com.unity.inputsystem/Documentation~/corresponding-old-new-api.md
@@ -1,57 +1,20 @@
---
-uid: input-system-migration
+uid: input-system-old-new-apis
---
-# Migrating from the old Input Manager
-- [Read the introductory documentation first](#read-the-introductory-documentation-first)
-- [Which system is enabled?](#which-system-is-enabled)
-- [Comparison of API in the old Input Manager and the new Input System package](#comparison-of-api-in-the-old-input-manager-and-the-new-input-system-package)
- - [Action-based input](#action-based-input)
- - [Directly reading Gamepad and Joystick controls](#directly-reading-gamepad-and-joystick-controls)
- - [Keyboard](#keyboard)
- - [Mouse](#mouse)
- - [Touch and Pen](#touch-and-pen)
- - [Sensors](#sensors)
-
-This page is provided to help you match input-related API from Unity's old, built-in input (known as the [Input Manager](https://docs.unity3d.com/Manual/class-InputManager.html)) to the corresponding API in the new Input System package.
-
-## Read the introductory documentation first
-
-If you're new to the Input System package and have landed on this page looking for documentation, it's best to read the [QuickStart Guide](QuickStartGuide.md), and the [Concepts](Concepts.md) and [Workflows](Workflows.md) pages from the introduction section of the documentation, so that you can make sure you're choosing the best workflow for your project's input requirements.
-
-This is because there are a number of different ways to read input using the Input System, and some of the directly corresponding API methods on this page might give you the quickest - but least flexible - solution, and may not be suitable for a project with more complex requirements.
-
-## Which system is enabled?
-
-When installing the new Input System, Unity prompts you to enable the new input system and disable the old one. You can change this setting at any time later, by going to **Edit > Project Settings > Player > Other Settings > Active Input Handling**, [as described here](./Installation.md#enabling-the-new-input-backends).
-
-There are scripting symbols defined which allow you to use conditional compilation based on which system is enabled, as shown in the example below.
-
-```CSharp
-#if ENABLE_INPUT_SYSTEM
- // New input system backends are enabled.
-#endif
-
-#if ENABLE_LEGACY_INPUT_MANAGER
- // Old input backends are enabled.
-#endif
-```
-
-> **Note:** It is possible to have both systems enabled at the same time, in which case both sets of code in the example above above will be active.
-
-## Comparison of API in the old Input Manager and the new Input System package
+# Corresponding old and new APIs
Below is a list comparing the API from the old Input Manager with the corresponding API for the new Input System package.
All of the new Input System package APIs listed below are in the `UnityEngine.InputSystem` namespace. The namespace is omitted here for brevity.
-### Action-based input
+## Action-based input
-Action-based input refers to reading pre-configured named axes, buttons, or other controls. ([Read more about Action-based input](./Workflow-Actions.md))
+Action-based input refers to reading pre-configured named axes, buttons, or other controls. ([Read more about Action-based input](./using-actions-workflow.md))
- In the old Input Manager, these are defined in the **Axes** list, in the **Input Manager** section of the **Project Settings** window. _(Below, left)_
-- In the new Input System, these are defined in the [Actions Editor](ActionsEditor.md), which can be found in the **Input System Package** section of the **Project Settings** window, or by opening an [Action Asset](ActionAssets.md). _(Below, right)_
+- In the new Input System, these are defined in the [Actions Editor](actions-editor.md), which can be found in the **Input System Package** section of the **Project Settings** window, or by opening an [Action Asset](action-assets.md). _(Below, right)_
-_On the left, the old Input Manager Axes Configuration window, in Project settings. On the right, the new Input System's [Actions Editor](ActionsEditor.md)._
+_On the left, the old Input Manager Axes Configuration window, in Project settings. On the right, the new Input System's [Actions Editor](actions-editor.md)._
__Note:__ In some cases for named axes and buttons, the new Input System requires slightly more code than the old Input Manager, but this results in better performance. This is because in the new Input System, the logic is separated into two parts: the first is to find and store a reference to the action (usually done once, for example in your `Start` method), and the second is to read the action (usually done every frame, for example in your `Update` method). In contrast, the old Input Manager used a string-based API to "find" and "read" the value at the same time, because it was not possible to store a reference to a button or axis. This results in worse performance, because the axis or button is looked up each time the value is read.
@@ -72,13 +35,11 @@ Then, to read the action values, use the following:
[`Input.GetButton`](https://docs.unity3d.com/ScriptReference/Input.GetButton.html) Example: `bool jumpValue = Input.GetButton("Jump");` |Use [`IsPressed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_IsPressed_) on the reference to the action to read the button value. Example: `bool jumpValue = jumpAction.IsPressed();`.
[`Input.GetButtonDown`](https://docs.unity3d.com/ScriptReference/Input.GetButtonDown.html) Example: `bool jump = Input.GetButtonDown("Jump");` |Use [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) on the reference to the action to read if the button was pressed this frame. Example: `bool jumpValue = jumpAction.WasPressedThisFrame();`.
[`Input.GetButtonUp`](https://docs.unity3d.com/ScriptReference/Input.GetButtonUp.html) Example: `bool jump = Input.GetButtonUp("Jump");` |Use [`WasReleasedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame_) on the reference to the action to read whether the button was released this frame. Example: `bool jumpValue = jumpAction.WasReleasedThisFrame();`.
-[`Input.GetAxisRaw`](https://docs.unity3d.com/ScriptReference/Input.GetAxisRaw.html) For example, to read the raw values of the horizontal and vertical axes: `float h = Input.GetAxisRaw("Horizontal");` `float v = Input.GetAxisRaw("Vertical");` |No direct equivalent, but if there are [processors](Processors.md) associated with the action, you can use [`InputControl<>.ReadUnprocessedValue()`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadUnprocessedValue) to read unprocessed values. Example: `Vector2 moveVector = moveAction.ReadUnprocessedValue();` Note: This returns the same value as ReadValue when there are no processors on the action.
-
-
+[`Input.GetAxisRaw`](https://docs.unity3d.com/ScriptReference/Input.GetAxisRaw.html) For example, to read the raw values of the horizontal and vertical axes: `float h = Input.GetAxisRaw("Horizontal");` `float v = Input.GetAxisRaw("Vertical");` |No direct equivalent, but if there are [processors](processors.md) associated with the action, you can use [`InputControl<>.ReadUnprocessedValue()`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadUnprocessedValue) to read unprocessed values. Example: `Vector2 moveVector = moveAction.ReadUnprocessedValue();` Note: This returns the same value as ReadValue when there are no processors on the action.
-### Directly reading Gamepad and Joystick controls
+## Directly reading Gamepad and Joystick controls
-Directly reading hardware controls bypasses the new Input System's action-based workflow, which has some benefits and some drawbacks. ([Read more about directly reading devices](./Workflow-Direct.md))
+Directly reading hardware controls bypasses the new Input System's action-based workflow, which has some benefits and some drawbacks. ([Read more about directly reading devices](./using-direct-workflow.md))
|Input Manager (Old)|Input System (New)|
@@ -86,12 +47,11 @@ Directly reading hardware controls bypasses the new Input System's action-based
[`Input.GetKey`](https://docs.unity3d.com/ScriptReference/Input.GetKey.html) Example: `Input.GetKey(KeyCode.JoystickButton0)` |Use [`isPressed`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_isPressed) on the corresponding Gamepad button. Example: `InputSystem.GamePad.current.buttonNorth.isPressed`.
[`Input.GetKeyDown`](https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html) Example: `Input.GetKeyDown(KeyCode.JoystickButton0)` |Use [`wasPressedThisFrame`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_wasPressedThisFrame) on the corresponding Gamepad button. Example: `InputSystem.GamePad.current.buttonNorth.WasPressedThisFrame`.
[`Input.GetKeyUp`](https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html) Example: `Input.GetKeyUp(KeyCode.JoystickButton0)` |Use [`wasReleasedThisFrame`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_wasReleasedThisFrame) on the corresponding Gamepad button. Example: `InputSystem.GamePad.current.buttonNorth.wasReleasedThisFrame`.
-[`Input.GetJoystickNames`](https://docs.unity3d.com/ScriptReference/Input.GetJoystickNames.html)|There is no API that corresponds to this exactly, but there are examples of [how to read all connected devices here](Gamepad.html#discover-all-connected-devices).
+[`Input.GetJoystickNames`](https://docs.unity3d.com/ScriptReference/Input.GetJoystickNames.html)|There is no API that corresponds to this exactly, but there are examples of [how to read all connected devices here](query-gamepads.md#discover-all-connected-devices).
[`Input.IsJoystickPreconfigured`](https://docs.unity3d.com/ScriptReference/Input.IsJoystickPreconfigured.html)|Not needed. Devices which derive from [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) always correctly implement the mapping of axes and buttons to the corresponding [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html) members of the [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html) class. [`Input.ResetInputAxes`](https://docs.unity3d.com/ScriptReference/Input.ResetInputAxes.html)
+## Keyboard
-
-### Keyboard
|Input Manager (Old)|Input System (New)|
|--|--|
[`Input.GetKey`](https://docs.unity3d.com/ScriptReference/Input.GetKey.html) Example: `Input.GetKey(KeyCode.Space)` |Use [`isPressed`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_isPressed) on the corresponding key. Example: `InputSystem.Keyboard.current.spaceKey.isPressed`
@@ -101,11 +61,12 @@ Directly reading hardware controls bypasses the new Input System's action-based
[`Input.anyKeyDown`](https://docs.unity3d.com/ScriptReference/Input-anyKeyDown.html)|Use [`Keyboard.current.anyKey.wasUpdatedThisFrame`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_anyKey)
[`Input.compositionCursorPos`](https://docs.unity3d.com/ScriptReference/Input-compositionCursorPos.html)|Use [`Keyboard.current.SetIMECursorPosition(myPosition)`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_SetIMECursorPosition_UnityEngine_Vector2_)
[`Input.compositionString`](https://docs.unity3d.com/ScriptReference/Input-compositionString.html)|Subscribe to the [`Keyboard.onIMECompositionChange`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_onIMECompositionChange).
-[`Input.imeCompositionMode`](https://docs.unity3d.com/ScriptReference/Input-imeCompositionMode.html)|Use: [`Keyboard.current.SetIMEEnabled(true)`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_SetIMEEnabled_System_Boolean_) Also see: [Keyboard text input documentation](Keyboard.html#ime).
+[`Input.imeCompositionMode`](https://docs.unity3d.com/ScriptReference/Input-imeCompositionMode.html)|Use: [`Keyboard.current.SetIMEEnabled(true)`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_SetIMEEnabled_System_Boolean_) Also see: [Keyboard text input documentation](read-keyboard-text-input.md#working-with-input-from-input-method-editors).
[`Input.imeIsSelected`](https://docs.unity3d.com/ScriptReference/Input-imeIsSelected.html)|Use: [`Keyboard.current.imeSelected`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_imeSelected)
[`Input.inputString`](https://docs.unity3d.com/ScriptReference/Input-inputString.html)|Subscribe to the [`Keyboard.onTextInput`](../api/UnityEngine.InputSystem.Keyboard.html#UnityEngine_InputSystem_Keyboard_onTextInput) event: `Keyboard.current.onTextInput += character => /* ... */;`
-### Mouse
+## Mouse
+
|Input Manager (Old)|Input System (New)|
|--|--|
[`Input.GetMouseButton`](https://docs.unity3d.com/ScriptReference/Input.GetMouseButton.html) Example: `Input.GetMouseButton(0)`|Use [`isPressed`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_isPressed) on the corresponding mouse button. Example: `InputSystem.Mouse.current.leftButton.isPressed`
@@ -114,7 +75,7 @@ Directly reading hardware controls bypasses the new Input System's action-based
[`Input.mousePosition`](https://docs.unity3d.com/ScriptReference/Input-mousePosition.html)|Use [`Mouse.current.position.ReadValue()`](../api/UnityEngine.InputSystem.Mouse.html) Example: `Vector2 position = Mouse.current.position.ReadValue();` __Note__: Mouse simulation from touch isn't implemented yet.
[`Input.mousePresent`](https://docs.unity3d.com/ScriptReference/Input-mousePresent.html)|No corresponding API yet.
-### Touch and Pen
+## Touch and Pen
|Input Manager (Old)|Input System (New)|
|--|--|
@@ -127,18 +88,18 @@ Directly reading hardware controls bypasses the new Input System's action-based
[`Input.touchPressureSupported`](https://docs.unity3d.com/ScriptReference/Input-touchPressureSupported.html)|No corresponding API yet.
[`Input.touchSupported`](https://docs.unity3d.com/ScriptReference/Input-touchSupported.html)|[`Touchscreen.current != null`](../api/UnityEngine.InputSystem.Touchscreen.html#UnityEngine_InputSystem_Touchscreen_current)
[`Input.backButtonLeavesApp`](https://docs.unity3d.com/ScriptReference/Input-backButtonLeavesApp.html)|No corresponding API yet.
-[`GetPenEvent`](https://docs.unity3d.com/ScriptReference/Input.GetPenEvent.html) [`GetLastPenContactEvent`](https://docs.unity3d.com/ScriptReference/Input.GetLastPenContactEvent.html) [`ResetPenEvents`](https://docs.unity3d.com/ScriptReference/Input.ResetPenEvents.html) [`ClearLastPenContactEvent`](https://docs.unity3d.com/ScriptReference/Input.ClearLastPenContactEvent.html)|Use: [`Pen.current`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_current) See the [Pen, tablet and stylus support](Pen.md) docs for more information.
+[`GetPenEvent`](https://docs.unity3d.com/ScriptReference/Input.GetPenEvent.html) [`GetLastPenContactEvent`](https://docs.unity3d.com/ScriptReference/Input.GetLastPenContactEvent.html) [`ResetPenEvents`](https://docs.unity3d.com/ScriptReference/Input.ResetPenEvents.html) [`ClearLastPenContactEvent`](https://docs.unity3d.com/ScriptReference/Input.ClearLastPenContactEvent.html)|Use: [`Pen.current`](../api/UnityEngine.InputSystem.Pen.html#UnityEngine_InputSystem_Pen_current) See the [Pen, tablet and stylus support](devices-pen.md) docs for more information.
-
Note: [`UnityEngine.TouchScreenKeyboard`](https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard.html) is not part of the old Input Manager API, so you can continue to use it when migrating to the new Input System package.
-### Sensors
+## Sensors
+
|Input Manager (Old)|Input System (New)|
|--|--|
[`Input.acceleration`](https://docs.unity3d.com/ScriptReference/Input-acceleration.html)|[`Accelerometer.current.acceleration.ReadValue()`](../api/UnityEngine.InputSystem.Accelerometer.html).
-[`Input.accelerationEventCount`](https://docs.unity3d.com/ScriptReference/Input-accelerationEventCount.html) [`Input.accelerationEvents`](https://docs.unity3d.com/ScriptReference/Input-accelerationEvents.html)|Acceleration events aren't made available separately from other input events. See the [accelerometer code sample on the Sensors page](Sensors.html#accelerometer).
+[`Input.accelerationEventCount`](https://docs.unity3d.com/ScriptReference/Input-accelerationEventCount.html) [`Input.accelerationEvents`](https://docs.unity3d.com/ScriptReference/Input-accelerationEvents.html)|Acceleration events aren't made available separately from other input events. See the [accelerometer code sample on the Sensors page](query-sensors.md#measure-a-devices-acceleration).
[`Input.compass`](https://docs.unity3d.com/ScriptReference/Input-compass.html)|No corresponding API yet.
[`Input.compensateSensors`](https://docs.unity3d.com/ScriptReference/Input-compensateSensors.html)|[`InputSettings.compensateForScreenOrientation`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_compensateForScreenOrientation).
[`Input.deviceOrientation`](https://docs.unity3d.com/ScriptReference/Input-deviceOrientation.html)|No corresponding API yet.
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-custom-composite-binding.md b/Packages/com.unity.inputsystem/Documentation~/create-custom-composite-binding.md
new file mode 100644
index 0000000000..a8ed4bae6e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-custom-composite-binding.md
@@ -0,0 +1,99 @@
+
+# Create custom composite bindings
+
+You can define new types of Composites, and register them with the API. Unity treats these the same as predefined types, which the Input System internally defines and registers in the same way.
+
+To define a new type of Composite, create a class based on [`InputBindingComposite`](../api/UnityEngine.InputSystem.InputBindingComposite-1.html).
+
+> __IMPORTANT__: Composites must be __stateless__. This means that you cannot store local state that changes depending on the input being processed. For __stateful__ processing on Bindings, see [interactions](write-custom-interactions.md).
+
+```CSharp
+// Use InputBindingComposite as a base class for a composite that returns
+// values of type TValue.
+// NOTE: It is possible to define a composite that returns different kinds of values
+// but doing so requires deriving directly from InputBindingComposite.
+#if UNITY_EDITOR
+[InitializeOnLoad] // Automatically register in editor.
+#endif
+// Determine how GetBindingDisplayString() formats the composite by applying
+// the DisplayStringFormat attribute.
+[DisplayStringFormat("{firstPart}+{secondPart}")]
+public class CustomComposite : InputBindingComposite
+{
+ // Each part binding is represented as a field of type int and annotated with
+ // InputControlAttribute. Setting "layout" restricts the controls that
+ // are made available for picking in the UI.
+ //
+ // On creation, the int value is set to an integer identifier for the binding
+ // part. This identifier can read values from InputBindingCompositeContext.
+ // See ReadValue() below.
+ [InputControl(layout = "Button")]
+ public int firstPart;
+
+ [InputControl(layout = "Button")]
+ public int secondPart;
+
+ // Any public field that is not annotated with InputControlAttribute is considered
+ // a parameter of the composite. This can be set graphically in the UI and also
+ // in the data (e.g. "custom(floatParameter=2.0)").
+ public float floatParameter;
+ public bool boolParameter;
+
+ // This method computes the resulting input value of the composite based
+ // on the input from its part bindings.
+ public override float ReadValue(ref InputBindingCompositeContext context)
+ {
+ var firstPartValue = context.ReadValue(firstPart);
+ var secondPartValue = context.ReadValue(secondPart);
+
+ //... do some processing and return value
+ }
+
+ // This method computes the current actuation of the binding as a whole.
+ public override float EvaluateMagnitude(ref InputBindingCompositeContext context)
+ {
+ // Compute normalized [0..1] magnitude value for current actuation level.
+ }
+
+ static CustomComposite()
+ {
+ // Can give custom name or use default (type name with "Composite" clipped off).
+ // Same composite can be registered multiple times with different names to introduce
+ // aliases.
+ //
+ // NOTE: Registering from the static constructor using InitializeOnLoad and
+ // RuntimeInitializeOnLoadMethod is only one way. You can register the
+ // composite from wherever it works best for you. Note, however, that
+ // the registration has to take place before the composite is first used
+ // in a binding. Also, for the composite to show in the editor, it has
+ // to be registered from code that runs in edit mode.
+ InputSystem.RegisterBindingComposite();
+ }
+
+ [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
+ static void Init() {} // Trigger static constructor.
+}
+```
+
+The Composite should now appear in the editor UI when you add a Binding, and you can now use it in scripts.
+
+```CSharp
+ myAction.AddCompositeBinding("custom(floatParameter=2.0)")
+ .With("firstpart", "/buttonSouth")
+ .With("secondpart", "/buttonNorth");
+```
+
+To define a custom parameter editor for the Composite, you can derive from [`InputParameterEditor`](../api/UnityEngine.InputSystem.Editor.InputParameterEditor-1.html).
+
+```CSharp
+#if UNITY_EDITOR
+public class CustomParameterEditor : InputParameterEditor
+{
+ public override void OnGUI()
+ {
+ EditorGUILayout.Label("Custom stuff");
+ target.floatParameter = EditorGUILayout.FloatField("Some Parameter", target.floatParameter);
+ }
+}
+#endif
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-custom-device.md b/Packages/com.unity.inputsystem/Documentation~/create-custom-device.md
new file mode 100644
index 0000000000..c81d272514
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-custom-device.md
@@ -0,0 +1,16 @@
+---
+uid: input-system-create-custom-device
+---
+
+# Create a custom device
+
+>__Note__: This example deals only with Devices that have fixed layouts (that is, you know the specific model or models that you want to implement). This is different from an interface such as HID, where Devices can describe themselves through the interface and take on a wide variety of forms. A fixed Device layout can't cover self-describing Devices, so you need to use a [layout builder](layouts.md#generated-layouts) to build Device layouts from information you obtain at runtime.
+
+There are two main situations in which you might need to create a custom Device:
+
+1. You have an existing API that generates input, and which you want to reflect into the Input System.
+2. You have an HID that the Input System ignores, or that the Input system auto-generates a layout for that doesn't work well enough for your needs.
+
+For the second scenario, see [Overriding the HID Fallback](hid-create-custom-layout.md).
+
+The steps deal with the first scenario, where you want to create a new Input Device entirely from scratch and provide input to it from a third-party API.
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-custom-on-screen-control.md b/Packages/com.unity.inputsystem/Documentation~/create-custom-on-screen-control.md
new file mode 100644
index 0000000000..40c5fc2c8d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-custom-on-screen-control.md
@@ -0,0 +1,35 @@
+---
+uid: input-system-screen-custom-control
+---
+
+# Create a custom on-screen control
+
+To create custom [input controls](controls.md), you can extend [`OnScreenControl`](../api/UnityEngine.InputSystem.OnScreen.OnScreenControl.html).
+
+The following sample demonstrates one way to do this:
+
+```CSharp
+ [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;
+ }
+ }
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-device.md b/Packages/com.unity.inputsystem/Documentation~/create-device.md
new file mode 100644
index 0000000000..094414fdeb
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-device.md
@@ -0,0 +1,35 @@
+---
+uid: input-system-create-device
+---
+
+# Create a device
+
+Once the system has chosen a [layout](layouts.md) for a device, it instantiates an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) and populates it with [`InputControls`](../api/UnityEngine.InputSystem.InputControl.html) as the layout dictates. This process is internal and happens automatically.
+
+>__Note__: You can't create valid [`InputDevices`](../api/UnityEngine.InputSystem.InputDevice.html) and [`InputControls`](../api/UnityEngine.InputSystem.InputControl.html) by manually instantiating them with `new`. To guide the creation process, you must use [layouts](layouts.md).
+
+After the Input System assembles the [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html), it calls [`FinishSetup`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_FinishSetup_) on each control of the device and on the device itself. Use this to finalize the setup of the Controls.
+
+After an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) is fully assembled, the Input System adds it to the system. As part of this process, the Input System calls [`MakeCurrent`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_MakeCurrent_) on the Device, and signals [`InputDeviceChange.Added`](../api/UnityEngine.InputSystem.InputDeviceChange.html#UnityEngine_InputSystem_InputDeviceChange_Added) on [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange). The Input System also calls [`InputDevice.OnAdded`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_OnAdded_).
+
+Once added, the [`InputDevice.added`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_added) flag is set to true.
+
+## Add devices manually
+
+To add devices manually, you can call one of the `InputSystem.AddDevice` methods such as [`InputSystem.AddDevice(layout)`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice_System_String_System_String_System_String_).
+
+```CSharp
+// Add a gamepad. This bypasses the matching process and creates
+// a device directly
+// with the Gamepad layout.
+InputSystem.AddDevice();
+
+// Add a device such that the matching process is employed:
+InputSystem.AddDevice(new InputDeviceDescription
+{
+ interfaceName = "XInput",
+ product = "Xbox Controller",
+});
+```
+
+When a device is added, the Input System automatically issues a [sync request](../api/UnityEngine.InputSystem.LowLevel.RequestSyncCommand.html) on the device. This instructs the device to send an event representing its current state. Whether this request succeeds depends on the whether the given device supports the sync command.
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-edit-delete-action-maps.md b/Packages/com.unity.inputsystem/Documentation~/create-edit-delete-action-maps.md
new file mode 100644
index 0000000000..2170dcdbb3
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-edit-delete-action-maps.md
@@ -0,0 +1,16 @@
+---
+uid: input-system-create-maps
+---
+
+# Create action maps
+
+Action maps provide a way to group collections of Actions that represent different input scenarios in your project (such as UI navigation, gameplay, etc.)
+
+Actions must belong to an Action Map, therefore if you are starting with an empty Actions Asset, you must create an action map before you can create any actions.
+
+The Action Maps section on the left side of the [Actions Editor window](./actions-editor.md) allows you to create, rename, delete, and duplicate Action Maps.
+
+* To add a new Action Map, select the Add (+) icon in the header of the Action Map panel.
+* To rename an existing Action Map, either long-click the name, or right-click the Action Map and select __Rename__ from the context menu. Note that Action Map names can't contain slashes (`/`).
+* To delete an existing Action Map, right-click it and select __Delete__ from the context menu.
+* To duplicate an existing Action Map, right-click it and select __Duplicate__ from the context menu.
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-edit-delete-actions.md b/Packages/com.unity.inputsystem/Documentation~/create-edit-delete-actions.md
new file mode 100644
index 0000000000..24431dfaab
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-edit-delete-actions.md
@@ -0,0 +1,47 @@
+---
+uid: input-system-edit-actions
+---
+# Create, edit and delete actions
+
+The simplest way to create, edit, or delete actions is to use the [Input Actions editor](actions-editor.md) in the Project Settings window. This is the primary recommended workflow and suitable for most scenarios.
+
+However there are many other ways to work with actions which might suit less common scenarios. For example, by [loading actions from JSON data](configure-input-from-json.md), or [creating actions entirely in code](configure-input-directly-from-code.md).
+
+## Create Actions using the Action editor
+
+For information on how to create and edit Input Actions in the editor, see the [Input Actions editor](actions-editor.md). This is the recommended workflow if you want to organise all your input actions and bindings in one place, which applies across the whole of your project. This often the case for most types of game or app.
+
+
+*The Input Actions Editor in the Project Settings window*
+
+
+### Add, rename, duplicate or delete actions
+
+* To add a new Action, select the Add (+) icon in the header of the Action column.
+* To rename an existing Action, either long-click the name, or right-click the Action and select __Rename__ from the context menu.
+* To delete an existing Action, either right-click it and select __Delete__ from the context menu.
+* To duplicate an existing Action, either right-click it and select __Duplicate__ from the context menu.
+
+
+If you’d like to delete all the actions so that you can start from an empty configuration, you don’t need to delete the individual actions one-by-one. You can delete the each Action Map, which deletes all the Actions contained in the maps in one go.
+
+You can also delete all action maps, or reset all the actions back to the default values from the **more** (⋮) menu at the top right of the Input Actions section of the settings window, below the Project Settings window search field.
+
+
+
+> **Note:** this **more** (⋮) menu is only available when the Actions Editor is viewed within the Project Settings window. It isn't available when the Actions Editor is open in a separate window.
+
+
+## Other ways to create Actions
+
+The simplest way to create actions is to use the [Input Actions editor](actions-editor.md) to configure a set of actions in an asset, as described above. However, because the Input System package API is open and flexible, you can create actions using alternative techniques. These alternatives might be more suitable if you want to customize your project beyond the standard workflow.
+
+See:
+
+- [Stand-alone actions](declare-standalone-actions.md)
+- [Loading actions from JSON](configure-input-from-json.md)
+- [Creating actions in code](./configure-input-from-code.md)
+
+
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-empty-action-asset.md b/Packages/com.unity.inputsystem/Documentation~/create-empty-action-asset.md
new file mode 100644
index 0000000000..9ec8d6fe12
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-empty-action-asset.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-empty-action-asset
+---
+
+# Create an empty action asset
+
+Usually you only need one Action Asset, assigned as the project-wide actions. The input package provides a convenient way to [create a set of useful default actions and assign them as project-wide](assign-project-wide-actions.md) which is the most common and recommended workflow. In other cases, you might want to start with an empty actions asset, or create more than one actions asset.
+
+To do this:
+
+1. Go to __Assets > Create > Input Actions__ from Unity's main menu/
+
+(or)
+
+1. Click the project window's **Add (+)** button.
+2. Select **Input Actions** from the menu.
+
+When you create an action asset this way, the new action asset is empty, containing no actions, action maps, or control schemes. You must [add](./create-edit-delete-actions.md) and [configure](./configure-actions.md) new actions to use it. The new action asset is also not assigned as [project-wide](./assign-project-wide-actions.md).
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-events.md b/Packages/com.unity.inputsystem/Documentation~/create-events.md
new file mode 100644
index 0000000000..24ee815e87
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-events.md
@@ -0,0 +1,65 @@
+---
+uid: input-system-create-events
+---
+
+# Create events
+
+Anyone can create and queue new input events against any existing Device. Queueing an input event is thread-safe, which means that event generation can happen in background threads.
+
+>__Note__: Unity allocates limited memory to events that come from background threads. If background threads produce too many events, queueing an event from a thread blocks the thread until the main thread flushes out the background event queue.
+
+Note that queuing an event doesn't immediately consume the event. Event processing happens on the next update (depending on [`InputSettings.updateMode`](update-mode.md), it is triggered either manually via [`InputSystem.Update`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update), or automatically as part of the Player loop).
+
+## Sending state events
+
+For Devices that have a corresponding "state struct" describing the state of the device, the easiest way of sending input to the Device is to simply queue instances of those structs:
+
+```CSharp
+// Mouse.
+InputSystem.QueueStateEvent(Mouse.current, new MouseState { position = new Vector2(123, 234) });
+
+// Keyboard.
+InputSystem.QueueStateEvent(Keyboard.current, new KeyboardState(Key.LeftCtrl, Key.A));
+```
+
+`Touchscreen` is somewhat special in that it expects its input to be in [`TouchState`](../api/UnityEngine.InputSystem.LowLevel.TouchState.html) format.
+
+```CSharp
+// Start touch.
+InputSystem.QueueStateEvent(Touchscreen.current,
+ new TouchState { touchId = 1, phase = TouchPhase.Began, position = new Vector2(123, 234) });
+
+// Move touch.
+InputSystem.QueueStateEvent(Touchscreen.current,
+ new TouchState { touchId = 1, phase = TouchPhase.Moved, position = new Vector2(234, 345) });
+
+// End touch.
+InputSystem.QueueStateEvent(Touchscreen.current,
+ new TouchState { touchId = 1, phase = TouchPhase.Ended, position = new Vector2(123, 234) });
+```
+
+>__IMPORTANT:__ [Touch IDs](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_touchId) cannot be 0! A valid touch must have a non-zero touch ID. Concurrent touches must each have a unique ID. After a touch has ended, its ID can be reused – although it is recommended to not do so.
+
+If the exact format of the state used by a given Device is not known, the easiest way to send input to it is to simply create a [`StateEvent`](../api/UnityEngine.InputSystem.LowLevel.StateEvent.html) from the Device itself:
+
+```CSharp
+// `StateEvent.From` creates a temporary buffer in unmanaged memory that holds
+// a state event large enough for the given device and contains a memory
+// copy of the device's current state.
+InputEventPtr eventPtr;
+using (StateEvent.From(myDevice, out eventPtr))
+{
+ ((AxisControl) myDevice["myControl"]).WriteValueIntoEvent(0.5f, eventPtr);
+ InputSystem.QueueEvent(eventPtr);
+}
+```
+
+Alternatively, you can send events for individual Controls.
+
+```CSharp
+// Send event to update leftStick on the gamepad.
+InputSystem.QueueDeltaStateEvent(Gamepad.current.leftStick,
+ new Vector2(0.123f, 0.234f);
+```
+
+Note that delta state events only work for Controls that are both byte-aligned and a multiple of 8 bits in size in memory. You can't send a delta state event for a button Control that is stored as a single bit, for example.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-on-screen-button-control.md b/Packages/com.unity.inputsystem/Documentation~/create-on-screen-button-control.md
new file mode 100644
index 0000000000..2364516169
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-on-screen-button-control.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-screen-button-control
+---
+
+# Create an on-screen button control
+
+To create an on-screen button:
+
+1. Add a UI `Button` object.
+2. Add the [`OnScreenButton`](../api/UnityEngine.InputSystem.OnScreen.OnScreenButton.html) component to it.
+3. Set the [controlPath](../api/UnityEngine.InputSystem.OnScreen.OnScreenControl.html#UnityEngine_InputSystem_OnScreen_OnScreenControl_controlPath) to refer to a [`ButtonControl`](../api/UnityEngine.InputSystem.Controls.ButtonControl.html) (for example, `/buttonSouth`). The type of device referenced by the control path determines the type of virtual device created by the component.
+
+
+
+The [`OnScreenButton`](../api/UnityEngine.InputSystem.OnScreen.OnScreenButton.html) component requires the target control to be a `Button` control. [`OnScreenButton`](../api/UnityEngine.InputSystem.OnScreen.OnScreenButton.html) sets the target control value to 1 when it receives a pointer-down (`IPointerDownHandler.OnPointerDown`) event, or 0 when it receives a pointer-up (`IPointerUpHandler.OnPointerUp`) event.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-on-screen-stick-control.md b/Packages/com.unity.inputsystem/Documentation~/create-on-screen-stick-control.md
new file mode 100644
index 0000000000..e63e9a42b4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-on-screen-stick-control.md
@@ -0,0 +1,36 @@
+---
+uid: input-system-screen-stick-control
+---
+
+# Create an on-screen stick control
+
+To create an on-screen stick:
+
+1. Create a UI `Image` object.
+2. Add the [`OnScreenStick`](../api/UnityEngine.InputSystem.OnScreen.OnScreenStick.html) component to it.
+3. Set the [`controlPath`](../api/UnityEngine.InputSystem.OnScreen.OnScreenControl.html#UnityEngine_InputSystem_OnScreen_OnScreenControl_controlPath) to refer to a [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) (for example, `/leftStick`). The type of device referenced by the control path determines the type of virtual device created by the component.
+
+
+
+The [`OnScreenStick`](../api/UnityEngine.InputSystem.OnScreen.OnScreenStick.html) component requires the target control to be a `Vector2` control. [`OnScreenStick`](../api/UnityEngine.InputSystem.OnScreen.OnScreenStick.html) starts the movement of the stick control when it receives a pointer-down (`IPointerDownHandler.OnPointerDown`) event, and stops it when it receives a pointer-up (`IPointerUpHandler.OnPointerUp`) event.
+
+In-between, the stick moves according to the pointer being dragged (`IDragHandler.OnDrag`) within a box centered on the pointer-down screen point, and with an edge length defined in the component's __Movement Range__ property. A movement range of 50, for example, means that the stick's on-screen area is 25 pixels up, down, left, and right of the pointer-down point on screen.
+
+If you want to be notified when the user starts and/or stops touching the on-screen stick, implement `IPointerDownHandler` and/or `IPointerUpHandler` on a component and add it to the stick `GameObject`.
+
+## Isolate stick controls
+
+The [`OnScreenStick`](../api/UnityEngine.InputSystem.OnScreen.OnScreenStick.html) simulates input events from the device specified in the [`OnScreenControl.control`](../api/UnityEngine.InputSystem.OnScreen.OnScreenControl.html#UnityEngine_InputSystem_OnScreen_OnScreenControl_control) property. To the Input System itself, these are normal events and can cause the paired device to change in games and applications where dynamic device switching is used, for example when the [`PlayerInput`](../api/UnityEngine.InputSystem.PlayerInput.html) component is used with the [`PlayerInput.neverAutoSwitchControlSchemes`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_neverAutoSwitchControlSchemes) propety set to false. As the stick is dragged around, the paired device will alternate between the device that owns the pointer (mouse, touch, pen etc) and the device from the control path, which can result in jittery movement of the on-screen stick.
+
+To fix this, enable **Use Isolated Input Actions**. This mode uses a local set of input action instances to drive interaction with the stick, and not the actions defined in the UI. The downside of this mode is that pointer actions will be duplicated in both the on-screen stick component and any input action assets being used to drive the UI. Note that if a set of bindings is not specified for the Pointer Down action and Pointer Move actions, the following defaults will be used:
+
+* Pointer Down action
+ - `/leftButton`
+ - `/tip`
+ - `/touch*/press`
+ - `/trigger`
+
+* Pointer Move action
+ - `/position`
+ - `/position`
+ - `/touch*/position`
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-precompiled-layout.md b/Packages/com.unity.inputsystem/Documentation~/create-precompiled-layout.md
new file mode 100644
index 0000000000..aa770b72fc
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-precompiled-layout.md
@@ -0,0 +1,89 @@
+---
+uid: input-system-create-precompiled-layout
+---
+
+# Create a precompiled layout
+
+The first step in setting up a precompiled layout is to generate it. To do so, open the [Input Debugger](debugging.md), navigate to the layout you want to precompile within the **Layouts** branch, right-click it, and select **Generate Precompiled Layout**.
+
+
+
+Unity will ask you where to store the generated code. Pick a directory in your project, enter a file name, and click **Save**.
+
+ Once generated, you can register the precompiled layout with the Input System using [`InputSystem.RegisterPrecompiledLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterPrecompiledLayout__1_System_String_). The method expects a string argument containing metadata for the precompiled layout. This string is automatically emitted as a `const` inside the generated class.
+
+ ```CSharp
+ InputSystem.RegisterPrecompiledLayout(MyPrecompiledDevice.metadata);
+ ```
+
+>__IMPORTANT__: It is very important that this method is called with all relevant layout registrations being in the same state as at the time the layout was precompiled. There is no internal check whether the precompiled layout will still generate an identical result to the non-precompiled version.
+
+Once registered, a precompiled layout is automatically used whenever the layout that the precompiled layout is based on is instantiated.
+
+```CSharp
+// Let's assume you have a custom device class.
+public class MyDevice : InputDevice
+{
+ // Setters for your control getters need to have at least `protected`
+ // or `internal` access so the precompiled version can use them.
+ [InputControl]
+ public ButtonControl button { get; protected set; }
+
+ // This method will *NOT* be invoked by the precompiled version. Instead, all the lookups
+ // performed here will get hardcoded into the generated C# code.
+ protected override void FinishSetup()
+ {
+ base.FinishSetup();
+
+ button = GetChildControl("button1");
+ }
+}
+
+// You register the device as a layout somewhere during startup.
+InputSystem.RegisterLayout();
+
+// And you register a precompiled version of it then as well.
+InputSystem.RegisterPrecompiledLayout(PrecompiledMyDevice.metadata);
+
+// Then the following will implicitly use the precompiled version.
+InputSystem.AddDevice();
+```
+
+A precompiled layout will automatically be unregistered in the following cases:
+
+* A [layout override](#layout-overrides) is applied to one of the layouts used by the precompiled Device. This also extends to [controls](controls.md) used by the Device.
+* A layout with the same name as one of the layouts used by the precompiled Device is registered (which replaces the layout already registered under the name).
+* A [processor](processors.md) is registered that replaces a processor used by the precompiled Device.
+
+This causes the Input System to fall back to the non-precompiled version of the layout. Note also that a precompiled layout will not be used for layouts [derived](#layout-inheritance) from the layout the precompiled version is based on. In the example above, if someone derives a new layout from `MyDevice`, the precompiled version is unaffected (it will not be unregistered) but is also not used for the newly created type of device.
+
+```CSharp
+// Let's constinue from the example above and assume that sometime
+// later, someone replaces the built-in button with an extended version.
+InputSystem.RegisterLayout("Button");
+
+// PrecompiledMyDevice has implicitly been removed now, because the ButtonControl it uses
+// has now been replaced with ExtendedButtonControl.
+```
+
+If needed, you can add `#if` checks to the generated code, if needed. The code generator will scan the start of an existing file for a line starting with `#if` and, if found, preserve it in newly generated code and generate a corresponding `#endif` at the end of the file. Similarly, you can change the generated class from `public` to `internal` and the modifier will be preserved when regenerating the class. Finally, you can also modify the namespace in the generated file with the change being preserved.
+
+The generated class is marked as `partial`, which means you can add additional overloads and other code by having a parallel, `partial` class definition.
+
+```CSharp
+// The next line will be preserved when regenerating the precompiled layout. A
+// corresponding #endif will be emitted at the end of the file.
+#if UNITY_EDITOR || UNITY_STANDALONE
+
+// If you change the namespace to a different one, the name of the namespace will be
+// preserved when you regenerate the precompiled layout.
+namepace MyNamespace
+{
+ // If you change `public` to `internal`, the change will be preserved
+ // when regenerating the precompiled layout.
+ public partial class PrecompiledMyDevice : MyDevice
+ {
+ //...
+```
+
+The namespace of the generated layout will correspond to the
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-project-wide-actions.md b/Packages/com.unity.inputsystem/Documentation~/create-project-wide-actions.md
new file mode 100644
index 0000000000..21712962f3
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-project-wide-actions.md
@@ -0,0 +1,32 @@
+---
+uid: input-system-project-wide-assets
+---
+
+# Create and assign a default project-wide actions asset
+
+Follow these steps to create an actions asset that contains the built-in [default actions](./default-actions.md), and assign them as project-wide.
+
+Open the Input System Package panel in Project Settings, by going to **Edit** > **Project Settings** > **Input System Package**.
+
+If you don't yet have an Action Asset assigned as project-wide in your project, the Input System Package settings window displays an empty field for you to assign your action asset, and a button allowing you to create and assign one.
+
+
+*The Input System Package Project Settings with no project-wide actions assigned*
+
+> **Note:** If you already have an Action Asset assigned, this button is not displayed, and instead the Actions Editor is displayed, allowing you to edit the currently assigned project-wide actions.
+
+Click **"Create a new project-wide Action Asset"**.
+
+The asset is created in your project, and automatically assigned as the **project-wide actions**.
+
+The Action Asset appears in your Project view, and is named "InputSystem_Actions". This is where your new configuration of actions is saved, including any changes you make to it.
+
+
+*The new Actions Asset in your Project window*
+
+When you create an action asset this way, the new asset contains a set of default actions that are useful in many common scenarios. You can [configure them](./configure-actions.md) or [add new actions](./create-edit-delete-actions.md) to suit your project.
+
+
+*The Input System Package Project Settings after creating and assigning the default actions*
+
+Once you have created and assigned project-wide actions, the Input System Package page in Project Settings displays the **Actions Editor** interface. Read more about how to use the [Actions Editor](actions-editor.md) to configure your actions.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-settings-asset.md b/Packages/com.unity.inputsystem/Documentation~/create-settings-asset.md
new file mode 100644
index 0000000000..f7e5e2406c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-settings-asset.md
@@ -0,0 +1,13 @@
+---
+uid: input-settings-create-settings-asset
+---
+
+# Create a settings asset
+
+When you first view the input settings, they are not editable, and instead a button to __Create settings asset__ is displayed at the top of the input settings window.
+
+
+
+If you want to customise the input settings, you must first click this button, which creates a settings asset in your Project. Once your project contains a settings asset, the __Create settings asset__ is no longer displayed, and the settings fields become editable. Unity saves changes to your settings in the settings asset when you save the project.
+
+If your project contains multiple settings assets, you can use the gear menu in the top-right corner of the window to choose which asset to use. You can also use this menu to create addit
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/create-user-paired-with-input-device.md b/Packages/com.unity.inputsystem/Documentation~/create-user-paired-with-input-device.md
new file mode 100644
index 0000000000..96141b44a7
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/create-user-paired-with-input-device.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-user-paired-with-device
+---
+
+# Create a user paired with an input device
+
+You can use the [`InputUser.PerformPairingWithDevice`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_PerformPairingWithDevice_UnityEngine_InputSystem_InputDevice_UnityEngine_InputSystem_Users_InputUser_UnityEngine_InputSystem_Users_InputUserPairingOptions_) method to create a new [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) instance and pair it with an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html). You can also optionally pass in an existing [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) instance to pair it with the Device, if you don't want to create a new user instance.
+
+To query the Devices paired to a specific [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html), use [`InputUser.pairedDevices`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_pairedDevices). To remove the pairing, use [`InputUser.UnpairDevice`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_UnpairDevice_UnityEngine_InputSystem_InputDevice_) or [`InputUser.UnpairDevices`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_UnpairDevices).
+
+## Initial engagement
+
+After you create a user, you can use [`InputUser.AssociateActionsWithUser`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_AssociateActionsWithUser_UnityEngine_InputSystem_IInputActionCollection_) to associate [Input Actions](actions.md) to it, and use [`InputUser.ActivateControlScheme`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_ActivateControlScheme_System_String_) to associate and activate a [Control Scheme](control-schemes.md). You can use [`InputControlScheme.FindControlSchemeForDevice`](../api/UnityEngine.InputSystem.InputControlScheme.html#UnityEngine_InputSystem_InputControlScheme_FindControlSchemeForDevice__1_UnityEngine_InputSystem_InputDevice___0_) to pick a control scheme that matches the selected Actions and Device:
+
+```
+var scheme = InputControlScheme.FindControlSchemeForDevice(user.pairedDevices[0], user.actions.controlsSchemes);
+if (scheme != null)
+ user.ActivateControlScheme(scheme);
+```
+
+When you activate a Control Scheme, the Input System automatically switches the active Binding mask for the user's Actions to that Control Scheme.
diff --git a/Packages/com.unity.inputsystem/Documentation~/custom-devices.md b/Packages/com.unity.inputsystem/Documentation~/custom-devices.md
new file mode 100644
index 0000000000..60156d3364
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/custom-devices.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-custom-devices
+---
+
+# Custom devices
+
+Extend the Input System with devices and input sources that Unity does not provide out of the box.
+
+Send low-level input events into the runtime, or implement a custom Device with layouts, state, and registration. Use **Input events** when you need to inject or observe raw input; follow **Create a custom device** when you integrate a third-party API or replace HID fallback behavior.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Input events](input-events.md)** | Listen for, create, record, and process low-level input events for custom devices. |
+| **[Create a custom device](create-custom-device.md)** | Walk through state struct, Device class, update, registration, and optional commands. |
+
+## Additional resources
+
+- [Layouts](layouts.md)
+- [Human Interface Device specification](hid-specification.md)
+- [Debug layouts](debug-layouts.md)
+- [Devices (scripting)](devices-scripting.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/debug-action.md b/Packages/com.unity.inputsystem/Documentation~/debug-action.md
new file mode 100644
index 0000000000..c706bcc40c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/debug-action.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-debug-action
+---
+
+# Debug an action
+
+The Input Debugger window lists all enabled [Actions](actions.md) in the __Actions__ list. This list only appears if at least one Action is active and the Editor is in Play mode. If an Action has actively bound Controls, you can click the arrow next to the Action to see a list of the Controls. This is useful to debug whether your Bindings correctly map to the Controls you want them to bind to. See documentation on [Binding resolution](binding-resolution.md) for more information about how Unity maps Bindings to Controls.
+
+>__Note__: Actions that belong to [`InputUsers`](user-management.md) don't appear here. They appear in the [__Users__](#debugging-users-and-playerinput) list instead.
diff --git a/Packages/com.unity.inputsystem/Documentation~/debug-device.md b/Packages/com.unity.inputsystem/Documentation~/debug-device.md
new file mode 100644
index 0000000000..fef0055e22
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/debug-device.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-debug-device
+---
+
+# Debug a device
+
+In the Input Debugger window, navigate to the __Devices__ list and double-click any [Input Device](devices.md). This opens a window that displays information about the Device, including real-time state information for its Controls.
+
+
+
+The top of the Device window displays general information about the specific Device, such as name, manufacturer, and serial number.
+
+The __Controls__ section lists the Device's Controls and their individual states. This is useful when debugging input issues, because you can verify whether the data that the Input System receives from the Input Device is what you expect it to be. There are two buttons at the top of this panel:
+
+* __HID Descriptor__: Only displayed for devices that use the HID protocol to connect. This opens a window that displays the detailed [HID](hid-specification-introduction.md) specifications for the Device and each of it's logical controls.
+
+* __State__: Display the current state of the Device in a new window. This is identical to the information displayed in this view, but doesn't update in real time, so you can take a snapshot of input state data and take the time to inspect it as needed.
+
+The __Events__ section lists all [input events](input-events.md) generated by the Device. You can double-click any event in the list to inspect the full Device state at the time the event occurred. To get a side-by-side difference between the state of the Device at different points in time, select multiple events, right-click them, and click __Compare__ from the context menu.
diff --git a/Packages/com.unity.inputsystem/Documentation~/debug-layouts.md b/Packages/com.unity.inputsystem/Documentation~/debug-layouts.md
new file mode 100644
index 0000000000..729b562625
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/debug-layouts.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-debug-layouts
+---
+
+# Debug layouts
+
+The [__Layouts__](layouts.md) list in the Input Debugger window displays a breakdown of all registered [Control and Device layouts](layouts.md). This is the database of supported hardware and the knowledge of how to represent a given piece of input hardware. It's useful when you want to [create a new Device mapping](hid-specification.md#creating-a-custom-device-layout) and see how the Input System represents it.
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/debug-player-input-component.md b/Packages/com.unity.inputsystem/Documentation~/debug-player-input-component.md
new file mode 100644
index 0000000000..d36e038da5
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/debug-player-input-component.md
@@ -0,0 +1,11 @@
+---
+uid: input-system-debug-player-input-component
+---
+
+# Debug the Player Input component
+
+When the Editor is in Play mode, each Player Input component instance displays a **Debug** section, as shown below.
+
+
+
+The Debug section shows the User number (which starts counting from zero), the control Scheme, and the devices assigned to the PlayerInput instance.
diff --git a/Packages/com.unity.inputsystem/Documentation~/debug-users-playerinput.md b/Packages/com.unity.inputsystem/Documentation~/debug-users-playerinput.md
new file mode 100644
index 0000000000..43bb64b216
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/debug-users-playerinput.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-debug-users-playerinput
+---
+
+# Debug users and PlayerInput
+
+When there are [`InputUser`](user-management.md) instances (if you use `PlayerInput`, each `PlayerInput` instance implicitly creates one), the Input Debugger's __Users__ list displays each instance along with its paired Devices and active Actions. The listed Devices and Actions work the same way as those displayed in the [__Devices__](#debugging-devices) and [__Actions__](#debugging-actions) lists in the debugging window.
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/declare-standalone-actions.md b/Packages/com.unity.inputsystem/Documentation~/declare-standalone-actions.md
new file mode 100644
index 0000000000..6243c6b7d1
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/declare-standalone-actions.md
@@ -0,0 +1,33 @@
+---
+uid: input-system-declare-standalone-actions
+---
+
+# Declare stand-alone actions
+
+As an alternative workflow, you can declare individual [Input Action](../api/UnityEngine.InputSystem.InputAction.html) and [Input Action Maps](../api/UnityEngine.InputSystem.InputActionMap.html) as fields directly inside `MonoBehaviour` components.
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+public class ExampleScript : MonoBehaviour
+{
+ public InputAction move;
+ public InputAction jump;
+}
+```
+
+The result is similar to using an Actions defined in the Input Actions editor, except the Actions are defined in the GameObject's properties and saved as Scene or Prefab data, instead of in a dedicated Asset.
+
+When you embed actions like this, by defining serialized InputAction fields in a MonoBehaviour, the GameObject's Inspector window displays an interface similar to the Actions column of the [Actions Editor](./actions-editor.md), which allows you to set up the bindings for those actions. For example:
+
+
+
+* To add or remove Actions or Bindings, click the Add (+) or Remove (-) icon in the header.
+* To edit Bindings, double-click them.
+* To edit Actions, double-click them in an Action Map, or click the gear icon on individual Action properties.
+* You can also right-click entries to bring up a context menu, and you can drag them. Hold the Alt key and drag an entry to duplicate it.
+
+Unlike the project-wide actions in the Project Settings window, you must manually enable and disable Actions and Action Maps that are embedded in MonoBehaviour components.
+
+When you use this workflow, the serialised action configurations are stored with the parent GameObject as part of the scene, opposite to being serialised with an Action Asset. This can be useful if you want to bundle the control bindings and behaviour together in a single monobehaviour or prefab, so it can be distributed together. However, this can also make it harder to organize your full set of control bindings if they are distributed across multiple prefabs or scenes.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/default-actions.md b/Packages/com.unity.inputsystem/Documentation~/default-actions.md
new file mode 100644
index 0000000000..8ff904924e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/default-actions.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-default-project-wide-actions
+---
+
+# The default project-wide actions
+
+When you [create and assign default project-wide actions](./create-project-wide-actions.md) the Action Asset comes pre-configured with some default Actions such as "Move", "Jump", and more, which suit many common app and game scenarios. They are configured to read input from the most common types of input controller such as Keyboard, Mouse, Gamepad, Touchscreen, and extended reality (XR).
+
+
+*The Input System Package Project Settings after creating and assigning the default actions*
+
+These default actions mean that in many cases, you can start scripting with the Input System without any configuration by referring to the names of the default actions that are already configured for you. You can also rename and reconfigure the default actions, or delete these default configurations to suit your needs.
+
+
+
+### The legacy default Actions Asset
+
+The Input System Package also comes with an asset called `DefaultInputActions.inputactions` containing a default set of Actions. This default actions asset is older than, and entirely separate from the default project-wide actions described above.
+
+This is a legacy asset that remains included in the package for backward compatibility only, and not recommended for use in new projects. It should not be confused with the default project-wide actions described above.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/default-interactions.md b/Packages/com.unity.inputsystem/Documentation~/default-interactions.md
new file mode 100644
index 0000000000..0b7745da86
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/default-interactions.md
@@ -0,0 +1,38 @@
+---
+uid: input-system-default-interactions
+---
+
+# Default interactions
+
+Different Action types have different default Interactions. For example, the following diagram shows the behavior of the built-in Interactions for a simple button press.
+
+
+
+The following table provides an at-a-glance overview of how Interaction phases change for each action type's default Interaction.
+
+|__Callback__|[`InputActionType.Value`](respond-to-input.md#value)|[`InputActionType.Button`](respond-to-input.md#button)|[`InputActionType.PassThrough`](respond-to-input.md#pass-through)|
+|-----------|-------------|------------|-----------------|
+|[`started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started)|Control(s) changed value away from the default value.|Button started being pressed but has not necessarily crossed the press threshold yet.|not used|
+|[`performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)|Control(s) changed value.|Button was pressed to at least the button [press threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint).|Control changed value.|
+|[`canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled)|Control(s) are no longer actuated.|Button was released. If the button was pressed above the press threshold, the button has now fallen to or below the [release threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_buttonReleaseThreshold). If the button was never fully pressed, the button is now back to completely unpressed.|Action is disabled.|
+
+## Value Action default Interaction
+
+[`Value`](respond-to-input.md#value)-type Actions have a default Interaction with the following behavior:
+
+1. As soon as a bound Control becomes [actuated](control-actuation.md), the Action's Interaction phase goes from `Waiting` to `Started`, and then immediately to `Performed` and back to `Started`. One callback occurs on [`InputAction.started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started), followed by one callback on [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed).
+2. For as long as the bound Control remains actuated, the Action's Interaction phase stays in `Started` and triggers `Performed` whenever the value of the Control changes (that is, one call occurs to [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed)).
+3. When the bound Control stops being actuated, the Action's Interaction phase goes to `Canceled` and then back to `Waiting`. One call occurs to [`InputAction.canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
+
+## Button Action default Interaction
+
+[`Button`](respond-to-input.md#button)-type Actions have a default Interaction with the following behavior:
+
+1. As soon as a bound Control becomes [actuated](control-actuation.md), the Action's Interaction phase goes from `Waiting` to `Started`. One callback occurs on [`InputAction.started`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_started).
+2. If a Control then reaches or exceeds the button press threshold, the Action's Interaction phase goes from `Started` to `Performed`. One callback occurs on [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed). The default value of the button press threshold is defined in the [input settings](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_defaultButtonPressPoint). However, an individual control can [override](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_pressPoint) this value.
+3. Once the Action has `Performed`, if all Controls then go back to a level of actuation at or below the [release threshold](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_buttonReleaseThreshold), the Action's Interaction phase goes from `Performed` to `Canceled`. One call occurs to [`InputAction.canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
+4. If the Action's Interaction phase never went to `Performed`, it will go to `Canceled` as soon as all Controls are released. One call occurs to [`InputAction.canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled).
+
+## PassThrough Action default Interaction
+
+[`PassThrough`](respond-to-input.md#pass-through)-type Actions have a default Interaction with a simpler behavior. The Input System doesn't try to track bound Controls as a single source of input. Instead, it triggers a `Performed` callback for each value change.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/default-value-properties.md b/Packages/com.unity.inputsystem/Documentation~/default-value-properties.md
new file mode 100644
index 0000000000..82f5e37a57
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/default-value-properties.md
@@ -0,0 +1,16 @@
+---
+uid: input-system-default-value-properties
+---
+
+# Default value properties
+
+|Property|Description|
+|----|-----------|
+|Default Deadzone Min|The default minimum value for [Stick Deadzone](built-in-processors.md) or [Axis Deadzone](built-in-processors.md) processors when no `min` value is explicitly set on the processor.|
+|Default Deadzone Max|The default maximum value for [Stick Deadzone](built-in-processors.md) or [Axis Deadzone](built-in-processors.md) processors when no `max` value is explicitly set on the processor.|
+|Default Button Press Point|The default [press point](../api/UnityEngine.InputSystem.Controls.ButtonControl.html#UnityEngine_InputSystem_Controls_ButtonControl_pressPointOrDefault) for [Button Controls](../api/UnityEngine.InputSystem.Controls.ButtonControl.html), and for various [Interactions](Interactions.md). For button Controls which have analog physics inputs (such as triggers on a gamepad), this configures how far they need to be held down for the system to consider them pressed.|
+|Default Tap Time|Default duration for [Tap](built-in-interactions.md#tap) and [MultiTap](built-in-interactions.md#multitap) Interactions. Also used by by touchscreen Devices to distinguish taps from to new touches.|
+|Default Slow Tap Time|Default duration for [SlowTap](built-in-interactions.md#tap) Interactions.|
+|Default Hold Time|Default duration for [Hold](built-in-interactions.md#hold) Interactions.|
+|Tap Radius|Maximum distance between two finger taps on a touchscreen Device for the system to consider this a tap of the same touch (as opposed to a new touch).|
+|Multi Tap Delay Time|Default delay between taps for [MultiTap](built-in-interactions.md#multitap) Interactions. Also used by touchscreen Devices to count multi-taps (See [`TouchControl.tapCount`](../api/UnityEngine.InputSystem.Controls.TouchControl.html#UnityEngine_InputSystem_Controls_TouchControl_tapCount)).|
diff --git a/Packages/com.unity.inputsystem/Documentation~/derive-new-layout-from-existing-layout.md b/Packages/com.unity.inputsystem/Documentation~/derive-new-layout-from-existing-layout.md
new file mode 100644
index 0000000000..39cfdd57e8
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/derive-new-layout-from-existing-layout.md
@@ -0,0 +1,5 @@
+---
+uid: derive-new-layout
+---
+
+# Derive a new layout from an existing layout
diff --git a/Packages/com.unity.inputsystem/Documentation~/detect-current-input-system.md b/Packages/com.unity.inputsystem/Documentation~/detect-current-input-system.md
new file mode 100644
index 0000000000..30e5af99ec
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/detect-current-input-system.md
@@ -0,0 +1 @@
+# Detect the current input system
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-assignments.md b/Packages/com.unity.inputsystem/Documentation~/device-assignments.md
new file mode 100644
index 0000000000..e776873f4e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-assignments.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-device assignments
+---
+
+# Device assignments
+
+If the `PlayerInput` component has any Devices assigned, it matches these to the [Control Schemes](control-schemes.md) in the associated Action Asset, and only enables Control Schemes which match its Input Devices.
+
+Each `PlayerInput` can have one or more Devices assigned to it. By default, no two `PlayerInput` components are assigned the same Devices, but you can force this; to do so, manually assign Devices to a player when calling [`PlayerInput.Instantiate`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_Instantiate_UnityEngine_GameObject_System_Int32_System_String_System_Int32_UnityEngine_InputSystem_InputDevice_), or call [`InputUser.PerformPairingWithDevice`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_PerformPairingWithDevice_UnityEngine_InputSystem_InputDevice_UnityEngine_InputSystem_Users_InputUser_UnityEngine_InputSystem_Users_InputUserPairingOptions_) on the `InputUser` of a `PlayerInput`.
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-background-focus-changes.md b/Packages/com.unity.inputsystem/Documentation~/device-background-focus-changes.md
new file mode 100644
index 0000000000..d6c1036c6e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-background-focus-changes.md
@@ -0,0 +1,25 @@
+---
+uid: input-system-device-background-focus-changes
+---
+
+# Device background and focus changes
+
+In general, input is tied to [application focus](https://docs.unity3d.com/ScriptReference/Application-isFocused.html). This means that Devices do not receive input while the application is not in the foreground and thus no [Actions](actions.md) will receive input either. When the application comes back into focus, all devices will receive a [sync](#device-syncs) request to have them send their current state (which may have changed while the application was in the background) to the application. Devices that do not support sync requests will see a [soft reset](#device-resets) that resets all Controls not marked as [`dontReset`](layouts.md#control-items) to their default state.
+
+On platforms such as iOS and Android, that do not support running Unity applications in the background, this is the only supported behavior.
+
+If the application is configured to run while in the background (that is, not having focus), input behavior can be selected from several options. This is supported in two scenarios:
+
+* In Unity's [Player Settings](https://docs.unity3d.com/Manual/class-PlayerSettings.html) you can explicity enable `Run In Background` for specific players that support it (such as Windows or Mac standalone players). Note that in these players this setting is always enabled automatically in *development* players.
+* In the editor, application focus is tied to focus on the Game View. If no Game View is focused, the application is considered to be running in the background. However, while in play mode, the editor will *always* keep running the player loop regardless of focus on the Game View window. This means that in the editor, `Run In Background` is considered to always be enabled.
+
+If the application is configured this way to keep running while in the background, the player loop and thus the Input System, too, will keep running even when the application does not have focus. What happens with respect to input then depends on two factors:
+
+1. On the ability of individual devices to receive input while the application is not running in the foreground. This is only supported by a small subset of devices and platforms. VR devices ([`TrackedDevice`](../api/UnityEngine.InputSystem.TrackedDevice.html)) such as HMDs and VR controllers generally support this. To find out whether a specific device supports this, you can query the [`InputDevice.canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) property. This property can also be forced to true or false via a Device's [layout](layouts.md#control-items).
+2. On two settings you can find in the project-wide [Input Settings](input-settings.md). Specifically, [`InputSettings.backgroundBehavior`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_backgroundBehavior) and [`InputSettings.editorInputBehaviorInPlayMode`](../api/UnityEngine.InputSystem.InputSettings.html#UnityEngine_InputSystem_InputSettings_editorInputBehaviorInPlayMode). The table below shows a detailed breakdown of how input behaviors vary based on these two settings and in relation to the `Run In Background` player setting in Unity.
+
+>__Note__: [`InputDevice.canRunInBackground`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_canRunInBackground) is overridden by the editor in certain situations (see table below). In general, the value of the property does not have to be the same between the editor and the player and depends on the specific platform and device.
+
+The following table shows the full matrix of behaviors according to the [Input Settings](input-settings.md) and whether the game is running in the editor or in the player.
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-capabilities.md b/Packages/com.unity.inputsystem/Documentation~/device-capabilities.md
new file mode 100644
index 0000000000..d8a7ce89eb
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-capabilities.md
@@ -0,0 +1,7 @@
+---
+uid: input-system-device-capabilities
+---
+
+# Device capabilities
+
+Part of the Device description can be a [`capabilities`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_capabilities) string in JSON format. This string describes characteristics that help the Input System to interpret the data from a Device, and map it to Control representations. Not all Device interfaces report Device capabilities. Examples of interface-specific Device capabilities are [HID descriptors](hid-specification-introduction.md). WebGL, Android, and Linux use similar mechanisms to report available Controls on connected gamepads.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-commands.md b/Packages/com.unity.inputsystem/Documentation~/device-commands.md
new file mode 100644
index 0000000000..698df45c51
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-commands.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-device-commands
+---
+
+# Device commands
+
+Send data to Devices from script—for rumble, HID output reports, and other backend features.
+
+Unlike [input events](input-events.md), which flow from hardware into the Input System, commands flow out to the Device. Send built-in command types or define your own for custom hardware.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Send a command to a device](send-command-to-device.md)** | Call `InputDevice.ExecuteCommand` and monitor commands with `InputSystem.onDeviceCommand`. |
+| **[Add a custom device command](add-custom-device-command.md)** | Define `IInputDeviceCommandInfo` structs to send custom data to a Device backend. |
+
+## Additional resources
+
+- [Input events](input-events.md)
+- [Human Interface Device specification](hid-specification.md)
+- [Gamepad haptics](gamepad-haptics.md)
+- [Step 6 Device Commands (Optional)](step-6-device-commands-optional.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-descriptions.md b/Packages/com.unity.inputsystem/Documentation~/device-descriptions.md
new file mode 100644
index 0000000000..befb829a27
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-descriptions.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-device-descriptions
+---
+
+# Device descriptions
+
+An [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html) describes a Device. The Input System uses this primarily during the Device discovery process. When a new Device is reported (by the runtime or by the user), the report contains a Device description. Based on the description, the system then attempts to find a Device [layout](layouts.md) that matches the description. This process is based on [Device matchers](#matching).
+
+After a Device has been created, you can retrieve the description it was created from through the [`InputDevice.description`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_description) property.
+
+Every description has a set of standard fields:
+
+|Field|Description|
+|-----|-----------|
+|[`interfaceName`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_interfaceName)|Identifier for the interface/API that is making the Device available. In many cases, this corresponds to the name of the platform, but there are several more specific interfaces that are commonly used: [HID](https://www.usb.org/hid), [RawInput](https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input), [XInput](https://docs.microsoft.com/en-us/windows/desktop/xinput/xinput-game-controller-apis-portal). This field is required.|
+|[`deviceClass`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_deviceClass)|A broad categorization of the Device. For example, "Gamepad" or "Keyboard".|
+|[`product`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_product)|Name of the product as reported by the Device/driver itself.|
+|[`manufacturer`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_manufacturer)|Name of the manufacturer as reported by the Device/driver itself.|
+|[`version`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_version)|If available, provides the version of the driver or hardware for the Device.|
+|[`serial`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_serial)|If available, provides the serial number for the Device.|
+|[`capabilities`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html#UnityEngine_InputSystem_Layouts_InputDeviceDescription_capabilities)|A string in JSON format that describes Device/interface-specific capabilities. See the [section on capabilities](#capabilities).|
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-ids.md b/Packages/com.unity.inputsystem/Documentation~/device-ids.md
new file mode 100644
index 0000000000..fde6d4b86c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-ids.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-device-ids
+---
+
+# Device IDs
+
+Each created Device receives a unique numeric ID. You can access this ID through [`InputDevice.deviceId`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_deviceId).
+
+All IDs are only used once per Unity session.
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-lifecycle.md b/Packages/com.unity.inputsystem/Documentation~/device-lifecycle.md
new file mode 100644
index 0000000000..71a7172d95
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-lifecycle.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-device-lifecycle
+---
+
+# Device lifecycle
+
+Manage how Input Devices are created, updated, and torn down at runtime and in the Editor.
+
+Use these topics when you need to add or remove devices, reset or sync state, control whether devices process input, or understand focus and domain reload behavior.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Create a device](create-device.md)** | Add devices with `InputSystem.AddDevice` and understand automatic layout instantiation. |
+| **[Remove a device](remove-device.md)** | Remove disconnected or manual devices and handle `onDeviceChange` notifications. |
+| **[Reset a device](reset-device.md)** | Reset controls to default state with `InputSystem.ResetDevice`. |
+| **[Sync a device](sync-device.md)** | Request current hardware state with `RequestSyncCommand` when the platform supports it. |
+| **[Enable and disable devices](enable-disable-devices.md)** | Control whether a device processes input using enabled state and commands. |
+| **[Device background and focus changes](device-background-focus-changes.md)** | Handle focus loss, regain, and background execution settings for device state. |
+| **[Devices and domain reloads](devices-domain-reloads.md)** | Understand how Editor domain reloads recreate devices and reset state. |
+
+## Additional resources
+
+- [Working with devices](working-with-devices.md)
+- [Device states](device-states.md)
+- [Native devices](native-devices.md)
+- [Debug a device](debug-device.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-matching.md b/Packages/com.unity.inputsystem/Documentation~/device-matching.md
new file mode 100644
index 0000000000..343d60de02
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-matching.md
@@ -0,0 +1,30 @@
+---
+uid: input-system-device-matching
+---
+
+# Device matching
+
+[`InputDeviceMatcher`](../api/UnityEngine.InputSystem.Layouts.InputDeviceMatcher.html) instances handle matching an [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html) to a registered layout. Each matcher loosely functions as a kind of regular expression. Each field in the description can be independently matched with either a plain string or regular expression. Matching is not case-sensitive. For a matcher to apply, all of its individual expressions have to match.
+
+To matchers to any layout, call [`InputSystem.RegisterLayoutMatcher`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayoutMatcher_System_String_UnityEngine_InputSystem_Layouts_InputDeviceMatcher_). You can also supply them when you register a layout.
+
+```CSharp
+// Register a new layout and supply a matcher for it.
+InputSystem.RegisterLayoutMatcher(
+ matches: new InputDeviceMatcher()
+ .WithInterface("HID")
+ .WithProduct("MyDevice.*")
+ .WithManufacturer("MyBrand");
+
+// Register an alternate matcher for an already registered layout.
+InputSystem.RegisterLayoutMatcher(
+ new InputDeviceMatcher()
+ .WithInterface("HID")
+
+```
+
+If multiple matchers are matching the same [`InputDeviceDescription`](../api/UnityEngine.InputSystem.Layouts.InputDeviceDescription.html), the Input System chooses the matcher that has the larger number of properties to match against.
+
+## Hijacking the matching process
+
+You can overrule the internal matching process from outside to select a different layout for a Device than the system would normally choose. This also makes it possible to quickly build new layouts. To do this, add a custom handler to the [`InputSystem.onFindControlLayoutForDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onFindLayoutForDevice) event. If your handler returns a non-null layout string, then the Input System uses this layout.
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-simulation.md b/Packages/com.unity.inputsystem/Documentation~/device-simulation.md
new file mode 100644
index 0000000000..6dce6084f6
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-simulation.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-device-simulation
+---
+
+# Device Simulation
+
+When Device Simulator window is in use, mouse and pen inputs on the simulated device screen are turned into touchscreen inputs. Device Simulator uses its own touchscreen device, which it creates and destroys together with the Device Simulator window.
+
+To prevent conflicts between simulated touchscreen inputs and native mouse and pen inputs, Device Simulator disables all native mouse and pen devices.
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-states.md b/Packages/com.unity.inputsystem/Documentation~/device-states.md
new file mode 100644
index 0000000000..ac85fd5529
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-states.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-device-states
+---
+
+# Device states
+
+Observe and change Device control state from script beyond what native backends send.
+
+Each [Device](devices-scripting.md) stores control values in memory, usually updated by [state events](read-state-events.md). Use change monitors to react when values change, or synthesize state when you need derived or manual updates.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Monitor device state changes](monitor-device-state-changes.md)** | Register callbacks with `InputState.AddChangeMonitor` when control state changes. |
+| **[Synthesize a device state change](synthesize-device-state-change.md)** | Push state changes with `InputState.Change` for derived or manual control values. |
+
+## Additional resources
+
+- [Controls](controls.md)
+- [Read state events](read-state-events.md)
+- [Device commands](device-commands.md)
+- [Working with devices](working-with-devices.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/device-usages.md b/Packages/com.unity.inputsystem/Documentation~/device-usages.md
new file mode 100644
index 0000000000..8cdd53e156
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/device-usages.md
@@ -0,0 +1,7 @@
+---
+uid: input-system-device-usages
+---
+
+# Device usages
+
+Like any [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html), a Device can have usages associated with it. You can query usages with the [`usages`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_usages) property, and use[`InputSystem.SetDeviceUsage()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_SetDeviceUsage_UnityEngine_InputSystem_InputDevice_System_String_) to set them. Usages can be arbitrary strings with arbitrary meanings. One common case where the Input System assigns Devices usages is the handedness of XR controllers, which are tagged with the "LeftHand" or "RightHand" usages.
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-domain-reloads.md b/Packages/com.unity.inputsystem/Documentation~/devices-domain-reloads.md
new file mode 100644
index 0000000000..b510805a50
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-domain-reloads.md
@@ -0,0 +1,13 @@
+---
+uid: input-system-devices-domain-reloads
+---
+
+# Devices and domain reloads
+
+The Editor reloads the C# application domain whenever it reloads and recompiles scripts, or when the Editor goes into Play mode. This requires the Input System to reinitialize itself after each domain reload. During this process, the Input System attempts to recreate devices that were instantiated before the domain reload. However, the state of each Device doesn't carry across, which means that Devices reset to their default state on domain reloads.
+
+Note that layout registrations do not persist across domain reloads. Instead, the Input System relies on all registrations to become available as part of the initialization process (for example, by using `[InitializeOnLoad]` to run registration as part of the domain startup code in the Editor). This allows you to change registrations and layouts in script, and the change to immediately take effect after a domain reload.
+
+## Support for Configurable Enter Play Mode
+
+Input System 1.20.0 and later supports Configurable Enter Play Mode, which allows entering Play mode with domain reload disabled. For more information, refer to [Configuring how Unity enters Play mode](https://docs.unity3d.com/Manual/configurable-enter-play-mode.html) and [Enter Play mode with domain reload disabled](https://docs.unity3d.com/Manual/domain-reloading.html).
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-gamepads.md b/Packages/com.unity.inputsystem/Documentation~/devices-gamepads.md
new file mode 100644
index 0000000000..583060b407
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-gamepads.md
@@ -0,0 +1,24 @@
+---
+uid: input-system-gamepad
+---
+
+# Gamepads
+
+A gamepad is narrowly defined as a device with two thumbsticks, a D-pad, and four face buttons. Additionally, gamepads usually have two shoulder and two trigger buttons. Most gamepads also have two buttons in the middle.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Gamepads introduction](gamepads-introduction.md)** | Configure devices that have a D-pad and four face buttons.|
+| **[PlayStation gamepads](gamepads-playstation.md)** | Configure PlayStation controllers in your application. |
+| **[Switch gamepads](gamepads-switch.md)** | Configure Switch controllers in your application. |
+| **[Xbox gamepads](gamepads-xbox.md)** | Configure Xbox controllers in your application. |
+| **[Query and control gamepads in code](query-gamepads.md)** | Access information about the gamepads connected to your application.|
+| **[Gamepad polling](gamepad-polling.md)** | Collect gamepad input on a frame-by-frame basis.|
+| **[Gamepad haptics](gamepad-haptics.md)** | Control the rumble and motor of gamepads.|
+
+## Additional resources
+
+- [Devices](devices.md)
+- [The Player Input component](player-input-component.md)
+- [Control schemes](control-schemes.md)
+- [User rebinding at runtime](user-rebinding-runtime.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-joysticks.md b/Packages/com.unity.inputsystem/Documentation~/devices-joysticks.md
new file mode 100644
index 0000000000..8e0c8acb6d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-joysticks.md
@@ -0,0 +1,12 @@
+---
+uid: input-system-joystick
+---
+# Joystick support
+
+The Input System currently supports joysticks as generic [HIDs](hid-specification.md) only. The system attempts to identify controls based on the information provided in the HID descriptor of the device, but it might not always be accurate. These devices often work best when you allow the user to [manually remap the controls](xref:UnityEngine.InputSystem.InputActionRebindingExtensions).
+
+To better support specific joysticks devices, you can also [provide your own custom mappings for those devices](hid-create-custom-layout.md). For more information, refer to the [HID](hid-specification.md) documentation.
+
+## Controls
+
+The Input System supports generic HID Input devices which are recognized as joysticks via the [`Joystick`](xref:UnityEngine.InputSystem.Joystick) class. Joystick devices can have any number of controls as reported by the Device's HID descriptor.
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-keyboard.md b/Packages/com.unity.inputsystem/Documentation~/devices-keyboard.md
new file mode 100644
index 0000000000..ca6335cc88
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-keyboard.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-keyboard
+---
+# Keyboards
+
+Keyboard devices are those with a set of keys for input, represented by the `Keyboard` class. You can access keyboard input to capture text input, or query a keyboard for its layout.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Keyboard devices introduction](keyboards-introduction.md)** | Configure devices that use key controls. |
+| **[Query keyboard devices in code](query-keyboards.md)** | Access information about the keyboards connected to your application. |
+| **[Read text input](read-keyboard-text-input.md)** | Collect text input from keyboards.|
+
+## Additional resources
+
+- [Devices](devices.md)
+- [Actions](actions.md)
+- [Navigation input UI support](supported-ui-input-types-navigation.md)
+- [Responding to input](respond-to-input.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-mouse.md b/Packages/com.unity.inputsystem/Documentation~/devices-mouse.md
new file mode 100644
index 0000000000..0665655480
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-mouse.md
@@ -0,0 +1,20 @@
+---
+uid: input-system-mouse
+---
+
+# Mouse devices
+
+The Input System represents mouse input with the [`Mouse`](xref:UnityEngine.InputSystem.Mouse) device layout. Mice are based on the [pointer layout](devices-pointers.md).
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Mouse devices introduction](mouse-introduction.md)** | Configure mouse devices. |
+| **[Query and control mouse devices in code](query-mouse-devices.md)** | Access information about the mice connected to your application. |
+
+## Additional resources
+
+- [Pointer devices](devices-pointers.md)
+- [Use a Virtual Mouse for UI cursor control](virtual-mouse-ui-cursor-control.md)
+- [Pointer input UI support](supported-ui-input-types-pointer.md)
+- [Read devices directly](read-devices-directly.md)
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-overview.md b/Packages/com.unity.inputsystem/Documentation~/devices-overview.md
new file mode 100644
index 0000000000..794894cb42
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-overview.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-devices-types
+---
+
+# Types of input devices
+
+The Input package identifies and recognizes the following types of input devices:
+
+* [Pointers](devices-pointers.md): Devices which track positions in 2D space. This category has the following devices:
+ * [Mouse](devices-mouse.md)
+ * [Touch](devices-touch.md)
+ * [Pen](devices-pen.md)
+* [Keyboards](devices-keyboard.md): Devices with key input.
+* [Joysticks](devices-joysticks.md): Devices with at least one input stick and button.
+* [Gamepads](devices-gamepads.md): Devices with two thumbsticks, a D-pad, four face buttons, two shoulder buttons, and two trigger buttons. This category has the following devices:
+ * [PlayStation gamepads](gamepads-playstation.md)
+ * [Switch gamepads](gamepads-switch.md)
+ * [Xbox gamepads](gamepads-xbox.md)
+* [Sensors](devices-sensors.md): Devices which have sensors that measure environmental characteristics such as acceleration, or orientation.
+
+Additionally, the Input Package uses the [Human Interface Device (HID)](hid-specification.md) specification to create layouts for controls that connect via USB or Bluetooth connection.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-pen.md b/Packages/com.unity.inputsystem/Documentation~/devices-pen.md
new file mode 100644
index 0000000000..b2e217cc87
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-pen.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-pen
+---
+
+# Pen devices
+
+Unity supports pen input on tablets, desktop, and mobile devices. There are a range of controls you can use to access the pressure sensitivity and range detection of pens.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Pen devices introduction](pen-introduction.md)** | Understand how pen devices are represented in the Input System. |
+| **[Query pen devices in code](query-pen-devices.md)** | Use the `Pen` API to access information about the pens connected to your application. |
+
+## Additional resources
+
+- [Pointer devices](devices-pointers.md)
+- [Read input in Editor Windows](read-input-editor-windows.md)
+- [Devices](devices.md)
+- [Pointer input UI support](supported-ui-input-types-pointer.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-pointers.md b/Packages/com.unity.inputsystem/Documentation~/devices-pointers.md
new file mode 100644
index 0000000000..4ceb615d14
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-pointers.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-pointers
+---
+
+# Pointer devices
+
+Pointer devices track positions on a 2D surface. Supported pointer devices include mice, touch input, and pens.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Pointer devices introduction](pointers-introduction.md)** | Connect pointer devices to your application. |
+| **[Touch devices](devices-touch.md)** | Configure devices that track input on a touch screen. |
+| **[Mouse devices](devices-mouse.md)** | Query and control mouse devices.|
+| **[Pen devices](devices-pen.md)** | Query and control pen devices. |
+
+## Additional resources
+
+- [Devices](devices.md)
+- [Pointer input UI support](supported-ui-input-types-pointer.md)
+- [Use a Virtual Mouse for UI cursor control](virtual-mouse-ui-cursor-control.md)
+- [Input for user interfaces](ui-input.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-scripting.md b/Packages/com.unity.inputsystem/Documentation~/devices-scripting.md
new file mode 100644
index 0000000000..24ef6c8410
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-scripting.md
@@ -0,0 +1,28 @@
+---
+uid: input-system-devices-scripting
+---
+
+# Devices (scripting)
+
+This section explains how to work with [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) instances from script.
+
+If you only need to get a device reference and read control values, refer to [Read devices directly](read-devices-directly.md). For hardware support by platform, refer to [Supported devices reference](supported-devices-reference.md).
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Device descriptions](device-descriptions.md)** | Learn about `InputDeviceDescription` and how devices are reported when they are discovered. |
+| **[Device capabilities](device-capabilities.md)** | Learn about capability strings attached to device descriptions. |
+| **[Device matching](device-matching.md)** | Learn to match descriptions to layouts using `InputDeviceMatcher`. |
+| **[Device lifecycle](device-lifecycle.md)** | Learn to manage devices throughout their life. |
+| **[Native devices](native-devices.md)** | Learn how to tell native backend devices apart from devices you create from script, and supply layouts when hardware is discovered. |
+| **[Device IDs](device-ids.md)** | Learn about session-unique IDs. |
+| **[Device usages](device-usages.md)** | Learn to set and query device usages. |
+| **[Device commands](device-commands.md)** | Learn to send commands to devices. |
+| **[Device states](device-states.md)** | Monitor and synthesize a device state change. |
+| **[Working with devices](working-with-devices.md)** | Learn to monitor connected devices, and add or remove devices manually. |
+
+## Additional resources
+
+* [Devices](devices.md)
+* [Layouts](layouts.md)
+* [Architecture](Architecture.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-sensors.md b/Packages/com.unity.inputsystem/Documentation~/devices-sensors.md
new file mode 100644
index 0000000000..1363c71f29
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-sensors.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-sensors
+---
+# Sensors
+
+Sensors measure the environmental characteristics of the device that the application is running on. You can use the `Sensor` API to access information like a device's speed, orientation, or ambient temperature.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Sensors introduction](sensors-introduction.md)** | Configure sensors to get information about environmental characteristics of devices. |
+| **[Query sensors in code](query-sensors.md)** | Access information about the sensors connected to your application.|
+| **[Supported sensors reference](supported-sensors-reference.md)** | Explore the sensor types the Input System can access.|
+
+## Additional resources
+
+- [Devices](devices.md)
+- [Use mobile device input in the Editor (Unity Remote)](use-mobile-device-input-editor-unity-remote.md)
+- [Compensate orientation](compensate-orientation.md)
+- [Platform-specific settings](platform-specific-settings.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices-touch.md b/Packages/com.unity.inputsystem/Documentation~/devices-touch.md
new file mode 100644
index 0000000000..ef89ffe563
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices-touch.md
@@ -0,0 +1,22 @@
+---
+uid: input-system-touch
+---
+
+# Touch devices
+
+Touch devices capture input from touchscreens, and inherit from the `Pointer` class.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Touch devices introduction](touch-introduction.md)** | Configure devices that track touch input. |
+| **[Touch polling](touch-polling.md)** | Query touch devices on a frame-by-frame basis. |
+| **[Simulate touches](simulate-touch-input.md)** | Simulate touch input on other devices.|
+| **[Bind touch input to an action](bind-touch-input.md)** | Connect touch input to actions. |
+
+## Additional resources
+
+- [Pointer devices](devices-pointers.md)
+- [Create on-screen controls](on-screen-controls.md)
+- [Input for user interfaces](ui-input.md)
+- [Devices](devices.md)
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/devices.md b/Packages/com.unity.inputsystem/Documentation~/devices.md
new file mode 100644
index 0000000000..0f9765cc10
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/devices.md
@@ -0,0 +1,29 @@
+---
+uid: input-system-devices
+---
+
+# Devices
+
+You can configure and respond to a variety of input devices in the Actions Editor window, but each type of device has its own unique features that sometimes require special handling, such as touches on a touchscreen, or text input on a keyboard.
+
+Learn about supported input devices and their unique features in this section.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Types of input devices](devices-overview.md)**|Connect devices to your application.|
+| **[Pointer devices](devices-pointers.md)** | Configure devices that track input on a 2D surface, such as mice, or pens. |
+| **[Keyboards](devices-keyboard.md)** | Configure devices that use a set of key controls.|
+| **[Joysticks](devices-joysticks.md)** | Configure devices that have at least one input stick and one button. |
+| **[Gamepads](devices-gamepads.md)** | Configure devices that have a D-pad and four face buttons. |
+| **[Sensors](devices-sensors.md)** | Configure devices that measure environmental input. |
+| **[Human Interface Device specification](hid-specification.md)** | Use the Human Interface Device specification to implement peripheral user input devices connected to computers via USB or Bluetooth. |
+| **[Supported devices reference](supported-devices-reference.md)** | Explore platform support for each compatible device. |
+| **[Devices (scripting)](devices-scripting.md)** | Learn how to manage devices in code. |
+| **[Custom devices](custom-devices.md)** | Create events and custom devices. |
+
+## Additional resources
+
+- [Setting up input](setting-up-input.md)
+- [Responding to input](respond-to-input.md)
+- [Layouts](layouts.md)
+- [Debug a device](debug-device.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/display-bindings.md b/Packages/com.unity.inputsystem/Documentation~/display-bindings.md
new file mode 100644
index 0000000000..2fd2562f03
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/display-bindings.md
@@ -0,0 +1,69 @@
+---
+uid: input-system-display-bindings
+---
+
+# Display bindings
+
+It can be useful for the user to know what an Action is currently bound to (taking any potentially active rebindings into account) while rebinding UIs, and for on-screen hints while the app is running. You can use [`InputBinding.effectivePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_effectivePath) to get the currently active path for a Binding (which returns [`overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) if set, or otherwise returns [`path`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_path)).
+
+The easiest way to retrieve a display string for an action is to call [`InputActionRebindingExtensions.GetBindingDisplayString`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetBindingDisplayString_) which is an extension method for [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html).
+
+```CSharp
+ // Get a binding string for the action as a whole. This takes into account which
+ // bindings are currently active and the actual controls bound to the action.
+ m_RebindButton.GetComponentInChildren().text = action.GetBindingDisplayString();
+
+ // Get a binding string for a specific binding on an action by index.
+ m_RebindButton.GetComponentInChildren().text = action.GetBindingDisplayString(1);
+
+ // Look up binding indices with GetBindingIndex.
+ var bindingIndex = action.GetBindingIndex(InputBinding.MaskByGroup("Gamepad"));
+ m_RebindButton.GetComponentInChildren().text =
+ action.GetBindingDisplayString(bindingIndex);
+```
+
+You can also use this method to replace the text string with images.
+
+```CSharp
+ // Call GetBindingDisplayString() such that it also returns information about the
+ // name of the device layout and path of the control on the device. This information
+ // is useful for reliably associating imagery with individual controls.
+ // NOTE: The first argument is the index of the binding within InputAction.bindings.
+ var bindingString = action.GetBindingDisplayString(0, out deviceLayout, out controlPath);
+
+ // If it's a gamepad, look up an icon for the control.
+ Sprite icon = null;
+ if (!string.IsNullOrEmpty(deviceLayout)
+ && !string.IsNullOrEmpty(controlPath)
+ && InputSystem.IsFirstLayoutBasedOnSecond(deviceLayout, "Gamepad"))
+ {
+ switch (controlPath)
+ {
+ case "buttonSouth": icon = aButtonIcon; break;
+ case "dpad/up": icon = dpadUpIcon; break;
+ //...
+ }
+ }
+
+ // If you have an icon, display it instead of the text.
+ var text = m_RebindButton.GetComponentInChildren();
+ var image = m_RebindButton.GetComponentInChildren();
+ if (icon != null)
+ {
+ // Display icon.
+ text.gameObject.SetActive(false);
+ image.gameObject.SetActive(true);
+ image.sprite = icon;
+ }
+ else
+ {
+ // Display text.
+ text.gameObject.SetActive(true);
+ image.gameObject.SetActive(false);
+ text.text = bindingString;
+ }
+```
+
+Additionally, each Binding has a [`ToDisplayString`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_ToDisplayString_UnityEngine_InputSystem_InputBinding_DisplayStringOptions_UnityEngine_InputSystem_InputControl_) method, which you can use to turn individual Bindings into display strings. There is also a generic formatting method for Control paths, [`InputControlPath.ToHumanReadableString`](../api/UnityEngine.InputSystem.InputControlPath.html#UnityEngine_InputSystem_InputControlPath_ToHumanReadableString_System_String_UnityEngine_InputSystem_InputControlPath_HumanReadableStringOptions_UnityEngine_InputSystem_InputControl_), which you can use with arbitrary Control path strings.
+
+Note that the Controls a Binding resolves to can change at any time, and the display strings for controls might change dynamically. For example, if the user switches the currently active keyboard layout, the display string for each individual key on the [`Keyboard`](../api/UnityEngine.InputSystem.Keyboard.html) might change.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/doc_files.txt b/Packages/com.unity.inputsystem/Documentation~/doc_files.txt
new file mode 100644
index 0000000000..c5f3900358
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/doc_files.txt
@@ -0,0 +1,292 @@
+actions.md
+Architecture.md
+Contributing.md
+EditorFeatures.md
+Events.md
+HowDoI.md
+Installation.md
+Interactions.md
+KnownLimitations.md
+OnScreen.md
+PlayerInputManager.md
+processors.md
+Settings.md
+TableOfContents.md
+UserManagement.md
+about-action-assets.md
+about-action-control-types.md
+about-layouts.md
+about-player-input-component.md
+about-project-wide-actions.md
+about-responding-to-input.md
+about-user-management.md
+access-ui-input-module.md
+action-and-control-types.md
+action-assets.md
+action-properties-panel-reference.md
+action-type-reference.md
+actions-editor.md
+add-custom-device-command.md
+add-duplicate-delete-binding.md
+add-layout-from-cs.md
+add-layout-from-json.md
+add-layout-using-layout-builder.md
+add-processors-bindings-actions.md
+add-processors-controls.md
+api-overview.md
+apply-binding-overrides.md
+apply-interactions-actions.md
+apply-interactions-bindings.md
+assign-project-wide-actions.md
+assign-project-wide-asset.md
+background-behavior.md
+bind-touch-input.md
+binding-conflicts.md
+binding-initial-state-checks.md
+binding-properties-panel-reference.md
+binding-resolution.md
+binding-types.md
+bindings.md
+built-in-interactions.md
+built-in-processors.md
+compensate-orientation.md
+composite-bindings.md
+configure-action-type.md
+configure-actions.md
+configure-bindings-from-code.md
+configure-control-type.md
+configure-controls-from-code.md
+configure-input-directly-from-code.md
+configure-input-from-code.md
+configure-input-from-json.md
+configure-interactions-from-code.md
+configure-multiplayer-ui-input.md
+configure-player-input-manager-component.md
+configure-processors-from-code.md
+configure-ui-input-action-map.md
+configure-unity-events.md
+configure-virtual-mouse-input.md
+control-actuation.md
+control-hierarchies.md
+control-items.md
+control-paths.md
+control-schemes-devices-menu-reference.md
+control-schemes-devices-menu.md
+control-schemes.md
+control-state.md
+control-types-reference.md
+control-usages.md
+controls.md
+corresponding-old-new-api.md
+create-actions-in-code.md
+create-custom-composite-binding.md
+create-custom-device.md
+create-custom-on-screen-control.md
+create-device.md
+create-edit-delete-action-maps.md
+create-edit-delete-actions.md
+create-empty-action-asset.md
+create-events.md
+create-on-screen-button-control.md
+create-on-screen-stick-control.md
+create-precompiled-layout.md
+create-project-wide-actions.md
+create-settings-asset.md
+create-user-paired-with-input-device.md
+custom-devices.md
+debug-action.md
+debug-device.md
+debug-layouts.md
+debug-player-input-component.md
+debug-users-playerinput.md
+debugging.md
+declare-standalone-actions.md
+default-actions.md
+default-interactions.md
+default-value-properties.md
+derive-new-layout-from-existing-layout.md
+detect-current-input-system.md
+device-assignments.md
+device-background-focus-changes.md
+device-capabilities.md
+device-commands.md
+device-descriptions.md
+device-ids.md
+device-lifecycle.md
+device-matching.md
+device-simulation.md
+device-states.md
+device-usages.md
+devices-(Old Content).md
+devices-domain-reloads.md
+devices-gamepads.md
+devices-joysticks.md
+devices-keyboard.md
+devices-mouse.md
+devices-overview.md
+devices-pen.md
+devices-pointers.md
+devices-scripting.md
+devices-sensors.md
+devices-touch.md
+devices.md
+display-bindings.md
+edit-composite-bindings.md
+editor-features.md
+editor-ui.md
+enable-actions.md
+enable-correct-input-system.md
+enable-disable-devices.md
+erase-bindings.md
+event-merging.md
+event-processing.md
+filter-noise-on-current.md
+gamepad-haptics.md
+gamepad-polling.md
+gamepads-introduction.md
+gamepads-playstation.md
+gamepads-switch.md
+gamepads-xbox.md
+generate-cs-api-from-actions.md
+get-information-about-devices.md
+get-started-player-input-component.md
+get-started-player-input-mananger-component.md
+group-binding-to-control-scheme.md
+handle-loss-of-device.md
+handling-input-target-ambiguity.md
+hid-create-custom-layout-class.md
+hid-create-custom-layout-existing.md
+hid-create-custom-layout.md
+hid-specification-introduction.md
+hid-specification.md
+include-interactions-reference.md
+include-processors-reference.md
+index.md
+input-actions-editor-window-reference.md
+input-events.md
+input-settings.md
+interactive-rebinding.md
+introduction-interactions.md
+introduction-multiplayer-ui-input.md
+introduction-on-screen-controls.md
+introduction-to-bindings.md
+introduction-to-controls.md
+introduction-to-processors.md
+introduction-ui-input-module.md
+introduction-virtual-mouse.md
+keyboards-introduction.md
+layout-formats.md
+layout-inheritance.md
+layouts.md
+listen-to-events.md
+local-multiplayer-scenarios.md
+look-up-bindings.md
+manually-add-remove-devices.md
+migrate-from-old-input-system.md
+monitor-device-state-changes.md
+monitor-devices.md
+mouse-introduction.md
+multiplayer-event-system-component-input.md
+multiplayer-ui-input.md
+native-devices.md
+noisy-controls.md
+on-screen-controls.md
+optimize-controls.md
+override-layout-definitions.md
+pen-introduction.md
+platform-specific-settings.md
+player-input-component.md
+player-input-manager-component.md
+pointers-introduction.md
+polling-actions.md
+precompiled-layouts.md
+predefined-interactions.md
+query-gamepads.md
+query-keyboards.md
+query-mouse-devices.md
+query-pen-devices.md
+query-sensors.md
+quick-start-guide.md
+read-all-touches.md
+read-devices-directly.md
+read-input-editor-windows.md
+read-keyboard-text-input.md
+read-state-events.md
+rebind-action-runtime.md
+record-control-state-history.md
+record-events.md
+remove-device.md
+reset-device.md
+respond-to-input.md
+restore-original-bindings.md
+restrict-binding-resolution-to-device.md
+save-load-rebinds.md
+see-record-input-event-flow.md
+select-control-binding.md
+select-notification-behavior.md
+send-command-to-device.md
+sensors-introduction.md
+set-callbacks-on-actions.md
+set-up-player-input-component-local-multiplayer.md
+set-up-split-screen-local-multiplayer.md
+set-up-test-assemblies.md
+set-up-test-fixtures.md
+setting-up-input.md
+simulate-input-on-device.md
+simulate-touch-input.md
+step-1-state-struct.md
+step-2-device-class.md
+step-3-update-method.md
+step-4-device-registration-creation.md
+step-5-current-all-optional.md
+step-6-device-commands-optional.md
+supported-devices-reference.md
+supported-devices.md
+supported-sensors-reference.md
+supported-ui-input-types-navigation.md
+supported-ui-input-types-pointer.md
+supported-ui-input-types-tracked.md
+supported-ui-input-types.md
+supported-ui-systems.md
+sync-device.md
+synthesize-device-state-change.md
+synthetic-controls.md
+testing.md
+the-input-debugger-window.md
+timing-and-latency.md
+timing-input-events-queue.md
+timing-missed-duplicate-events.md
+timing-mixed-scenarios.md
+timing-optimize-dynamic-update.md
+timing-optimize-fixed-update.md
+timing-select-mode.md
+touch-introduction.md
+touch-polling.md
+touch-support.md
+trace-actions.md
+types-of-events.md
+ui-action-map-reference.md
+ui-input-module-reference.md
+ui-input.md
+understand-ui-compatibility.md
+understanding-input.md
+update-mode.md
+use-imgui-alongside-input-system.md
+use-mobile-device-input-editor-unity-remote.md
+use-player-input-component-ui.md
+user-management.md
+user-rebinding-runtime.md
+using-actions-workflow.md
+using-direct-workflow.md
+using-playerinput-workflow.md
+using-ui-input-module.md
+virtual-mouse-component-reference.md
+virtual-mouse-ui-cursor-control.md
+visualise-actions.md
+visualise-input-controls.md
+visualizers.md
+workflows.md
+working-with-devices.md
+write-custom-interactions.md
+write-custom-processors.md
+write-tests.md
diff --git a/Packages/com.unity.inputsystem/Documentation~/doc_lower.txt b/Packages/com.unity.inputsystem/Documentation~/doc_lower.txt
new file mode 100644
index 0000000000..470af8bcaf
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/doc_lower.txt
@@ -0,0 +1,293 @@
+actions.md
+architecture.md
+contributing.md
+editorfeatures.md
+events.md
+howdoi.md
+installation.md
+interactions.md
+knownlimitations.md
+onscreen.md
+playerinputmanager.md
+processors.md
+respondingtoactions.md
+settings.md
+tableofcontents.md
+usermanagement.md
+about-action-assets.md
+about-action-control-types.md
+about-layouts.md
+about-player-input-component.md
+about-project-wide-actions.md
+about-responding-to-input.md
+about-user-management.md
+access-ui-input-module.md
+action-and-control-types.md
+action-assets.md
+action-properties-panel-reference.md
+action-type-reference.md
+actions-editor.md
+add-custom-device-command.md
+add-duplicate-delete-binding.md
+add-layout-from-cs.md
+add-layout-from-json.md
+add-layout-using-layout-builder.md
+add-processors-bindings-actions.md
+add-processors-controls.md
+api-overview.md
+apply-binding-overrides.md
+apply-interactions-actions.md
+apply-interactions-bindings.md
+assign-project-wide-actions.md
+assign-project-wide-asset.md
+background-behavior.md
+bind-touch-input.md
+binding-conflicts.md
+binding-initial-state-checks.md
+binding-properties-panel-reference.md
+binding-resolution.md
+binding-types.md
+bindings.md
+built-in-interactions.md
+built-in-processors.md
+compensate-orientation.md
+composite-bindings.md
+configure-action-type.md
+configure-actions.md
+configure-bindings-from-code.md
+configure-control-type.md
+configure-controls-from-code.md
+configure-input-directly-from-code.md
+configure-input-from-code.md
+configure-input-from-json.md
+configure-interactions-from-code.md
+configure-multiplayer-ui-input.md
+configure-player-input-manager-component.md
+configure-processors-from-code.md
+configure-ui-input-action-map.md
+configure-unity-events.md
+configure-virtual-mouse-input.md
+control-actuation.md
+control-hierarchies.md
+control-items.md
+control-paths.md
+control-schemes-devices-menu-reference.md
+control-schemes-devices-menu.md
+control-schemes.md
+control-state.md
+control-types-reference.md
+control-usages.md
+controls.md
+corresponding-old-new-api.md
+create-actions-in-code.md
+create-custom-composite-binding.md
+create-custom-device.md
+create-custom-on-screen-control.md
+create-device.md
+create-edit-delete-action-maps.md
+create-edit-delete-actions.md
+create-empty-action-asset.md
+create-events.md
+create-on-screen-button-control.md
+create-on-screen-stick-control.md
+create-precompiled-layout.md
+create-project-wide-actions.md
+create-settings-asset.md
+create-user-paired-with-input-device.md
+custom-devices.md
+debug-action.md
+debug-device.md
+debug-layouts.md
+debug-player-input-component.md
+debug-users-playerinput.md
+debugging.md
+declare-standalone-actions.md
+default-actions.md
+default-interactions.md
+default-value-properties.md
+derive-new-layout-from-existing-layout.md
+detect-current-input-system.md
+device-assignments.md
+device-background-focus-changes.md
+device-capabilities.md
+device-commands.md
+device-descriptions.md
+device-ids.md
+device-lifecycle.md
+device-matching.md
+device-simulation.md
+device-states.md
+device-usages.md
+devices-(old content).md
+devices-domain-reloads.md
+devices-gamepads.md
+devices-joysticks.md
+devices-keyboard.md
+devices-mouse.md
+devices-overview.md
+devices-pen.md
+devices-pointers.md
+devices-scripting.md
+devices-sensors.md
+devices-touch.md
+devices.md
+display-bindings.md
+edit-composite-bindings.md
+editor-features.md
+editor-ui.md
+enable-actions.md
+enable-correct-input-system.md
+enable-disable-devices.md
+erase-bindings.md
+event-merging.md
+event-processing.md
+filter-noise-on-current.md
+gamepad-haptics.md
+gamepad-polling.md
+gamepads-introduction.md
+gamepads-playstation.md
+gamepads-switch.md
+gamepads-xbox.md
+generate-cs-api-from-actions.md
+get-information-about-devices.md
+get-started-player-input-component.md
+get-started-player-input-mananger-component.md
+group-binding-to-control-scheme.md
+handle-loss-of-device.md
+handling-input-target-ambiguity.md
+hid-create-custom-layout-class.md
+hid-create-custom-layout-existing.md
+hid-create-custom-layout.md
+hid-specification-introduction.md
+hid-specification.md
+include-interactions-reference.md
+include-processors-reference.md
+index.md
+input-actions-editor-window-reference.md
+input-events.md
+input-settings.md
+interactive-rebinding.md
+introduction-interactions.md
+introduction-multiplayer-ui-input.md
+introduction-on-screen-controls.md
+introduction-to-bindings.md
+introduction-to-controls.md
+introduction-to-processors.md
+introduction-ui-input-module.md
+introduction-virtual-mouse.md
+keyboards-introduction.md
+layout-formats.md
+layout-inheritance.md
+layouts.md
+listen-to-events.md
+local-multiplayer-scenarios.md
+look-up-bindings.md
+manually-add-remove-devices.md
+migrate-from-old-input-system.md
+monitor-device-state-changes.md
+monitor-devices.md
+mouse-introduction.md
+multiplayer-event-system-component-input.md
+multiplayer-ui-input.md
+native-devices.md
+noisy-controls.md
+on-screen-controls.md
+optimize-controls.md
+override-layout-definitions.md
+pen-introduction.md
+platform-specific-settings.md
+player-input-component.md
+player-input-manager-component.md
+pointers-introduction.md
+polling-actions.md
+precompiled-layouts.md
+predefined-interactions.md
+query-gamepads.md
+query-keyboards.md
+query-mouse-devices.md
+query-pen-devices.md
+query-sensors.md
+quick-start-guide.md
+read-all-touches.md
+read-devices-directly.md
+read-input-editor-windows.md
+read-keyboard-text-input.md
+read-state-events.md
+rebind-action-runtime.md
+record-control-state-history.md
+record-events.md
+remove-device.md
+reset-device.md
+respond-to-input.md
+restore-original-bindings.md
+restrict-binding-resolution-to-device.md
+save-load-rebinds.md
+see-record-input-event-flow.md
+select-control-binding.md
+select-notification-behavior.md
+send-command-to-device.md
+sensors-introduction.md
+set-callbacks-on-actions.md
+set-up-player-input-component-local-multiplayer.md
+set-up-split-screen-local-multiplayer.md
+set-up-test-assemblies.md
+set-up-test-fixtures.md
+setting-up-input.md
+simulate-input-on-device.md
+simulate-touch-input.md
+step-1-state-struct.md
+step-2-device-class.md
+step-3-update-method.md
+step-4-device-registration-creation.md
+step-5-current-all-optional.md
+step-6-device-commands-optional.md
+supported-devices-reference.md
+supported-devices.md
+supported-sensors-reference.md
+supported-ui-input-types-navigation.md
+supported-ui-input-types-pointer.md
+supported-ui-input-types-tracked.md
+supported-ui-input-types.md
+supported-ui-systems.md
+sync-device.md
+synthesize-device-state-change.md
+synthetic-controls.md
+testing.md
+the-input-debugger-window.md
+timing-and-latency.md
+timing-input-events-queue.md
+timing-missed-duplicate-events.md
+timing-mixed-scenarios.md
+timing-optimize-dynamic-update.md
+timing-optimize-fixed-update.md
+timing-select-mode.md
+touch-introduction.md
+touch-polling.md
+touch-support.md
+trace-actions.md
+types-of-events.md
+ui-action-map-reference.md
+ui-input-module-reference.md
+ui-input.md
+understand-ui-compatibility.md
+understanding-input.md
+update-mode.md
+use-imgui-alongside-input-system.md
+use-mobile-device-input-editor-unity-remote.md
+use-player-input-component-ui.md
+user-management.md
+user-rebinding-runtime.md
+using-actions-workflow.md
+using-direct-workflow.md
+using-playerinput-workflow.md
+using-ui-input-module.md
+virtual-mouse-component-reference.md
+virtual-mouse-ui-cursor-control.md
+visualise-actions.md
+visualise-input-controls.md
+visualizers.md
+workflows.md
+working-with-devices.md
+write-custom-interactions.md
+write-custom-processors.md
+write-tests.md
diff --git a/Packages/com.unity.inputsystem/Documentation~/edit-composite-bindings.md b/Packages/com.unity.inputsystem/Documentation~/edit-composite-bindings.md
new file mode 100644
index 0000000000..85d364db85
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/edit-composite-bindings.md
@@ -0,0 +1,45 @@
+---
+uid: input-system-edit-composite-bindings
+---
+
+# Edit composite bindings
+
+You can add, edit, and delete [composite bindings](composite-bindings.md) in the [Actions Editor window](actions-editor.md).
+
+When you [add a composite binding](./add-duplicate-delete-binding.md), the Input System creates a set of individual sub-bindings, or **parts** to match the type of composite. For example, a 2D Vector composite has four parts, up, down, left and right. These are visible in the hierarchy of the selected action in the Actions panel. Each part is a **simple binding** as described in [binding types](./binding-types.md).
+
+A new composite binding's parts are initially unassigned, and display "No Binding" in the actions panel.
+
+## Assign bindings to each part of the composite
+
+To assign bindings to each part of the composite:
+
+1. In the Actions panel, select the Action whose composite binding you want to edit.
+2. Expand the Action's hierarchy as necessary to display the composite binding and its parts.
+3. Select the part you want to configure
+4. In the Binding Properties panel, [select a control for this part](./select-control-binding.md) using the Path field.
+
+## Change a composite's type
+
+A composite binding's type controls the selection of parts it has, and what value it outputs. To change a composite's type:
+
+1. In the Actions panel, select the Action whose type you want to change.
+2. Expand the Action's hierarchy as necessary to display the composite binding.
+3. Select the composite binding.
+4. In the Binding Properties panel, select a new **Composite Type**.
+
+Changing a composite binding's type will change which parts it has, and any configurations on parts that are removed are lost.
+
+## Add or remove extra parts of the composite
+
+You can assign multiple Bindings to the same part, and duplicate, cut, copy and paste individual part bindings. To do this:
+
+1. In the Actions panel, select the Action whose composite binding you want to edit.
+2. Expand the Action's hierarchy as necessary to display the composite binding and its parts.
+3. Select the part you want to duplicate or remove
+4. Right-click the part, and select Duplicate, Delete, Copy, Cut, or Paste
+
+By duplicating bindings and then editing the new duplicates, you can bind multiple contrls to the same composite part. For example, to create a single 2D composite which receives input from the WSAD keys and the arrow keys on a keyboard.
+
+
+*A composite 2D vector binding with duplicated parts, allowing multiple keyboard keys to activate the same part of the composite.*
diff --git a/Packages/com.unity.inputsystem/Documentation~/editor-ui.md b/Packages/com.unity.inputsystem/Documentation~/editor-ui.md
new file mode 100644
index 0000000000..6b34c7f96e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/editor-ui.md
@@ -0,0 +1 @@
+# Editor UI
diff --git a/Packages/com.unity.inputsystem/Documentation~/enable-actions.md b/Packages/com.unity.inputsystem/Documentation~/enable-actions.md
new file mode 100644
index 0000000000..68656a0ce3
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/enable-actions.md
@@ -0,0 +1,37 @@
+---
+uid: input-system-enable-actions
+---
+
+# Enabling actions
+
+Actions have an **enabled** state, meaning you can enable or disable them to suit different situations.
+
+## Project-wide actions
+
+If you are using the recommended [project-wide actions](./about-project-wide-actions.md) workflow, those actions are enabled automatically as your project starts. You do not need to enable them.
+
+## Other actions
+
+For actions defined elsewhere, such as in an action asset not assigned as project-wide, or defined your own code, those actions begin in a disabled state, and you must enable them before you can use them to respond to input.
+
+You can enable actions individually, or as a group by enabling the Action Map which contains them.
+
+```CSharp
+// Enable a single action.
+lookAction.Enable();
+
+// Enable an en entire action map.
+gameplayActions.Enable();
+```
+
+## Behaviour when enabled
+
+When an action is enabled, the Input System resolves its bindings, unless it has done so already, or if the set of devices that the action can use has not changed. For more details about this process, see the documentation on [binding resolution](binding-resolution.md).
+
+You can't change certain aspects of the configuration, such as an action's bindings, while an action is enabled. To stop actions or action maps from responding to input, call [`Disable`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_Disable).
+
+While enabled, the action actively monitors the [control(s)](controls.md) it is bound to. If a bound control changes state, the action processes the change. If the control's change represents an [interaction](Interactions.md) change, the action creates a response. All of this happens during the Input System update logic. Depending on the [update mode](update-mode.md) selected in the input settings, this happens once every frame, once every fixed update, or manually if the update mode setting is set to manual.
+
+
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/enable-correct-input-system.md b/Packages/com.unity.inputsystem/Documentation~/enable-correct-input-system.md
new file mode 100644
index 0000000000..de48486791
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/enable-correct-input-system.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-enable-correct-input-system
+---
+
+# Enable the correct input system
+
+When installing the new Input System, Unity prompts you to enable the new input system and disable the old one. You can change this setting at any time later, by going to **Edit > Project Settings > Player > Other Settings > Active Input Handling**, [as described here](./Installation.md#enabling-the-new-input-backends).
+
+There are scripting symbols defined which allow you to use conditional compilation based on which system is enabled, as shown in the example below.
+
+```CSharp
+#if ENABLE_INPUT_SYSTEM
+ // New input system backends are enabled.
+#endif
+
+#if ENABLE_LEGACY_INPUT_MANAGER
+ // Old input backends are enabled.
+#endif
+```
+
+> **Note:** It is possible to have both systems enabled at the same time, in which case both sets of code in the example above above will be active.
diff --git a/Packages/com.unity.inputsystem/Documentation~/enable-disable-devices.md b/Packages/com.unity.inputsystem/Documentation~/enable-disable-devices.md
new file mode 100644
index 0000000000..4df8e4c2f4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/enable-disable-devices.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-enable-disable-devices
+---
+
+# Enable and disable devices
+
+When a Device is added, the Input System sends it an initial [`QueryEnabledStateCommand`](../api/UnityEngine.InputSystem.LowLevel.QueryEnabledStateCommand.html) to find out whether the device is currently enabled or not. The result of this is reflected in the [`InputDevice.enabled`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_enabled) property.
+
+When disabled, no events other than removal ([`DeviceRemoveEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceRemoveEvent.html)) and configuration change ([`DeviceConfigurationEvent`](../api/UnityEngine.InputSystem.LowLevel.DeviceConfigurationEvent.html)) events are processed for a Device, even if they are sent.
+
+A Device can be manually disabled and re-enabled via [`InputSystem.DisableDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_DisableDevice_) and [`InputSystem.EnableDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_EnableDevice_) respectively.
+
+Note that [sensors](devices-sensors.md) start in a disabled state by default, and you need to enable them in order for them to generate events.
+
+The Input System may automatically disable and re-enable Devices in certain situations, as detailed in the [next section](#background-and-focus-change-behavior).
diff --git a/Packages/com.unity.inputsystem/Documentation~/erase-bindings.md b/Packages/com.unity.inputsystem/Documentation~/erase-bindings.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Packages/com.unity.inputsystem/Documentation~/event-merging.md b/Packages/com.unity.inputsystem/Documentation~/event-merging.md
new file mode 100644
index 0000000000..4caaa6221e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/event-merging.md
@@ -0,0 +1,45 @@
+---
+uid: input-system-event-merging
+---
+
+# Event merging
+
+Input system uses event mering to reduce amount of events required to be processed.
+This greatly improves performance when working with high refresh rate devices like 8000 Hz mice, touchscreens and others.
+
+For example let's take a stream of 7 mouse events coming in the same update:
+
+```
+
+Mouse Mouse Mouse Mouse Mouse Mouse Mouse
+Event no1 Event no2 Event no3 Event no4 Event no5 Event no6 Event no7
+Time 1 Time 2 Time 3 Time 4 Time 5 Time 6 Time 7
+Pos(10,20) Pos(12,21) Pos(13,23) Pos(14,24) Pos(16,25) Pos(17,27) Pos(18,28)
+Delta(1,1) Delta(2,1) Delta(1,2) Delta(1,1) Delta(2,1) Delta(1,2) Delta(1,1)
+BtnLeft(0) BtnLeft(0) BtnLeft(0) BtnLeft(1) BtnLeft(1) BtnLeft(1) BtnLeft(1)
+```
+
+To reduce workload we can skip events that are not encoding button state changes:
+
+```
+ Mouse Mouse Mouse
+ Time 3 Time 4 Time 7
+ Event no3 Event no4 Event no7
+ Pos(13,23) Pos(14,24) Pos(18,28)
+ Delta(3,3) Delta(1,1) Delta(4,4)
+ BtnLeft(0) BtnLeft(1) BtnLeft(1)
+```
+
+In that case we combine no1, no2, no3 together into no3 and accumulate the delta,
+then we keep no4 because it stores the transition from button unpressed to button pressed,
+and it's important to keep the exact timestamp of such transition.
+Later we combine no5, no6, no7 together into no7 because it is the last event in the update.
+
+Currently this approach is implemented for:
+- `FastMouse`, combines events unless `buttons` or `clickCount` differ in `MouseState`.
+- `Touchscreen`, combines events unless `touchId`, `phaseId` or `flags` differ in `TouchState`.
+
+You can disable merging of events by:
+```
+InputSystem.settings.disableRedundantEventsMerging = true;
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/event-processing.md b/Packages/com.unity.inputsystem/Documentation~/event-processing.md
new file mode 100644
index 0000000000..95d5fc8061
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/event-processing.md
@@ -0,0 +1,23 @@
+---
+uid: input-system-event-processing
+---
+
+# Event processing
+
+[Events](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) are collected on a queue by the Unity runtime. This queue is regularly flushed out and the events on it processed. Events can be added to the queue manually by calling [`InputSystem.QueueEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_QueueEvent_UnityEngine_InputSystem_LowLevel_InputEventPtr_).
+
+Each time input is processed, [`InputSystem.Update`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_) is called implicitly by the Unity runtime.
+
+The interval at which this happens is determined by the ["Update Mode"](update-mode.md) configured in the settings. By default, input is processed in each frame __before__ MonoBehaviour.Update methods are called. If the setting is changed to process input in fixed updates, then this changes to input being processed each time before MonoBehaviour.FixedUpdate methods are called.
+
+Normally, when input is processed, __all__ outstanding input events on the queue will be consumed. There are two exceptions to this, however.
+
+When using [`UpdateMode.ProcessEventsInFixedUpdate`](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html#UnityEngine_InputSystem_InputSettings_UpdateMode_ProcessEventsInFixedUpdate), the Input System attempts to associate events with the timeslice of the corresponding FixedUpdate . This is based on the [timestamps](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_time) of the events and a "best effort" at calculating the corresponding timeslice of the current FixedUpdated .
+
+The other exception are [`BeforeRender`](../api/UnityEngine.InputSystem.LowLevel.InputUpdateType.html#UnityEngine_InputSystem_LowLevel_InputUpdateType_BeforeRender) updates. These updates are run after fixed or dynamic updates but before rendering and used used exclusively to update devices such as VR headsets that need the most up-to-date tracking data. Other input is not consumed from such updates and these updates are only enabled if such devices are actually present. `BeforeRender` updates are not considered separate frames as far as input is concerned.
+
+>__Note__: Manually calling [`InputSystem.Update`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_Update_) is strongly advised against except within tests employing [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) or when explicitly setting the system to [manual update mode](../api/UnityEngine.InputSystem.InputSettings.UpdateMode.html#UnityEngine_InputSystem_InputSettings_UpdateMode_ProcessEventsManually).
+
+Methods such as [`InputAction.WasPerformedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPerformedThisFrame) and [`InputAction.WasPerformedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPerformedThisFrame) operate implicitly based on the [`InputSystem.Update`] cadence described above. Meaning, that they refer to the state as per the __last__ fixed/dynamic/manual update happened.
+
+You can query the [current/last update type](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_currentUpdateType) and [count](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_updateCount) from [`InputState`](../api/UnityEngine.InputSystem.LowLevel.InputState.html).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/gamepad-haptics.md b/Packages/com.unity.inputsystem/Documentation~/gamepad-haptics.md
new file mode 100644
index 0000000000..f46edf5b22
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/gamepad-haptics.md
@@ -0,0 +1,44 @@
+---
+uid: input-system-gamepad-haptics
+---
+
+# Gamepad haptics
+
+The [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) class implements the [`IDualMotorRumble`](xref:UnityEngine.InputSystem.Haptics.IDualMotorRumble) interface that allows you to control the left and right motor speeds. In most common gamepads, the left motor emits a low-frequency rumble, and the right motor emits a high-frequency rumble.
+
+```c#
+
+// Rumble the low-frequency (left) motor at 1/4 speed and the high-frequency
+// (right) motor at 3/4 speed.
+Gamepad.current.SetMotorSpeeds(0.25f, 0.75f);
+
+```
+
+Only the following platforms support rumble:
+
+* PlayStation, Xbox, and Switch controllers on their respective consoles.
+* PlayStation controllers on macOS, Windows or Universal Windows Platform.
+* Xbox controllers on Windows.
+
+## Pausing, resuming, and stopping haptics
+
+[`IDualMotorRumble`](xref:UnityEngine.InputSystem.Haptics.IDualMotorRumble) is based on [`IHaptics`](xref:UnityEngine.InputSystem.Haptics.IHaptics), which is the base interface for any haptics support on any device. You can pause, resume, and reset haptic feedback using the [`PauseHaptics`](xref:UnityEngine.InputSystem.Haptics.IHaptics.PauseHaptics), [`ResumeHaptics`](xref:UnityEngine.InputSystem.Haptics.IHaptics.ResumeHaptics), and [`ResetHaptics`](xref:UnityEngine.InputSystem.Haptics.IHaptics.ResetHaptics) methods respectively.
+
+In certain situations, you might want to globally pause or stop haptics for all devices. For example, if the player enters an in-game menu, you can pause haptics while the player is in the menu, and then resume haptics once the player resumes the game.
+
+You can use the corresponding methods on [`InputSystem`](xref:UnityEngine.InputSystem.InputSystem) to achieve this result. These methods work the same way as device-specific methods, but affect all devices:
+
+```c#
+
+// Pause haptics globally.
+InputSystem.PauseHaptics();
+
+// Resume haptics globally.
+InputSystem.ResumeHaptics();
+
+// Stop haptics globally.
+InputSystem.ResetHaptics();
+
+```
+
+The difference between `PauseHaptics` and `ResetHaptics` is that the latter resets haptics playback state on each device to its initial state, whereas `PauseHaptics` preserves playback state in memory and only stops playback on the hardware.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/gamepad-polling.md b/Packages/com.unity.inputsystem/Documentation~/gamepad-polling.md
new file mode 100644
index 0000000000..1d12fc0cdb
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/gamepad-polling.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-polling-gamepad
+---
+
+# Gamepad polling
+
+You can control polling frequency manually. The default polling frequency is 60 Hz. Use [`InputSystem.pollingFrequency`](xref:UnityEngine.InputSystem.InputSystem.pollingFrequency) to get or set the frequency.
+
+```c#
+
+// Poll gamepads at 120 Hz.
+InputSystem.pollingFrequency = 120;
+
+```
+
+Increased frequency should lead to an increased number of events on the respective devices. The timestamps provided on the events should follow the spacing dictated by the polling frequency. The asynchronous background polling depends on the operating system's thread scheduling and can vary.
+
+>[!NOTE]
+>On Windows (XInput controllers only), Universal Windows Platform (UWP), and Switch, Unity polls gamepads explicitly rather than deliver updates as events.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/gamepads-introduction.md b/Packages/com.unity.inputsystem/Documentation~/gamepads-introduction.md
new file mode 100644
index 0000000000..4e0eee8349
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/gamepads-introduction.md
@@ -0,0 +1,22 @@
+---
+uid: input-system-gamepads-intro
+---
+
+# Gamepads introduction
+
+In the Input System, a **gamepad** is a controller that matches the [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) layout: two thumbsticks, a D-pad, four face buttons, shoulder and trigger buttons, and usually two center buttons. Use [Gamepads](devices-gamepads.md) to browse related setup and reference topics in this manual.
+
+A gamepad can expose extra controls (for example a gyroscope). Every recognized gamepad still implements at least the controls defined on the [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) type.
+
+The Input System also provides device-specific APIs for:
+
+* PlayStation DualShock and DualSense hardware in the [`DualShock`](xref:UnityEngine.InputSystem.DualShock) namespace.
+* Xbox controllers that use XInput in the [`XInput`](xref:UnityEngine.InputSystem.XInput) namespace.
+* Nintendo Switch Pro controllers in the [`Switch`](xref:UnityEngine.InputSystem.Switch) namespace.
+
+For platform availability, refer to [Supported devices reference](supported-devices-reference.md).
+
+When the Input System recognizes a device as a [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad), control placement stays consistent across platforms and hardware. For example, a PlayStation 4 DualShock maps to the same logical layout whether it is connected on Windows or macOS, and the south face button is always the bottom button in the diamond.
+
+> [!IMPORTANT]
+> Generic [HID](hid-specification.md) gamepads are not surfaced as [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) instances; they appear as generic [joysticks](devices-joysticks.md). The Input System cannot rely on HID descriptors alone to map every axis and button correctly. Only HID devices that ship with explicit [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) support (for example the PlayStation 4 controller) use the gamepad layout. To add comparable support for another HID controller, refer to [Create a custom device layout](hid-create-custom-layout.md).
diff --git a/Packages/com.unity.inputsystem/Documentation~/gamepads-playstation.md b/Packages/com.unity.inputsystem/Documentation~/gamepads-playstation.md
new file mode 100644
index 0000000000..3734999e60
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/gamepads-playstation.md
@@ -0,0 +1,23 @@
+---
+uid: input-system-playstation-gamepads
+---
+
+# PlayStation gamepads
+
+The Input System implements PlayStation gamepads as different derived types of the [`DualShockGamepad`](xref:UnityEngine.InputSystem.DualShock.DualShockGamepad) base class, which derives from [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad):
+
+* [`DualShock3GamepadHID`](xref:UnityEngine.InputSystem.DualShock.DualShock3GamepadHID): A DualShock 3 controller connected to a desktop computer using the [HID interface](hid-specification-introduction.md). Currently only supported on macOS. Doesn't support [rumble](gamepad-haptics.md).
+* [`DualShock4GamepadHID`](xref:UnityEngine.InputSystem.DualShock.DualShock4GamepadHID): A DualShock 4 controller connected to a desktop computer using the [HID interface](hid-specification-introduction.md). Supported on macOS, Windows, UWP, and Linux.
+* [`DualSenseGamepadHID`](xref:UnityEngine.InputSystem.DualShock.DualSenseGamepadHID): A DualSense controller connected to a desktop computer using the [HID interface](hid-specification-introduction.md). Supported on macOS, Windows.
+* [`DualShock4GampadiOS`](xref:UnityEngine.InputSystem.iOS.DualShock4GampadiOS): A DualShock 4 controller connected to an iOS Device via Bluetooth. Requires iOS 13 or higher.
+* [`SetLightBarColor(Color)`](xref:UnityEngine.InputSystem.DualShock.DualShockGamepad.SetLightBarColor(UnityEngine.Color)): Used to set the color of the light bar on the controller.
+
+Unity supports PlayStation controllers on WebGL in some browser and OS configurations, but treats them as basic [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) or [`Joystick`](xref:UnityEngine.InputSystem.Joystick) devices, and doesn't support rumble or any other DualShock-specific functionality.
+
+Unity doesn't support connecting a PlayStation controller to a desktop machine using the DualShock 4 USB wireless adaptor. Use USB or Bluetooth to connect it. For more information on platform support for PlayStation gamepads, refer to [Supported devices reference](supported-devices-reference.md).
+
+## Input output control commands
+
+Because of limitations in the USB driver and the hardware, the Input System can only service one IOCTL (input/output control) command at a time. [`SetLightBarColor(Color)`](xref:UnityEngine.InputSystem.DualShock.DualShockGamepad.SetLightBarColor(UnityEngine.Color)) and [`SetMotorSpeeds(Single, Single)`](xref:UnityEngine.InputSystem.Gamepad.SetMotorSpeeds(System.Single,System.Single)) functionality on Dualshock 4 is implemented using IOCTL commands, so if either method is called in quick succession, it's likely that only the first command will successfully complete. The other commands are dropped.
+
+If you need to set both lightbar color and rumble motor speeds at the same time, use the [`SetMotorSpeedsAndLightBarColor(Single, Single, Color)`](xref:UnityEngine.InputSystem.DualShock.DualShock4GamepadHID.SetMotorSpeedsAndLightBarColor(System.Single,System.Single,UnityEngine.Color)) method.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/gamepads-switch.md b/Packages/com.unity.inputsystem/Documentation~/gamepads-switch.md
new file mode 100644
index 0000000000..38da334415
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/gamepads-switch.md
@@ -0,0 +1,11 @@
+---
+uid: input-system-switch-gamepads
+---
+
+# Switch gamepads
+
+The Input System supports Switch Pro controllers on desktop computers via the [`SwitchProControllerHID`](xref:UnityEngine.InputSystem.Switch.SwitchProControllerHID.html) class, which implements basic gamepad functionality.
+
+This support doesn't currently work for Switch Pro controllers connected via wired USB. Instead, the Switch Pro controller must be connected via Bluetooth. This is due to the controller using a proprietary communication protocol [on top of HID](hid-specification-introduction.md) which doesn't allow treating the controller like any other HID.
+
+For more information on platform support for Switch gamepads, refer to [Supported devices reference](supported-devices-reference.md).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/gamepads-xbox.md b/Packages/com.unity.inputsystem/Documentation~/gamepads-xbox.md
new file mode 100644
index 0000000000..c879839715
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/gamepads-xbox.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-xbox-gamepads
+---
+
+# Xbox gamepads
+
+The Input System implements Xbox gamepads using the [`XInputController`](xref:UnityEngine.InputSystem.XInput.XInputController) class, which derives from [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad). On Windows and Universal Windows Platform, Unity uses the `XInput` API to connect to any type of supported XInput controller, including all Xbox One or Xbox 360-compatible controllers. These controllers are represented as an [`XInputController`](xref:UnityEngine.InputSystem.XInput.XInputController) instance.
+
+You can query the [`XInputController.subType`](xref:UnityEngine.InputSystem.XInput.XInputController.subType) property to get information about the type of controller (for example, a wheel or a gamepad).
+
+On other platforms, Unity uses derived classes to represent Xbox controllers:
+
+* [`XboxGamepadMacOS`](xref:UnityEngine.InputSystem.XInput.XboxGamepadMacOS): Any Xbox or compatible gamepad connected to macOS via USB using the [Xbox Controller Driver for macOS](https://github.com/360Controller/360Controller).
+* [`XboxOneGampadMacOSWireless`](xref:UnityEngine.InputSystem.XInput.XboxOneGampadMacOSWireless): An Xbox One controller connected to macOS via Bluetooth. Only the latest generation of Xbox One controllers supports Bluetooth. These controllers don't require any additional drivers in this scenario.
+* [`XboxOneGampadiOS`](xref:UnityEngine.InputSystem.iOS.XboxOneGampadiOS): An Xbox One controller connected to an iOS device via Bluetooth. Requires iOS 13 or higher.
+
+XInput controllers on macOS require the installation of the [Xbox Controller Driver for macOS](https://github.com/360Controller/360Controller). This driver only supports USB connections, and doesn't support wireless dongles. However, the latest generation of Xbox One controllers natively support Bluetooth. macOS natively supports these controllers as [HID devices](hid-specification-introduction.md) without any additional drivers when connected via Bluetooth.
+
+Unity supports Xbox controllers on WebGL in some browser and OS configurations, but treats them as basic [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad) or [`Joystick`](xref:UnityEngine.InputSystem.Joystick) devices, and doesn't support rumble or any other Xbox-specific functionality.
+
+For more information on platform support for Xbox gamepads, refer to [Supported devices reference](supported-devices-reference.md).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/generate-cs-api-from-actions.md b/Packages/com.unity.inputsystem/Documentation~/generate-cs-api-from-actions.md
new file mode 100644
index 0000000000..0cba98e3c1
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/generate-cs-api-from-actions.md
@@ -0,0 +1,69 @@
+---
+uid: input-system-api-from-actions
+---
+
+# Generate C# API from actions
+
+Input Action Assets allow you to **generate a C# class** from your action definitions, which allow you to refer to your actions in a type-safe manner from code.
+
+This removes the need to manually look up Actions and Action Maps using their names, and also provides an easy way to set up callbacks.
+
+> **Note**: This is an alternative workflow to [project-wide actions](./about-project-wide-actions.md), and provides a different way to access the actions defined in your action asset.
+
+
+To enable type-safe C# API generation:
+
+1. Select the action asset in the Project window.
+2. In the Inpsector window, enable the __Generate C# Class__ option.
+3. Select __Apply__.
+
+
+
+You can optionally choose a path name, class name, and namespace for the generated script, or keep the default values.
+
+Once applied, the Input System creates a C# script containing API that matches the actions defined in the asset which you can access directly in code. The following example demonstrates this, assuming there is an action map named "gameplay" containing two actions, "use" and "move" defined in the action asset:
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+// IGameplayActions is an interface generated from the "gameplay" action map.
+// Your interface name will match the name you chose for your action map.
+public class MyPlayerScript : MonoBehaviour, IGameplayActions
+{
+ // MyPlayerControls is the C# class that Unity generated.
+ // It encapsulates the data from the .inputactions asset we created
+ // and automatically looks up all the maps and actions for us.
+ MyPlayerControls controls;
+
+ public void OnEnable()
+ {
+ if (controls == null)
+ {
+ controls = new MyPlayerControls();
+ // Tell the "gameplay" action map that we want to get told about
+ // when actions get triggered.
+ controls.gameplay.SetCallbacks(this);
+ }
+ controls.gameplay.Enable();
+ }
+
+ public void OnDisable()
+ {
+ controls.gameplay.Disable();
+ }
+
+ public void OnUse(InputAction.CallbackContext context)
+ {
+ // 'Use' code here.
+ }
+
+ public void OnMove(InputAction.CallbackContext context)
+ {
+ // 'Move' code here.
+ }
+
+}
+```
+
+>__Note__: To regenerate the .cs file, right-click the .inputactions asset in the Project Browser and choose "Reimport".
diff --git a/Packages/com.unity.inputsystem/Documentation~/get-information-about-devices.md b/Packages/com.unity.inputsystem/Documentation~/get-information-about-devices.md
new file mode 100644
index 0000000000..41594eb26c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/get-information-about-devices.md
@@ -0,0 +1,5 @@
+---
+uid: input-system-information-devices
+---
+
+# Get information about devices
diff --git a/Packages/com.unity.inputsystem/Documentation~/get-started-player-input-component.md b/Packages/com.unity.inputsystem/Documentation~/get-started-player-input-component.md
new file mode 100644
index 0000000000..6997f00c18
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/get-started-player-input-component.md
@@ -0,0 +1,11 @@
+---
+uid: input-system-get-started-player-input-component
+---
+
+# Get started with the Player Input component
+
+To get started using the Player Input component, use the following steps:
+
+1. [Add](https://docs.unity3d.com/Manual/UsingComponents.html) a **Player Input** component to a GameObject. This would usually be the GameObject that represents the player in your game.
+1. Assign your [Action Asset](action-assets.md) to the **Actions** field. This is usually the default project-wide action asset named "InputSystem_Actions"
+1. Set up Action responses, by selecting a **Behaviour** type from the Behaviour menu. The Behaviour type you select affects how you should implement the methods that handle your Action responses. See the [notification behaviors](#notification-behaviors) section further down for details. 
diff --git a/Packages/com.unity.inputsystem/Documentation~/get-started-player-input-mananger-component.md b/Packages/com.unity.inputsystem/Documentation~/get-started-player-input-mananger-component.md
new file mode 100644
index 0000000000..2edc274275
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/get-started-player-input-mananger-component.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-player-input-manager-component
+---
+
+# Get started with the Player Input Manager component
+
+>NOTE: The Input System package comes with a sample called `Simple Multiplayer` which you can install from the package manager UI in the Unity editor. The sample demonstrates how to use [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) to set up a simple local multiplayer scenario.
+
+The [`Player Input`](player-input-component.md) system facilitates setting up local multiplayer games, where multiple players share a single screen and multiple controllers. You can set this up using the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) component, which automatically manages the creation and lifetime of `PlayerInput` instances as players join and leave the game.
diff --git a/Packages/com.unity.inputsystem/Documentation~/group-binding-to-control-scheme.md b/Packages/com.unity.inputsystem/Documentation~/group-binding-to-control-scheme.md
new file mode 100644
index 0000000000..5dbc7f41db
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/group-binding-to-control-scheme.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-binding-control-schemes
+---
+
+# Group bindings to control schemes
+
+[Control schemes](control-schemes.md) allow you to group types of bindings together according to their control type, so that you can enable or disable groups of bindings. For example, for games that support both gamepads and keyboard & mouse, you might want to enable all keyboard and mouse bindings if the user presses any keyboard button or uses the mouse.
+
+You can select which [control schemes](control-schemes.md) a binding belongs to in the [Actions Editor window](./actions-editor.md).
+
+To do so:
+
+1. In the Actions panel, select the Action whose bindings you want to edit.
+2. Expand the Action's hierarchy as necessary to display the bindings.
+3. Select a binding to edit. For composite bindings, you must select one or more of its sub-bindings.
+4. In the Binding Properties panel, under **Use in control scheme**, enable or disable the control schemes that you want this binding to belong to.
+
+You can edit the control schemes listed under **Use in control scheme**, by using the [Control Schemes menu](./control-schemes-devices-menu-reference.md) at the top left of the [Actions Editor window](./actions-editor.md).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/handle-loss-of-device.md b/Packages/com.unity.inputsystem/Documentation~/handle-loss-of-device.md
new file mode 100644
index 0000000000..6f046dabae
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/handle-loss-of-device.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-handle-device-loss
+---
+
+# Handle loss of a device
+
+If paired Input Devices disconnect during the session, the system notifies the [`InputUser`](../api/UnityEngine.InputSystem.Users.InputUser.html) class. It still keeps track of the Device, and automatically re-pairs the Device if it becomes available again.
+
+To get notifications about these changes, subscribe to the [`InputUser.onChange`](../api/UnityEngine.InputSystem.Users.InputUser.html#UnityEngine_InputSystem_Users_InputUser_onChange) event.
diff --git a/Packages/com.unity.inputsystem/Documentation~/handling-input-target-ambiguity.md b/Packages/com.unity.inputsystem/Documentation~/handling-input-target-ambiguity.md
new file mode 100644
index 0000000000..b758060fe5
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/handling-input-target-ambiguity.md
@@ -0,0 +1,45 @@
+---
+uid: input-system-target-ambiguity
+---
+
+# Handling input target ambiguity
+
+Understand how to manage ambiguities between input for your application's user interface (UI), and input for other parts of your application.
+
+>[!NOTE]
+>The Input System package includes a sample project called "**UI vs Game Input**". The sample demonstrates how to deal with ambiguities between inputs for UI and inputs for the game.
+
+## How Unity processes UI input
+
+Unity processes UI input through the same mechanisms as the input for the rest of your application. There's no automatic mechanism that prevents the UI and the rest of your code from consuming the same input (such as a mouse click).
+
+## Strategies for avoiding ambiguity
+
+Ambiguities can appear between, for example, code that responds to [`UI.Button.onClick`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.Button.html#UnityEngine_UI_Button_onClick) and code that responds to [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed) for an action bound to `/leftButton`.
+
+Whether such ambiguities exist depends on how you implement the UI and the UI input. The following UI implementation strategies are examples of how you can avoid these ambiguities:
+
+* Perform all interaction through UI elements. Render a scene in the background, but perform all interaction through UI events (including those such as 'background' clicks on the `Canvas`).
+* Place UI over a 2D/3D scene, but don’t let the user directly interact with the UI.
+* Place UI over a 2D/3D scene, but create a clear "mode" switch that determines whether interaction applies to the UI or the scene. For example, a first-person game on desktop might employ a [cursor lock](https://docs.unity3d.com/ScriptReference/Cursor-lockState.html) which directs input to the game when it is engaged, and to the UI when it is not engaged.
+
+There are also specific ambiguities that can arise for [pointer input](supported-ui-input-types-pointer.md) and [navigation input](supported-ui-input-types-navigation.md).
+
+## Handling pointer input ambiguities
+
+Input from pointers (mice, touchscreens, pens) can be ambiguous depending on whether or not the pointer is over a UI element when initiating an interaction. For example, if there is a button on screen, then clicking on the button may lead to a different outcome than clicking outside of the button and within the game scene.
+
+If all pointer input is handled via UI events, no ambiguities arise as the UI will implicitly route input to the respective receiver. If, however, input within the UI is handled via UI events and input in the game is handled via [actions](actions.md), pointer input will by default lead to *both* being triggered.
+
+The easiest way to resolve such ambiguities is to respond to in-game actions by [polling](respond-to-input.md#polling-actions) from inside [`MonoBehaviour.Update`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.Update.html) methods and using [`EventSystem.IsPointerOverGameObject`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.EventSystem.html?q=ispointerovergameobject#UnityEngine_EventSystems_EventSystem_IsPointerOverGameObject) to find out whether the pointer is over UI or not. Another way is to use [`EventSystem.RaycastAll`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.EventSystem.html?q=ispointerovergameobj#UnityEngine_EventSystems_EventSystem_RaycastAll_UnityEngine_EventSystems_PointerEventData_System_Collections_Generic_List_UnityEngine_EventSystems_RaycastResult__) to determine if the pointer is currently over UI.
+
+>[!NOTE]
+>Calling [`EventSystem.IsPointerOverGameObject`](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.EventSystems.EventSystem.html?q=ispointerovergameobject#UnityEngine_EventSystems_EventSystem_IsPointerOverGameObject) from within [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html) callbacks such as [`InputAction.performed`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed) lead to a warning. The UI updates separately after input processing, so UI state corresponds to that of the last frame/update while input is being processed.
+
+## Handling navigation input ambiguities
+
+For navigation-type devices such as gamepads, joysticks, and keyboards, you must decide explicitly whether to use input for the UI's `Move`, `Submit`, and `Cancel` inputs or for the game. This can be done by either splitting control on a device or by having an explicit mode switch.
+
+Splitting input on a device is done by simply using certain controls for operating the UI while using others to operate the game. For example, you could use the d-pad on gamepads to operate UI selection while using the sticks for in-game character control. This setup requires adjusting the bindings used by the UI actions accordingly.
+
+An explicit mode switch is implemented by temporarily switching to UI control while suspending in-game actions. For example, the left trigger on the gamepad could bring up an item selection wheel which then puts the game in a mode where the sticks are controlling UI selection, the A button confirms the selection, and the B button closes the item selection wheel. No ambiguities arise as in-game actions will not respond while the UI is in the "foreground".
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/HID.md b/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout-class.md
similarity index 54%
rename from Packages/com.unity.inputsystem/Documentation~/HID.md
rename to Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout-class.md
index b6908ff12c..dbe2764dc1 100644
--- a/Packages/com.unity.inputsystem/Documentation~/HID.md
+++ b/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout-class.md
@@ -1,93 +1,14 @@
---
-uid: input-system-hid
+uid: input-system-custom-class-layout
---
-# HID Support
-Human Interface Device (HID) is a [specification](https://www.usb.org/hid) to describe peripheral user input devices connected to computers via USB or Bluetooth. HID is commonly used to implement devices such as gamepads, joysticks, or racing wheels.
+# Use a custom class to create a layout
-The Input System directly supports HID (connected via both USB and Bluetooth) on Windows, MacOS, and the Universal Windows Platform (UWP). The system might support HID on other platforms, but not deliver input through HID-specific APIs. For example, on Linux, the system supports gamepad and joystick HIDs through SDL, but doesn't support other HIDs.
+You can create your own [`InputDevice`](xref:UnityEngine.InputSystem.InputDevice) class and state layouts in C# to create a custom layout as follows:
-Every HID comes with a device descriptor. To browse through the descriptor of an HID from the Input Debugger, click the __HID Descriptor__ button in the device debugger window. To specify the type of the device, the HID descriptor reports entry numbers in the [HID usage tables](https://www.usb.org/document-library/hid-usage-tables-112), and a list of all controls on the device, along with their data ranges and usages.
+```c#
-
-
-The Input System handles HIDs in one of two ways:
-
-1. The system has a known layout for the specific HID.
-2. If the system does not have a known layout, it auto-generates one for the HID.
-
-## Auto-generated layouts
-
-By default, the Input System creates layouts and Device representations for any HID which reports its usage as `GenericDesktop/Joystick`, `GenericDesktop/Gamepad`, or `GenericDesktop/MultiAxisController` (see the [HID usage table specifications](https://www.usb.org/document-library/hid-usage-tables-112) for more information). To change the list of supported usages, set [`HIDSupport.supportedHIDUsages`](../api/UnityEngine.InputSystem.HID.HIDSupport.html#UnityEngine_InputSystem_HID_HIDSupport_supportedHIDUsages).
-
-When the Input System automatically creates a layout for an HID, it always reports these Devices as [`Joysticks`](Joystick.md), represented by the [`Joystick` device class](../api/UnityEngine.InputSystem.Joystick.html). The first elements with a reported HID usage of `GenericDesktop/X` and `GenericDesktop/Y` together form the joystick's [`stick`](../api/UnityEngine.InputSystem.Joystick.html#UnityEngine_InputSystem_Joystick_stick) Control. The system then adds Controls for all further HID axis or button elements, using the Control names reported by the HID specification. The Input System assigns the first control with an HID usage of `Button/Button 1` to the joystick's [`trigger`](../api/UnityEngine.InputSystem.Joystick.html#UnityEngine_InputSystem_Joystick_trigger) Control.
-
-The auto-generated layouts represent a "best effort" on the part of the Input System. The way Human Interface Devices describe themselves in accordance with the HID standard is too ambiguous in practice, so generated layouts might lead to Controls that don't work as expected. For example, while the layout builder can identify hat switches and D-pads, it can often only make guesses as to which direction represents which. The same goes for individual buttons, which generally aren't assigned any meaning in HID.
-
-The best way to resolve the situation of HIDs not working as expected is to add a custom layout, which bypasses auto-generation altogether. See [Creating a custom device layout](#creating-a-custom-device-layout) for details.
-
-## HID output
-
-HIDs can support output (for example, to toggle lights or force feedback motors on a gamepad). Unity controls output by sending HID Output Report commands to a Device. Output reports use Device-specific data formats. To use HID Output Reports, call [`InputDevice.ExecuteCommand`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_ExecuteCommand__1___0__) to send a command struct with the [`typeStatic`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html#properties) property set as `"HIDO"` to a Device. The command struct contains the Device-specific data sent out to the HID.
-
-## Creating a custom device layout
-
-Often, when using the layouts auto-generated for HIDs, the result isn't ideal. Controls don't receive proper names specific to the Device, some Controls might not work as expected, and some Controls that use vendor-specific formats might not appear altogether.
-
-The best way to deal with this is to override the HID fallback and set up a custom Device layout specifically for your Device. This overrides the default auto-generation and gives you full control over how the Device is exposed.
-
-Below are three example workflows showing different ways to achieve this.
-
-- [Example 1 - Use an existing C# InputDevice](#custom-device-workflow-example-1---use-an-existing-c-inputdevice)
-- [Example 2 - Create your own InputDevice class](#custom-device-workflow-example-2---create-your-own-inputdevice-class)
-- [Example 3 - A more complex example using the PS4 DualShock Controller](#custom-device-workflow-example-3---ps4-dualshock-controller)
-
-### Custom Device Workflow Example 1 - Use an existing C# InputDevice
-
-If you want to use one of the existing C# [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) classes in code to interface with your Device, you can build on an existing layout using JSON:
-
-```
- {
- "name" : "MyDevice",
- "extend" : "Gamepad", // Or some other thing
- "controls" : [
- {
- "name" : "firstButton",
- "layout" : "Button",
- "offset" : 0,
- "bit": 0,
- "format" : "BIT",
- },
- {
- "name" : "secondButton",
- "layout" : "Button",
- "offset" : 0,
- "bit": 1,
- "format" : "BIT",
- },
- {
- "name" : "axis",
- "layout" : "Axis",
- "offset" : 4,
- "format" : "FLT",
- "parameters" : "clamp=true,clampMin=0,clampMax=1"
- }
- ]
- }
-```
-You then register your layout with the system and then instantiate it:
-
-```C#
- InputSystem.RegisterControlLayout(myDeviceJson);
- var device = InputSystem.AddDevice("MyDevice");
-```
-
-### Custom Device Workflow Example 2 - Create your own InputDevice class
-
-Alternatively, you can create your own [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) class and state layouts in C#.
-
-```C#
- public struct MyDeviceState : IInputStateTypeInfo
+ public struct MyDeviceState : IInputStateTypeInfo
{
// FourCC type codes are used to identify the memory layouts of state blocks.
public FourCC format => new FourCC('M', 'D', 'E', 'V');
@@ -114,32 +35,43 @@ Alternatively, you can create your own [`InputDevice`](../api/UnityEngine.InputS
base.FinishSetup(setup);
}
}
+
```
-To create an instance of your Device, register it as a layout and then instantiate it:
+To create an instance of your device, register it as a layout and then instantiate it:
+
+```c#
-```C#
- InputSystem.RegisterControlLayout("MyDevice", typeof(MyDevice));
+ InputSystem.RegisterControlLayout("MyDevice", typeof(MyDevice));
InputSystem.AddDevice("MyDevice");
+
```
-### Custom Device Workflow Example 3 - PS4 DualShock Controller
+## Use a custom class to control a complex controller
This example workflow uses the same technique as the previous example, but provides more detail by using the PS4 DualShock controller as a more complex device to set up.
The following example assumes that the Input System doesn't already have a custom layout for the PS4 DualShock controller, and that you want to add such a layout.
-In this example, you want to expose the controller as a [`Gamepad`](Gamepad.md) and you roughly know the HID data format used by the Device.
+In this example, you want to expose the controller as a [gamepad](gamepads-introduction.md) and you roughly know the HID data format used by the Device.
+
+If you don't know the format of a given HID you want to support:
->__Tip__: If you don't know the format of a given HID you want to support, you can open the Input Debugger with the Device plugged in and pop up both the debugger view for the Device and the window showing the HID descriptor. Then, you can go through the Controls one by one, see what happens in the debug view, and correlate that to the Controls in the HID descriptor. You can also double-click individual events and compare the raw data coming in from the Device. If you select two events in the event trace, you can then right-click them and choose __Compare__ to open a window that shows only the differences between the two events.
+1. Plug the device into your computer
+1. Open the Input Debugger (**Window** > **Analysis** > **Input Debugger**)
+1. Open both the debugger view for the device and the window showing the HID descriptor
+1. Go through the controls one by one, refer to the debug view, and correlate that to the controls in the HID descriptor.
-#### Step 1: The state struct
+You can also double-click individual events and compare the raw data coming in from the device. If you select two events in the event trace, you can then right-click them and choose **Compare** to open a window that shows only the differences between the two events.
-The first step is to describe in detail what format that input data for the Device comes in, as well as the [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html) instances that should read out individual pieces of information from that data.
+### Define the input data
+
+The first step is to describe in detail what format that input data for the device comes in, and the [`InputControl`](xref:UnityEngine.InputSystem.InputControl) instances that should read out individual pieces of information from that data.
The HID input reports from the PS4 controller look approximately like this:
-```C++
+```
+
struct PS4InputReport
{
byte reportId; // #0
@@ -166,11 +98,13 @@ struct PS4InputReport
byte leftTrigger; // #8
byte rightTrigger; // #9
}
+
```
-You can translate this into a C# struct:
+You can translate this into a C\# struct:
+
+```c#
-```CSharp
// We receive data as raw HID input reports. This struct
// describes the raw binary format of such a report.
[StructLayout(LayoutKind.Explicit, Size = 32)]
@@ -253,15 +187,17 @@ struct DualShock4HIDInputReport : IInputStateTypeInfo
[FieldOffset(30)] public byte batteryLevel;
}
+
```
-#### Step 2: The InputDevice
+### Create an InputDevice instance to represent your device
-Next, you need an `InputDevice` to represent your device. Because you're dealing with a gamepad, you must create a new subclass of `Gamepad`.
+Next, you need an `InputDevice` to represent your device. Because you're dealing with a gamepad, you must create a new subclass of Gamepad.
For simplicity, this example ignores the fact that there is a `DualShockGamepad` class that the actual `DualShockGamepadHID` is based on.
-```CSharp
+```c#
+
// Using InputControlLayoutAttribute, we tell the system about the state
// struct we created, which includes where to find all the InputControl
// attributes that we placed on there. This is how the Input System knows
@@ -270,17 +206,19 @@ For simplicity, this example ignores the fact that there is a `DualShockGamepad`
public DualShock4GamepadHID : Gamepad
{
}
+
```
-#### Step 3: Registering the Device
+### Register your device
-The last step is to register your new type of Device and set up the Input System so that when a PS4 controller is connected, the Input System generates your custom Device instead of using the default HID fallback.
+The last step is to register your new type of device and set up the Input System so that when a PlayStation 4 controller is connected, the Input System generates your custom Device instead of using the default HID fallback.
-This only requires a call to [`InputSystem.RegisterLayout`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayout__1_System_String_System_Nullable_UnityEngine_InputSystem_Layouts_InputDeviceMatcher__), giving it an [`InputDeviceMatcher`](../api/UnityEngine.InputSystem.Layouts.InputDeviceMatcher.html) that matches the description for a PS4 DualShock HID. In theory, you can place this call anywhere, but the best point for registering layouts is generally during startup. Doing so ensures that your custom layout is visible to the Unity Editor and therefore exposed, for example, in the Input Control picker.
+This requires a call to [`InputSystem.RegisterLayout`](xref:UnityEngine.InputSystem.InputSystem.RegisterLayout``1(System.String,System.Nullable{UnityEngine.InputSystem.Layouts.InputDeviceMatcher})), giving it an [`InputDeviceMatcher`](xref:UnityEngine.InputSystem.Layouts.InputDeviceMatcher) that matches the description for a PlayStation 4 DualShock HID. In theory, you can place this call anywhere, but the best point for registering layouts is generally during startup. Doing so ensures that your custom layout is visible to the Unity Editor and therefore exposed, for example, in the Input Control picker.
-You can insert your registration into the startup sequence by modifying the code for your `DualShock4GamepadHID` Device as follows:
+You can insert your registration into the startup sequence by modifying the code for your `DualShock4GamepadHID` device as follows:
+
+```c#
-```CSharp
[InputControlLayout(stateType = typeof(DualShock4HIDInputReport)]
#if UNITY_EDITOR
[InitializeOnLoad] // Make sure static constructor is called during startup.
@@ -310,8 +248,9 @@ public DualShock4GamepadHID : Gamepad
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void Init() {}
}
+
```
-Your custom layout now picks up any Device that matches the manufacturer and product name strings, or the vendor and product IDs in its HID descriptor. The Input System now represents a `DualShock4GamepadHID` Device instance.
+Your custom layout now picks up any device that matches the manufacturer and product name strings, or the vendor and product IDs in its HID descriptor. The Input System now represents a `DualShock4GamepadHID` device instance.
-For more information, you can also read the [Device matching](Devices.md#matching) documentation.
+For more information, refer to the [device matching](device-matching.md) documentation.
diff --git a/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout-existing.md b/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout-existing.md
new file mode 100644
index 0000000000..d2b20c68a8
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout-existing.md
@@ -0,0 +1,48 @@
+---
+uid: input-system-use-existing-layout
+---
+
+# Use an existing input device to create a layout
+
+To use one of the existing C# [`InputDevice`](xref:UnityEngine.InputSystem.InputDevice) classes in code to interface with a device, you can build on an existing layout using JSON:
+
+```json
+
+ {
+ "name" : "MyDevice",
+ "extend" : "Gamepad", // Or some other thing
+ "controls" : [
+ {
+ "name" : "firstButton",
+ "layout" : "Button",
+ "offset" : 0,
+ "bit": 0,
+ "format" : "BIT",
+ },
+ {
+ "name" : "secondButton",
+ "layout" : "Button",
+ "offset" : 0,
+ "bit": 1,
+ "format" : "BIT",
+ },
+ {
+ "name" : "axis",
+ "layout" : "Axis",
+ "offset" : 4,
+ "format" : "FLT",
+ "parameters" : "clamp=true,clampMin=0,clampMax=1"
+ }
+ ]
+ }
+
+```
+
+You then register your layout with the system and then instantiate it:
+
+```c#
+
+ InputSystem.RegisterControlLayout(myDeviceJson);
+ var device = InputSystem.AddDevice("MyDevice");
+
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout.md b/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout.md
new file mode 100644
index 0000000000..1360298e4d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/hid-create-custom-layout.md
@@ -0,0 +1,14 @@
+---
+uid: input-system-custom-device-layout
+---
+
+# Create a custom device layout
+
+You can override auto-generated layouts to resolve issues such as when controls don't receive proper names specific to the device, or if a control doesn't work as expected.
+
+When you set up a custom device layout specifically for your device it overrides the default auto-generation and gives you full control over how the device is exposed.
+
+You can create a custom device layout in the following ways:
+
+* [Use an existing C# `InputDevice`](hid-create-custom-layout-existing.md)
+* [Create your own `InputDevice` class](hid-create-custom-layout-class.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/hid-specification-introduction.md b/Packages/com.unity.inputsystem/Documentation~/hid-specification-introduction.md
new file mode 100644
index 0000000000..8e245b0805
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/hid-specification-introduction.md
@@ -0,0 +1,36 @@
+---
+uid: input-system-hid-intro
+---
+
+# Human Interface Device specification introduction
+
+Human Interface Device (HID) is a [specification](https://www.usb.org/hid) to describe peripheral user input devices connected to computers via USB or Bluetooth. HID is commonly used to implement devices such as gamepads, joysticks, or racing wheels.
+
+The Input System directly supports HID (connected via both USB and Bluetooth) on Windows, macOS, and the Universal Windows Platform (UWP). The system might support HID on other platforms, but not deliver input through HID-specific APIs. For example, on Linux, the system supports gamepad and joystick HIDs through SDL, but doesn't support other HIDs.
+
+The Input System handles HIDs in one of the following ways:
+
+* Uses a set layout if the system has a known layout for the specific HID.
+* If the system doesn't have a known layout, Unity auto-generates one for the HID.
+
+## Auto-generated layouts
+
+By default, the Input System creates layouts and device representations for any HID which reports its usage as GenericDesktop/Joystick, GenericDesktop/Gamepad, or GenericDesktop/MultiAxisController (see the [HID usage table specifications](https://www.usb.org/document-library/hid-usage-tables-112) for more information). To change the list of supported usages, set [HIDSupport.supportedHIDUsages](http://localhost:57437/com.unity.inputsystem@1.12/api/UnityEngine.InputSystem.HID.HIDSupport.html#UnityEngine_InputSystem_HID_HIDSupport_supportedHIDUsages).
+
+When the Input System automatically creates a layout for an HID, it always reports these Devices as [Joystick](http://localhost:57437/com.unity.inputsystem@1.12/manual/Joystick.html) instances, represented by the [Joystick device class](http://localhost:57437/com.unity.inputsystem@1.12/api/UnityEngine.InputSystem.Joystick.html). The first elements with a reported HID usage of GenericDesktop/X and GenericDesktop/Y together form the joystick's [stick](http://localhost:57437/com.unity.inputsystem@1.12/api/UnityEngine.InputSystem.Joystick.html#UnityEngine_InputSystem_Joystick_stick) control. The system then adds Controls for all further HID axis or button elements, using the Control names reported by the HID specification. The Input System assigns the first control with an HID usage of Button/Button 1 to the joystick's [trigger](http://localhost:57437/com.unity.inputsystem@1.12/api/UnityEngine.InputSystem.Joystick.html#UnityEngine_InputSystem_Joystick_trigger) Control.
+
+The auto-generated layouts represent a best effort on the part of the Input System. The way HIDs describe themselves in accordance with the HID standard varies, so generated layouts might lead to controls that don't work as expected. For example, while the layout builder can identify hat switches and D-pads, it can often only make guesses as to which direction represents which. The same goes for individual buttons, which generally aren't assigned any meaning in HID.
+
+To resolve the situation of HIDs not working as expected, you can add a custom layout, which bypasses auto-generation altogether. See [Creating a custom device layout](http://localhost:57437/com.unity.inputsystem@1.12/manual/HID.html#creating-a-custom-device-layout) for details.
+
+## HID in the Unity Editor
+
+Every HID comes with a device descriptor. To browse through the descriptor of an HID from the Input Debugger, select the HID Descriptor button in the device debugger window.
+
+To specify the type of the device, the HID descriptor reports entry numbers in the [HID usage tables](https://www.usb.org/document-library/hid-usage-tables-112), and a list of all controls on the device, along with their data ranges and usages.
+
+## HID output
+
+HIDs can support output (for example, to toggle lights or force feedback motors on a gamepad). Unity controls output by sending HID Output Report commands to a device. Output reports use Device-specific data formats.
+
+To use HID Output Reports, call [InputDevice.ExecuteCommand](http://localhost:57437/com.unity.inputsystem@1.12/api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_ExecuteCommand__1___0__) to send a command struct with the [typeStatic](http://localhost:57437/com.unity.inputsystem@1.12/api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html#properties) property set as "HIDO" to a device. The command struct contains the device-specific data sent out to the HID.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/hid-specification.md b/Packages/com.unity.inputsystem/Documentation~/hid-specification.md
new file mode 100644
index 0000000000..d7689700d6
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/hid-specification.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-hid
+---
+
+# Human Interface Device specification
+
+Human Interface Device (HID) is a specification that describes peripheral user input devices connected to computers via USB or Bluetooth. HID is commonly used to implement devices such as gamepads, joysticks, or racing wheels.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+| **[Human Interface Device specification introduction](hid-specification-introduction.md)** | Map generic devices with the HID specification. |
+| **[Create a custom device layout](hid-create-custom-layout.md)** | Override default HID mappings with a custom layout.|
+| **[Use an existing input device to create a layout](hid-create-custom-layout-existing.md)** | Create a custom layout with an existing device.|
+| **[Use a custom class to create a layout](hid-create-custom-layout-class.md)** | Create a custom class to make a custom layout.|
+
+## Additional resources
+
+- [Layouts](layouts.md)
+- [Custom devices](custom-devices.md)
+- [Debug layouts](debug-layouts.md)
+- [Devices](devices.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/include-interactions-reference.md b/Packages/com.unity.inputsystem/Documentation~/include-interactions-reference.md
new file mode 100644
index 0000000000..8c8758692d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/include-interactions-reference.md
@@ -0,0 +1,47 @@
+# Interactions Editor reference
+
+The Interactions foldout contains properties for [interactions](Interactions.md) that you can assign to actions and bindings.
+
+All properties in the Interactions foldout correspond to the [`InputSystem.Interactions`](..api/UnityEngine.InputSystem.Interactions.html) API.
+
+By default, all Interactions have the following properties:
+
+|Property|Description|
+|-|-|
+|**Press Point**| Set the amount of control actuation required for the action to trigger. |
+|**Default**| Use the default value for the associated property. Un-check this checkbox to enter a custom value.|
+|**Open Input Settings**| Open the [project-wide Input System settings](input-settings) in the Project Settings. |
+
+Additionally, each Interaction type has unique properties.
+
+## Hold
+
+|Property|Description|
+|-|-|
+|**Hold Time**| Set the duration in seconds that the control must be pressed for the hold to register.|
+
+
+## MultiTap
+
+|Property|Description|
+|-|-|
+|**Tap Count**| Set the number of taps required to perform the action.|
+|**Max Tap Spacing**| Set the maximum amount of time (in seconds) that can pass between taps.|
+|**Max Tap Duration**| Set the maximum time (in seconds) within which the control needs to be pressed and released to perform the interaction.|
+
+## Press
+
+|Property|Description|
+|-|-|
+|**Trigger behavior**|Define when the interaction triggers. The options available by default are: - **Press Only**: Trigger the action when the button enters a pressed state. **Release Only**: Trigger the action or binding when the button exits a pressed state. - **Press and Release**: Trigger the action when the button enters a pressed state, and again when it exits a pressed state. |
+
+## Slow Tap
+
+|Property|Description|
+|-|-|
+|**Min Tap Duration**| Set the minimum time (in seconds) within which the control needs to be pressed and released to perform the interaction.|
+
+## Tap
+|Property|Description|
+|-|-|
+|**Max Tap Duration**| Set the maximum time (in seconds) within which the control needs to be pressed and released to perform the interaction.|
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/include-processors-reference.md b/Packages/com.unity.inputsystem/Documentation~/include-processors-reference.md
new file mode 100644
index 0000000000..9d30c9552e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/include-processors-reference.md
@@ -0,0 +1,14 @@
+## Processors Editor reference
+
+The Processors foldout contains properties for [processors](processors.md) that you can assign to actions and bindings.
+
+All properties in the Processors foldout correspond to the [`InputSystem.Processors`](..api/UnityEngine.InputSystem.Processors.html) API.
+
+|Processor|Description|
+|-|-|
+|**Axis Deadzone**| Scale the values of a control so that any absolute value smaller than **Min** is `0`, and any absolute value larger than **Max** is `1` or `-1`.|
+|**Clamp**| Restrict the input values to the [`min..max`] range.|
+|**Invert**| Invert the values from a Control (that is, multiply the values by -1). For Value-type and PassThrough-type actions, you can also use **Invert Vector2** and **Invert Vector3** processors. |
+|**Normalize**| Normalize input values in the range [`min..max`] to unsigned normalized form [`0..1`]. For Value-type and PassThrough-type actions, you can also use **Normalize Vector2** and **Normalize Vector3** processors. |
+|**Scale**| Multiply all input values by **Factor**. For Value-type and PassThrough-type actions, you can also use **Scale Vector2** and **Scale Vector3** processors.|
+|**Stick Deadzone**| Scale the values of a Vector2 control so that any input vector with a magnitude smaller than **Min** results in (`0,0`), and any input vector with a magnitude greater than **Max** is normalized to length `1`.|
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/index.md b/Packages/com.unity.inputsystem/Documentation~/index.md
index 40b5a7703c..e6dd33af81 100644
--- a/Packages/com.unity.inputsystem/Documentation~/index.md
+++ b/Packages/com.unity.inputsystem/Documentation~/index.md
@@ -15,7 +15,7 @@ This **Input System package** is a newer, more flexible system, which allows you
During the installation process for the Input System package, the installer offers to automatically deactivate the older built-in system. ([Read more](Installation.md))
-To get started, see the [Installation](Installation.md) and [Workflows](Workflows.md) sections. For a demo project, see the [Warriors demo](https://github.com/UnityTechnologies/InputSystem_Warriors) on GitHub.
+To get started, see the [Installation](Installation.md) and [Workflows](workflows.md) sections. For a demo project, see the [Warriors demo](https://github.com/UnityTechnologies/InputSystem_Warriors) on GitHub.

_The Input Actions Editor, displaying some of the default actions that come pre-configured with the Input System package._
diff --git a/Packages/com.unity.inputsystem/Documentation~/input-actions-editor-window-reference.md b/Packages/com.unity.inputsystem/Documentation~/input-actions-editor-window-reference.md
new file mode 100644
index 0000000000..29c2989f91
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/input-actions-editor-window-reference.md
@@ -0,0 +1,35 @@
+---
+uid: input-system-actions-editor-window
+---
+
+# Input Actions Editor window reference
+
+The **Input Actions Editor** is an Editor window that displays action maps, actions, bindings, and their properties.
+
+ *The Input Actions editor, displaying the default actions*
+
+The Input Actions Editor is divided into three panels:
+
+|Name|Description|
+|-|-|
+|**(A) Action Maps**|Displays the list of currently defined Action Maps. Each Action Map is a collection of actions that you can enable or disable together as a group.|
+|**(B) Actions**|Displays all the actions defined in the currently selected Action Map, and the bindings associated with each action.|
+|**(C) Properties**|Displays the properties of the currently selected Action or Binding from the **Actions** panel. The title of this panel changes depending on whether you have an Action or a Binding selected in the Actions panel.|
+
+## Action Maps panel reference
+|Button|Description|
+|-|-|
+|**Action Maps**: **Add (+)** button| Select the **Add (+)** button in the Action Maps panel header to create a new Action Map.|
+
+## Actions panel reference
+|Button|Description|
+|-|-|
+|**Actions**: **Add (+)**| Select the **Add (+)** button in the Actions panel header to create a new action.|
+|Per-action **Add (+)** button| Select the **Add (+)** button next to an action to create a new binding.|
+
+## Properties panel reference
+
+The properties that appear in the Action Properties and Binding Properties panels differ depending on the action or binding you have selected. For detailed reference documentation, refer to:
+
+* [Action Properties panel reference](action-properties-panel-reference.md)
+* [Bindings properties panel reference](binding-properties-panel-reference.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/input-events.md b/Packages/com.unity.inputsystem/Documentation~/input-events.md
new file mode 100644
index 0000000000..367c90472c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/input-events.md
@@ -0,0 +1,25 @@
+---
+uid: input-system-input-events
+---
+
+# Input events
+
+The Input System is event-driven. All input is delivered as events, and you can generate custom input by injecting events. You can also observe all source input by listening in on the events flowing through the system.
+
+>__Note__: Events are an advanced, mostly internal feature of the Input System. Knowledge of the event system is mostly useful if you want to support custom Devices, or change the behavior of existing Devices.
+
+Input events are a low-level mechanism. Usually, you don't need to deal with events if all you want to do is receive input for your app. Events are stored in unmanaged memory buffers and not converted to C# heap objects. The Input System provides wrapper APIs, but unsafe code is required for more involved event manipulations.
+
+Note that there are no routing mechanism. The runtime delivers events straight to the Input System, which then incorporates them directly into the Device state.
+
+Input events are represented by the [`InputEvent`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html) struct. Each event has a set of common properties:
+
+|Property|Description|
+|--------|-----------|
+|[`type`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_type)|[`FourCC`](../api/UnityEngine.InputSystem.Utilities.FourCC.html) code that indicates what type of event it is.|
+|[`eventId`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_eventId)|Unique numeric ID of the event.|
+|[`time`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_time)|Timestamp of when the event was generated. This is on the same timeline as [`Time.realtimeSinceStartup`](https://docs.unity3d.com/ScriptReference/Time-realtimeSinceStartup.html).|
+|[`deviceId`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_deviceId)|ID of the Device that the event targets.|
+|[`sizeInBytes`](../api/UnityEngine.InputSystem.LowLevel.InputEvent.html#UnityEngine_InputSystem_LowLevel_InputEvent_sizeInBytes)|Total size of the event in bytes.|
+
+You can observe the events received for a specific input device in the [input debugger](debug-device.md).
diff --git a/Packages/com.unity.inputsystem/Documentation~/input-settings.md b/Packages/com.unity.inputsystem/Documentation~/input-settings.md
new file mode 100644
index 0000000000..073447f673
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/input-settings.md
@@ -0,0 +1,24 @@
+---
+uid: input-system-input-settings
+---
+
+# Input settings
+
+The Input settings panel, available in the Project Settings window, allows you to configure various features and behaviors of the Input System. This section explains how to create a settings asset, and the options available in all settings.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Create a settings asset](create-settings-asset.md)** | Create a settings asset to change input settings in your project. |
+| **[Update Mode](update-mode.md)** | Set when to process input. |
+| **[Background behavior](background-behavior.md)** | Decide how to behave when the application's focus is lost or regained. |
+| **[Compensate orientation](compensate-orientation.md)** | Set rotation values around the Z axis. |
+| **[Default value properties](default-value-properties.md)** | Set default values for numerical properties. |
+| **[Supported devices](supported-devices.md)** | Restrict input devices to those your project needs. |
+| **[Platform-specific settings](platform-specific-settings.md)** | Select options for individual platforms. |
+
+## Additional resources
+
+- [Devices](devices.md)
+- [Device background and focus changes](device-background-focus-changes.md)
+- [Supported devices reference](supported-devices-reference.md)
+- [Update Mode](update-mode.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/interactive-rebinding.md b/Packages/com.unity.inputsystem/Documentation~/interactive-rebinding.md
new file mode 100644
index 0000000000..0ab97ec760
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/interactive-rebinding.md
@@ -0,0 +1,32 @@
+
+## Interactive rebinding
+
+>__Note:__ To download a sample project which demonstrates how to set up a rebinding user interface with Input System APIs, open the Package Manager, select the Input System Package, and choose the sample project "Rebinding UI" to download.
+
+Runtime rebinding allows users of your application to set their own Bindings.
+
+To allow users to choose their own Bindings interactively, use the [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) class. Call the [`PerformInteractiveRebinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_PerformInteractiveRebinding_UnityEngine_InputSystem_InputAction_System_Int32_) method on an Action to create a rebinding operation. This operation waits for the Input System to register any input from any Device which matches the Action's expected Control type, then uses [`InputBinding.overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) to assign the Control path for that Control to the Action's Bindings. If the user actuates multiple Controls, the rebinding operation chooses the Control with the highest [magnitude](controls.md#control-actuation).
+
+>IMPORTANT: You must dispose of [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) instances via `Dispose()`, so that they don't leak memory on the unmanaged memory heap.
+
+```C#
+ void RemapButtonClicked(InputAction actionToRebind)
+ {
+ var rebindOperation = actionToRebind
+ .PerformInteractiveRebinding().Start();
+ }
+```
+
+The [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) API is highly configurable to match your needs. For example, you can:
+
+* Choose expected Control types ([`WithExpectedControlType()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithExpectedControlType_System_Type_)).
+
+* Exclude certain Controls ([`WithControlsExcluding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithControlsExcluding_System_String_)).
+
+* Set a Control to cancel the operation ([`WithCancelingThrough()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithCancelingThrough_UnityEngine_InputSystem_InputControl_)).
+
+* Choose which Bindings to apply the operation on if the Action has multiple Bindings ([`WithTargetBinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithTargetBinding_System_Int32_), [`WithBindingGroup()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithBindingGroup_System_String_), [`WithBindingMask()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithBindingMask_System_Nullable_UnityEngine_InputSystem_InputBinding__)).
+
+Refer to the scripting API reference for [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) for a full overview.
+
+Note that [`PerformInteractiveRebinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_PerformInteractiveRebinding_UnityEngine_InputSystem_InputAction_System_Int32_) automatically applies a set of default configurations based on the given action and targeted binding.
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-interactions.md b/Packages/com.unity.inputsystem/Documentation~/introduction-interactions.md
new file mode 100644
index 0000000000..acffcf2ef6
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-interactions.md
@@ -0,0 +1,105 @@
+---
+uid: input-system-interactions-intro
+---
+
+# Introduction to interactions
+
+An Interaction represents a specific pattern of [control actuation](control-actuation.md) that determines how an action is started, performed, or canceled.
+
+An action with no explicit interaction applied behaves according the [default interaction](default-interactions.md) for its [action type](about-action-control-types.md). For example, a button action's default interaction is to immediately perform the action when the button is pressed.
+
+When you apply an interaction to an action, it overrides the default interaction behavior and changes how the action is performed. This allows you, for example, to implement a [hold](built-in-interactions.md#hold) interaction that requires a control to be held for a minimum amount of time, or a [multi-tap](built-in-interactions.md#multitap) interaction that requires the control to be quickly tapped multiple times to perform the action.
+
+Interactions trigger responses on Actions. You can place them on individual Bindings, or on Actions, in which case they apply to every Binding on the Action. At runtime, when a particular interaction completes, this triggers the Action.
+
+
+
+## How interactions work
+
+An Interaction has a set of distinct phases it can go through in response to receiving input.
+
+|Phase|Description|
+|-----|-----------|
+|`Waiting`|The Interaction is waiting for input.|
+|`Started`|The Interaction has started (that is, it received some of its expected input), but is not complete yet.|
+|`Performed`|The Interaction is complete.|
+|`Canceled`|The Interaction was interrupted and aborted. For example, the user pressed and then released a button before the minimum time required for a Hold Interaction to complete.|
+
+Not every Interaction triggers every phase, and the pattern in which specific Interactions trigger phases depends on the Interaction type.
+
+While `Performed` is typically the phase that triggers the actual response to an Interaction, `Started` and `Canceled` can be useful for providing UI feedback while the Interaction is in progress. For example, when a [hold](built-in-interactions.md#hold) is `Started`, the app can display a progress bar that fills up until the hold time has been reached. If, however, the hold is `Canceled` before it completes, the app can reset the progress bar to the beginning.
+
+
+The following example demonstrates this using a [Slow Tap interaction](./built-in-interactions.md#slowtap) on a `Jump` action so that the user can tap to jump immediately, or hold down the jump button to charge up a higher powered jump, displaying a UI to show the amount charged:
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+using UnityEngine.InputSystem.Interactions;
+
+public class ExampleScript : MonoBehaviour
+{
+ InputAction jumpAction;
+
+ private void Start()
+ {
+ jumpAction = InputSystem.actions.FindAction("Jump");
+
+
+ jumpAction.started += context =>
+ {
+ if (context.interaction is SlowTapInteraction)
+ {
+ // Show "charging" UI
+ }
+ };
+
+ jumpAction.performed += context =>
+ {
+ if (context.interaction is SlowTapInteraction)
+ {
+ // call "charged jump" code
+ }
+ else
+ {
+ // call "regular jump" code
+ };
+ };
+
+ jumpAction.canceled += context =>
+ {
+ // Hide "charging" UI
+ };
+
+ }
+}
+```
+
+## Multiple Controls on an Action
+
+If you have multiple Controls bound to a Binding or an Action which has an Interaction, then the Input System first applies the [Control conflict resolution](binding-conflicts.md) logic to get a single value for the Action, which it then feeds to the Interaction logic. Any of the bound Controls can perform the Interaction.
+
+## Multiple Interactions on a Binding
+
+If multiple Interactions are present on a single Binding or Action, then the Input System checks the Interactions in the order they are present on the Binding. The code example above illustrates this example. The Binding on the `fireAction` Action has two Interactions: `WithInteractions("tap;slowTap")`. The [tap](built-in-interactions.md#tap) Interaction gets a first chance at interpreting the input from the Action. If the button is pressed, the Action calls the `Started` callback on the tap Interaction. If the user keeps holding the button, the tap Interaction times out, and the Action calls the [`Canceled`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_canceled) callback for the tap Interaction and starts processing the [slow tap](built-in-interactions.md#slowtap) Interaction (which now receives a `Started` callback).
+
+At any one time, only one Interaction can be "driving" the action (that is, it gets to determine the action's current [`phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase)). If an Interaction higher up in the stack cancels, Interactions lower down in the stack can take over.
+
+Note that the order of interactions can affect which interaction is passed to your callback function. For example, an action with [Tap](built-in-interactions.md#tap), [MultiTap](built-in-interactions.md#multitap) and [Hold](built-in-interactions.md#hold) interactions will have different behaviour when the interactions are in a different order, such as [Hold](built-in-interactions.md#hold), [MultiTap](built-in-interactions.md#multitap) and [Tap](built-in-interactions.md#tap). If you get unexpected behaviour, you may need to experiment with a different ordering.
+
+## Timeouts
+
+Interactions might need to wait a certain time for a specific input to occur or to not occur. An example of this is the [Hold](built-in-interactions.md#hold) interaction which, after a button is pressed, has to wait for a set [duration](../api/UnityEngine.InputSystem.Interactions.HoldInteraction.html#UnityEngine_InputSystem_Interactions_HoldInteraction_duration) until the "hold" is complete. To do this, an interaction installs a timeout using [`SetTimeout`](../api/UnityEngine.InputSystem.InputInteractionContext.html#UnityEngine_InputSystem_InputInteractionContext_SetTimeout_System_Single_).
+
+It can be useful to know how much of a timeout is left for an interaction to complete. For example, you might want to display a bar in the UI that is charging up while the interaction is waiting to complete. To query the percentage to which a timeout has completed, use [`GetTimeoutCompletionPercentage`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_GetTimeoutCompletionPercentage_).
+
+```CSharp
+// Returns a value between 0 (inclusive) and 1 (inclusive).
+var warpActionCompletion = playerInput.actions["warp"].GetTimeoutCompletionPercentage();
+```
+
+Note that each Interaction can have its own separate timeout (but only a single one at any one time). If [multiple interactions](#multiple-interactions-on-a-binding) are in effect, then [`GetTimeoutCompletionPercentage`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_GetTimeoutCompletionPercentage_) will only use the timeout of the one interaction that is currently driving the action.
+
+Some Interactions might involve multiple timeouts in succession. In this case, knowing only the completion of the currently running timeout (if any) is often not useful. An example is [`MultiTapInteraction`](../api/UnityEngine.InputSystem.Interactions.MultiTapInteraction.html), which involves a timeout on each individual tap, as well as a timeout in-between taps. The Interaction is complete only after a full tap sequence has been performed.
+
+An Interaction can use [`SetTotalTimeoutCompletionTime`](../api/UnityEngine.InputSystem.InputInteractionContext.html#UnityEngine_InputSystem_InputInteractionContext_SetTotalTimeoutCompletionTime_System_Single_) to inform the Input System of the total time it will run timeouts for.
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-multiplayer-ui-input.md b/Packages/com.unity.inputsystem/Documentation~/introduction-multiplayer-ui-input.md
new file mode 100644
index 0000000000..1838cf21cf
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-multiplayer-ui-input.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-multiplayer-ui-input-intro
+---
+
+# Introduction to multiplayer UI input
+
+The Input System can handle multiple separate UI instances on the screen controlled separately by different [bindings](bindings.md). This is useful if you want to have multiple local players share a single screen with different controllers, so that every player can control their own UI instance.
+
+To implement multiplayer UI, the Input System uses the Multiplayer Event System.
+
+
+
+You can have multiple Multiplayer Event Systems active in the Scene at the same time. This means you can have multiple players, each with their own [UI Input Module](using-ui-input-module.md) and Multiplayer Event System components, and each player can have their own set of actions driving their own UI instance.
+
+The properties of the Multiplayer Event System component are mostly identical to those in the [Event System](https://docs.unity3d.com/Manual/script-EventSystem.html) component. However, the Multiplayer Event System component also has a [Player Root](../api/UnityEngine.InputSystem.UI.MultiplayerEventSystem.html#UnityEngine_InputSystem_UI_MultiplayerEventSystem_playerRoot) property, which defines a parent GameObject for UI [selectables](https://docs.unity3d.com/Manual/script-Selectable.html). When each player has a Multiplayer Event System with a **Player** Root assigned, UI navigation input for each player is limited to UI selectables that are child GameObjects of the Player Root.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-on-screen-controls.md b/Packages/com.unity.inputsystem/Documentation~/introduction-on-screen-controls.md
new file mode 100644
index 0000000000..1db4d4d43d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-on-screen-controls.md
@@ -0,0 +1,27 @@
+---
+uid: input-system-on-screen
+---
+# Introduction to on-screen controls
+
+You can use on-screen controls to simulate Input Devices with UI widgets that the user interacts with on the screen. The most prominent example is the use of stick and button widgets on touchscreens to emulate a joystick or gamepad.
+
+There are two built-in on-screen control types:
+
+* [On-screen buttons](create-on-screen-button-control.md)
+* [On-screen sticks](create-on-screen-stick-control.md)
+
+You can implement custom controls by extending the base [`OnScreenControl`](../api/UnityEngine.InputSystem.OnScreen.OnScreenControl.html) class (see documentation on [writing custom on screen controls](create-custom-on-screen-control.md) to learn more).
+
+>[!NOTE]
+>On-screen controls don't have a predefined visual representation. It's up to you to set up the visual aspect of a control (for example, by adding a sprite or UI component to the GameObject). On-screen controls take care of the interaction logic and of setting up and generating input from interactions.
+
+Each on-screen control uses a [control path](control-paths.md) to reference the control that it should report input as. For example, the following on-screen button reports input as the right shoulder button of a gamepad:
+
+
+
+The collection of on-screen controls present in a Scene forms one or more [input devices](devices.md). The Input System creates one input Device for each distinct type of device the controls reference. For example, if one on-screen button references `/buttonSouth` and another on-screen button references `/a`, the Input System creates both a `Gamepad` and a `Keyboard`. This happens automatically when the components are enabled. When disabled, the Input System automatically removes the devices again.
+
+To query the control (and, implicitly, the device) that an on-screen control feeds into, you can use the [`OnScreenControl.control`](../api/UnityEngine.InputSystem.OnScreen.OnScreenControl.html#UnityEngine_InputSystem_OnScreen_OnScreenControl_control) property.
+
+>[!NOTE]
+>This design allows you to use on-screen controls to create input for arbitrary input devices, in addition to joysticks and gamepads.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-to-bindings.md b/Packages/com.unity.inputsystem/Documentation~/introduction-to-bindings.md
new file mode 100644
index 0000000000..09032ecb3d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-to-bindings.md
@@ -0,0 +1,17 @@
+---
+uid: input-system-bindings-intro
+---
+
+# Introduction to bindings
+
+
+
+A **binding** represents a connection between an [Action](actions.md) and one or more [Controls](controls.md) identified by a [Control path](./control-paths.md). For example, the right trigger of a gamepad (a control) might be bound to an an action named `accelerate`, so that pulling the right trigger causes a car to accelerate in your game.
+
+You can add multiple bindings to an action, which is generally useful for supporting multiple types of input device. For example, in the default set of actions, the "Move" action has a binding to the left gamepad stick and the WSAD keys, which means input through any of these bindings will perform the action.
+
+You can also bind multiple controls from the same device to an action. For example, both the left and right trigger of a gamepad could be mapped to the same action, so that pulling either trigger has the same result in your game.
+
+
+_The default "Move" action in the Actions Editor window, displaying the multiple bindings associated with it._
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-to-controls.md b/Packages/com.unity.inputsystem/Documentation~/introduction-to-controls.md
new file mode 100644
index 0000000000..9a4ac86d3d
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-to-controls.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-intro-controls
+---
+
+# Introduction to controls
+
+A **control** is a part of a [device](devices.md) that sends values to the Input System when [actuated](control-actuation.md). Devices usually have multiple controls integrated into a single physical object. On a gamepad device, each of the buttons and sticks are controls. On a keyboard device, each of the individual keys are controls. Controls can take many other forms unique to certain types of device such as the pressure and radius of a pen, or the three-dimensional orientation of an XR input device.
+
+In most scenarios, to set up input for your app, use the [Actions Editor window](actions-editor.md) to [bind](./bindings.md) controls to [actions](actions.md), so that when a user presses a button or moves a stick, the Input System sends the values from that control to the action which you can then [write code to respond](./respond-to-input.md).
+
+## Control names
+
+Each control is identified by a name ([`InputControl.name`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_name)) and can optionally have a display name ([`InputControl.displayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_displayName)) that differs from the control name. For example, the right-hand face button closest to the touchpad on a PlayStation DualShock 4 controller has the control name `buttonWest` and the display name `Square`.
+
+Additionally, a control might have one or more aliases which provide alternative names for the control. You can access the aliases for a specific control through its [`InputControl.aliases`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_aliases) property.
+
+Finally, a control might also have a short display name which can be accessed through the [`InputControl.shortDisplayName`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_shortDisplayName) property. For example, the short display name for the left mouse button is "LMB".
+
+## Control value types
+
+A control represents a source of values. These values can be of any structured or primitive type, such as `float`, `Vector2`, or `Quaternion`. The only requirement is that the type is [blittable](https://docs.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types).
+
+## Parts of devices that are not controls
+
+Devices sometimes have other functional parts that are not considered controls. For example, output and configuration items such as haptic feedback, player number indicator lights, and on/off switches. The Input System only considers a part to be a control if it sends values for the purposes of input.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-to-processors.md b/Packages/com.unity.inputsystem/Documentation~/introduction-to-processors.md
new file mode 100644
index 0000000000..a21d4e5379
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-to-processors.md
@@ -0,0 +1,41 @@
+---
+uid: input-system-intro-processors
+---
+
+# Introduction to processors
+
+Input processors apply processing to input values, and return the result. The Input System’s [built-in processors](built-in-processors.md) can apply value clamping, scaling, normalization, inversion, and deadzones. You can also create [custom processors](write-custom-processors.md) to apply additional data processing to input values.
+
+You can install processors on [bindings](bindings.md), [actions](actions.md) or [controls](controls.md). The Input System [registers](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterProcessor__1_System_String_) each processor with a unique name. This means that if you need to replace an existing processor, you need to register the new processor under the name of the existing processor.
+
+Processors can have boolean, integer, and floating-point number parameters. When created in data such as [bindings](./bindings.md), processors are described as strings that look like function calls.
+
+For example, the following string references the processor registered as "scale" and sets its "factor" parameter to a floating-point value of 2.5:
+
+```CSharp
+ "scale(factor=2.5)"
+```
+
+Multiple processors can be chained together. The Input System processes them in the order they appear in code. For example, the following string inverts a value, then normalizes [0..10] values to [0..1]:
+
+```CSharp
+ "invert,normalize(min=0,max=10)"
+```
+
+## Processors on bindings and actions
+
+When you create bindings for your [actions](actions.md), you can choose to add processors to the bindings. These process the values from the controls they bind to, before the system applies them to the action value. For example, you could invert the `Vector2` values from the controls along the Y axis before passing the values to the associated action.
+
+Processors on actions work the same way, but affect all bindings on an action.
+
+If there are processors on both the binding and the action, the Input System processes the processors from the binding first.
+
+To apply a processor to a binding or action, refer to [Add processors to bindings and actions](add-processors-bindings-actions.md).
+
+## Processors on controls
+
+You can have any number of processors directly on an [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html), which then process the values read from the Control. Whenever you call [`ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) on a Control, all processors on that Control process the value before it gets returned to you. You can use [`ReadUnprocessedValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadUnprocessedValue) on a Control to bypass the processors.
+
+The devices that the Input System supports out of the box already have some useful processors added to their controls by default. For example, sticks on gamepads have a [Stick Deadzone](built-in-processors.md#stick-deadzone) processor.
+
+To apply a processor to a control, refer to [Add processors to controls](add-processors-controls.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-ui-input-module.md b/Packages/com.unity.inputsystem/Documentation~/introduction-ui-input-module.md
new file mode 100644
index 0000000000..cfd86a90ed
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-ui-input-module.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-ui-module-intro
+---
+
+# Introduction to the UI Input Module
+
+The UI Input Module passes actions from your Input System to your UI, alongside some other UI-related input settings.
+
+You must use the **UI Input Module** when working with Unity UI (uGUI), or when using UI Toolkit in versions of Unity prior to Unity 2023.2.
+
+You don't need to specify to the UI Input Module which UI system you are using. Input support for both [Unity UI](https://docs.unity3d.com/Manual/com.unity.ugui.html) and [UI Toolkit](https://docs.unity3d.com/Manual/UIElements.html) is based on the same [Event System](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/EventSystem.html) and [BaseInputModule](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/InputModules.html) subsystem.
+
+The UI Input module is implemented in the class [`InputSystemUIInputModule`](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html).
+
+## Input priority
+
+If you have an instance of the [Input System UI Input Module](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) component in your scene, the settings on that component takes priority and are used instead of the UI settings in your project-wide actions. The UI action map is enabled, along with the default action map specified on any UI Input Module component in the scene.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/introduction-virtual-mouse.md b/Packages/com.unity.inputsystem/Documentation~/introduction-virtual-mouse.md
new file mode 100644
index 0000000000..560413d701
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/introduction-virtual-mouse.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-virtual-mouse-intro
+---
+
+# Introduction to Virtual Mouse for UI cursor control
+
+If your application uses gamepads and joysticks as an input, you can use [navigation input actions](supported-ui-input-types-navigation.md) to operate the UI. However, it usually involves extra work to make the UI work well with navigation.
+
+An alternative way to operate the UI is to allow gamepads and joysticks to drive the cursor from a virtual mouse. The Input System package provides a **Virtual Mouse** component for this purpose.
+
+At runtime, the component adds a virtual [Mouse](../api/UnityEngine.InputSystem.Mouse.html) device which the [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html) component picks up. The controls of the `Mouse` are fed input based on the actions configured on the [VirtualMouseInput](../api/UnityEngine.InputSystem.UI.VirtualMouseInput.html) component.
+
+Note that the resulting [Mouse](../api/UnityEngine.InputSystem.Mouse.html) input is visible in all code that picks up input from the mouse device. You can therefore use the component for mouse simulation elsewhere, not just with [InputSystemUIInputModule](../api/UnityEngine.InputSystem.UI.InputSystemUIInputModule.html).
+
+To see an example of the Virtual Mouse in a project, see the [Gamepad Mouse Cursor sample](Installation.md#installing-samples) included with the Input System package.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/keyboards-introduction.md b/Packages/com.unity.inputsystem/Documentation~/keyboards-introduction.md
new file mode 100644
index 0000000000..832d92cc67
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/keyboards-introduction.md
@@ -0,0 +1,13 @@
+---
+uid: input-system-keyboard-intro
+---
+
+# Keyboard devices introduction
+
+The [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) class defines a device with a set of key controls defined by the [`Key`](xref:UnityEngine.InputSystem.Key) enumeration.
+
+The location of individual keys is agnostic to keyboard layout. This means that, for example, the **A** key is always the key to the right of the **Caps Lock** key, regardless of where the active keyboard layout places the key that generates the A character, or whether the layout has a key assigned to that character.
+
+For a list of platforms that support keyboard devices, refer to [Supported devices reference](supported-devices-reference.md).
+
+The [scripting API reference for the `Keyboard` class](xref:UnityEngine.InputSystem.Keyboard) lists all the properties for the individual key controls. Two controls, [`anyKey`](xref:UnityEngine.InputSystem.Keyboard.anyKey) and [`imeSelected`](xref:UnityEngine.InputSystem.Keyboard.imeSelected), don't directly map to individual keys. `anyKey` is a [synthetic](synthetic-controls.md) button control which reports whether any key on the keyboard is pressed, and `imeSelected`reports whether or not [IME](read-keyboard-text-input.md#working-with-input-from-input-method-editors) text processing is enabled.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/layout-formats.md b/Packages/com.unity.inputsystem/Documentation~/layout-formats.md
new file mode 100644
index 0000000000..2abe7957f5
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/layout-formats.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-layout-formats
+---
+
+# Layout formats
+
+Add new layouts using the approach that fits how you author and register devices in your project.
+
+You can define layouts in three ways: as C# types, as JSON, or with the layout builder API at runtime. Use C# or JSON when your layout is fixed at build time. Use the layout builder when device structure is discovered dynamically, such as for [HID](hid-specification.md) devices.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Add a layout from C#](add-layout-from-cs.md)** | Register a layout using C# classes derived from InputControl or InputDevice. |
+| **[Add a layout from JSON](add-layout-from-json.md)** | Register a layout from JSON to store or load definitions separately from your code. |
+| **[Add a layout using Layout Builder](add-layout-using-layout-builder.md)** | Build a layout at runtime with the layout builder API. |
+
+## Additional resources
+
+- [Human Interface Device specification](hid-specification.md)
+- [Use an existing input device to create a layout](hid-create-custom-layout-existing.md)
+- [Create a custom device](create-custom-device.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/layout-inheritance.md b/Packages/com.unity.inputsystem/Documentation~/layout-inheritance.md
new file mode 100644
index 0000000000..0389f69691
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/layout-inheritance.md
@@ -0,0 +1,11 @@
+---
+uid: input-system-layout-inheritance
+---
+
+# Layout inheritance
+
+You can derive a layout from an existing layout. This process is based on merging the information from the derived layout on top of the information that the base layout contains.
+
+* For layouts defined as types, the base layout is the layout of the base type (if any).
+* For layouts defined in JSON, you can specify the base layout in the `extends` property of the root node.
+* For layouts created in code using [`InputControlLayout.Builder`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.html), you can specify a base layout using [`InputControlLayout.Builder.Extend()`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.Builder.html#UnityEngine_InputSystem_Layouts_InputControlLayout_Builder_Extend_System_String_).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/listen-to-events.md b/Packages/com.unity.inputsystem/Documentation~/listen-to-events.md
new file mode 100644
index 0000000000..1dec05ee12
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/listen-to-events.md
@@ -0,0 +1,38 @@
+---
+uid: input-system-listen-to-events
+---
+
+# Listen to events
+
+If you want to do any monitoring or processing on incoming events yourself, subscribe to the [`InputSystem.onEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onEvent) callback.
+
+```CSharp
+InputSystem.onEvent +=
+ (eventPtr, device) =>
+ {
+ Debug.Log($"Received event for {device}");
+ };
+```
+
+An [`IObservable`](https://docs.microsoft.com/en-us/dotnet/api/system.iobservable-1) interface is provided to more conveniently process events.
+
+```CSharp
+// Wait for first button press on a gamepad.
+InputSystem.onEvent
+ .ForDevice()
+ .Where(e => e.HasButtonPress())
+ .CallOnce(ctrl => Debug.Log($"Button {ctrl} pressed"));
+```
+
+To enumerate the controls that have value changes in an event, you can use [`InputControlExtensions.EnumerateChangedControls`](../api/UnityEngine.InputSystem.InputControlExtensions.html#UnityEngine_InputSystem_InputControlExtensions_EnumerateChangedControls_UnityEngine_InputSystem_LowLevel_InputEventPtr_UnityEngine_InputSystem_InputDevice_System_Single_).
+
+```CSharp
+InputSystem.onEvent
+ .Call(eventPtr =>
+ {
+ foreach (var control in eventPtr.EnumerateChangedControls())
+ Debug.Log($"Control {control} changed value to {control.ReadValueFromEventAsObject(eventPtr)}");
+ };
+```
+
+This is significantly more efficient than manually iterating over [`InputDevice.allControls`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_allControls) and reading out the value of each control from the event.
diff --git a/Packages/com.unity.inputsystem/Documentation~/local-multiplayer-scenarios.md b/Packages/com.unity.inputsystem/Documentation~/local-multiplayer-scenarios.md
new file mode 100644
index 0000000000..80d452bacc
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/local-multiplayer-scenarios.md
@@ -0,0 +1,8 @@
+---
+uid: input-system-local-mutliplayer-scenarios
+---
+
+# Local multiplayer scenarios
+
+You can also have multiple **Player Input** components active at the same time (each on a separate instance of a prefab) along with the [**Player Input Manager**](player-input-manager-component.md) component to implement local multiplayer features, such as device filtering, and screen-splitting.
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/look-up-bindings.md b/Packages/com.unity.inputsystem/Documentation~/look-up-bindings.md
new file mode 100644
index 0000000000..f3df76d2b0
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/look-up-bindings.md
@@ -0,0 +1,41 @@
+---
+uid: input-system-look-up-bindings
+---
+
+# Look up bindings
+
+You can retrieve the bindings of an action using its [`InputAction.bindings`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_bindings) property which returns a read-only array of [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html) structs.
+
+```CSharp
+ // Get bindings of "fire" action.
+ var fireBindings = playerInput.actions["fire"].bindings;
+```
+
+Also, all the bindings for all actions in an [`InputActionMap`](../api/UnityEngine.InputSystem.InputActionMap.html) are made available through the [`InputActionMap.bindings`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_bindings) property. The bindings are associated with actions through an [action ID](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_id) or [action name](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_name) stored in the [`InputBinding.action`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_action) property.
+
+```CSharp
+ // Get all bindings in "gameplay" action map.
+ var gameplayBindings = playerInput.actions.FindActionMap("gameplay").bindings;
+```
+
+You can also look up the indices of specific bindings in [`InputAction.bindings`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_bindings) using the [`InputActionRebindingExtensions.GetBindingIndex`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetBindingIndex_UnityEngine_InputSystem_InputAction_UnityEngine_InputSystem_InputBinding_) method.
+
+```CSharp
+ // Find the binding in the "Keyboard" control scheme.
+ playerInput.actions["fire"].GetBindingIndex(group: "Keyboard");
+
+ // Find the first binding to the space key in the "gameplay" action map.
+ playerInput.FindActionMap("gameplay").GetBindingIndex(
+ new InputBinding { path = "/space" });
+```
+
+Finally, you can look up the binding that corresponds to a specific control through [`GetBindingIndexForControl`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_GetBindingIndexForControl_). This way, you can, for example, map a control found in the [`controls`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_controls) array of an [`InputAction`](../api/UnityEngine.InputSystem.InputAction.html) back to an [`InputBinding`](../api/UnityEngine.InputSystem.InputBinding.html).
+
+```CSharp
+ // Find the binding that binds LMB to "fire". If there is no such binding,
+ // bindingIndex will be -1.
+ var fireAction = playerInput.actions["fire"];
+ var bindingIndex = fireAction.GetBindingIndexForControl(Mouse.current.leftButton);
+ if (binding == -1)
+ Debug.Log("Fire is not bound to LMB of the current mouse.");
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/manually-add-remove-devices.md b/Packages/com.unity.inputsystem/Documentation~/manually-add-remove-devices.md
new file mode 100644
index 0000000000..a08338f66a
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/manually-add-remove-devices.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-manually-add-remove-devices
+---
+
+# Manually add and remove devices
+
+To manually add and remove Devices through the API, use [`InputSystem.AddDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice_UnityEngine_InputSystem_InputDevice_) and [`InputSystem.RemoveDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RemoveDevice_UnityEngine_InputSystem_InputDevice_).
+
+This allows you to create your own Devices, which can be useful for testing purposes, or for creating virtual Input Devices which synthesize input from other events. As an example, see the [on-screen Controls](on-screen-controls.md) that the Input System provides. The Input Devices used for on-screen Controls are created entirely in code and have no [native representation](#native-devices).
diff --git a/Packages/com.unity.inputsystem/Documentation~/migrate-from-old-input-system.md b/Packages/com.unity.inputsystem/Documentation~/migrate-from-old-input-system.md
new file mode 100644
index 0000000000..fcbe1c8673
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/migrate-from-old-input-system.md
@@ -0,0 +1,13 @@
+---
+uid: input-system-migrate-from-old-system
+---
+
+# Migrate from the old input system
+
+This page is provided to help you match input-related API from Unity's old, built-in input (known as the [Input Manager](https://docs.unity3d.com/Manual/class-InputManager.html)) to the corresponding API in the new Input System package.
+
+## Read the introductory documentation first
+
+If you're new to the Input System package and have landed on this page looking for documentation, it's best to read the [QuickStart Guide](quick-start-guide.md), and the [Concepts](understanding-input.md) and [Workflows](workflows.md) pages from the introduction section of the documentation, so that you can make sure you're choosing the best workflow for your project's input requirements.
+
+This is because there are a number of different ways to read input using the Input System, and some of the directly corresponding API methods on this page might give you the quickest - but least flexible - solution, and may not be suitable for a project with more complex requirements.
diff --git a/Packages/com.unity.inputsystem/Documentation~/monitor-device-state-changes.md b/Packages/com.unity.inputsystem/Documentation~/monitor-device-state-changes.md
new file mode 100644
index 0000000000..b78a22a9e5
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/monitor-device-state-changes.md
@@ -0,0 +1,7 @@
+---
+uid: input-system-monitor-device-state-changes
+---
+
+# Monitor device state changes
+
+You can use [`InputState.AddChangeMonitor()`](../api/UnityEngine.InputSystem.LowLevel.InputState.html#UnityEngine_InputSystem_LowLevel_InputState_AddChangeMonitor_UnityEngine_InputSystem_InputControl_System_Action_UnityEngine_InputSystem_InputControl_System_Double_UnityEngine_InputSystem_LowLevel_InputEventPtr_System_Int64__System_Int32_System_Action_UnityEngine_InputSystem_InputControl_System_Double_System_Int64_System_Int32__) to register a callback to be called whenever the state of a Control changes. The Input System uses the same mechanism to implement [input Actions](actions.md).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/monitor-devices.md b/Packages/com.unity.inputsystem/Documentation~/monitor-devices.md
new file mode 100644
index 0000000000..16eeae6136
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/monitor-devices.md
@@ -0,0 +1,34 @@
+---
+uid: input-system-monitor-devices
+---
+
+# Monitor devices
+
+To be notified when new Devices are added or existing Devices are removed, use [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange).
+
+```CSharp
+InputSystem.onDeviceChange +=
+ (device, change) =>
+ {
+ switch (change)
+ {
+ case InputDeviceChange.Added:
+ // New Device.
+ break;
+ case InputDeviceChange.Disconnected:
+ // Device got unplugged.
+ break;
+ case InputDeviceChange.Connected:
+ // Plugged back in.
+ break;
+ case InputDeviceChange.Removed:
+ // Remove from Input System entirely; by default, Devices stay in the system once discovered.
+ break;
+ default:
+ // See InputDeviceChange reference for other event types.
+ break;
+ }
+ }
+```
+
+[`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) delivers notifications for other device-related changes as well. See the [`InputDeviceChange` enum](../api/UnityEngine.InputSystem.InputDeviceChange.html) for more information.
diff --git a/Packages/com.unity.inputsystem/Documentation~/mouse-introduction.md b/Packages/com.unity.inputsystem/Documentation~/mouse-introduction.md
new file mode 100644
index 0000000000..f3dc005505
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/mouse-introduction.md
@@ -0,0 +1,14 @@
+---
+uid: input-system-mouse-intro
+---
+
+# Mouse devices introduction
+
+The Input System represents mouse input with the [`MouseState`](xref:UnityEngine.InputSystem.LowLevel.MouseState) [device layout](layouts.md) that the [`Mouse`](xref:UnityEngine.InputSystem.Mouse) class implements.
+
+>[!IMPORTANT]
+>The Input System doesn't support input from multiple mice at the platform level, or identifying the current display a mouse is on.
+
+The `Mouse` class is based on the [pointer layout](devices-pointers.md) so inherits its controls. It also implements additional controls outlined in the [Mouse API documentation](xref:UnityEngine.InputSystem.Mouse).
+
+For a list of platforms that support mice, refer to [Supported devices reference](supported-devices-reference.md).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/multiplayer-event-system-component-input.md b/Packages/com.unity.inputsystem/Documentation~/multiplayer-event-system-component-input.md
new file mode 100644
index 0000000000..a4b5450daf
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/multiplayer-event-system-component-input.md
@@ -0,0 +1,13 @@
+## Multiplayer Event System component reference
+
+Use the Multiplayer Event System component to configure input for a specific user in a multiplayer application.
+
+
+
+|**Property**|**Description**|
+|--------|-----------|
+**First Selected**| Define which GameObject is selected first. |
+|**Send Navigation Events**| Define whether the Event System should send navigation events such as move, submit, and cancel. |
+|**Drag Threshold**| Define the soft area for dragging in pixels. |
+|**Player Root**| Define which part of the hierarchy belongs to the current user. |
+|**Add Default Input Modules**| Add the default Input System components to the same GameObject as this Multiplayer Event System component.|
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/multiplayer-ui-input.md b/Packages/com.unity.inputsystem/Documentation~/multiplayer-ui-input.md
new file mode 100644
index 0000000000..6e8c7a5199
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/multiplayer-ui-input.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-multiplayer-ui-input
+---
+
+# Multiplayer UI input
+
+Give each local player their own UI on a shared screen, with separate navigation and selection per controller or device.
+
+The Input System uses a [Multiplayer Event System](../api/UnityEngine.InputSystem.UI.MultiplayerEventSystem.html) so multiple [UI Input Module](using-ui-input-module.md) instances can run at once—one per player. Start with the introduction, then configure components and Player Root hierarchy for your scene.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Introduction to multiplayer UI input](introduction-multiplayer-ui-input.md)** | Learn how Multiplayer Event System scopes UI navigation to each player's controls on a shared screen. |
+| **[Configure multiplayer UI input](configure-multiplayer-ui-input.md)** | Replace the Event System, assign Player Root, and wire UI Input Module actions for each player. |
+
+## Additional resources
+
+- [Use the Player Input component with UI](use-player-input-component-ui.md)
+- [Using UI Input Module for UI support](using-ui-input-module.md)
+- [Use a Virtual Mouse for UI cursor control](virtual-mouse-ui-cursor-control.md)
+- [The Player Input component](player-input-component.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/native-devices.md b/Packages/com.unity.inputsystem/Documentation~/native-devices.md
new file mode 100644
index 0000000000..46dc4900d3
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/native-devices.md
@@ -0,0 +1,32 @@
+---
+uid: input-system-native-devices
+---
+
+# Native devices
+
+Devices that the [native backend](Architecture.md#native-backend) reports are considered native (as opposed to Devices created from script code). To identify these Devices, you can check the [`InputDevice.native`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_native) property.
+
+The Input System remembers native Devices. For example, if the system has no matching layout when the Device is first reported, but a layout which matches the device is registered later, the system uses this layout to recreate the Device.
+
+You can force the Input System to use your own [layout](layouts.md) when the native backend discovers a specific Device, by describing the Device in the layout, like this:
+
+```
+ {
+ "name" : "MyGamepad",
+ "extend" : "Gamepad",
+ "device" : {
+ // All strings in here are regexs and case-insensitive.
+ "product" : "MyController",
+ "manufacturer" : "MyCompany"
+ }
+ }
+```
+
+Note: You don't have to restart Unity in order for changes in your layout to take effect on native Devices. The Input System applies changes automatically on every domain reload, so you can just keep refining a layout and your Device is recreated with the most up-to-date version every time scripts are recompiled.
+
+
+## Disconnected Devices
+
+If you want to get notified when Input Devices disconnect, subscribe to the [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) event, and look for events of type [`InputDeviceChange.Disconnected`](../api/UnityEngine.InputSystem.InputDeviceChange.html).
+
+The Input System keeps track of disconnected Devices in [`InputSystem.disconnectedDevices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_disconnectedDevices). If one of these Devices reconnects later, the Input System can detect that the Device was connected before, and reuses its [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) instance. This allows the [`PlayerInputManager`](player-input-manager-component.md) to reassign the Device to the same [user](user-management.md) again.
diff --git a/Packages/com.unity.inputsystem/Documentation~/noisy-controls.md b/Packages/com.unity.inputsystem/Documentation~/noisy-controls.md
new file mode 100644
index 0000000000..0c6f8cb1a1
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/noisy-controls.md
@@ -0,0 +1,21 @@
+---
+uid: input-system-noisy-controls
+---
+
+# Noisy controls
+
+Noisy controls are those that can change value without any actual or intentional user interaction required. For example, they gyroscope sensor in a cellphone provides noisy input data because even if the cellphone is at rest, there are usually fluctuations in the control's value readings. Another example are orientation readings from a head-mounted display.
+
+Some built-in control types are marked as **noisy**. You can query this using the [`InputControl.noisy`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_noisy) property, or by inspecting the control types in the [Input Debugger window](the-input-debugger-window.md).
+
+If a control is marked as noisy:
+
+- The control is not considered for [interactive rebinding](interactive-rebinding.md). [`InputActionRebindingExceptions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) ignores the control by default (you can bypass this using [`WithoutIgnoringNoisyControls`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithoutIgnoringNoisyControls)).
+
+- The Input System performs additional event filtering to filter out noise, then calls [`InputDevice.MakeCurrent`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_MakeCurrent) if any non-noise values cause the control to change state. If an input event for a Device contains no state change on a control that is not marked noisy, then the Device will not be made current based on the event. This avoids, for example, a plugged in PS4 controller constantly making itself the current gamepad ([`Gamepad.current`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_current)) due to its sensors constantly feeding data into the system.
+
+- When the application loses focus and Devices are [reset](reset-device.md) as a result, the state of noisy control will be preserved as is. This ensures that sensor readings will remain at their last value rather than being reset to default values.
+
+>**Note**: If any control on a device is noisy, the device itself is flagged as noisy.
+
+In addition to the [`input state`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_currentStatePtr) and the [`default state`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_defaultStatePtr) that the Input System keeps for all Devices currently present, it also maintains a [`noise mask`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_noiseMaskPtr) in which only bits for state that is __not__ noise are set. You can use this to efficiently mask out noise in input.
diff --git a/Packages/com.unity.inputsystem/Documentation~/on-screen-controls.md b/Packages/com.unity.inputsystem/Documentation~/on-screen-controls.md
new file mode 100644
index 0000000000..afdcd0fba6
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/on-screen-controls.md
@@ -0,0 +1,20 @@
+---
+uid: input-system-on-screen
+---
+# Create on-screen controls
+
+Simulate input devices with UI widgets that the user interacts with on the screen.
+
+| **Topic** | **Description** |
+| :------------------------------ | :------------------------------- |
+|**[Introduction to on-screen controls](introduction-on-screen-controls.md)**| Simulate buttons, sticks, and custom inputs with on-screen controls. |
+|**[Create an on-screen button control](create-on-screen-button-control.md)**| Create and configure simulated on-screen button controls.|
+|**[Create an on-screen stick control](create-on-screen-stick-control.md)**| Create and configure simulated on-screen stick controls.|
+|**[Create a custom on-screen control](create-custom-on-screen-control.md)**| Create and configure custom simulated on-screen controls.|
+
+## Additional resources
+
+- [Manually add and remove devices](manually-add-remove-devices.md)
+- [Input for user interfaces](ui-input.md)
+- [Working with devices](working-with-devices.md)
+- [Custom devices](custom-devices.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/optimize-controls.md b/Packages/com.unity.inputsystem/Documentation~/optimize-controls.md
new file mode 100644
index 0000000000..29e53d02c3
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/optimize-controls.md
@@ -0,0 +1,54 @@
+---
+uid: input-system-optimize-controls
+---
+
+# Optimize controls
+
+The [recommended workflow](workflows.md) is sufficiently optimized for most scenarios. However in some specialized situations when reading values directly from controls, you can make small performance gains by implementing some of the following techniques.
+
+## Avoiding defensive copies
+
+Use [`InputControl.value`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_value) instead of [`InputControl.ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) to avoid creating a copy of the control state on every call, as the former returns the value as `ref readonly` while the latter always makes a copy. Note that this optimization only applies if the call site assigns the return value to a variable that has been declared 'ref readonly'. Otherwise a copy will be made as before. Additionally, be aware of defensive copies that can be allocated by the compiler when it is unable to determine that it can safely use the readonly reference i.e. if it can't determine that the reference won't be changed, it will create a defensive copy for you. For more details, see https://learn.microsoft.com/en-us/dotnet/csharp/write-safe-efficient-code#use-ref-readonly-return-statements.
+
+## Control Value Caching
+
+When the `'USE_READ_VALUE_CACHING'` internal feature flag is set, the Input System will switch to an optimized path for reading control values. This path efficiently marks controls as 'stale' when they have been actuated. Subsequent calls to [`InputControl.ReadValue`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadValue) will only apply control processing when there have been changes to that control or in case of control processing. Control processing in this case can mean any hard-coded processing that might exist on the control, such as with [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) which has built-in inversion, normalisation, scaling etc, or any processors that have been applied to the controls' [processor stack](add-processors-controls.md).
+> Note: Performance improvements **are currently not guaranteed** for all use cases. Even though this performance path marks controls as "stale" in an efficient way, it still has an overhead which can degrade performance in some cases.
+
+A positive performance impact has been seen when:
+- Reading from controls that do not change frequently.
+- In case the controls change every frame, are being read and have actions bound to them as well, e.g. on a Gamepad, reading `leftStick`, `leftStick.x` and `leftStick.left` for example when there's a action with composite bindings setup.
+
+On the other hand, it is likely to have a negative performance impact when:
+- No control reads are performed for a control, and there are a lot of changes for that particular control.
+- Reading from controls that change frequently that have no actions bound to those controls.
+
+Moreover, this feature is not enabled by default as it can result in the following minor behavioural changes:
+ * Some control processors use global state. Without cached value optimizations, it is possible to read the control value, change the global state, read the control value again, and get a new value due to the fact that the control processor runs on every call. With cached value optimizations, reading the control value will only ever return a new value if the physical control has been actuated. Changing the global state of a control processor will have no effect otherwise.
+ * Writing to device state using low-level APIs like [`InputControl.WriteValueIntoState`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_WriteValueIntoState__0_System_Void__) does not set the stale flag and subsequent calls to [`InputControl.value`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_value) will not reflect those changes.
+ * After changing properties on [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) the [`ApplyParameterChanges`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_ApplyParameterChanges) has to be called to invalidate cached value.
+
+Processors that need to run on every read can set their respective caching policy to EvaluateOnEveryRead. That will disable caching on controls that are using such processor.
+
+If there are any non-obvious inconsistencies, 'PARANOID_READ_VALUE_CACHING_CHECKS' internal feature flag can be enabled to compare cached and uncached value on every read and log an error if they don't match.
+
+## Optimized control read value
+
+When the `'USE_OPTIMIZED_CONTROLS'` internal feature flag is set, the Input System will use faster way to use state memory for some controls instances. This is very specific optimization and should be used with caution.
+
+Most controls are flexible with regards to memory representation, like [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) can be one bit, multiple bits, a float, etc, or in [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) where x and y can have different memory representation.
+Yet for most controls there are common memory representation patterns, for example [`AxisControl`](../api/UnityEngine.InputSystem.Controls.AxisControl.html) are floats or single bytes. Or some [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) are two consequitive floats in memory.
+If a control matches a common representation we can bypass reading its children control and cast the memory directly to the common representation. For example if [`Vector2Control`](../api/UnityEngine.InputSystem.Controls.Vector2Control.html) is two consecutive floats in memory we can bypass reading `x` and `y` separately and just cast the state memory to `Vector2`.
+
+This optimization has a performance impact on `PlayMode` as we do extra checks to ensure that the controls have the correct memory representation during development. Don't be alarmed if you see a performance drop in `PlayMode` when using this optimization as it's expected at this stage.
+
+This optimization only works if the controls don't need any processing applied to them, such as `invert`, `clamp`, `normalize`, `scale` or any other processor. If any of these are applied to the control, **there won't be any optimization applied** and the control will be read as usual.
+
+Also, [`InputControl.ApplyParameterChanges()`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_ApplyParameterChanges) **must be explicitly called** in specific changes to ensure [`InputControl.optimizedControlDataType`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_optimizedControlDataType) is updated to the correct memory representation. Make sure to call it when:
+* Configuration changes after [`InputControl.FinishSetup()`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_FinishSetup_) is called.
+* Changing parameters such [`AxisControl.invert`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_invert), [`AxisControl.clamp`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_clamp), [`AxisControl.normalize`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_normalize), [`AxisControl.scale`](../api/UnityEngine.InputSystem.Controls.AxisControl.html#UnityEngine_InputSystem_Controls_AxisControl_scale) or changing processors. The memory representation needs to be recalculated after these changes so that we know that the control is not optimized anymore. Otherwise, the control will be read with wrong values.
+
+The optimized controls work as follows:
+* A potential memory representation is set using [`InputControl.CalculateOptimizedControlDataType()`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_CalculateOptimizedControlDataType)
+* Its memory representation is stored in [`InputControl.optimizedControlDataType`](../api/UnityEngine.InputSystem.InputControl.html#UnityEngine_InputSystem_InputControl_optimizedControlDataType)
+* Finally, [`ReadUnprocessedValueFromState`](../api/UnityEngine.InputSystem.InputControl-1.html#UnityEngine_InputSystem_InputControl_1_ReadUnprocessedValueFromState_) uses the optimized memory representation to decide if it should cast to memory directly instead of reading every children control on it's own to reconstruct the controls state.
diff --git a/Packages/com.unity.inputsystem/Documentation~/override-layout-definitions.md b/Packages/com.unity.inputsystem/Documentation~/override-layout-definitions.md
new file mode 100644
index 0000000000..601a93206e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/override-layout-definitions.md
@@ -0,0 +1,22 @@
+---
+uid: input-system-override-layout-definitions
+---
+
+# Override layout definitions
+
+You can non-destructively change aspects of an existing layout using layout overrides. You can call [`InputSystem.RegisterLayoutOverride`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_RegisterLayoutOverride_System_String_System_String_) to register a layout as an override of its [base layout](#layout-inheritance). The system then adds any property present in the override to the base layout or to existing properties.
+
+```CSharp
+// Add an extra Control to the "Mouse" layout
+const string json = @"
+ {
+ ""name"" : ""Overrides"",
+ ""extend"" : ""Mouse"",
+ ""controls"" : [
+ { ""name"" : ""extraControl"", ""layout"" : ""Button"" }
+ ]
+ }
+";
+
+InputSystem.RegisterLayoutOverride(json);
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/pen-introduction.md b/Packages/com.unity.inputsystem/Documentation~/pen-introduction.md
new file mode 100644
index 0000000000..e159f0f081
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/pen-introduction.md
@@ -0,0 +1,13 @@
+---
+uid: input-system-pen-devices-intro
+---
+
+# Pen devices introduction
+
+The Input System supports pen devices on tablets and desktops, such as the various Wacom tablets. It also supports styluses on mobile devices, such as the stylus on the Samsung Note, the Apple Pencil on iOS, or the Surface Pen on the Microsoft Surface line of notebooks.
+
+Pens offer input features such as pressure sensitivity, in-range detection (being able to control the cursor while not yet touching the tablet or screen surface), and the ability to flip the pen for eraser-like behavior.
+
+For a list of platforms that support pen devices, refer to [Supported devices reference](supported-devices-reference.md).
+
+Pens are represented by the [`PenState`](xref:UnityEngine.InputSystem.LowLevel.PenState) [device layout](layouts.md) implemented by the `Pen` class. Pens are based on the [pointer layout](pointers-introduction.md). The `Pen` class inherits the controls from the `Pointer` layout, and also implements some additional controls. For more information, refer to the [Pen class API documentation](xref:UnityEngine.InputSystem.Pen).
diff --git a/Packages/com.unity.inputsystem/Documentation~/platform-specific-settings.md b/Packages/com.unity.inputsystem/Documentation~/platform-specific-settings.md
new file mode 100644
index 0000000000..2eb8e56298
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/platform-specific-settings.md
@@ -0,0 +1,34 @@
+---
+uid: input-system-platform-specific-settings
+---
+
+# Platform-specific settings
+
+## iOS/tvOS
+
+__Motion Usage__
+ Governs access to the [pedometer](supported-sensors-reference.md) on the device. If you enable this setting, the __Description__ field becomes editable. The text you enter into the Description field is added to your application's `Info.plist`.
+
+## Editor
+
+### Play Mode Input Behavior
+
+__Play Mode Input Behavior__ determines how input is handled in the Editor when in play mode. Unlike in built players, in the Unity Editor the input back-ends keep running for as long as the Editor is active, regardless of whether a Game View window is focused or not. This setting determines how input should behave when focus is __not__ on any Game View – and thus [`Application.isFocused`](https://docs.unity3d.com/ScriptReference/Application-isFocused.html) is false and the player considered to be running in the background.
+
+|Setting|Description|
+|-------|-----------|
+|[`Pointers And Keyboards Respect Game View Focus`](../api/UnityEngine.InputSystem.InputSettings.EditorInputBehaviorInPlayMode.html#UnityEngine_InputSystem_InputSettings_EditorInputBehaviorInPlayMode_PointersAndKeyboardsRespectGameViewFocus)|Only [Pointer](devices-pointers.md) and [Keyboard](devices-keyboard.md) Devices require the Game View to be focused. Other Devices will route their input into the application regardless of Game View focus. This setting essentially routes any input into the game that is, by default, not used to operate the Editor UI. So, Devices such as [gamepads](devices-gamepads.md) will go to the application at all times when in play mode whereas keyboard input, for example, will require explicitly giving focus to a Game View window. This setting is the default.|
+|[`All Devices Respect Game View Focus`](../api/UnityEngine.InputSystem.InputSettings.EditorInputBehaviorInPlayMode.html#UnityEngine_InputSystem_InputSettings_EditorInputBehaviorInPlayMode_AllDevicesRespectGameViewFocus)|Focus on a Game View is required for all Devices. When no Game View window is focused, all input goes to the editor and not to the application. This allows other EditorWindows to receive these inputs (from gamepads, for example).|
+|[`All Device Input Always Goes To Game View`](../api/UnityEngine.InputSystem.InputSettings.EditorInputBehaviorInPlayMode.html#UnityEngine_InputSystem_InputSettings_EditorInputBehaviorInPlayMode_AllDeviceInputAlwaysGoesToGameView)|All editor input is disabled and input is considered to be exclusive to Game Views. Also, [`Background Behavior`](#background-behavior) is to be taken literally and executed like in players. Meaning, if in a certain situation, a Device is disabled in the player, it will get disabled in the editor as well. This setting most closely aligns player behavior with editor behavior. Be aware, however, that no EditorWindows will be able to see input from Devices (this does not effect IMGUI and UITK input in the Editor in general as they do not consume input from the Input System).|
+
+### Input Action Property Drawer Mode
+
+Determines how the Inspector window displays [`InputActionProperty`](xref:UnityEngine.InputSystem.InputActionProperty) fields.
+
+This setting is not shown in the **Edit** > **Project Settings** window, it is instead only available in the Debug mode of the Inspector window of an Input Settings asset. See the Unity Manual page for [working in the Inspector](https://docs.unity3d.com/Manual/InspectorOptions.html) under section Toggle Debug Mode.
+
+|Setting|Description|
+|-------|-----------|
+|[`Compact`](../api/UnityEngine.InputSystem.InputSettings.InputActionPropertyDrawerMode.html#UnityEngine_InputSystem_InputSettings_InputActionPropertyDrawerMode_Compact)|Display the property in a compact format, using a minimal number of lines. Toggling between a reference to an input action in an asset and a directly serialized input action is done using a dropdown menu.|
+|[`Multiline Effective`](../api/UnityEngine.InputSystem.InputSettings.InputActionPropertyDrawerMode.html#UnityEngine_InputSystem_InputSettings_InputActionPropertyDrawerMode_MultilineEffective)|Display the effective action underlying the property, using multiple lines. Toggling between a reference to an input action in an asset and a directly serialized input action is done using a property that is always visible. This mode could be useful if you want to see or revert prefab overrides and hide the field that is ignored.|
+|[`Multiline Both`](../api/UnityEngine.InputSystem.InputSettings.InputActionPropertyDrawerMode.html#UnityEngine_InputSystem_InputSettings_InputActionPropertyDrawerMode_MultilineBoth)|Display both the input action and external reference underlying the property. Toggling between a reference to an input action in an asset and a directly serialized input action is done using a property that is always visible. This mode could be useful if you want to see both values of the property without needing to toggle Use Reference.|
diff --git a/Packages/com.unity.inputsystem/Documentation~/player-input-component.md b/Packages/com.unity.inputsystem/Documentation~/player-input-component.md
new file mode 100644
index 0000000000..2e696cb0f4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/player-input-component.md
@@ -0,0 +1,33 @@
+---
+uid: input-system-player-input-component
+---
+
+# The Player Input component
+
+The Player Input component provides two related but separate features which can be useful in common game scenarios. These are:
+
+- Configuring how [actions](actions.md) map to methods or callbacks in the script that controls your player.
+
+- Handling local multiplayer scenarios such as player lobbies, device filtering, and screen-splitting.
+
+| **Topic** | **Description** |
+|:--- | :--- |
+| [**About the Player Input Component**](about-player-input-component.md) | Represent the connection between a player's associated device, actions, and methods or callbacks. |
+| [**Get started with the Player Input component**](get-started-player-input-component.md) | Assign your action asset and set up action responses. |
+| [**Select a notification behavior**](select-notification-behavior.md) | Use the `Behavior` property to determine how a `PlayerInput` component notifies game code when something related to the player has occurred. |
+| [**Configure Unity events**](configure-unity-events.md) | Learn about properties to configure `PlayerInput`. |
+| [**Device Assignments**](device-assignments.md) | Force two `PlayerInput` components for the same Devices. |
+| [**Debug Player Input Component**](debug-player-input-component.md) | Learn about the **Debug** section of the Player Input component. |
+| [**Use PlayerInput Component with UI**](use-player-input-component-ui.md) | Set up the `PlayerInput` component to work with an `InputSystemUIInputModule` to drive the UI system. |
+| [**Local multiplayer scenarios**](local-multiplayer-scenarios.md) | Implement local multiplayer features, such as device filtering, and screen-splitting. |
+
+## Additional resources
+
+* [Set up PlayerInput Component for local multiplayer](set-up-player-input-component-local-multiplayer.md)
+* [UI system](ui-input.md).
+* [The Player Input Manager Component](player-input-manager-component.md)
+
+
+
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/player-input-manager-component.md b/Packages/com.unity.inputsystem/Documentation~/player-input-manager-component.md
new file mode 100644
index 0000000000..e3adffab46
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/player-input-manager-component.md
@@ -0,0 +1,20 @@
+---
+uid: input-system-player-input-manager
+---
+
+# The Player Input Manager component
+
+Set up local multiplayer games, where multiple players share a single screen and multiple controllers.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| [Get started with the Player Input Manager component](get-started-player-input-mananger-component.md) | Use the `PlayerInputManager` component to set up local multiplayer games. |
+| [Configure the Player Input Manager](configure-player-input-manager-component.md) | A reference for the Player Input Manager component. |
+| [Set up split-screen local multiplayer](set-up-split-screen-local-multiplayer.md) | Use the `Split-Screen` option to automatically split the available screen space between the active players. |
+
+## Additional resources
+
+- [The Player Input component](player-input-component.md)
+- [Responding to input](respond-to-input.md)
+- [Multiplayer UI input](multiplayer-ui-input.md)
+- [Local multiplayer scenarios](local-multiplayer-scenarios.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/pointers-introduction.md b/Packages/com.unity.inputsystem/Documentation~/pointers-introduction.md
new file mode 100644
index 0000000000..76fe147b1e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/pointers-introduction.md
@@ -0,0 +1,22 @@
+---
+uid: input-system-pointer-devices-intro
+---
+
+# Pointer devices introduction
+
+A pointer device tracks positions on a 2D surface. The Input System package supports the following types of pointer device:
+
+* [Touch](devices-touch.md)
+* [Mouse](devices-mouse.md)
+* [Pen](devices-pen.md)
+
+Pointer devices are represented by the [`Pointer` class](xref:UnityEngine.InputSystem.Pointer) which inherits from the [`InputDevice`](xref:UnityEngine.InputSystem.InputDevice) class. They have a shared set of behaviors and controls, which are explained in the [`Pointer` API documentation](xref:UnityEngine.InputSystem.Pointer).
+
+For a list of platforms that support pointers, refer to [Supported devices reference](supported-devices-reference.md).
+
+## Pointer window space
+
+The coordinates of pointers depend on whether you're working in a player or in the Unity Editor:
+
+* In player code, the coordinates are in the coordinate space of the Player window.
+* In Editor code, the coordinates are in the coordinate space of the current [`EditorWindow`](xref:UnityEditor.EditorWindow). For example, if you query [`Pointer.current.position`](xref:UnityEngine.InputSystem.Pointer.position) in [`UnityEditor.EditorWindow.OnGUI`](xref:EditorWindow.OnGUI), the returned 2D vector is in the coordinate space of your local GUI (same as [`UnityEngine.Event.mousePosition`](xref:UnityEngine.Event-mousePositio)).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/polling-actions.md b/Packages/com.unity.inputsystem/Documentation~/polling-actions.md
new file mode 100644
index 0000000000..f1caa0705e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/polling-actions.md
@@ -0,0 +1,152 @@
+---
+uid: input-system-poll-actions
+---
+
+# Polling actions
+
+Polling actions is one of the two main [ways to respond to actions](about-responding-to-input.md) using the recommended workflow.
+
+Polling refers to the act of repeatedly checking the status or value of an action. This is in contrast to using callbacks which are only triggered when an action is performed.
+
+The code required to poll an action depends on the [action type](action-type-reference.md), and whether you want to read the action's values or use the [interaction state](Interactions.md) instead.
+
+## Poll value-type actions
+
+To poll an action whose type is **Value** or **Pass-through**, use:
+
+- [`ReadValue<>()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_ReadValue__1)
+
+You must use the corresponding type that matches the action's [control type's](action-and-control-types.md) value. For example, `ReadValue()` for a 2D axis.
+
+## Poll button-type actions
+
+To poll an action whose type is **Button**, use:
+
+- [`IsPressed()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame)
+- [`WasPressedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame)
+- [`WasReleasedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame)
+
+Buttons have no applicable value other than whether they are pressed or released.
+
+## Poll using interaction phases
+
+Actions have [interaction phases](introduction-interactions.md) which can be either `Waiting`, `Started`, `Performed` or `Canceled`. The interaction phase changes depending on the action's [interaction type](built-in-interactions.md), if one is assigned, or the [default interaction](default-interactions.md) otherwise. You can poll an action's interaction phase using the following methods:
+
+- [`phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase)
+- [`WasPerformedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPerformedThisFrame)
+- [`WasCompletedThisFrame()`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasCompletedThisFrame)
+
+## Examples
+
+### Polling actions example with a 2D axis and a button action
+This example shows polling two actions in `Update`.
+
+The `Move` action is a value-type, and the `Jump` action is a button-type.
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+public class Example : MonoBehaviour
+{
+ // These variables are to hold the Action references
+ InputAction moveAction;
+ InputAction jumpAction;
+
+ private void Start()
+ {
+ // Find the references to the "Move" and "Jump" actions
+ moveAction = InputSystem.actions.FindAction("Move");
+ jumpAction = InputSystem.actions.FindAction("Jump");
+ }
+
+ void Update()
+ {
+ // Read the "Move" action value, which is a 2D vector
+ // and the "Jump" action state, which is a button
+
+ Vector2 moveValue = moveAction.ReadValue();
+ // your movement code here
+
+ if (jumpAction.IsPressed())
+ {
+ // your jump code here
+ }
+ }
+}
+```
+
+### Polling actions example using interaction phase
+
+
+This example uses the Interact action from the [default actions](default-actions.md), which has a [Hold](built-in-interactions.md#hold) interaction to make it perform only after the bound control is held for a period of time (for example, 0.4s):
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+public class Example : MonoBehaviour
+{
+ InputAction interactAction;
+
+ private void Start()
+ {
+ interactAction = InputSystem.actions.FindAction("Interact");
+ }
+
+ void Update()
+ {
+ if (interactAction.WasPerformedThisFrame())
+ {
+ // your code to respond to the first frame that the Interact action is held for enough time
+ }
+
+ if (interactAction.WasCompletedThisFrame())
+ {
+ // your code to respond to the frame that the Interact action is released after being held for enough time
+ }
+ }
+}
+```
+
+
+### Polling button actions example
+
+This example uses three actions called Shield, Teleport, and Submit (which are not included in the [default actions](./about-project-wide-actions.md#the-default-actions)):
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+public class Example : MonoBehaviour
+{
+ InputAction shieldAction;
+ InputAction teleportAction;
+ InputAction submitAction;
+
+ private void Start()
+ {
+ shieldAction = InputSystem.actions.FindAction("Shield");
+ teleportAction = InputSystem.actions.FindAction("Teleport");
+ submitAction = InputSystem.actions.FindAction("Submit");
+ }
+
+ void Update()
+ {
+ if (shieldAction.IsPressed())
+ {
+ // shield is active for every frame that the shield action is pressed
+ }
+
+ if (teleportAction.WasPressedThisFrame())
+ {
+ // teleport occurs on the first frame that the action is pressed, and not again until the button is released
+ }
+
+ if (submit.WasReleasedThisFrame())
+ {
+ // submit occurs on the frame that the action is released, a common technique for buttons relating to UI controls.
+ }
+ }
+}
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/precompiled-layouts.md b/Packages/com.unity.inputsystem/Documentation~/precompiled-layouts.md
new file mode 100644
index 0000000000..6826d0b199
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/precompiled-layouts.md
@@ -0,0 +1,12 @@
+---
+uid: input-system-precompiled-layouts
+---
+
+# Precompiled layouts
+
+Building a device at runtime from an [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html) is a slow process. The layout instance itself has to be built (which might involve reflection) and then interpreted in order to put the final [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) instance together. This process usually involves the loading of multiple [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html) instances, each of which might be the result of merging multiple layouts together (if the layout involves [inheritance](#layout-inheritance) or [overrides](#layout-overrides)).
+
+You can speed up this process up by "baking" the final form of a layout into a "precompiled layout". A precompiled layout is generated C# code that, when run, will build the corresponding device without relying on loading and interpreting an [`InputControlLayout`](../api/UnityEngine.InputSystem.Layouts.InputControlLayout.html). Aside from running faster, this will also create far less garbage and will not involve C# reflection (which generally causes runtime overhead by inflating the number of objects internally kept by the C# runtime).
+
+>__NOTE__: Precompiled layouts must be device layouts. It is not possible to precompile the layout for an [`InputControl`](../api/UnityEngine.InputSystem.InputControl.html).
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/predefined-interactions.md b/Packages/com.unity.inputsystem/Documentation~/predefined-interactions.md
new file mode 100644
index 0000000000..84b92f4b69
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/predefined-interactions.md
@@ -0,0 +1,12 @@
+---
+uid: input-system-predefined-interactions
+---
+
+# Predefined interactions
+
+The Input System provides a set of default Interactions for each Action type, and a set of basic built-in Interactions that you can use to get started.
+
+|Topic|Description|
+|-----|-----------|
+| [**Default interactions**](default-interactions.md) | Use the default Interaction configuration for Value-type Actions, Button-type Actions, and PassThrough-type Actions. |
+| [**Built-in interactions**](built-in-interactions.md) | Use the Input System's built-in Interactions for Actions and Bindings. |
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/query-gamepads.md b/Packages/com.unity.inputsystem/Documentation~/query-gamepads.md
new file mode 100644
index 0000000000..bcd9d3af41
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/query-gamepads.md
@@ -0,0 +1,115 @@
+---
+uid: input-system-query-gamepads
+---
+
+# Query and control gamepads in code
+
+You can use the methods in the Gamepad class to access information about the gamepads connected to your application.
+
+## Discover all connected devices
+
+There are various ways to discover the currently connected devices. To query a list of all connected devices (doesn't allocate; read-only access) use the following:
+
+```c#
+
+InputSystem.devices
+
+```
+
+To get notified when a device is added or removed:
+
+```c#
+
+InputSystem.onDeviceChange +=
+ (device, change) =>
+ {
+ if (change == InputDeviceChange.Added || change == InputDeviceChange.Removed)
+ {
+ Debug.Log($"Device '{device}' was {change}");
+ }
+ }
+
+```
+
+To find all gamepads and joysticks:
+
+```c#
+
+var devices = InputSystem.devices;
+for (var i = 0; i < devices.Count; ++i)
+{
+ var device = devices[i];
+ if (device is Joystick || device is Gamepad)
+ {
+ Debug.Log("Found " + device);
+ }
+}
+```
+
+## Access gamepad buttons
+
+To access gamepad buttons, you can use the indexer property on [`Gamepad`](xref:UnityEngine.InputSystem.Gamepad.Item(UnityEngine.InputSystem.LowLevel.GamepadButton)) and the [`GamepadButton`](xref:UnityEngine.InputSystem.LowLevel.GamepadButton) enumeration:
+
+```c#
+
+Gamepad.current[GamepadButton.LeftShoulder];
+
+```
+
+Gamepads have both Xbox-style and PlayStation-style aliases on buttons. For example, the following four accessors all retrieve the same north face button:
+
+```c
+
+Gamepad.current[GamepadButton.Y]
+Gamepad.current["Y"]
+Gamepad.current[GamepadButton.Triangle]
+Gamepad.current["Triangle"]
+
+```
+
+## Add a deadzone to a gamepad
+
+Deadzones prevent accidental input due to slight variations in where gamepad sticks come to rest at their center point. They allow a certain small inner area where the input is considered to be zero even if the input is slightly off from the zero position.
+
+To add a deadzone to gamepad stick, put a [stick deadzone Processor](built-in-processors.md) on the sticks, like this:
+
+```json
+
+ {
+ "name" : "MyGamepad",
+ "extend" : "Gamepad",
+ "controls" : [
+ {
+ "name" : "leftStick",
+ "processors" : "stickDeadzone(min=0.125,max=0.925)"
+ },
+ {
+ "name" : "rightStick",
+ "processors" : "stickDeadzone(min=0.125,max=0.925)"
+ }
+ ]
+ }
+
+```
+
+You can do the same in your C# state structs:
+
+```c#
+
+ public struct MyDeviceState
+ {
+ [InputControl(processors = "stickDeadzone(min=0.125,max=0.925)"]
+ public StickControl leftStick;
+ [InputControl(processors = "stickDeadzone(min=0.125,max=0.925)"]
+ public StickControl rightStick;
+ }
+
+```
+
+The gamepad layout already adds stick deadzone processors which take their minimum and maximum values from [`InputSettings.defaultDeadzoneMin`](xref:UnityEngine.InputSystem.InputSettings.defaultDeadzoneMin) and [`InputSettings.defaultDeadzoneMax`](xref:UnityEngine.InputSystem.InputSettings.defaultDeadzoneMax).
+
+## Using gamepads for mouse input
+
+To use a gamepad for driving mouse input, refer to the sample called Gamepad Mouse Cursor. To access the sample, open the Package Manager window, and select the Input System package. Then select the Samples tab. The sample demonstrates how to set up gamepad input to drive a virtual mouse cursor.
+
+You can also use the [`VirtualMouseInput`](xref:UnityEngine.InputSystem.UI.VirtualMouseInput) component to control the hardware or software cursor. For more information, refer to [`VirtualMouseInput` component](ui-input.md#virtual-mouse-cursor-control).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/query-keyboards.md b/Packages/com.unity.inputsystem/Documentation~/query-keyboards.md
new file mode 100644
index 0000000000..0c0b41addd
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/query-keyboards.md
@@ -0,0 +1,39 @@
+---
+uid: input-system-query-keyboard
+---
+
+# Query keyboard devices in code
+
+To query which (if any) character is generated by a given key, use the key control's [`displayName`](xref:UnityEngine.InputSystem.InputControl.displayName) property. The value of this property changes automatically when the operating system changes the keyboard layout.
+
+## Look up keys
+
+To retrieve a key from a [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) device, use one of these methods:
+
+* Use the key's accessor property, such [`Keyboard.spaceKey`](xref:UnityEngine.InputSystem.Keyboard.spaceKey).
+* Use the [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) class' indexer and the [`Key`](xref:UnityEngine.InputSystem.Key) enumeration (for example, `keyboard[Key.Space]`).
+
+## Look up keys based on the character they produce
+
+To look up keys based on the character they produce, use [Control paths](control-paths.md). For example, you can query the key that produces the producing the a character from [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) using [`Keyboard.current\["\#(a)"\]`](xref:UnityEngine.InputSystem.Keyboard.Item(UnityEngine.InputSystem.Key)).
+
+## Look up keyboard layouts
+
+To query the name of the current keyboard layout use [`Keyboard.keyboardLayout`](xref:UnityEngine.InputSystem.Keyboard.keyboardLayout). Layout names are platform-specific. There's no support for setting keyboard layouts from your application.
+
+To monitor keyboard layout changes, hook into [`InputSystem.onDeviceChange`](xref:UnityEngine.InputSystem.InputSystem.onDeviceChange) and check for [`InputDeviceChange.ConfigurationChanged`](xref:UnityEngine.InputSystem.InputDeviceChange) on a [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) device.
+
+To find the key control that corresponds to a specific display character sequence, call [`Keyboard.FindKeyOnCurrentKeyboardLayout`](xref:UnityEngine.InputSystem.Keyboard.FindKeyOnCurrentKeyboardLayout*):
+
+```c#
+
+// Find key that generates a 'q' character according to the current keyboard layout.
+Keyboard.current.FindKeyOnCurrentKeyboardLayout("q");
+
+```
+
+## Keyboard limitations
+
+* Keyboards usually have hardware limitations on both the number of simultaneous keypresses they report, and the combinations of keys they support. This means that certain simultaneous keypresses might not register correctly. For example, a given keyboard might report a simultaneous press of the `QWERT` keys correctly, but might not report `QWERA` correctly.
+* The Input System doesn't support on-screen keyboards. Instead, use `UnityEngine.TouchScreenKeyboard`.
+* Unity platform backends generally don't support distinguishing between multiple keyboards. While the Input System supports having many [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) devices at any point, platform backends generally only report a single keyboard and route input from all attached keyboards to the one keyboard device.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/query-mouse-devices.md b/Packages/com.unity.inputsystem/Documentation~/query-mouse-devices.md
new file mode 100644
index 0000000000..b2776334fa
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/query-mouse-devices.md
@@ -0,0 +1,34 @@
+---
+uid: input-system-query-mouse-devices
+---
+
+# Query and control mouse devices in code
+
+You can use the `Mouse` class to control how mouse devices work with your application.
+
+## Query the last mouse
+
+To query the last used or last added mouse, use [`Mouse.current`](xref:UnityEngine.InputSystem.Mouse.current):
+
+```c#
+
+ var mouse = Mouse.current;
+
+```
+
+## Move the mouse cursor
+
+On desktop platforms (Windows, macOS, Linux, and Universal Windows Platform), you can move the mouse cursor via code with the [`WarpCursorPosition`](xref:UnityEngine.InputSystem.Mouse.WarpCursorPosition(UnityEngine.Vector2)) method.
+
+`WarpCursorPosition` moves the system's actual mouse cursor, not just Unity's internally stored mouse position. This means that the user sees the cursor jumping to a different position, which is generally considered to be bad practice. It's best practice to only do this if the cursor is hidden. For information on how to hide a cursor, refer to the [`Cursor` API documentation](xref:UnityEngine.Cursor).
+
+To move the cursor to a different position, use [`Mouse.WarpCursorPosition`](xref:UnityEngine.InputSystem.Mouse.WarpCursorPosition(UnityEngine.Vector2)). The coordinates are expressed as Unity screen coordinates, just like [`Mouse.position`](xref:UnityEngine.InputSystem.Pointer.position).
+
+```c#
+
+ Mouse.current.WarpCursorPosition(new Vector2(123, 234));
+
+```
+
+> [!NOTE]
+> If the cursor is locked, warping the mouse position is only temporary and Unity resets the cursor to the center of the window every frame.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/query-pen-devices.md b/Packages/com.unity.inputsystem/Documentation~/query-pen-devices.md
new file mode 100644
index 0000000000..df03e3945f
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/query-pen-devices.md
@@ -0,0 +1,32 @@
+---
+uid: input-system-query-pen-devices
+---
+
+# Query pen devices in code
+
+To query the last used or last added pen, use [`Pen.current`](xref:UnityEngine.InputSystem.Pen.current).
+
+> [!NOTE]
+> Some devices support tracking multiple pens independently, but the Input System doesn't support this currently.
+
+## Access the pressure of the pen
+
+To access the pen's current pressure, use [`Pen.pressure`](xref:UnityEngine.InputSystem.Pointer.pressure), where 0 means no pressure, and 1 means maximum pressure.
+
+Pressure can go over 1 if the system applies a custom pressure curve where a pressure value of 1 doesn't require pressing the pen down all the way to the maximum force the hardware supports. If a pen doesn't support different pressure levels, `Pen.pressure` always returns 1.
+
+## Access the tilt of the pen
+
+If supported, the [`Pen.tilt`](xref:UnityEngine.InputSystem.Pen.tilt) control represents the angle at which the pen tilts towards the tablet or screen surface. The x and y axes correspond to the respective screen axes. A value of 1 on either axis means that the pen is fully parallel to the tablet or screen surface on that axis. A value of 0 means that the pen is perpendicular to the tablet or screen surface on that axis. If a pen doesn't support tilt angles, `Pen.tilt` is always (0,0).
+
+## Access the rotation of the pen
+
+Some pens support twist detection (the pen rotating around its own axis). If supported, [`Pen.twist`](xref:UnityEngine.InputSystem.Pen.twist) represents the current rotation, where 0 means that the pen is facing up towards the y-axis, and values close to 1 mean that the pen is fully rotated clockwise around its own axis.
+
+## In-range detection
+
+A pen might not need to touch the tablet or screen surface to be able to control the cursor. You can use the [`inRange`](xref:UnityEngine.InputSystem.Pen.inRange) button Control to determine whether the pen is currently in detection range. If `inRange` reports as pressed, the pen registers with the tablet or screen. For devices that don't support this feature, `inRange` always reports as pressed.
+
+## Barrel buttons
+
+Pen devices often have one or multiple buttons on the side of the pen. These are represented by the [`firstBarrelButton`](xref:UnityEngine.InputSystem.Pen.firstBarrelButton), [`secondBarrelButton`](xref:UnityEngine.InputSystem.Pen.secondBarrelButton), [`thirdBarrelButton`](xref:UnityEngine.InputSystem.Pen.thirdBarrelButton), and [`fourthBarrelButton`](xref:UnityEngine.InputSystem.Pen.fourthBarrelButton) where applicable.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/query-sensors.md b/Packages/com.unity.inputsystem/Documentation~/query-sensors.md
new file mode 100644
index 0000000000..ed79505aa1
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/query-sensors.md
@@ -0,0 +1,104 @@
+---
+uid: input-system-query-sensors
+---
+
+# Query sensors in code
+
+To determine whether a particular sensor is present, you can use its `.current` getter.
+
+```c#
+
+// Determine if a Gyroscope sensor device is present.
+if (Gyroscope.current != null)
+ Debug.Log("Gyroscope present");
+
+```
+
+Unlike other devices, sensors are disabled by default. To enable a sensor, call [`InputSystem.EnableDevice`](xref:UnityEngine.InputSystem.InputSystem.EnableDevice).
+
+```c#
+
+InputSystem.EnableDevice(Gyroscope.current);
+
+```
+
+To disable a sensor, call [`InputSystem.DisableDevice`](xref:UnityEngine.InputSystem.InputSystem.DisableDevice).
+
+```c#
+
+InputSystem.DisableDevice(Gyroscope.current);
+
+```
+
+To check whether a sensor is currently enabled, use [`InputDevice.enabled`](xref:UnityEngine.InputSystem.InputDevice.enabled).
+
+```c#
+
+if (Gyroscope.current.enabled)
+ Debug.Log("Gyroscope is enabled");
+
+```
+
+## Sample sensor frequency
+
+Sensors sample continuously at a set interval. You can set or query the sampling frequency for each sensor using the [`samplingFrequency`](xref:UnityEngine.InputSystem.Sensor.samplingFrequency) property. The frequency is expressed in Hertz (number of samples per second).
+
+```c#
+
+// Get sampling frequency of gyro.
+var frequency = Gyroscope.current.samplingFrequency;
+
+// Set sampling frequency of gyro to sample 16 times per second.
+Gyroscope.current.samplingFrequency = 16;
+```
+
+## Measure a device's acceleration
+
+Use the accelerometer to measure the acceleration of a device. This is useful to control content by moving a device around. It reports the acceleration measured on a device both due to moving the device around, and due to gravity pulling the device down. You can use GravitySensor and LinearAccelerationSensor to get separate values for these. Values are affected by the [Compensate Orientation](compensate-orientation.md) setting.
+
+The following code traces all input events on the [`Accelerometer.current`](xref:UnityEngine.InputSystem.Accelerometer) device.
+
+```c#
+
+ private InputEventTrace trace;
+
+ void StartTrace()
+ {
+ InputSystem.EnableDevice(Accelerometer.current);
+
+ trace = new InputEventTrace(Accelerometer.current);
+ trace.Enable();
+ }
+
+ void Update()
+ {
+ foreach (var e in trace)
+ {
+ //...
+ }
+ trace.Clear();
+ }
+```
+
+## Determine the orientation of a device
+
+Use the attitude sensor to determine the orientation of a device. This is useful to control content by rotating a device. Values are affected by the [Compensate Orientation](compensate-orientation.md) setting.
+
+On Android devices, there are two types of attitude sensors: [`RotationVector`](https://developer.android.com/reference/android/hardware/Sensor#TYPE_ROTATION_VECTOR) and [`GameRotationVector`](https://developer.android.com/reference/android/hardware/Sensor#TYPE_GAME_ROTATION_VECTOR). Some Android devices have both types of sensor, while other devices only have one or the other type available. These two types of attitude sensor behave slightly differently to each other. For more information, refer to the [Android documentation](https://developer.android.com/guide/topics/sensors/sensors_position#sensors-pos-gamerot).
+
+Because of this variety in what type of rotation sensors are available across devices, when you require input from a rotation sensor on Android devices, you should include code that checks for your preferred type of rotation sensor with a fallback to the alternative type of rotation sensor if it is not present. For example:
+
+```c#
+
+AttitudeSensor attitudeSensor = InputSystem.GetDevice();
+if (attitudeSensor == null)
+{
+ attitudeSensor = InputSystem.GetDevice();
+ if (attitudeSensor == null)
+ Debug.LogError("AttitudeSensor is not available");
+}
+
+if (attitudeSensor != null)
+ InputSystem.EnableDevice(attitudeSensor);
+
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/QuickStartGuide.md b/Packages/com.unity.inputsystem/Documentation~/quick-start-guide.md
similarity index 96%
rename from Packages/com.unity.inputsystem/Documentation~/QuickStartGuide.md
rename to Packages/com.unity.inputsystem/Documentation~/quick-start-guide.md
index ba4f488eca..942462f540 100644
--- a/Packages/com.unity.inputsystem/Documentation~/QuickStartGuide.md
+++ b/Packages/com.unity.inputsystem/Documentation~/quick-start-guide.md
@@ -1,7 +1,9 @@
-
+---
+uid: quickstart-guide
+---
# Quickstart Guide
-This page has a brief description of how to quickly start using the Input System. The Input System has [multiple workflows](Workflows.md) which you might prefer that offer different benefits. This quickstart guide shows a workflow which suits most common scenarios.
+This page has a brief description of how to quickly start using the Input System. The Input System has [multiple workflows](workflows.md) which you might prefer that offer different benefits. This quickstart guide shows a workflow which suits most common scenarios.
First, install the Input System package. For information on how to install the new Input System, see [Installation](Installation.md).
@@ -22,7 +24,7 @@ Once you have created and assigned some project-wide actions, the **Input Action
You can use this window to view the Actions to find out their names, value types, and what their corresponding bindings. You can also edit, delete, or add new Actions here.
-[Read more about using the Input Action Settings Window.](ActionsEditor.md)
+[Read more about using the Input Action Settings Window.](actions-editor.md)
## The default Action Maps and Actions
diff --git a/Packages/com.unity.inputsystem/Documentation~/read-all-touches.md b/Packages/com.unity.inputsystem/Documentation~/read-all-touches.md
new file mode 100644
index 0000000000..3f0828f176
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/read-all-touches.md
@@ -0,0 +1 @@
+# Read all touches
diff --git a/Packages/com.unity.inputsystem/Documentation~/read-devices-directly.md b/Packages/com.unity.inputsystem/Documentation~/read-devices-directly.md
new file mode 100644
index 0000000000..3aeeb6e458
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/read-devices-directly.md
@@ -0,0 +1,78 @@
+---
+uid: input-system-read-devices-directly
+---
+
+# Read devices directly
+
+The input system allows you to directly read the state of a device's controls, which can be useful in some situations. This isn't generally the recommended workflow because it bypasses many of the Input Systems useful features, such as [actions](actions.md) and [bindings](bindings.md).
+
+To read a device's controls directly you must:
+
+1. Get a reference to a device
+2. Identify the control on the device you want to read
+3. Read the value from the control
+
+## Get a reference to a device
+
+To get a reference to a device, you can either:
+
+- Get the currently connected device of a given type, or
+- Check through all currently connected devices.
+
+### Get the current device of a specific type
+
+You can get references to any supported device currently connected by using one of the [InputDevice classes](../api/UnityEngine.InputSystem.InputDevice.html) and using the `.current` property to get the currently active device of that type. For example, [`Gamepad.current`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_current) returns the most recently active connected gamepad.
+
+You can browse the available device types from the [InputDevice classes API documentation](../api/UnityEngine.InputSystem.InputDevice.html).
+- Some types listed are usable directly, such as `Gamepad` or `Joystick`.
+- Some are abstract parent classes that have usable child classes. For example, `Pointer` is not directly usable, but has usable child classes of `Mouse`, `Pen`, and `Touch`.
+- Some usable types also have more specialized child classes. For example `Gamepad` also has child classes such as `AndroidGamepad` as well as other Gampad types.
+
+### Check through all connected devices
+
+The `InputSystem.devices` property provides an array of all currently connected devices. You can [iterate through this array to get the reference to each connected device](query-gamepads.md#discover-all-connected-devices).
+
+
+## Identify the control property on the device
+
+Each type of device has its own configuration of [controls](controls.md), defined by its [layout](layouts.md). Each control has an API property that allows you to access the value of that control.
+
+For example, all Gamepads have a `leftStick` and `rightStick` property, as well as a number of other properties which correspond to each of its controls.
+
+You can browse the API documentation for any given device type to discover the control properties to use. For example, the [Gamepad class properties API documentation](../api/UnityEngine.InputSystem.Gamepad.html#properties).
+
+## Read the value from the control
+
+Once you have the reference to the device, and you know the control property to read, you can read the value from your code using the API which matches the [control's type](control-types-reference.md).
+
+- For value type controls, use `ReadValue`, which returns a value of the control's type.
+- For button type controls, use `isPressed`, `wasPressedThisFrame` or `wasReleasedThisFrame`.
+
+For example:
+
+```CSharp
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+public class MyPlayerScript : MonoBehaviour
+{
+ void Update()
+ {
+ var gamepad = Gamepad.current;
+
+ // check there is a Gamepad connected
+ if (gamepad != null)
+ {
+ if (gamepad.rightTrigger.wasPressedThisFrame)
+ {
+ // 'Use' code here
+ }
+
+ Vector2 move = gamepad.leftStick.ReadValue();
+ {
+ // 'Move' code here
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/UseInEditor.md b/Packages/com.unity.inputsystem/Documentation~/read-input-editor-windows.md
similarity index 94%
rename from Packages/com.unity.inputsystem/Documentation~/UseInEditor.md
rename to Packages/com.unity.inputsystem/Documentation~/read-input-editor-windows.md
index 39ce07c6c0..e481f0b252 100644
--- a/Packages/com.unity.inputsystem/Documentation~/UseInEditor.md
+++ b/Packages/com.unity.inputsystem/Documentation~/read-input-editor-windows.md
@@ -1,7 +1,8 @@
---
-uid: input-system-use-in-editor
+uid: input-system-read-input-editor-windows
---
-# Using Input in the Editor
+
+# Read input in Editor Windows
Unlike Unity's old Input Manager, you can use the new Input System from within `EditorWindow` code as well. For example, you can gain access to pen pressure information like this:
diff --git a/Packages/com.unity.inputsystem/Documentation~/read-keyboard-text-input.md b/Packages/com.unity.inputsystem/Documentation~/read-keyboard-text-input.md
new file mode 100644
index 0000000000..6f60cad63c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/read-keyboard-text-input.md
@@ -0,0 +1,15 @@
+---
+uid: input-system-read-text-input
+---
+
+# Read text input
+
+To receive text input from a keyboard, set up a callback on the [`Keyboard.onTextInput`](xref:UnityEngine.InputSystem.Keyboard.onTextInput) event. This delivers character-by-character input as reported by the platform, including input from on-screen keyboards. As a best practice, don't manually translate text input from key presses by trying to string together the characters corresponding to the keys.
+
+The text input API doesn't allocate managed memory because it doesn't deliver fully composed strings.
+
+## Working with input from input method editors
+
+Some writing systems, such as some East-Asian scripts, are too complex to represent all characters as individual keys on a keyboard. For these layouts, operating systems implement input method editors (IME) to allow composing input strings by other methods, for instance by typing several keys to produce a single character.
+
+Unity's UI frameworks for text input support IME without any additional configuration. To build your own UI for text input, the [`Keyboard`](xref:UnityEngine.InputSystem.Keyboard) class allows you to work with input from IME with APIs that have `IME` in their names. For more information, refer to the [`Keyboard` API documentation](xref:UnityEngine.InputSystem.Keyboard).
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/read-state-events.md b/Packages/com.unity.inputsystem/Documentation~/read-state-events.md
new file mode 100644
index 0000000000..567d721a78
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/read-state-events.md
@@ -0,0 +1,30 @@
+---
+uid: input-system-read-state-events
+---
+
+# Read state events
+
+State events contain raw memory snapshots for Devices. As such, interpreting the data in the event requires knowledge about where and how individual state is stored for a given Device.
+
+The easiest way to access state contained in a state event is to rely on the Device that the state is meant for. You can ask any Control to read its value from a given event rather than from its own internally stored state.
+
+For example, the following code demonstrates how to read a value for [`Gamepad.leftStick`](../api/UnityEngine.InputSystem.Gamepad.html#UnityEngine_InputSystem_Gamepad_leftStick) from a state event targeted at a [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html).
+
+```CSharp
+InputSystem.onEvent +=
+ (eventPtr, device) =>
+ {
+ // Ignore anything that isn't a state event.
+ if (!eventPtr.IsA() && !eventPtr.IsA())
+ return;
+
+ var gamepad = device as Gamepad;
+ if (gamepad == null)
+ {
+ // Event isn't for a gamepad or device ID is no longer valid.
+ return;
+ }
+
+ var leftStickValue = gamepad.leftStick.ReadValueFromEvent(eventPtr);
+ };
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/rebind-action-runtime.md b/Packages/com.unity.inputsystem/Documentation~/rebind-action-runtime.md
new file mode 100644
index 0000000000..edac839148
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/rebind-action-runtime.md
@@ -0,0 +1,35 @@
+---
+uid: input-system-rebind-at-runtime
+---
+
+# Rebind an action at runtime
+
+>__Note:__ To download a sample project which demonstrates how to set up a rebinding user interface with Input System APIs, open the Package Manager, select the Input System Package, and choose the sample project "Rebinding UI" to download.
+
+Runtime rebinding allows users of your application to set their own Bindings.
+
+To allow users to choose their own Bindings interactively, use the [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) class. Call the [`PerformInteractiveRebinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_PerformInteractiveRebinding_UnityEngine_InputSystem_InputAction_System_Int32_) method on an Action to create a rebinding operation. This operation waits for the Input System to register any input from any Device which matches the Action's expected Control type, then uses [`InputBinding.overridePath`](../api/UnityEngine.InputSystem.InputBinding.html#UnityEngine_InputSystem_InputBinding_overridePath) to assign the Control path for that Control to the Action's Bindings. If the user actuates multiple Controls, the rebinding operation chooses the Control with the highest [magnitude](controls.md#control-actuation).
+
+>IMPORTANT: You must dispose of [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) instances via `Dispose()`, so that they don't leak memory on the unmanaged memory heap.
+
+```C#
+ void RemapButtonClicked(InputAction actionToRebind)
+ {
+ var rebindOperation = actionToRebind
+ .PerformInteractiveRebinding().Start();
+ }
+```
+
+The [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) API is highly configurable to match your needs. For example, you can:
+
+* Choose expected Control types ([`WithExpectedControlType()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithExpectedControlType_System_Type_)).
+
+* Exclude certain Controls ([`WithControlsExcluding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithControlsExcluding_System_String_)).
+
+* Set a Control to cancel the operation ([`WithCancelingThrough()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithCancelingThrough_UnityEngine_InputSystem_InputControl_)).
+
+* Choose which Bindings to apply the operation on if the Action has multiple Bindings ([`WithTargetBinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithTargetBinding_System_Int32_), [`WithBindingGroup()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithBindingGroup_System_String_), [`WithBindingMask()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RebindingOperation_WithBindingMask_System_Nullable_UnityEngine_InputSystem_InputBinding__)).
+
+Refer to the scripting API reference for [`InputActionRebindingExtensions.RebindingOperation`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.RebindingOperation.html) for a full overview.
+
+Note that [`PerformInteractiveRebinding()`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_PerformInteractiveRebinding_UnityEngine_InputSystem_InputAction_System_Int32_) automatically applies a set of default configurations based on the given action and targeted binding.
diff --git a/Packages/com.unity.inputsystem/Documentation~/record-control-state-history.md b/Packages/com.unity.inputsystem/Documentation~/record-control-state-history.md
new file mode 100644
index 0000000000..be2dad66d4
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/record-control-state-history.md
@@ -0,0 +1,59 @@
+---
+uid: input-system-control-state-history
+---
+
+# Record control state history
+
+You might want to access the history of changes to a [control's state](control-state.md). For example, to compute exit velocity on a touch release.
+
+To record state changes over time, you can use [`InputStateHistory`](../api/UnityEngine.InputSystem.LowLevel.InputStateHistory.html) or [`InputStateHistory`](../api/UnityEngine.InputSystem.LowLevel.InputStateHistory-1.html). The latter restricts controls to those of a specific value type, which in turn simplifies some of the API.
+
+```CSharp
+// Create history that records Vector2 control value changes.
+// NOTE: You can also pass controls directly or use paths that match multiple
+// controls (e.g. "/").
+// NOTE: The unconstrained InputStateHistory class can record changes on controls
+// of different value types.
+var history = new InputStateHistory("/primaryTouch/position");
+
+// To start recording state changes of the controls to which the history
+// is attached, call StartRecording.
+history.StartRecording();
+
+// To stop recording state changes, call StopRecording.
+history.StopRecording();
+
+// Recorded history can be accessed like an array.
+for (var i = 0; i < history.Count; ++i)
+{
+ // Each recorded value provides information about which control changed
+ // value (in cases state from multiple controls is recorded concurrently
+ // by the same InputStateHistory) and when it did so.
+
+ var time = history[i].time;
+ var control = history[i].control;
+ var value = history[i].ReadValue();
+}
+
+// Recorded history can also be iterated over.
+foreach (var record in history)
+ Debug.Log(record.ReadValue());
+Debug.Log(string.Join(",\n", history));
+
+// You can also record state changes manually, which allows
+// storing arbitrary histories in InputStateHistory.
+// NOTE: This records a value change that didn't actually happen on the control.
+history.RecordStateChange(Touchscreen.current.primaryTouch.position,
+ new Vector2(0.123f, 0.234f));
+
+// State histories allocate unmanaged memory and need to be disposed.
+history.Dispose();
+```
+
+For example, if you want to have the last 100 samples of the left stick on the gamepad available, you can use this code:
+
+```CSharp
+var history = new InputStateHistory(Gamepad.current.leftStick);
+history.historyDepth = 100;
+history.StartRecording();
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/record-events.md b/Packages/com.unity.inputsystem/Documentation~/record-events.md
new file mode 100644
index 0000000000..674133a64c
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/record-events.md
@@ -0,0 +1,67 @@
+---
+uid: input-system-record-events
+---
+
+# Record events
+
+>NOTE: To download a sample project which contains a reusable MonoBehaviour called `InputRecorder`, which can capture and replay input from arbitrary devices, open the Package Manager, select the Input System Package, and choose the sample project "Input Recorder" to download.
+
+You can use the [`InputEventTrace`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html) class to record input events for later processing:
+
+```CSharp
+var trace = new InputEventTrace(); // Can also give device ID to only
+ // trace events for a specific device.
+
+trace.Enable();
+
+//... run stuff
+
+var current = new InputEventPtr();
+while (trace.GetNextEvent(ref current))
+{
+ Debug.Log("Got some event: " + current);
+}
+
+// Also supports IEnumerable.
+foreach (var eventPtr in trace)
+ Debug.Log("Got some event: " + eventPtr);
+
+// Trace consumes unmanaged resources. Make sure to dispose.
+trace.Dispose();
+```
+
+Dispose event traces after use, so that they do not leak memory on the unmanaged (C++) memory heap.
+
+You can also write event traces out to files/streams, load them back in, and replay recorded streams.
+
+```CSharp
+// Set up a trace with such that it automatically grows in size as needed.
+var trace = new InputEventTrace(growBuffer: true);
+trace.Enable();
+
+// ... capture some input ...
+
+// Write trace to file.
+trace.WriteTo("mytrace.inputtrace.");
+
+// Load trace from same file.
+var loadedTrace = InputEventTrace.LoadFrom("mytrace.inputtrace");
+```
+
+You can replay captured traces directly from [`InputEventTrace`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html) instances using the [`Replay`](../api/UnityEngine.InputSystem.LowLevel.InputEventTrace.html#UnityEngine_InputSystem_LowLevel_InputEventTrace_Replay_) method.
+
+```CSharp
+// The Replay method returns a ReplayController that can be used to
+// configure and control playback.
+var controller = trace.Replay();
+
+// For example, to not replay the events as is but rather create new devices and send
+// the events to them, call WithAllDevicesMappedToNewInstances.
+controller.WithAllDevicessMappedToNewInstances();
+
+// Replay all frames one by one.
+controller.PlayAllFramesOnyByOne();
+
+// Replay events in a way that tries to simulate original event timing.
+controller.PlayAllEventsAccordingToTimestamps();
+```
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/remove-device.md b/Packages/com.unity.inputsystem/Documentation~/remove-device.md
new file mode 100644
index 0000000000..66bbcd6703
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/remove-device.md
@@ -0,0 +1,11 @@
+---
+uid: input-system-remove-device
+---
+
+# Remove a device
+
+When a Device is disconnected, it is removed from the system. A notification appears for [`InputDeviceChange.Removed`](../api/UnityEngine.InputSystem.InputDeviceChange.html) (sent via [`InputSystem.onDeviceChange`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange)) and the Devices are removed from the [`devices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceChange) list. The system also calls [`InputDevice.OnRemoved`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_OnRemoved_).
+
+The [`InputDevice.added`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_added) flag is reset to false in the process.
+
+Note that Devices are not destroyed when removed. Device instances remain valid and you can still access them in code. However, trying to read values from the controls of these Devices leads to exceptions.
diff --git a/Packages/com.unity.inputsystem/Documentation~/reset-device.md b/Packages/com.unity.inputsystem/Documentation~/reset-device.md
new file mode 100644
index 0000000000..58347e8adc
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/reset-device.md
@@ -0,0 +1,22 @@
+---
+uid: input-system-reset-device
+---
+
+# Reset a device
+
+Resetting a Device resets its Controls to their default state. You can do this manually using [`InputSystem.ResetDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_):
+
+```CSharp
+ InputSystem.ResetDevice(Gamepad.current);
+```
+
+There are two types of resets as determined by the second parameter to [`InputSystem.ResetDevice`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_ResetDevice_UnityEngine_InputSystem_InputDevice_System_Boolean_):
+
+|Type|Description|
+|----|-----------|
+|"Soft" Resets|This is the default. With this type, only controls that are *not* marked as [`dontReset`](layouts.md#control-items) are reset to their default value. This excludes controls such as [`Pointer.position`](../api/UnityEngine.InputSystem.Pointer.html#UnityEngine_InputSystem_Pointer_position) from resets and thus prevents mouse positions resetting to `(0,0)`.|
+|"Hard" Resets|In this type, *all* controls are reset to their default value regardless of whether they have [`dontReset`](layouts.md#control-items) set or not.|
+
+Resetting Controls this way is visible on [Actions](actions.md). If you reset a Device that is currently driving one or more Action, the Actions are cancelled. This cancellation is different from sending an event with default state. Whereas the latter may inadvertently [perform](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_performed) Actions (e.g. a button that was pressed would not appear to have been released), a reset will force clean cancellation.
+
+Resets may be triggered automatically by the Input System depending on [application focus](#background-and-focus-change-behavior).
diff --git a/Packages/com.unity.inputsystem/Documentation~/respond-to-input.md b/Packages/com.unity.inputsystem/Documentation~/respond-to-input.md
new file mode 100644
index 0000000000..a766ae36e2
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/respond-to-input.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-respond
+---
+
+# Responding to input
+
+Learn how to implement responses to the input that you have configured in your project.
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[About responding to input](about-responding-to-input.md)** | Learn the ways you can implement responses to input in your project. |
+| **[Enabling actions](enable-actions.md)** | Learn to enable or disable actions to suit different situations. |
+| **[Polling actions](polling-actions.md)** | Repeatedly check the status or value of an action. |
+| **[Set callbacks on actions](set-callbacks-on-actions.md)** | Set up an action to inform your code that a certain type of input has occurred. |
+| **[Read devices directly](read-devices-directly.md)** | Directly read the state of a device's controls. |
+| **[Scripting with actions API overview](api-overview.md)** | Learn about important APIs for scripting with actions in the Input System. |
+| **[The Player Input component](player-input-component.md)** | Configure how [actions](actions.md) map to methods or callbacks in the script that controls your player, and handle local multiplayer scenarios such as player lobbies, device filtering, and screen-splitting. |
+| **[The Player Input Manager Component](player-input-manager-component.md)** | Set up local multiplayer games, where multiple players share a single screen and multiple controllers. |
+
+
+## Additional resources
+
+- [Setting up input](setting-up-input.md)
+- [Actions](actions.md)
+- [Devices](devices.md)
+- [User rebinding at runtime](user-rebinding-runtime.md)
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/restore-original-bindings.md b/Packages/com.unity.inputsystem/Documentation~/restore-original-bindings.md
new file mode 100644
index 0000000000..725e86dd74
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/restore-original-bindings.md
@@ -0,0 +1,18 @@
+---
+uid: input-system-restore-original-bindings
+---
+
+# Restore original bindings
+
+You can remove Binding overrides and thus restore defaults by using [`RemoveBindingOverride`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RemoveBindingOverride_UnityEngine_InputSystem_InputAction_System_Int32_) or [`RemoveAllBindingOverrides`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_RemoveAllBindingOverrides_UnityEngine_InputSystem_IInputActionCollection2_).
+
+```CSharp
+// Remove binding overrides from the first binding of the "fire" action.
+playerInput.actions["fire"].RemoveBindingOverride(0);
+
+// Remove all binding overrides from the "fire" action.
+playerInput.actions["fire"].RemoveAllBindingOverrides();
+
+// Remove all binding overrides from a player's actions.
+playerInput.actions.RemoveAllBindingOverrides();
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/restrict-binding-resolution-to-device.md b/Packages/com.unity.inputsystem/Documentation~/restrict-binding-resolution-to-device.md
new file mode 100644
index 0000000000..86b3438ebe
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/restrict-binding-resolution-to-device.md
@@ -0,0 +1,17 @@
+---
+uid: input-system-restrict-binding-resolution
+---
+
+# Restrict binding resolution to a specific device
+
+By default, actions [resolve their bindings](./binding-resolution.md) against all devices present that the Input System is aware of (that is, those listed in [`InputSystem.devices`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_devices)). For example, if there are two gamepads connected, a binding to `/buttonSouth` picks up both gamepads and allows the action to be performed from either gamepad.
+
+You can override this behavior by restricting an [action asset](./action-assets.md) or individual [action maps](./create-edit-delete-action-maps.md) to a specific set of Devices. If you do this, binding resolution only takes the controls of the specified devices into account.
+
+To restrict an action map to just the first gamepad:
+
+1. Set the `.devices` property of the action map to an array containing a reference to the first item in the `Gamepad.all` array. For example: `actionMap.devices = new[] { Gamepad.all[0] };`
+
+
+> [!NOTE]
+> The Input System's [user management](user-management.md) feature and [Player Input component](player-input-component.md) make use of this automatically. They set the [`InputActionMap.devices`](../api/UnityEngine.InputSystem.InputActionMap.html#UnityEngine_InputSystem_InputActionMap_devices) for each player automatically, based on the device that is paired to each user.
diff --git a/Packages/com.unity.inputsystem/Documentation~/save-load-rebinds.md b/Packages/com.unity.inputsystem/Documentation~/save-load-rebinds.md
new file mode 100644
index 0000000000..953f75550e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/save-load-rebinds.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-save-load-rebinds
+---
+
+# Save and load rebinds
+
+You can serialize override properties of [Bindings](../api/UnityEngine.InputSystem.InputBinding.html) by serializing them as JSON strings and restoring them from these. Use [`SaveBindingOverridesAsJson`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_SaveBindingOverridesAsJson_UnityEngine_InputSystem_IInputActionCollection2_) to create these strings and [`LoadBindingOverridesFromJson`](../api/UnityEngine.InputSystem.InputActionRebindingExtensions.html#UnityEngine_InputSystem_InputActionRebindingExtensions_LoadBindingOverridesFromJson_UnityEngine_InputSystem_IInputActionCollection2_System_String_System_Boolean_) to restore overrides from them.
+
+```CSharp
+// Store player rebinds in PlayerPrefs.
+var rebinds = playerInput.actions.SaveBindingOverridesAsJson();
+PlayerPrefs.SetString("rebinds", rebinds);
+
+// Restore player rebinds from PlayerPrefs (removes all existing
+// overrides on the actions; pass `false` for second argument
+// in case you want to prevent that).
+var rebinds = PlayerPrefs.GetString("rebinds");
+playerInput.actions.LoadBindingOverridesFromJson(rebinds);
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/see-record-input-event-flow.md b/Packages/com.unity.inputsystem/Documentation~/see-record-input-event-flow.md
new file mode 100644
index 0000000000..3690e8be70
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/see-record-input-event-flow.md
@@ -0,0 +1,44 @@
+---
+uid: input-system-see-record-flow
+---
+
+# See and record input event flow
+
+To record events flowing through the system, use this code:
+
+```C#
+
+ // You can also provide a device ID to only
+ // trace events for a specific device.
+ var trace = new InputEventTrace();
+
+ trace.Enable();
+
+ var current = new InputEventPtr();
+ while (trace.GetNextEvent(ref current))
+ {
+ Debug.Log("Got some event: " + current);
+ }
+
+ // Also supports IEnumerable.
+ foreach (var eventPtr in trace)
+ Debug.Log("Got some event: " + eventPtr);
+
+ // Trace consumes unmanaged resources. Make sure you dispose it correctly to avoid memory leaks.
+ trace.Dispose();
+
+```
+
+To see events as they're processed, use this code:
+
+```C#
+
+ InputSystem.onEvent +=
+ (eventPtr, device) =>
+ {
+ // Can handle events yourself, for example, and then stop them
+ // from further processing by marking them as handled.
+ eventPtr.handled = true;
+ };
+
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/select-control-binding.md b/Packages/com.unity.inputsystem/Documentation~/select-control-binding.md
new file mode 100644
index 0000000000..e991f6fb16
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/select-control-binding.md
@@ -0,0 +1,58 @@
+---
+uid: input-system-control-for-binding
+---
+
+# Select a control for a binding
+
+The [control path](control-paths.md) identifies the control (or controls) that a binding is bound to, such as a button or stick on a gamepad, or a specific keyboard key.
+
+When selecting a control path, there are various levels of specificity you can use, such as referring to a common control across all types of gamepad (such as the left stick on a gamepad), a specific control on a specific model of gamepad (such as the `A` button on an Xbox controller), or a specific control usage across all types of device (such as the control associated with `Back` on any type of device). See [control path specificity](control-paths.md#specificity) for more information.
+
+There are three ways to specify the control path for a binding in the [Actions Editor window](./actions-editor.md). These are:
+
+- Select the control path from a list,
+- Select the control path using the listen feature, or
+- Enter the path directly by typing text
+
+For all these options, you must first:
+
+1. Open the [Actions Editor window](./actions-editor.md)
+2. Select the **action** you want to edit from the [actions panel](./input-actions-editor-window-reference.md#actions-panel-reference)
+3. Expand the action to reveal its bindings, or [add a new binding](./add-duplicate-delete-binding.md)
+4. Select the **binding** you want to edit
+
+
+With a binding selected, you can then select the control path using any of these options.
+
+### Select the control path from a list
+
+To select the control path for a binding from a list of available controls:
+
+ 1. Select the **Path** dropdown menu. This displays a hierarchically arranged tree of input devices and controls that the Input System recognizes, which you can browse to find the control you want to bind.
+
+ 2. Select the control you want from the list.
+
+
+
+Unity filters this list by the Action's [`Control Type`](control-types-reference.md) property. For example, if the Control type is `Vector2`, you can only select a Control that generates two-dimensional values, like a stick.
+
+In this list, use the **Usages** section to [select a control by usage](./control-usages.md) (such as `Back`), rather than by physical endpoint (such as `Button South`).
+
+### Select the control path using the listen feature
+
+Instead of browsing the tree to find the Control you want, if you have the device connected that you want to bind, it can be easier to let the Input System listen for input from that device. To do this:
+
+1. Select the __Listen__ button.
+2. Press the button or actuate the control on the device you want to bind to.
+3. While the control picker is in listen mode, all buttons or controls you actuate appear in a list.
+4. Select the binding from the list to finalise the binding.
+
+
+### Enter the path directly by typing text
+
+You can choose to manually type the Binding path as text instead of using the Control picker. To do this:
+
+1. Select the __T__ button next to the Control path popup. This changes the **path** field from a popup menu to a text field, where you can enter any Binding string.
+2. Type the control path's binding string into the text field.
+
+See the See [control paths format](./control-paths.md#format) for more details about valid syntax for this field.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/select-notification-behavior.md b/Packages/com.unity.inputsystem/Documentation~/select-notification-behavior.md
new file mode 100644
index 0000000000..8c2abb0f2b
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/select-notification-behavior.md
@@ -0,0 +1,23 @@
+---
+uid: input-system-select-notification-behavior
+---
+
+# Select a notification behavior
+
+You can use the [`Behavior`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_notificationBehavior) property in the Inspector to determine how a `PlayerInput` component notifies game code when something related to the player has occurred.
+
+The following options are available:
+
+|Behavior|Description|
+|--------|-----------|
+|[`Send Messages`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Uses [`GameObject.SendMessage`](https://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html) on the `GameObject` that the `PlayerInput` component belongs to.|
+|[`Broadcast Messages`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Uses [`GameObject.BroadcastMessage`](https://docs.unity3d.com/ScriptReference/GameObject.BroadcastMessage.html) on the `GameObject` that the `PlayerInput` component belongs to. This broadcasts the message down the `GameObject` hierarchy.|
+|[`Invoke Unity Events`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Uses a separate [`UnityEvent`](https://docs.unity3d.com/ScriptReference/Events.UnityEvent.html) for each individual type of message. When this is selected, the events available on the `PlayerInput` are accessible from the __Events__ foldout. The argument received by events triggered for Actions is the same as the one received by [`started`, `performed`, and `canceled` callbacks](respond-to-input.md#action-callbacks). |
+|[`Invoke CSharp Events`](../api/UnityEngine.InputSystem.PlayerNotifications.html)|Similar to `Invoke Unity Events`, except that the events are plain C# events available on the `PlayerInput` API. You cannot configure these from the Inspector. Instead, you have to register callbacks for the events in your scripts. The following events are available:[`onActionTriggered`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_onActionTriggered) (collective event for all actions on the player) [`onDeviceLost`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_onDeviceLost) [`onDeviceRegained`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_onDeviceRegained) |
+
+In addition to per-action notifications, `PlayerInput` sends the following general notifications:
+
+|Notification|Description|
+|------------|-----------|
+|[`DeviceLostMessage`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_DeviceLostMessage)|The player has lost one of the Devices assigned to it. This can happen, for example, if a wireless device runs out of battery.|
+|[`DeviceRegainedMessage`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_DeviceRegainedMessage)|Notification that triggers when the player recovers from Device loss and is good to go again.|
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/send-command-to-device.md b/Packages/com.unity.inputsystem/Documentation~/send-command-to-device.md
new file mode 100644
index 0000000000..d290fbd861
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/send-command-to-device.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-send-command-to-device
+---
+
+# Send a command to a device
+
+The Input System sends commands to the Device through [`InputDevice.ExecuteCommand`](../api/UnityEngine.InputSystem.InputDevice.html#UnityEngine_InputSystem_InputDevice_ExecuteCommand__1___0__). To monitor Device commands, use [`InputSystem.onDeviceCommand`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onDeviceCommand).
+
+Each Device command implements the [`IInputDeviceCommandInfo`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html) interface, which only requires the [`typeStatic`](../api/UnityEngine.InputSystem.LowLevel.IInputDeviceCommandInfo.html#UnityEngine_InputSystem_LowLevel_IInputDeviceCommandInfo_typeStatic) property to identify the type of the command. The native implementation of the Device should then understand how to handle that command. One common case is the `"HIDO"` command type which is used to send [HID output reports](hid-specification-introduction.md) to HIDs.
diff --git a/Packages/com.unity.inputsystem/Documentation~/sensors-introduction.md b/Packages/com.unity.inputsystem/Documentation~/sensors-introduction.md
new file mode 100644
index 0000000000..007bb59b79
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/sensors-introduction.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-sensors-intro
+---
+
+# Sensors introduction
+
+Sensors are [`InputDevice` instances](xref:UnityEngine.InputSystem.InputDevice) that measure environmental characteristics of the device that the content is running on. Unity currently supports sensors on iOS and Android. Android supports a wider range of sensors than iOS.
+
+For a list of platforms that support sensors, refer to [Supported devices reference](supported-devices-reference.md).
diff --git a/Packages/com.unity.inputsystem/Documentation~/set-callbacks-on-actions.md b/Packages/com.unity.inputsystem/Documentation~/set-callbacks-on-actions.md
new file mode 100644
index 0000000000..ac9c605b8e
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/set-callbacks-on-actions.md
@@ -0,0 +1,92 @@
+---
+uid: input-system-set-callbacks-actions
+---
+
+# Set callbacks on actions
+
+Setting callbacks on actions is one of the two main [ways to respond to actions](about-responding-to-input.md) using the recommended workflow.
+
+When you set up callbacks for your Action, the Action informs your code that a certain type of input has occurred, and your code can then respond accordingly.
+
+The Input System offers the following ways to set up input callbacks:
+
+- The [PlayerInput component](using-playerinput-workflow.md).
+- [Action callbacks](#action-callbacks).
+- [Action map callbacks](#action-map-callbacks)
+- The global [On Action Change callback](#global-input-callback).
+
+
+You can also use [`InputActionTrace`](trace-actions.md) to record all changes happening on actions, which is useful for [debugging](debugging.md).
+
+## The Player Input component
+
+With the Player Input component, you can set up callbacks using an interface in the inspector without requiring intermediate code. Refer to [the PlayerInput component](using-playerinput-workflow.md) for further information.
+
+
+## Action callbacks
+
+Every Action has a set of distinct phases it can go through in response to receiving input.
+
+|Phase|Description|
+|-----|-----------|
+|`Disabled`|The Action is disabled and can't receive input.|
+|`Waiting`|The Action is enabled and is actively waiting for input.|
+|`Started`|The Input System has received input that started an Interaction with the Action.|
+|`Performed`|An Interaction with the Action has been completed.|
+|`Canceled`|An Interaction with the Action has been canceled.|
+
+You can read the current phase of an action using [`InputAction.phase`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase).
+
+The `Started`, `Performed`, and `Canceled` phases each have a callback associated with them:
+
+```CSharp
+jumpAction = InputSystem.actions.FindAction("Jump");
+
+jumpAction.started += context => /* Action was started */;
+jumpAction.performed += context => /* Action was performed */;
+jumpAction.canceled += context => /* Action was canceled */;
+```
+
+Each callback receives an [`InputAction.CallbackContext`](../api/UnityEngine.InputSystem.InputAction.CallbackContext.html) structure, which holds context information that you can use to query the current state of the Action and to read out values from Controls that triggered the Action ([`InputAction.CallbackContext.ReadValue`](../api/UnityEngine.InputSystem.InputAction.CallbackContext.html#UnityEngine_InputSystem_InputAction_CallbackContext_ReadValue__1)).
+
+The contents of the callback context structure are only valid during the callback. In particular, it's not safe to store the received context and later access its properties from outside the callback.
+
+When and how the callbacks are triggered depends on the [interactions](Interactions.md) present on the respective bindings. If the bindings have no interactions that apply to them, the [default interaction](default-interactions.md) applies.
+
+## Action map callbacks
+
+Instead of listening to individual actions, you can listen to an entire action map for state changes on any action it contains.
+
+```CSharp
+playerActionMap = InputSystem.actions.FindActionMap("Player");
+
+
+playerActionMap.actionTriggered +=
+ context => { ... };
+```
+
+The argument received is the same `InputAction.CallbackContext` structure that you receive through the [`started`, `performed`, and `canceled` callbacks](#action-callbacks).
+
+>__Note__: The Input System calls `InputActionMap.actionTriggered` for all three of the individual callbacks on Actions. That is, you get `started`, `performed`, and `canceled` all on a single callback.
+
+## Global input callback
+
+Similar to `InputSystem.onDeviceChange`, your app can listen for any action-related change globally.
+
+```CSharp
+InputSystem.onActionChange +=
+ (obj, change) =>
+ {
+ // obj can be either an InputAction or an InputActionMap
+ // depending on the specific change.
+ switch (change)
+ {
+ case InputActionChange.ActionStarted:
+ case InputActionChange.ActionPerformed:
+ case InputActionChange.ActionCanceled:
+ Debug.Log($"{((InputAction)obj).name} {change}");
+ break;
+ }
+ }
+```
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/set-up-player-input-component-local-multiplayer.md b/Packages/com.unity.inputsystem/Documentation~/set-up-player-input-component-local-multiplayer.md
new file mode 100644
index 0000000000..de3ea1f4ba
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/set-up-player-input-component-local-multiplayer.md
@@ -0,0 +1,9 @@
+---
+uid: input-system-component-local-multiplayer
+---
+
+# Set up the Player Input component for local multiplayer
+
+In these local multiplayer scenarios, the Player Input component should be on a prefab that represents a player in your game, which the [**Player Input Manager**](player-input-manager-component.md) has a reference to. The **Player Input Manager** then instantiates players as they join the game and pairs each player instance to a unique device that the player uses exclusively (for example, one gamepad for each player). You can also manually pair devices in a way that enables two or more players to share a Device (for example, left/right keyboard splits or hot seat use).
+
+Each `PlayerInput` corresponds to one [`InputUser`](user-management.md). You can use [`PlayerInput.user`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_user) to query the `InputUser` from the component.
\ No newline at end of file
diff --git a/Packages/com.unity.inputsystem/Documentation~/set-up-split-screen-local-multiplayer.md b/Packages/com.unity.inputsystem/Documentation~/set-up-split-screen-local-multiplayer.md
new file mode 100644
index 0000000000..135f9789c2
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/set-up-split-screen-local-multiplayer.md
@@ -0,0 +1,17 @@
+---
+uid: input-system-split-screen-multiplayer
+---
+
+# Set up split-screen local multiplayer
+
+If you enable the [`Split-Screen`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreen) option, the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) automatically splits the available screen space between the active players. For this to work, you must set the [`Camera`](../api/UnityEngine.InputSystem.PlayerInput.html#UnityEngine_InputSystem_PlayerInput_camera) property on the `PlayerInput` prefab. The [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) then automatically resizes and repositions each camera instance to let each player have their own part of the screen.
+
+If you enable the [`Split-Screen`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreen) option, you can configure the following additional properties in the Inspector:
+
+|Property|Description|
+|--------|-----------|
+|[`Maintain Aspect Ratio`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_maintainAspectRatioInSplitScreen)|A `false` value enables the game to produce screen areas that have an aspect ratio different from the screen resolution when subdividing the screen.|
+|[`Set Fixed Number`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_fixedNumberOfSplitScreens)|If this value is greater than zero, the [`PlayerInputManager`](../api/UnityEngine.InputSystem.PlayerInputManager.html) always splits the screen into a fixed number of rectangles, regardless of the actual number of players.|
+|[`Screen Rectangle`](../api/UnityEngine.InputSystem.PlayerInputManager.html#UnityEngine_InputSystem_PlayerInputManager_splitScreenArea)|The normalized screen rectangle available for allocating player split-screens into.|
+
+By default, any player in the game can interact with any UI elements. However, in split-screen setups, your game can have screen-space UIs that are restricted to just one specific camera. See the [UI Input](player-input-component.md#ui-input) section on the Player Input component page on how to set this up using the Player Input component, [`InputSystemUIInputModule`](ui-input.md#setting-up-ui-input) and [`MultiplayerEventSystem`](ui-input.md#multiplayer-uis) components.
diff --git a/Packages/com.unity.inputsystem/Documentation~/set-up-test-assemblies.md b/Packages/com.unity.inputsystem/Documentation~/set-up-test-assemblies.md
new file mode 100644
index 0000000000..9fd9e891ad
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/set-up-test-assemblies.md
@@ -0,0 +1,19 @@
+---
+uid: input-system-set-up-test-assemblies
+---
+
+# Set up test assemblies
+
+To set up a test assembly that uses the Input System's automation framework, follow these steps:
+
+1. In the `Packages/manifest.json` file of your project, `com.unity.inputsystem` must be listed in `testables`. This is necessary for test code that comes with the package to be included with test builds of your project. You can, for example, add this after the `dependencies` property like so:
+ ```
+ },
+ "testables" : [
+ "com.unity.inputsystem"
+ ]
+ ```
+2. Create a new assembly definition (menu: __Create > Assembly Definition__) or go to an assembly definition for a test assembly that you have already created.
+3. Add references to `nunit.framework.dll`, `UnityEngine.TestRunner`, and `UnityEditor.TestRunner` (as described in [How to create a new test assembly](https://docs.unity3d.com/Packages/com.unity.test-framework@1.0/manual/workflow-create-test-assembly.html)), as well as `Unity.InputSystem` and `Unity.InputSystem.TestFramework` for the Input System.
+
+
diff --git a/Packages/com.unity.inputsystem/Documentation~/set-up-test-fixtures.md b/Packages/com.unity.inputsystem/Documentation~/set-up-test-fixtures.md
new file mode 100644
index 0000000000..0389538bc0
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/set-up-test-fixtures.md
@@ -0,0 +1,100 @@
+---
+uid: input-system-set-up-test-fixtures
+---
+
+# Set up test fixtures
+
+Use [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) to create an isolated version of the Input System for tests. The fixture sets up a blank, default-initialized version of the Input System for each test, and restores the Input System to its original state after the test completes. The default-initialized version has all built-in registrations (such as layout and processors), but doesn't have any pre-existing Input Devices.
+
+>__NOTE:__ [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) will not have custom registrations performed from Unity startup code such as `[InitializeOnLoad]` or `[RuntimeInitializeOnLoadMethod]`. Layouts needed during tests have to be manually registered as part of the test setup.
+
+You can use the fixture as a base class for your own fixture:
+
+```CSharp
+class MyTests : InputTestFixture
+{
+ [Test]
+ public void CanPressButtonOnGamepad()
+ {
+ var gamepad = InputSystem.AddDevice();
+ Press(gamepad.buttonSouth);
+ }
+
+ // If you need custom setup and tear-down logic, override the methods inherited
+ // from InputTestFixture.
+ // IMPORTANT: If you use NUnit's [Setup] and [TearDown] attributes on methods in your
+ // test fixture, this will *override* the methods inherited from
+ // InputTestFixture and thus cause them to not get executed. Either
+ // override the methods as illustrated here or call the Setup() and
+ // TearDown() methods of InputTestFixture explicitly.
+ public override void Setup()
+ {
+ base.Setup();
+ // Add setup code here.
+ }
+ public override void TearDown()
+ {
+ // Add teardown code here.
+ base.TearDown();
+ }
+}
+```
+
+>__IMPORTANT:__ If you do this, do __not__ add a `[SetUp]` or `[TearDown]` method. Doing so will cause the methods in [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) to not be called, thus leading to the test fixture not properly initializing or shutting down. Instead, override the `Setup` and/or `TearDown` method inherited from `InputTestFixture`.
+
+Alternatively, you can instantiate it in your fixture:
+
+```CSharp
+[TestFixture]
+class MyTestFixture
+{
+ private InputTestFixture input = new InputTestFixture();
+
+ // NOTE: You have to manually call Setup() and TearDown() in this scenario.
+
+ [SetUp]
+ void Setup()
+ {
+ input.Setup();
+ }
+
+ [TearDown]
+ void TearDown()
+ {
+ input.TearDown();
+ }
+}
+```
+
+This is especially useful when creating a larger setup for game testing using `PrebuiltSetup`.
+
+```CSharp
+[PrebuildSetup("GameTestPrebuildSetup")]
+public class GameTestFixture
+{
+ public Game game { get; set; }
+ public InputTestFixture input { get; set; }
+
+ public Mouse mouse { get; set; }
+ public Keyboard keyboard { get; set; }
+ public Touchscreen touchscreen { get; set; }
+ public Gamepad gamepad { get; set; }
+
+ //...
+}
+
+#if UNITY_EDITOR
+public class GameTestPrebuildSetup : IPrebuildSetup
+{
+ public void Setup()
+ {
+ UnityEditor.EditorBuildSettings.scenes = new[]
+ {
+ new UnityEditor.EditorBuildSettingsScene("Assets/Scenes/Main.unity", true)
+ };
+ }
+}
+#endif
+```
+
+Note that you do __not__ generally need to clean up any input-related data you set up. This includes devices you add, layouts you registered, [`InputSettings`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_settings) you modify, and any other alteration to the state of [`InputSystem`](../api/UnityEngine.InputSystem.InputSystem.html). [`InputTestFixture`](../api/UnityEngine.InputSystem.InputTestFixture.html) will automatically throw away the current state of the Input System and restore the state from before the test was started.
diff --git a/Packages/com.unity.inputsystem/Documentation~/setting-up-input.md b/Packages/com.unity.inputsystem/Documentation~/setting-up-input.md
new file mode 100644
index 0000000000..8dd8b5d9e5
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/setting-up-input.md
@@ -0,0 +1,26 @@
+---
+uid: input-system-setting-up
+---
+
+# Setting up input
+
+Configure how your project maps physical controls to gameplay and UI behavior.
+
+Use actions, action assets, and the Input Actions Editor to define what input means in your game, then wire bindings, interactions, and processors. When you are ready to read input in code, continue to [Respond to input](respond-to-input.md).
+
+| **Topic** | **Description** |
+| :--- | :--- |
+| **[Actions](actions.md)** | Separate input purpose from device controls and connect them with bindings. |
+| **[Input action assets](action-assets.md)** | Store actions, bindings, action maps, and control schemes in Input Action assets. |
+| **[Create action maps](create-edit-delete-action-maps.md)** | Group actions for different input scenarios such as gameplay and UI. |
+| **[Create, edit, and delete actions](create-edit-delete-actions.md)** | Create and manage actions in the Input Actions Editor. |
+| **[Configure actions](configure-actions.md)** | Set up action types, bindings, controls, schemes, interactions, and processors. |
+| **[Input Actions Editor references](actions-editor.md)** | Reference for the Actions Editor window and property panels. |
+| **[Configure input from code](configure-input-from-code.md)** | Define actions, bindings, and maps in script without relying on asset-only setup. |
+
+## Additional resources
+
+- [Respond to input](respond-to-input.md)
+- [Using the Actions Workflow](using-actions-workflow.md)
+- [Devices](devices.md)
+- [The Player Input component](player-input-component.md)
diff --git a/Packages/com.unity.inputsystem/Documentation~/simulate-input-on-device.md b/Packages/com.unity.inputsystem/Documentation~/simulate-input-on-device.md
new file mode 100644
index 0000000000..b92898f387
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/simulate-input-on-device.md
@@ -0,0 +1,5 @@
+---
+uid: simulate-input-on-device
+---
+
+# Simulate input on a device
diff --git a/Packages/com.unity.inputsystem/Documentation~/simulate-touch-input.md b/Packages/com.unity.inputsystem/Documentation~/simulate-touch-input.md
new file mode 100644
index 0000000000..488d4da161
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/simulate-touch-input.md
@@ -0,0 +1,35 @@
+---
+uid: input-system-simulate-touch
+---
+
+# Simulate touches
+
+You can simulate touch input from [pointer devices](pointers-introduction.md) such as [mouse](devices-mouse.md) and [pen](devices-pen.md) devices in the following ways:
+
+* [Enable touch simulation in the Unity Editor](#add-touch-simulation-to-a-gameobject).
+* [Add touch simulation to a GameObject](#add-touch-simulation-to-a-gameobject).
+* [Enable touch simulation in startup code](#enable-touch-simulation-in-the-unity-editor).
+
+## Enable touch simulation in the Unity Editor
+
+To enable touch simulation in the Unity Editor, perform the following steps:
+
+1. Open the [Input Debugger](the-input-debugger-window.md) (**Window** > **Analysis** > **Input Debugger**)
+1. Select the **Options** dropdown, and enable **Simulate Touch Input From Mouse or Pen**.
+
+## Add touch simulation to a GameObject
+
+Add the [`TouchSimulation`](xref:UnityEngine.InputSystem.EnhancedTouch.TouchSimulation) MonoBehaviour to a GameObject in your scene. `TouchSimulation` adds a [`Touchscreen`](xref:UnityEngine.InputSystem.Touchscreen) device and automatically mirrors input on any [Pointer](xref:UnityEngine.InputSystem.Pointer) device to the virtual touchscreen device.
+
+## Enable touch simulation in startup code
+
+Call [`TouchSimulation.Enable`](xref:UnityEngine.InputSystem.EnhancedTouch.TouchSimulation.Enable) somewhere in your startup code:
+
+```c#
+
+ void OnEnable()
+ {
+ TouchSimulation.Enable();
+ }
+
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/step-1-state-struct.md b/Packages/com.unity.inputsystem/Documentation~/step-1-state-struct.md
new file mode 100644
index 0000000000..36d3f48225
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/step-1-state-struct.md
@@ -0,0 +1,46 @@
+---
+uid: input-system-step-1-state-struct
+---
+
+# Step 1 The state struct
+
+The first step is to create a C# `struct` that represents the form in which the system receives and stores input, and also describes the `InputControl` instances that the Input System must create for the Device in order to retrieve its state.
+
+```CSharp
+// A "state struct" describes the memory format that a Device uses. Each Device can
+// receive and store memory in its custom format. InputControls then connect to
+// the individual pieces of memory and read out values from them.
+//
+// If it's important for the memory format to match 1:1 at the binary level
+// to an external representation, it's generally advisable to use
+// LayoutLind.Explicit.
+[StructLayout(LayoutKind.Explicit, Size = 32)]
+public struct MyDeviceState : IInputStateTypeInfo
+{
+ // You must tag every state with a FourCC code for type
+ // checking. The characters can be anything. Choose something that allows
+ // you to easily recognize memory that belongs to your own Device.
+ public FourCC format => new FourCC('M', 'Y', 'D', 'V');
+
+ // InputControlAttributes on fields tell the Input System to create Controls
+ // for the public fields found in the struct.
+
+ // Assume a 16bit field of buttons. Create one button that is tied to
+ // bit #3 (zero-based). Note that buttons don't need to be stored as bits.
+ // They can also be stored as floats or shorts, for example. The
+ // InputControlAttribute.format property determines which format the
+ // data is stored in. If omitted, the system generally infers it from the value
+ // type of the field.
+ [InputControl(name = "button", layout = "Button", bit = 3)]
+ public ushort buttons;
+
+ // Create a floating-point axis. If a name is not supplied, it is taken
+ // from the field.
+ [InputControl(layout = "Axis")]
+ public short axis;
+}
+```
+
+The Input System's layout mechanism uses [`InputControlAttribute`](../api/UnityEngine.InputSystem.Layouts.InputControlAttribute.html) annotations to add Controls to the layout of your Device. For details, see the [layout system](layouts.md) documentation.
+
+With the state struct in place, you now have a way to send input data to the Input System and store it there. The next thing you need is an [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) that uses your custom state struct and represents your custom Device.
diff --git a/Packages/com.unity.inputsystem/Documentation~/step-2-device-class.md b/Packages/com.unity.inputsystem/Documentation~/step-2-device-class.md
new file mode 100644
index 0000000000..77a611c295
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/step-2-device-class.md
@@ -0,0 +1,42 @@
+---
+uid: input-system-step-2-device-class
+---
+
+# Step 2 The Device class
+
+Next, you need a class derived from one of the [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html) base classes. You can either base your Device directly on [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html), or you can pick a more specific Device type, like [`Gamepad`](../api/UnityEngine.InputSystem.Gamepad.html).
+
+This example assumes that your Device doesn't fit into any of the existing Device classes, so it derives directly from [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html).
+
+```CSharp
+// InputControlLayoutAttribute attribute is only necessary if you want
+// to override the default behavior that occurs when you register your Device
+// as a layout.
+// The most common use of InputControlLayoutAttribute is to direct the system
+// to a custom "state struct" through the `stateType` property. See below for details.
+[InputControlLayout(displayName = "My Device", stateType = typeof(MyDeviceState))]
+public class MyDevice : InputDevice
+{
+ // In the state struct, you added two Controls that you now want to
+ // surface on the Device, for convenience. The Controls
+ // get added to the Device either way. When you expose them as properties,
+ // it is easier to get to the Controls in code.
+
+ public ButtonControl button { get; private set; }
+ public AxisControl axis { get; private set; }
+
+ // The Input System calls this method after it constructs the Device,
+ // but before it adds the device to the system. Do any last-minute setup
+ // here.
+ protected override void FinishSetup()
+ {
+ base.FinishSetup();
+
+ // NOTE: The Input System creates the Controls automatically.
+ // This is why don't do `new` here but rather just look
+ // the Controls up.
+ button = GetChildControl("button");
+ axis = GetChildControl("axis");
+ }
+}
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/step-3-update-method.md b/Packages/com.unity.inputsystem/Documentation~/step-3-update-method.md
new file mode 100644
index 0000000000..175842a66f
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/step-3-update-method.md
@@ -0,0 +1,30 @@
+---
+uid: input-system-step-3-update-method
+---
+
+# Step 3 The Update method
+
+You now have a Device in place along with its associated state format. You can call the following method to create a fully set-up Device with your two Controls on it:
+
+```CSharp
+InputSystem.AddDevice();
+```
+
+However, this Device doesn't receive input yet, because you haven't added any code that generates input. To do that, you can use [`InputSystem.QueueStateEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_QueueStateEvent__1_UnityEngine_InputSystem_InputDevice___0_System_Double_) or [`InputSystem.QueueDeltaStateEvent`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_QueueDeltaStateEvent__1_UnityEngine_InputSystem_InputControl___0_System_Double_) from anywhere, including from a thread. The following example uses [`IInputUpdateCallbackReceiver`](../api/UnityEngine.InputSystem.LowLevel.IInputUpdateCallbackReceiver.html), which, when implemented by any [`InputDevice`](../api/UnityEngine.InputSystem.InputDevice.html), adds an [`OnUpdate()`](../api/UnityEngine.InputSystem.LowLevel.IInputUpdateCallbackReceiver.html#UnityEngine_InputSystem_LowLevel_IInputUpdateCallbackReceiver_OnUpdate) method that automatically gets called during [`InputSystem.onBeforeUpdate`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_onBeforeUpdate) and provides input events to the current input update.
+
+>__Note__: If you already have a place where input for your device becomes available, you can skip this step and queue input events from there instead of using [`IInputUpdateCallbackReceiver`](../api/UnityEngine.InputSystem.LowLevel.IInputUpdateCallbackReceiver.html).
+
+```CSharp
+public class MyDevice : InputDevice, IInputUpdateCallbackReceiver
+{
+ //...
+
+ public void OnUpdate()
+ {
+ // In practice, this would read out data from an external
+ // API. This example uses some empty input.
+ var state = new MyDeviceState();
+ InputSystem.QueueStateEvent(this, state);
+ }
+}
+```
diff --git a/Packages/com.unity.inputsystem/Documentation~/step-4-device-registration-creation.md b/Packages/com.unity.inputsystem/Documentation~/step-4-device-registration-creation.md
new file mode 100644
index 0000000000..90282bae41
--- /dev/null
+++ b/Packages/com.unity.inputsystem/Documentation~/step-4-device-registration-creation.md
@@ -0,0 +1,126 @@
+---
+uid: input-system-step-4-device-registration
+---
+
+# Step 4 Device registration and creation
+
+You now have a functioning device, but you haven't registered it (added it to the system) yet. This means you can't see the device when, for example, you create bindings in the [Action editor](action-assets.md#editing-input-action-assets).
+
+You can register your device type with the system from within the code that runs automatically as part of Unity's startup. To do so, modify the definition of `MyDevice` like so:
+
+```CSharp
+// Add the InitializeOnLoad attribute to automatically run the static
+// constructor of the class after each C# domain load.
+#if UNITY_EDITOR
+[InitializeOnLoad]
+#endif
+public class MyDevice : InputDevice, IInputUpdateCallbackReceiver
+{
+ //...
+
+ static MyDevice()
+ {
+ // RegisterLayout() adds a "Control layout" to the system.
+ // These can be layouts for individual Controls (like sticks)
+ // or layouts for entire Devices (which are themselves
+ // Controls) like in our case.
+ InputSystem.RegisterLayout();
+ }
+
+ // You still need a way to trigger execution of the static constructor
+ // in the Player. To do this, you can add the RuntimeInitializeOnLoadMethod
+ // to an empty method.
+ [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
+ private static void InitializeInPlayer() {}
+}
+```
+
+This registers the Device type with the system and makes it available in the Control picker. However, you still need a way to add an instance of the Device when it is connected.
+
+In theory, you could call [`InputSystem.AddDevice()`](../api/UnityEngine.InputSystem.InputSystem.html#UnityEngine_InputSystem_InputSystem_AddDevice__1_System_String_) somewhere, but in a real-world setup you likely have to correlate the Input Devices you create with their identities in the third-party API.
+
+It might be tempting to do something like this:
+
+```CSharp
+public class MyDevice : InputDevice, IInputUpdateCallbackReceiver
+{
+ //...
+
+ // This does NOT work correctly.
+ public ThirdPartyAPI.DeviceId externalId { get; set; }
+}
+```
+
+and then set that on the Device after calling [`AddDevice