using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEditor;
using UnityEditor.SceneManagement;
public class CustomEventsList : MonoBehaviour
{
public List<CustomEvent> events;
public CustomEventsList()
{
events = new List<CustomEvent>();
}
public void RemoveEvent(string name)
{
foreach (var item in events)
{
if (item._name == name)
{
events.Remove(item);
break;
}
}
}
public void AddEvent(string name)
{
events.Add(new CustomEvent(name));
}
public int IndexOfEvent(CustomEvent _event)
{
int index = -1;
foreach (var item in events)
{
if (item == _event)
{
index = events.IndexOf(item);
}
}
return index;
}
public bool ContainsEvent(string name)
{
foreach (var item in events)
{
if (item._name == name)
{
return true;
}
}
return false;
}
}
[System.Serializable]
public class CustomEvent
{
[SerializeField]
public string _name;
[SerializeField]
public UnityEvent _event;
public CustomEvent(string _name)
{
this._name = _name;
this._event = new UnityEvent();
}
}
[CustomEditor(typeof(CustomEventsList))]
public class CustomEventsListInspector : Editor
{
private CustomEventsList CEL;
private string eventKey;
private void Awake()
{
eventKey = "Событие";
}
private void OnEnable()
{
CEL = (CustomEventsList)target;
}
public override void OnInspectorGUI()
{
EditorGUILayout.BeginVertical("box");
if (GUILayout.Button("Добавить событие", GUILayout.Height(30)))
{
if (!CEL.ContainsEvent(eventKey))
{
CEL.AddEvent(eventKey);
}
}
eventKey = EditorGUILayout.TextField("Имя события", eventKey);
EditorGUILayout.EndVertical();
if (CEL.events.Count > 0)
{
foreach (var item in CEL.events)
{
SerializedProperty prop = ????????????;
EditorGUILayout.BeginVertical("box");
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(item._name);
if (GUILayout.Button("Удалить"))
{
CEL.RemoveEvent(item._name);
break;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.PropertyField(prop);
EditorGUILayout.EndVertical();
}
}
if (GUI.changed)
{
EditorUtility.SetDirty(CEL);
EditorSceneManager.MarkSceneDirty(CEL.gameObject.scene);
}
}
}