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();