47 lines
2.4 KiB
Markdown
47 lines
2.4 KiB
Markdown
---
|
|
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`](xref:UnityEngine.InputSystem.Layouts.InputControlAttribute) 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`](xref:UnityEngine.InputSystem.InputDevice) that uses your custom state struct and represents your custom Device.
|