private void Cleanup()
        {
            for (int skinStylesIndex = 0; skinStylesIndex < m_SkinStyles.arraySize; skinStylesIndex++)
            {
                SerializedProperty skinPartsProperty = m_SkinStyles.GetArrayElementAtIndex(skinStylesIndex).FindPropertyRelative(FieldName.Parts);
                for (int skinPartsIndex = 0; skinPartsIndex < skinPartsProperty.arraySize; skinPartsIndex++)
                {
                    SerializedProperty partsProp             = skinPartsProperty.GetArrayElementAtIndex(skinPartsIndex);
                    SerializedProperty skinPartsTypeProperty = partsProp.FindPropertyRelative(FieldName.Type);
                    int skinPartsType = skinPartsTypeProperty.intValue;

                    // 該当IDが存在しない場合は何もしない
                    if (!SkinPartsAccess.IsCorrectSkinPartsId(skinPartsType))
                    {
                        continue;
                    }

                    var rootType = SkinPartsAccess.GetSkinPartsRootType(skinPartsType);

                    // 該当インスペクターが存在しない場合は何もしない
                    if (!SkinPartsInspectorAccess.IsRegistedInspector(rootType))
                    {
                        continue;
                    }

                    var inspector = SkinPartsInspectorAccess.GetSkinInspector(rootType);

                    m_SkinPartsProperty.MapProperties(partsProp.FindPropertyRelative(FieldName.Property));

                    inspector.CleanupFields(m_SkinPartsProperty);
                }
            }
        }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            int edittedCurrentStyle = currentStyleIndex;

            GUILayout.Label(EditorConst.CurrentSelectStyleTitle);
            GUILayout.BeginHorizontal();
            {
                if (GUILayout.Button(EditorConst.LeftSkinSelectArrow, EditorConst.SkinSelectArrowMaxWidth))
                {
                    edittedCurrentStyle--;
                }
                GUILayout.FlexibleSpace();
                m_CurrentSelectStyleTitle.text = m_StyleIndex.hasMultipleDifferentValues ? EditorConst.CurrentSkinHasMultipleDifferentValue : edittedCurrentStyle.ToString();
                GUILayout.Label(m_CurrentSelectStyleTitle);
                GUILayout.FlexibleSpace();
                if (GUILayout.Button(EditorConst.RightSkinSelectArrow, EditorConst.SkinSelectArrowMaxWidth))
                {
                    edittedCurrentStyle++;
                }
            }
            GUILayout.EndHorizontal();

            SkinnerEditorUtility.DrawLine();

            if (currentStyleIndex != edittedCurrentStyle)
            {
                if (edittedCurrentStyle < 0 || edittedCurrentStyle >= m_SkinStyles.arraySize)
                {
                    return;
                }
                currentStyleIndex = edittedCurrentStyle;
                ApplySkin();
            }

            for (int skinStylesIndex = 0; skinStylesIndex < m_SkinStyles.arraySize; skinStylesIndex++)
            {
                var skinStyleElementProperty = m_SkinStyles.GetArrayElementAtIndex(skinStylesIndex);
                var skinPartsProperty        = skinStyleElementProperty.FindPropertyRelative(FieldName.Parts);
                var styleKey = skinStyleElementProperty.FindPropertyRelative(FieldName.StyleKey);

                GUIStyle style = (edittedCurrentStyle == skinStylesIndex) ? EditorConst.HighLightFoldoutStyle : EditorConst.NormalFoldoutStyle;

                bool hasStyleKey = !string.IsNullOrEmpty(styleKey.stringValue);

                EditorGUILayout.BeginHorizontal();
                m_SkinFoldoutTitle.text             = hasStyleKey ? string.Format(EditorConst.SkinFoldTitleHasStyleKey, skinStylesIndex, styleKey.stringValue) : string.Format(EditorConst.SkinFoldTitle, skinStylesIndex);
                skinStyleElementProperty.isExpanded = EditorGUILayout.Foldout(skinStyleElementProperty.isExpanded, m_SkinFoldoutTitle, true, style);

                if (skinStyleElementProperty.isExpanded)
                {
                    EditorGUILayout.EndHorizontal();

                    EditorGUILayout.PropertyField(styleKey, EditorConst.SkinnerStyleKeyFieldTitle);

                    for (int skinPartsIndex = 0; skinPartsIndex < skinPartsProperty.arraySize; skinPartsIndex++)
                    {
                        SerializedProperty skinPartsElementProperty = skinPartsProperty.GetArrayElementAtIndex(skinPartsIndex);
                        SerializedProperty skinPartsTypeProperty    = skinPartsElementProperty.FindPropertyRelative(FieldName.Type);
                        int skinPartsType = skinPartsTypeProperty.intValue;

                        skinPartsTypeProperty.intValue = EditorGUILayout.IntPopup(skinPartsType, m_SkinnerPartsDisplayNames, m_SkinnerPartsOptionValues);

                        EditorGUI.indentLevel++;

                        // タイプの登録を確認
                        if (SkinPartsAccess.IsCorrectSkinPartsId(skinPartsType))
                        {
                            var rootType = SkinPartsAccess.GetSkinPartsRootType(skinPartsType);

                            // インスペクターの登録を確認
                            if (SkinPartsInspectorAccess.IsRegistedInspector(rootType))
                            {
                                var inspector = SkinPartsInspectorAccess.GetSkinInspector(rootType);

                                m_SkinPartsProperty.MapProperties(skinPartsElementProperty.FindPropertyRelative(FieldName.Property));

                                EditorGUI.BeginChangeCheck();
                                inspector.DrawInspector(m_SkinPartsProperty);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    if (skinStylesIndex == m_StyleIndex.intValue)
                                    {
                                        ApplySkin();
                                    }
                                }
                            }
                            else
                            {
                                // 該当インスペクターが存在しない場合は何もしない
                                var skinPartsTypeName = SkinnerEditorUtility.GetEditorName(rootType.Name);
                                EditorGUILayout.HelpBox(string.Format(EditorConst.MissingSkinPartsInspectorTypeMessage, skinPartsTypeName), EditorConst.MissingSkinPartsInspectorTypeMessageType);
                            }
                        }
                        else
                        {
                            // 該当IDが存在しない場合は警告を出す
                            EditorGUILayout.HelpBox(string.Format(EditorConst.MissingSkinPartsTypeMessage, skinPartsType), EditorConst.MissingSkinPartsTypeMessageType);
                        }

                        EditorGUI.indentLevel--;

                        if (SkinnerEditorUtility.DrawRemoveButton(EditorConst.RemovePartsButtonTitle, () => {
                            skinPartsProperty.DeleteArrayElementAtIndex(skinPartsIndex);
                            serializedObject.ApplyModifiedProperties();
                        }))
                        {
                            return;
                        }
                    }

                    EditorGUILayout.Space();
                    EditorGUILayout.BeginHorizontal();
                    if (SkinnerEditorUtility.DrawAddButton(EditorConst.AddPartsButtonTitle, () => {
                        skinPartsProperty.InsertArrayElementAtIndex(skinPartsProperty.arraySize);
                        serializedObject.ApplyModifiedProperties();
                    }))
                    {
                        return;
                    }

                    EditorGUILayout.Space();
                }

                if (SkinnerEditorUtility.DrawRemoveButton(EditorConst.RemoveSkinButtonTitle, () => {
                    m_SkinStyles.DeleteArrayElementAtIndex(skinStylesIndex);
                    if (currentStyleIndex >= skinLength)
                    {
                        // スキンがゼロの場合
                        if (skinLength == 0)
                        {
                            // 規定値としてゼロを入れておく
                            currentStyleIndex = 0;
                        }
                        // 設定された番号をスキンの数が下回った場合
                        else
                        {
                            // とりあえずサイズより小さくしておく
                            currentStyleIndex = m_SkinStyles.arraySize - 1;
                            // 反映
                            ApplySkin();
                        }
                    }
                    serializedObject.ApplyModifiedProperties();
                }))
                {
                    return;
                }
                EditorGUILayout.EndHorizontal();

                if (skinStyleElementProperty.isExpanded)
                {
                    EditorGUILayout.Space();
                    SkinnerEditorUtility.DrawLine();
                    EditorGUILayout.Space();
                }
                serializedObject.ApplyModifiedProperties();
            }

            EditorGUILayout.BeginHorizontal();

            if (SkinnerEditorUtility.DrawAddButton(EditorConst.AddSkinButtonTitle, () => {
                m_SkinStyles.InsertArrayElementAtIndex(m_SkinStyles.arraySize);
                var addedStyle = m_SkinStyles.GetArrayElementAtIndex(m_SkinStyles.arraySize - 1);
                bool expanded = true;
                if (m_SkinStyles.arraySize > 1)
                {
                    expanded = m_SkinStyles.GetArrayElementAtIndex(m_SkinStyles.arraySize - 2).isExpanded;
                }
                m_SkinStyles.GetArrayElementAtIndex(m_SkinStyles.arraySize - 1).isExpanded = expanded;
                serializedObject.ApplyModifiedProperties();
            }))
            {
                return;
            }

            EditorGUILayout.Space();

            if (SkinnerEditorUtility.DrawCleanupButton(EditorConst.CleanupButtonTitle, () => {
                Cleanup();
                serializedObject.ApplyModifiedProperties();
            }))
            {
                return;
            }

            EditorGUILayout.EndHorizontal();

            serializedObject.ApplyModifiedProperties();
        }