217 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using UnityEngine;
 | |
| using UnityEngine.SceneManagement;
 | |
| #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);
 | |
|             SceneManager.LoadScene(SceneManager.GetSceneAt(0).path);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 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
 | |
| }
 |