public override void OnInspectorGUI() { m_ItemEditor.GUI(); EditorGUILayout.PropertyField(m_SlotProperty); EditorGUILayout.PropertyField(m_MinimumStrengthProperty); EditorGUILayout.PropertyField(m_MinimumAgilityProperty); EditorGUILayout.PropertyField(m_MinimumDefenseProperty); int choice = EditorGUILayout.Popup("Add new Effect", -1, m_AvailableEquipEffectType.ToArray()); if (choice != -1) { var newInstance = ScriptableObject.CreateInstance(m_AvailableEquipEffectType[choice]); AssetDatabase.AddObjectToAsset(newInstance, target); m_EquippedEffectListProperty.InsertArrayElementAtIndex(m_EquippedEffectListProperty.arraySize); m_EquippedEffectListProperty.GetArrayElementAtIndex(m_EquippedEffectListProperty.arraySize - 1).objectReferenceValue = newInstance; } Editor ed = null; int toDelete = -1; for (int i = 0; i < m_EquippedEffectListProperty.arraySize; ++i) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(); var item = m_EquippedEffectListProperty.GetArrayElementAtIndex(i); SerializedObject obj = new SerializedObject(item.objectReferenceValue); Editor.CreateCachedEditor(item.objectReferenceValue, null, ref ed); ed.OnInspectorGUI(); EditorGUILayout.EndVertical(); if (GUILayout.Button("-", GUILayout.Width(32))) { toDelete = i; } EditorGUILayout.EndHorizontal(); } if (toDelete != -1) { var item = m_EquippedEffectListProperty.GetArrayElementAtIndex(toDelete).objectReferenceValue; DestroyImmediate(item, true); //need to do it twice, first time just nullify the entry, second actually remove it. m_EquippedEffectListProperty.DeleteArrayElementAtIndex(toDelete); m_EquippedEffectListProperty.DeleteArrayElementAtIndex(toDelete); } serializedObject.ApplyModifiedProperties(); }