void OnEnable()
    {
        // Load property with EditorPrefs.
        int inputSettingsCount = EditorPrefs.GetInt(INPUT_SETTING_NUM_KEY, 0);

        for (int i = 0; i < inputSettingsCount; i++)
        {
            InputSettingData data = new InputSettingData(EditorPrefs.GetString(NAME_KEY + i, missingStr), EditorPrefs.GetBool(IS_DISPLAY_KEY + i, false));
            data.descriptive         = EditorPrefs.GetString(DESCRIPTIVE_KEY + i, missingStr);
            data.negativeDescriptive = EditorPrefs.GetString(NEGATIVE_DESCRIPTIVE_KEY + i, missingStr);
            data.negativeButton      = EditorPrefs.GetString(NEGATIVE_BUTTON_KEY + i, missingStr);
            data.positiveButton      = EditorPrefs.GetString(POSITIVE_BUTTON_KEY + i, missingStr);
            data.altNegativeButton   = EditorPrefs.GetString(ALT_NEGATIVE_BUTTON_KEY + i, missingStr);
            data.altPositiveButton   = EditorPrefs.GetString(ALT_POSITIVE_BUTTON_KEY + i, missingStr);
            data.gravity             = EditorPrefs.GetFloat(GRAVITY_BUTTON_KEY + i, 0);
            data.dead        = EditorPrefs.GetFloat(DEAD_KEY + i, 0);
            data.sensitivity = EditorPrefs.GetFloat(SENSITIVITY_KEY + i, 0);
            data.snap        = EditorPrefs.GetBool(SNAP_KEY + i, false);
            data.invert      = EditorPrefs.GetBool(INVERT_KEY + i, false);
            data.inputType   = (InputType)EditorPrefs.GetInt(INPUT_TYPE_KEY + i, (int)InputType.KeyOrMouseButton);
            data.axisType    = (AxisType)EditorPrefs.GetInt(AXIS_TYPE_KEY + i, (int)AxisType.XAxis);
            data.joystickNum = (JoystickNum)EditorPrefs.GetInt(JOYSTICK_NUM_KEY + i, (int)JoystickNum.All);
            inputSettingList.Add(data);
        }
    }
 void OnDestroy()
 {
     // Save property with EditorPrefs.
     EditorPrefs.SetInt(INPUT_SETTING_NUM_KEY, inputSettingList.Count);
     for (int i = 0; i < inputSettingList.Count; i++)
     {
         InputSettingData data = inputSettingList [i];
         EditorPrefs.SetString(NAME_KEY + i, data.name);
         EditorPrefs.SetBool(IS_DISPLAY_KEY + i, data.isDisplay);
         EditorPrefs.SetString(DESCRIPTIVE_KEY + i, data.descriptive);
         EditorPrefs.SetString(NEGATIVE_DESCRIPTIVE_KEY + i, data.negativeDescriptive);
         EditorPrefs.SetString(NEGATIVE_BUTTON_KEY + i, data.negativeButton);
         EditorPrefs.SetString(POSITIVE_BUTTON_KEY + i, data.positiveButton);
         EditorPrefs.SetString(ALT_NEGATIVE_BUTTON_KEY + i, data.altNegativeButton);
         EditorPrefs.SetString(ALT_POSITIVE_BUTTON_KEY + i, data.altPositiveButton);
         EditorPrefs.SetFloat(GRAVITY_BUTTON_KEY + i, data.gravity);
         EditorPrefs.SetFloat(DEAD_KEY + i, data.dead);
         EditorPrefs.SetFloat(SENSITIVITY_KEY + i, data.sensitivity);
         EditorPrefs.SetBool(SNAP_KEY + i, data.snap);
         EditorPrefs.SetBool(INVERT_KEY + i, data.invert);
         EditorPrefs.SetInt(INPUT_TYPE_KEY + i, (int)data.inputType);
         EditorPrefs.SetInt(AXIS_TYPE_KEY + i, (int)data.axisType);
         EditorPrefs.SetInt(JOYSTICK_NUM_KEY + i, (int)data.joystickNum);
     }
 }
    /// <summary>
    /// 軸を追加します。
    /// </summary>
    /// <param name="serializedObject">Serialized object.</param>
    /// <param name="data">Axis.</param>
    void AddAxis(InputSettingData data)
    {
        // if (axis.axis < 1) Debug.LogError("Axisは1以上に設定してください。");
        SerializedProperty axesProperty = serializedObject.FindProperty("m_Axes");

        axesProperty.arraySize++;
        serializedObject.ApplyModifiedProperties();

        SerializedProperty axisProperty = axesProperty.GetArrayElementAtIndex(axesProperty.arraySize - 1);

        GetChildProperty(axisProperty, "m_Name").stringValue                  = data.name;
        GetChildProperty(axisProperty, "descriptiveName").stringValue         = data.descriptive;
        GetChildProperty(axisProperty, "descriptiveNegativeName").stringValue = data.negativeDescriptive;
        GetChildProperty(axisProperty, "negativeButton").stringValue          = data.negativeButton;
        GetChildProperty(axisProperty, "positiveButton").stringValue          = data.positiveButton;
        GetChildProperty(axisProperty, "altNegativeButton").stringValue       = data.altNegativeButton;
        GetChildProperty(axisProperty, "altPositiveButton").stringValue       = data.altPositiveButton;
        GetChildProperty(axisProperty, "gravity").floatValue                  = data.gravity;
        GetChildProperty(axisProperty, "dead").floatValue        = data.dead;
        GetChildProperty(axisProperty, "sensitivity").floatValue = data.sensitivity;
        GetChildProperty(axisProperty, "snap").boolValue         = data.snap;
        GetChildProperty(axisProperty, "invert").boolValue       = data.invert;
        GetChildProperty(axisProperty, "type").intValue          = (int)data.inputType;
        GetChildProperty(axisProperty, "axis").intValue          = (int)data.axisType;
        GetChildProperty(axisProperty, "joyNum").intValue        = (int)data.joystickNum;

        serializedObject.ApplyModifiedProperties();
    }
    /// <summary>
    /// ゲームパッド用の軸の設定データを作成する
    /// </summary>
    /// <returns>The joy axis.</returns>
    /// <param name="name">Name.</param>
    /// <param name="joystickNum">Joystick number.</param>
    /// <param name="axisType">Axis number.</param>
    public static InputSettingData CreatePadAxis(string name, JoystickNum joystickNum, AxisType axisType)
    {
        var axis = new InputSettingData(name);

        axis.name        = name;
        axis.dead        = 0.2f;
        axis.sensitivity = 1;
        axis.inputType   = InputType.JoystickAxis;
        axis.axisType    = axisType;
        axis.joystickNum = joystickNum;

        return(axis);
    }
    public void SetInputSettingData(List <InputSettingData> dataList)
    {
        if (dataList == null)
        {
            return;
        }

        Clear();
        for (int iInput = 0; iInput < dataList.Count; iInput++)
        {
            InputSettingData data = dataList[iInput];
            AddAxis(data);
        }
    }
    /// <summary>
    /// 押すと1になるキーの設定データを作成する
    /// </summary>
    /// <returns>The button.</returns>
    /// <param name="name">Name.</param>
    /// <param name="positiveButton">Positive button.</param>
    /// <param name="altPositiveButton">Alternate positive button.</param>
    public static InputSettingData CreateButton(string name, string positiveButton, string altPositiveButton)
    {
        var axis = new InputSettingData(name);

        axis.name              = name;
        axis.positiveButton    = positiveButton;
        axis.altPositiveButton = altPositiveButton;
        axis.gravity           = 1000;
        axis.dead              = 0.001f;
        axis.sensitivity       = 1000;
        axis.inputType         = InputType.KeyOrMouseButton;

        return(axis);
    }
    InputSettingData GetInputSettingData(SerializedProperty property)
    {
        InputSettingData data = new InputSettingData(GetChildProperty(property, "m_Name").stringValue, false);

        data.descriptive         = GetChildProperty(property, "descriptiveName").stringValue;
        data.negativeDescriptive = GetChildProperty(property, "descriptiveNegativeName").stringValue;
        data.negativeButton      = GetChildProperty(property, "negativeButton").stringValue;
        data.positiveButton      = GetChildProperty(property, "positiveButton").stringValue;
        data.altNegativeButton   = GetChildProperty(property, "altNegativeButton").stringValue;
        data.altPositiveButton   = GetChildProperty(property, "altPositiveButton").stringValue;
        data.gravity             = GetChildProperty(property, "gravity").floatValue;
        data.dead        = GetChildProperty(property, "dead").floatValue;
        data.sensitivity = GetChildProperty(property, "sensitivity").floatValue;
        data.snap        = GetChildProperty(property, "snap").boolValue;
        data.invert      = GetChildProperty(property, "invert").boolValue;
        data.inputType   = (InputType)GetChildProperty(property, "type").intValue;
        data.axisType    = (AxisType)GetChildProperty(property, "axis").intValue;
        data.joystickNum = (JoystickNum)GetChildProperty(property, "joyNum").intValue;
        return(data);
    }
    /// <summary>
    /// Draw settings data property.
    /// </summary>
    /// <param name="data"></param>
    void DrawInputSettingsProperty(InputSettingData data)
    {
        data.isDisplay = Foldout(data.name, data.isDisplay, out data.isDuplicate, out data.isRemove, out data.isUp, out data.isDown);

        if (data.isDisplay)
        {
            data.name        = EditorGUILayout.TextField("Name", data.name);
            data.descriptive = EditorGUILayout.TextField("Descriptive", data.descriptive);
            data.inputType   = (InputType)EditorGUILayout.EnumPopup("InputType", data.inputType);
            data.axisType    = DrawAxisTypeProperty(data.inputType, data.axisType);
            data.joystickNum = DrawJoystickNumProperty(data.inputType, data.joystickNum);
            DrawPositiveButtonProperty(data.inputType, ref data.positiveButton, ref data.altPositiveButton);
            data.gravity             = DrawGravityProperty(data.inputType, data.gravity);
            data.dead                = EditorGUILayout.FloatField("Dead", data.dead);
            data.snap                = DrawSnapProperty(data.inputType, data.snap);
            data.sensitivity         = EditorGUILayout.FloatField("Sensitivity", data.sensitivity);
            data.invert              = EditorGUILayout.Toggle("Invert", data.invert);
            data.isSetNegativeButton = EditorGUILayout.Toggle("Further set Negative Button", data.isSetNegativeButton);
            if (data.isSetNegativeButton)
            {
                DrawNegativeButtonProperty(data.inputType, ref data.negativeDescriptive, ref data.negativeButton, ref data.altNegativeButton);
            }
        }
    }
    void OnGUI()
    {
        Color bgColor = GUI.backgroundColor;

        using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPos)) {
            scrollPos = scrollView.scrollPosition;

            if (inputSettingList.Count == 0)
            {
                EditorGUILayout.LabelField(string.Format("Input settings is nothing. You can \"{0}\" or \"{1}\".", addStr, loadInputManagerStr));
            }

            for (int i = 0; i < inputSettingList.Count; i++)
            {
                DrawInputSettingsProperty(inputSettingList [i]);
            }
        }

        // Exchange
        for (int i = 0; i < inputSettingList.Count; i++)
        {
            if (inputSettingList[i].isUp)
            {
                inputSettingList[i].isUp = false;
                if (i != 0)
                {
                    InputSettingData work = inputSettingList[i];
                    inputSettingList[i]     = inputSettingList[i - 1];
                    inputSettingList[i - 1] = work;
                }
            }
            if (inputSettingList[i].isDown)
            {
                inputSettingList[i].isDown = false;
                if (i != inputSettingList.Count - 1)
                {
                    InputSettingData work = inputSettingList[i];
                    inputSettingList[i]     = inputSettingList[i + 1];
                    inputSettingList[i + 1] = work;
                }
            }
        }

        // Duplicate
        int count = inputSettingList.Count;

        for (int i = 0; i < count; i++)
        {
            if (inputSettingList[i].isDuplicate)
            {
                inputSettingList[i].isDuplicate = false;
                InputSettingData clone = inputSettingList[i].Clone();
                inputSettingList.Add(clone);
            }
        }

        // Remove
        for (int i = inputSettingList.Count - 1; i >= 0; i--)
        {
            if (inputSettingList[i].isRemove)
            {
                inputSettingList.RemoveAt(i);
            }
        }

        using (new EditorGUILayout.HorizontalScope()) {
            GUILayout.FlexibleSpace();
            if (GUILayout.Button(addStr))
            {
                inputSettingList.Add(new InputSettingData("New Input"));
            }
        }

        using (new EditorGUILayout.HorizontalScope()) {
            GUILayout.FlexibleSpace();

            if (GUILayout.Button("Open InputManager"))
            {
                EditorApplication.ExecuteMenuItem("Edit/Project Settings/Input");
            }

            if (GUILayout.Button(loadInputManagerStr))
            {
                inputSettingList.AddRange(LoadSettingsFromInputManager());
            }
        }

        using (new EditorGUILayout.HorizontalScope()) {
            GUILayout.FlexibleSpace();
            using (new EditorGUI.DisabledGroupScope(inputSettingList.Count == 0)) {
                if (GUILayout.Button("Clear Settings"))
                {
                    ClearSettings();
                }
            }

            GUI.backgroundColor = Color.green;
            if (GUILayout.Button("Apply"))
            {
                Apply();
            }
            GUI.backgroundColor = bgColor;
        }
    }