A game about forced loneliness, made by TACStudios
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}