This guide describes how to migrate your Unity game to use the latest
Input SDK. The *1.0.0-beta* SDK has substantial improvements over the
previous *0.0.4* preview. You should migrate from the earlier previews as soon
as possible. The *0.0.4* SDK will continue to function through March 2023.

## Update references

Classes received the `Play` prefix to avoid naming collisions with Unity.
Whenever you see the an error message similar to:
> error CS0246: The type or namespace name 'InputMappingProvider' could not be
> found (are you missing a using directive or an assembly reference?)

you must add the `Play` prefix to the class name. For example,
`InputMappingProvider` becomes `PlayInputMappingProvider`.

## Update each InputAction

`InputAction` is now constructed with a call to `PlayInputAction.Create` as opposed
to creating a new `struct` with named fields.

Locate any code that calls `new InputAction`:  

    var driveAction = new InputAction
    {
        ActionLabel = "Drive",
        UniqueId = (int)InputEventIds.DRIVE,
        InputControls = new InputControls
        {
            AndroidKeycodes = new[] { AndroidKeyCode.KEYCODE_SPACE }
        }
    };

And replace it with a call to `PlayInputAction.Create`:  

    var driveAction = PlayInputAction.Create(
        "Drive",
        (int)InputEventIds.DRIVE,
        PlayInputControls.Create(
            new[] { AndroidKeyCode.KEYCODE_SPACE },
            null
        )
    );

## Update each InputGroup

Like `InputAction`, `InputGroup` now has an `PlayInputGroup.Create` call rather
than requiring that you manually fill out a `struct`.

This means that you should locate any calls to `new InputGroup`:  

    var gameInputGroup = new InputGroup
    {
        GroupLabel = "Game controls",
        InputActions = new List<InputAction>
        {
            driveAction,
            turboAction,
            openGarageAction,
            openStoreAction
        }
    };

And replace it to a call to `PlayInputGroup.Create`:  

    var gameInputGroup = PlayInputGroup.Create(
        "Game controls",
        new List<PlayInputAction>
        {
            driveAction,
            turboAction,
            openGarageAction,
            openStoreAction
        }
    );

## Update the InputMap

`InputMap` uses `PlayInputMap.Create` as well instead of constructing a new
struct.

Locate any calls to `new InputMap`:  

    return new InputMap
    {
        InputGroups = new List<InputGroup>
        {
            gameInputGroup,
            menuInputGroup
        },
        MouseSettings = new MouseSettings
        {
            AllowMouseSensitivityAdjustment = false,
            InvertMouseMovement = false
        }
    };

And replace it with a call to `PlayInputMap.Create`:  

    return PlayInputMap.Create(
        new List<PlayInputGroup>
        {
            gameInputGroup,
            menuInputGroup
        },
        PlayMouseSettings.Create(false, false)
    );

## Rename the PlayInputMappingClient methods

For `PlayInputMappingClient`, `RegisterInputMappingProvider` has been renamed to
`SetInputMappingProvider`.

So locate any calls to `RegisterInputMappingProvider`:  

    Input.GetInputMappingClient().RegisterInputMappingProvider(_inputMappingProvider);

And replace them with a call to `SetInputMappingProvider`:  

    PlayInputMappingClient inputMappingClient =
        Google.Play.InputMapping.PlayInput.GetInputMappingClient();
    inputMappingClient.SetInputMappingProvider(_inputMapProvider);

`UnregisterInputMappingProvider` has also been renamed to
`ClearInputMappingProvider` and no longer requires your previously registered
`InputMappingProvider` as a parameter.

Locate any calls to `UnregisterInputMappingProvider`:  

    Input.GetInputMappingClient().UnregisterInputMappingProvider(_inputMapProvider);

And replace them with `ClearInputMappingProvider`:  

    PlayInput.GetInputMappingClient().ClearInputMappingProvider();