Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEditor;
- using System.Linq;
- using BSGTools.Utility;
- namespace BSGTools {
- namespace Events {
- [CustomEditor(typeof(EventManager))]
- public class EventManagerGUI : Editor {
- Vector2 scroll = Vector2.zero;
- delegate string[] GetNames(MonoBehaviour[] behavior);
- float delay = 0f;
- string name = "";
- List<bool> foldouts = new List<bool>();
- EventManager manager;
- void Reset() {
- manager = manager ?? target as EventManager;
- manager.tasks = manager.tasks ?? new List<ScriptableObject>();
- }
- public override void OnInspectorGUI() {
- EditorGUI.indentLevel = 1;
- manager = manager ?? target as EventManager;
- DrawDefaultInspector();
- CreateEventButton();
- CreateDelayButton();
- scroll = EditorGUILayout.BeginScrollView(scroll);
- EditorGUILayout.BeginVertical();
- GUILayout.Space(20f);
- if(foldouts.Count == 0) {
- foldouts.Clear();
- foreach(ScriptableObject so in manager.tasks)
- foldouts.Add(false);
- }
- for(int i = 0; i < manager.tasks.Count; i++) {
- EditorGUI.indentLevel = 1;
- ScriptableObject e = manager.tasks[i];
- foldouts[i] = EditorGUILayout.Foldout(foldouts[i], GetFoldoutName(e));
- if(!foldouts[i])
- continue;
- EditorGUI.indentLevel = 3;
- EditorGUILayout.BeginVertical();
- if(EditorGUILayout.ToggleLeft("Delete", false) && ShowEventDeleteConfirmation(e)) {
- manager.tasks.RemoveAt(i);
- foldouts.RemoveAt(i);
- continue;
- }
- if(EditorGUILayout.ToggleLeft("Move Up", false)) {
- manager.tasks.ModifyIndex(i, -1);
- foldouts.ModifyIndex(i, -1);
- }
- if(EditorGUILayout.ToggleLeft("Move Down", false)) {
- manager.tasks.ModifyIndex(i, 1);
- foldouts.ModifyIndex(i, 1);
- }
- if(e.GetType().Equals(typeof(EventTask)))
- DrawEventTask(e as EventTask);
- else if(e.GetType().Equals(typeof(DelayTask)))
- DrawDelayTask(e as DelayTask);
- EditorGUILayout.EndVertical();
- }
- EditorGUILayout.EndVertical();
- EditorGUILayout.EndScrollView();
- if(GUI.changed)
- EditorUtility.SetDirty(manager);
- }
- private bool ShowEventDeleteConfirmation(ScriptableObject e) {
- if(e.GetType().Equals(typeof(DelayTask)))
- return true;
- return EditorUtility.DisplayDialog(string.Format("Delete Event '{0}' ?", GetFoldoutName(e)), "This is irreversible!", "DELETE!", "DON'T DELETE!");
- }
- private string GetFoldoutName(ScriptableObject e) {
- if(e.GetType().Equals(typeof(EventTask))) {
- return ((EventTask) e).eventNickname;
- }
- else {
- return string.Format("DelayTask: {0}", ((DelayTask) e).delay);
- }
- }
- private void CreateEventButton() {
- EditorGUILayout.BeginHorizontal();
- bool newEventBtn = GUILayout.Button("Create New Task");
- name = EditorGUILayout.TextField("Nickname", name);
- if(newEventBtn) {
- EventTask task = ScriptableObject.CreateInstance<EventTask>();
- task.eventNickname = name.Length == 0 ? string.Format("EventTask_{0}", manager.tasks.Count) : name;
- manager.tasks.Add(task);
- foldouts.Add(false);
- }
- EditorGUILayout.EndHorizontal();
- }
- private void DrawDelayTask(DelayTask delayTask) {
- if(delayTask.delay <= 0f)
- delayTask.delay = 1f;
- delayTask.delay = EditorGUILayout.FloatField("Delay Time", delayTask.delay);
- }
- private void DrawEventTask(EventTask e) {
- e.waitForFinish = EditorGUILayout.ToggleLeft("Wait For Finish", e.waitForFinish);
- e.targetGameObj = EditorGUILayout.ObjectField(e.targetGameObj, typeof(GameObject), true) as GameObject;
- MonoBehaviour[] behaviors = EventManager.GetObjBehaviors(e.targetGameObj);
- if(behaviors.Length != 0) {
- int currentBehaviourIndex = behaviors.ToList().IndexOf(e.targetBehavior);
- currentBehaviourIndex = (currentBehaviourIndex < 0) ? 0 : currentBehaviourIndex;
- GetNames GetBNames = l => { string[] names = new string[l.Length]; for(int i = 0; i < l.Length; i++) { names[i] = l[i].GetType().Name; } return names; };
- string[] bNames = GetBNames(behaviors);
- int newBehaviourIndex = EditorGUILayout.Popup("", currentBehaviourIndex, bNames, GUILayout.ExpandWidth(false));
- e.targetBehavior = behaviors[newBehaviourIndex];
- string[] methodNames = EventManager.GetBehaviorMethods(behaviors[newBehaviourIndex]);
- if(methodNames.Length != 0) {
- int currentMethodIndex = methodNames.ToList().IndexOf(e.targetMethod);
- currentMethodIndex = (currentMethodIndex < 0) ? 0 : currentMethodIndex;
- int newMethodIndex = EditorGUILayout.Popup(currentMethodIndex, methodNames, GUILayout.ExpandWidth(true));
- e.targetMethod = methodNames[newMethodIndex];
- }
- }
- }
- private void CreateDelayButton() {
- EditorGUILayout.BeginHorizontal();
- bool newDelayBtn = GUILayout.Button("Create New Delay");
- if(delay <= 0f)
- delay = 1f;
- delay = EditorGUILayout.FloatField("Delay Time", delay);
- if(newDelayBtn && delay > 0f) {
- DelayTask task = ScriptableObject.CreateInstance<DelayTask>();
- task.delay = delay;
- manager.tasks.Add(task);
- foldouts.Add(false);
- }
- EditorGUILayout.EndHorizontal();
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement