|
|
- using System;
- using System.Collections;
- using UnityEngine;
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
-
- namespace UnityStandardAssets.Utility
- {
- public class TimedObjectActivator : MonoBehaviour
- {
- public enum Action
- {
- Activate,
- Deactivate,
- Destroy,
- ReloadLevel,
- Call,
- }
-
-
- [Serializable]
- public class Entry
- {
- public GameObject target;
- public Action action;
- public float delay;
- }
-
-
- [Serializable]
- public class Entries
- {
- public Entry[] entries;
- }
-
-
- public Entries entries = new Entries();
-
-
- private void Awake()
- {
- foreach (Entry entry in entries.entries)
- {
- switch (entry.action)
- {
- case Action.Activate:
- StartCoroutine(Activate(entry));
- break;
- case Action.Deactivate:
- StartCoroutine(Deactivate(entry));
- break;
- case Action.Destroy:
- Destroy(entry.target, entry.delay);
- break;
-
- case Action.ReloadLevel:
- StartCoroutine(ReloadLevel(entry));
- break;
- }
- }
- }
-
-
- private IEnumerator Activate(Entry entry)
- {
- yield return new WaitForSeconds(entry.delay);
- entry.target.SetActive(true);
- }
-
-
- private IEnumerator Deactivate(Entry entry)
- {
- yield return new WaitForSeconds(entry.delay);
- entry.target.SetActive(false);
- }
-
-
- private IEnumerator ReloadLevel(Entry entry)
- {
- yield return new WaitForSeconds(entry.delay);
- Application.LoadLevel(Application.loadedLevel);
- }
- }
- }
-
-
- namespace UnityStandardAssets.Utility.Inspector
- {
- #if UNITY_EDITOR
- [CustomPropertyDrawer(typeof (TimedObjectActivator.Entries))]
- public class EntriesDrawer : PropertyDrawer
- {
- private const float k_LineHeight = 18;
- private const float k_Spacing = 4;
-
-
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- EditorGUI.BeginProperty(position, label, property);
-
- float x = position.x;
- float y = position.y;
- float width = position.width;
-
- // Draw label
- EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
-
- // Don't make child fields be indented
- var indent = EditorGUI.indentLevel;
- EditorGUI.indentLevel = 0;
-
- var entries = property.FindPropertyRelative("entries");
-
- if (entries.arraySize > 0)
- {
- float actionWidth = .25f*width;
- float targetWidth = .6f*width;
- float delayWidth = .1f*width;
- float buttonWidth = .05f*width;
-
- for (int i = 0; i < entries.arraySize; ++i)
- {
- y += k_LineHeight + k_Spacing;
-
- var entry = entries.GetArrayElementAtIndex(i);
-
- float rowX = x;
-
- // Calculate rects
- Rect actionRect = new Rect(rowX, y, actionWidth, k_LineHeight);
- rowX += actionWidth;
-
- Rect targetRect = new Rect(rowX, y, targetWidth, k_LineHeight);
- rowX += targetWidth;
-
- Rect delayRect = new Rect(rowX, y, delayWidth, k_LineHeight);
- rowX += delayWidth;
-
- Rect buttonRect = new Rect(rowX, y, buttonWidth, k_LineHeight);
- rowX += buttonWidth;
-
- // Draw fields - passs GUIContent.none to each so they are drawn without labels
-
- if (entry.FindPropertyRelative("action").enumValueIndex !=
- (int) TimedObjectActivator.Action.ReloadLevel)
- {
- EditorGUI.PropertyField(actionRect, entry.FindPropertyRelative("action"), GUIContent.none);
- EditorGUI.PropertyField(targetRect, entry.FindPropertyRelative("target"), GUIContent.none);
- }
- else
- {
- actionRect.width = actionRect.width + targetRect.width;
- EditorGUI.PropertyField(actionRect, entry.FindPropertyRelative("action"), GUIContent.none);
- }
-
- EditorGUI.PropertyField(delayRect, entry.FindPropertyRelative("delay"), GUIContent.none);
- if (GUI.Button(buttonRect, "-"))
- {
- entries.DeleteArrayElementAtIndex(i);
- break;
- }
- }
- }
-
- // add & sort buttons
- y += k_LineHeight + k_Spacing;
-
- var addButtonRect = new Rect(position.x + position.width - 120, y, 60, k_LineHeight);
- if (GUI.Button(addButtonRect, "Add"))
- {
- entries.InsertArrayElementAtIndex(entries.arraySize);
- }
-
- var sortButtonRect = new Rect(position.x + position.width - 60, y, 60, k_LineHeight);
- if (GUI.Button(sortButtonRect, "Sort"))
- {
- bool changed = true;
- while (entries.arraySize > 1 && changed)
- {
- changed = false;
- for (int i = 0; i < entries.arraySize - 1; ++i)
- {
- var e1 = entries.GetArrayElementAtIndex(i);
- var e2 = entries.GetArrayElementAtIndex(i + 1);
-
- if (e1.FindPropertyRelative("delay").floatValue > e2.FindPropertyRelative("delay").floatValue)
- {
- entries.MoveArrayElement(i + 1, i);
- changed = true;
- break;
- }
- }
- }
- }
-
-
- // Set indent back to what it was
- EditorGUI.indentLevel = indent;
- //
-
-
- EditorGUI.EndProperty();
- }
-
-
- public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
- {
- SerializedProperty entries = property.FindPropertyRelative("entries");
- float lineAndSpace = k_LineHeight + k_Spacing;
- return 40 + (entries.arraySize*lineAndSpace) + lineAndSpace;
- }
- }
- #endif
- }
|