public override void OnInspectorGUI()
        {
            library    = EditorGUILayout.ObjectField("Library", library, typeof(SpiritLibrary), false) as SpiritLibrary;
            atkLibrary = EditorGUILayout.ObjectField("AttackLibrary", atkLibrary, typeof(AttackLibrary), false) as AttackLibrary;

            serializedObject.Update();
            if (library != null && atkLibrary != null)
            {
                RenderGeneratorStuff();
            }
            spiritList.DoLayoutList();

            if (selectedSpirit != null)
            {
                RenderSpirit(selectedSpirit);

                attackList?.DoLayoutList();
                if (selectedAttack != null)
                {
                    RenderAttack(selectedAttack);
                }
            }

            serializedObject.ApplyModifiedProperties();
        }
        public override void OnInspectorGUI()
        {
            SpiritLibrary tgt = (SpiritLibrary)target;

            GUILayout.BeginHorizontal();

            txtAsset = EditorGUILayout.ObjectField("Source File", txtAsset, typeof(TextAsset), false) as TextAsset;
            // file = GUILayout.TextField(file);

            if (GUILayout.Button("Load"))
            {
                // AssetDatabase.LoadAssetAtPath <TextAsset>(file)
                tgt.LoadFromCSV(txtAsset);
                EditorUtility.SetDirty(target);
                AssetDatabase.SaveAssets();
            }

            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Spirits");
            if (tgt.Spirits == null || tgt.Spirits.Length == 0)
            {
                return;
            }
            GUILayout.Label("Size: " + tgt.Spirits.Length);
            GUILayout.EndHorizontal();

            if (foldouts == null || foldouts.Length != tgt.Spirits.Length)
            {
                foldouts = new bool[tgt.Spirits.Length];
            }

            EditorGUI.BeginChangeCheck();

            SerializedObject lib = new UnityEditor.SerializedObject(tgt);
            var spirits          = lib.FindProperty("Spirits");

            //            EditorGUILayout.PropertyField(spirits, true);
            //            lib.ApplyModifiedProperties();
            //            EditorGUI.EndChangeCheck();
            //            return;

            for (int index = 0; index < spirits.arraySize; ++index)
            {
                var spiritObject = spirits.GetArrayElementAtIndex(index).objectReferenceValue as SpiritType;
                var spirit       = new SerializedObject(spiritObject);

                spirit.Update();


                var foldout = foldouts[index];
                foldouts[index] = EditorGUILayout.Foldout(foldout, spirit.FindProperty("Name").stringValue);

                var prop = spirit.GetIterator().Copy();

                if (foldout)
                {
                    int f2 = Screen.width / 2;
                    int f3 = Screen.width / 3;

                    GUILayout.BeginHorizontal();
                    GUILayout.Label("Attribute", GUILayout.MinWidth(f2), GUILayout.MaxWidth(f2));
                    GUILayout.Label("Value", GUILayout.MinWidth(f3));
                    GUILayout.EndHorizontal();

                    prop.Next(true);
                    var depth = prop.depth;
                    do
                    {
                        if (prop.displayName == "Attacks")
                        {
                            continue;
                        }
                        RenderAttribute(prop, f2);
                    } while(prop.NextVisible(false) && prop.depth >= depth);

                    var prop_attacks = spirit.FindProperty("Attacks");
                    EditorGUILayout.PropertyField(prop_attacks);
                }

                spirit.ApplyModifiedProperties();
            }

            lib.ApplyModifiedProperties();
            EditorGUI.EndChangeCheck();
        }