88 lines
3.8 KiB
Markdown
88 lines
3.8 KiB
Markdown
|
---
|
|||
|
uid: input-system-workflow-embedded
|
|||
|
---
|
|||
|
# Workflow Overview - Using Embedded Actions
|
|||
|
|
|||
|
![image alt text](./Images/Workflow-Embedded.svg)
|
|||
|
|
|||
|
You can use the **InputAction class** in your script to define actions in your script. This adds a layer of abstraction between your actual action code or methods, and the [bindings](ActionBindings.html) to specific device controls.
|
|||
|
|
|||
|
This means that instead of directly reading device states, you do not specify explicitly which controls (such as a gamepad trigger or stick) should do what in your code. Instead you create [Actions](Actions.html), [bind](ActionBindings.html) them to [controls](Controls.html), and respond to the states or values from your Actions in your code.
|
|||
|
|
|||
|
When you make a public [InputAction](../api/UnityEngine.InputSystem.InputAction.html) field in a MonoBehaviour script, it displays in the inspector as a configurable field. The configurable field UI allows you to create a binding for the action. For example, here are two Actions defined using the InputAction class in a script:
|
|||
|
|
|||
|
```
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.InputSystem;
|
|||
|
|
|||
|
public class ExampleScript : MonoBehaviour
|
|||
|
{
|
|||
|
public InputAction move;
|
|||
|
public InputAction jump;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
In the image below, you can see the actions displayed in the inspector. In this example they have been configured so they are bound to Gamepad controls.
|
|||
|
|
|||
|
![image alt text](./Images/Workflow-EmbeddedActionsInspector.png)
|
|||
|
|
|||
|
The InputAction class provides a way to bind interactions from a device’s controls to named actions in the inspector. When you bind actions to controls from a device in the inspector, you can then design your script to respond when the actions are performed without hard-coding references to specific devices in your script. This layer of abstraction provides you with the flexibility to modify or add multiple bindings without needing to change your code.
|
|||
|
|
|||
|
To read values from your Actions, you must first **enable** the action, and then either repeatedly poll the action in your game loop, or add event handlers to the action. You must also **disable** the action when you no longer want the input to trigger event handlers.
|
|||
|
|
|||
|
So, use actions such as those shown above in the small code sample, you would use a script like this:
|
|||
|
|
|||
|
```
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.InputSystem;
|
|||
|
|
|||
|
// Using embedded actions with callbacks or reading values each frame.
|
|||
|
|
|||
|
public class ExampleScript : MonoBehaviour
|
|||
|
{
|
|||
|
// these embedded actions are configurable in the inspector:
|
|||
|
public InputAction moveAction;
|
|||
|
public InputAction jumpAction;
|
|||
|
|
|||
|
public void Awake()
|
|||
|
{
|
|||
|
// assign a callback for the "jump" action.
|
|||
|
jumpAction.performed += ctx => { OnJump(ctx); };
|
|||
|
}
|
|||
|
|
|||
|
public void Update()
|
|||
|
{
|
|||
|
// read the value for the "move" action each frame.
|
|||
|
Vector2 moveAmount = moveAction.ReadValue<Vector2>();
|
|||
|
}
|
|||
|
|
|||
|
public void OnJump(InputAction.CallbackContext context)
|
|||
|
{
|
|||
|
// jump code goes here.
|
|||
|
}
|
|||
|
|
|||
|
// the actions must be enabled and disabled
|
|||
|
// when the GameObject is enabled or disabled
|
|||
|
|
|||
|
public void OnEnable()
|
|||
|
{
|
|||
|
moveAction.Enable();
|
|||
|
jumpAction.Enable();
|
|||
|
}
|
|||
|
|
|||
|
public void OnDisable()
|
|||
|
{
|
|||
|
moveAction.Disable();
|
|||
|
jumpAction.Disable();
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
See [Actions](Actions.html) for more information about both these techniques.
|
|||
|
|
|||
|
You can find an example of this workflow in the sample projects included with the input system package. To find it, in the Project window, look in **Assets > Samples > SimpleDemo** and open the scene: **SimpleDemo_UsingActions**.
|
|||
|
|
|||
|
Using InputActions also makes it easier to implement a system to allow the user to remap their own controls at run time.
|
|||
|
|
|||
|
Using embedded actions like this is more flexible than [directly reading device states](Workflow-Direct.html), but less flexible than using an [actions asset](Workflow-ActionsAsset.html).
|