You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
6.3 KiB
C#

using UnityEngine;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditorInternal;
#endif
namespace MalbersAnimations
{
[AddComponentMenu("Malbers/Utilities/Tools/Component Selector")]
[HelpURL("https://malbersanimations.gitbook.io/animal-controller/utilities/component-selector")]
public class ComponentSelector : MonoBehaviour
{
public List<ComponentSet> internalComponents;
public bool edit = true;
public ComponentSet this[int index] => internalComponents[index];
[ContextMenu("Show|Hide Editor")]
private void ShowHideEditor()
{
edit ^= true;
#if UNITY_EDITOR
EditorUtility.SetDirty(this);
#endif
}
private void Reset()
{
internalComponents = new List<ComponentSet>();
}
}
[System.Serializable]
public class ComponentSet
{
public string name = "Description Here";
[TextArea] public string tooltip;
public bool active = true;
public GameObject[] gameObjects;
public MonoBehaviour[] monoBehaviours;
}
#if UNITY_EDITOR
[CustomEditor(typeof(ComponentSelector))]
public class SelectComponentsEditor : Editor
{
SerializedProperty internalComponents, edit;
ComponentSelector M;
ReorderableList ReoInternalComponents;
private void OnEnable()
{
M = (ComponentSelector)target;
internalComponents = serializedObject.FindProperty("internalComponents");
edit = serializedObject.FindProperty("edit");
ReoInternalComponents = new ReorderableList(serializedObject, internalComponents)
{
drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
{
var element = internalComponents.GetArrayElementAtIndex(index);
var active = element.FindPropertyRelative("active");
var name = element.FindPropertyRelative("name");
var activeRect1 = new Rect(rect.x, rect.y - 1, 20, rect.height);
var IDRect = new Rect(rect.x + 20, rect.y, rect.width - 20, EditorGUIUtility.singleLineHeight);
active.boolValue = EditorGUI.Toggle(activeRect1, GUIContent.none, active.boolValue);
EditorGUI.PropertyField(IDRect, name, GUIContent.none);
},
drawHeaderCallback = (Rect rect) =>
{
var r = new Rect(rect) { x = rect.x + 30, width = 60 };
var a = new Rect(rect) { width = 65 };
EditorGUI.LabelField(a, new GUIContent("Act", "Is the Component Selection ON or OFF"));
EditorGUI.LabelField(r, new GUIContent("Name", "Name of the Button"));
},
onAddCallback = (ReorderableList list) =>
{
M.internalComponents.Add(new ComponentSet());
EditorUtility.SetDirty(M);
}
};
}
public override void OnInspectorGUI()
{
serializedObject.Update();
if (edit.boolValue)
{
ReoInternalComponents.DoLayoutList();
if (ReoInternalComponents.index != -1)
{
var elem = internalComponents.GetArrayElementAtIndex(ReoInternalComponents.index);
var gos = elem.FindPropertyRelative("gameObjects");
var monoBehaviours = elem.FindPropertyRelative("monoBehaviours");
var tooltip = elem.FindPropertyRelative("tooltip");
EditorGUILayout.PropertyField(gos,true);
EditorGUILayout.PropertyField(monoBehaviours, true);
EditorGUILayout.Space();
EditorGUILayout.PropertyField(tooltip);
}
}
else
{
if (internalComponents.arraySize > 0)
for (int i = 0; i < internalComponents.arraySize; i++)
{
var element = internalComponents.GetArrayElementAtIndex(i);
var name = element.FindPropertyRelative("name");
var tooltip = element.FindPropertyRelative("tooltip");
var active = element.FindPropertyRelative("active");
EditorGUILayout.BeginHorizontal(/*EditorStyles.helpBox*/);
if (GUILayout.Button(new GUIContent(name.stringValue, tooltip.stringValue), EditorStyles.miniButton))
{
if (M[i].gameObjects.Length > 0)
Selection.objects = M[i].gameObjects;
else if (M[i].monoBehaviours.Length > 0)
{
Selection.objects = new Object[1] { M[i].monoBehaviours[0].gameObject };
}
}
EditorGUI.BeginChangeCheck();
var currentGUIColor = GUI.color;
GUI.color = active.boolValue ? (GUI.color + Color.green)/2 : (GUI.color + Color.black) / 2;
active.boolValue = GUILayout.Toggle(active.boolValue, new GUIContent( active.boolValue ? "ON" : "OFF","Enable/Disable the "+ name.stringValue),
EditorStyles.miniButton, GUILayout.Width(55));
GUI.color = currentGUIColor;
if (EditorGUI.EndChangeCheck())
{
foreach (var item in M[i].gameObjects)
{
item.SetActive(active.boolValue);
EditorUtility.SetDirty(item);
}
foreach (var item in M[i].monoBehaviours)
{
item.enabled = (active.boolValue);
EditorUtility.SetDirty(item);
}
}
EditorGUILayout.EndHorizontal();
}
}
serializedObject.ApplyModifiedProperties();
}
}
#endif
}