A game about forced loneliness, made by TACStudios
at master 3.5 kB view raw
1using System; 2using System.Linq; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEditor; 6using UnityEditor.EditorTools; 7 8namespace UnityEditor.U2D.Common.Path 9{ 10 internal class GenericScriptablePathInspector<U,T> : ScriptablePathInspector where U : ScriptableData<T> 11 { 12 private List<U> m_DataObjects = new List<U>(); 13 private List<U> m_SelectedDataObjects = new List<U>(); 14 private Editor m_CachedEditor = null; 15 16 private void OnEnable() 17 { 18 PrepareDataObjects(); 19 } 20 21 private void OnDestroy() 22 { 23 DestroyDataObjects(); 24 } 25 26 public override void OnInspectorGUI() 27 { 28 base.OnInspectorGUI(); 29 30 DoCustomDataInspector(); 31 } 32 33 protected void DoCustomDataInspector() 34 { 35 PrepareDataObjects(); 36 37 if (m_SelectedDataObjects.Count > 0) 38 { 39 CreateCachedEditor(m_SelectedDataObjects.ToArray(), null, ref m_CachedEditor); 40 41 EditorGUI.BeginChangeCheck(); 42 43 m_CachedEditor.OnInspectorGUI(); 44 45 if (EditorGUI.EndChangeCheck()) 46 SetDataObjects(); 47 } 48 } 49 50 private void PrepareDataObjects() 51 { 52 var elementCount = 0; 53 54 m_SelectedDataObjects.Clear(); 55 56 foreach(var path in paths) 57 elementCount += path.pointCount; 58 59 while (m_DataObjects.Count < elementCount) 60 CreateDataObject(); 61 62 var index = 0; 63 foreach(var path in paths) 64 { 65 var genericPath = path as GenericScriptablePath<T>; 66 var customDataArray = genericPath.data; 67 var length = customDataArray.Length; 68 69 for (var i = 0; i < length; ++i) 70 { 71 var dataObject = m_DataObjects[index + i]; 72 dataObject.data = customDataArray[i]; 73 74 if (path.selection.Contains(i)) 75 { 76 dataObject.owner = path.owner; 77 dataObject.index = i; 78 m_SelectedDataObjects.Add(dataObject); 79 } 80 } 81 82 index += length; 83 } 84 } 85 86 private void SetDataObjects() 87 { 88 var index = 0; 89 foreach(var path in paths) 90 { 91 var genericPath = path as GenericScriptablePath<T>; 92 var customDataArray = genericPath.data; 93 var length = customDataArray.Length; 94 95 for (var i = 0; i < length; ++i) 96 customDataArray[i] = m_DataObjects[index + i].data; 97 98 genericPath.data = customDataArray; 99 100 index += length; 101 } 102 } 103 104 private U CreateDataObject() 105 { 106 var dataObject = ScriptableObject.CreateInstance<U>(); 107 dataObject.hideFlags = HideFlags.HideAndDontSave; 108 m_DataObjects.Add(dataObject); 109 return dataObject; 110 } 111 112 private void DestroyDataObjects() 113 { 114 foreach (var customDataObject in m_DataObjects) 115 DestroyImmediate(customDataObject); 116 117 m_DataObjects.Clear(); 118 m_SelectedDataObjects.Clear(); 119 } 120 } 121}