Quantcast
Channel: Latest Questions on Unity Answers
Viewing all articles
Browse latest Browse all 171066

Why I get strange behavior when creating fields in loop in custom editor?

$
0
0
The custom editor below creates towers fields in Inspector as shown in picture. ![alt text][1] When I drop game object into Tower1->TurretObject the same object is shown in Tower2->TurretObject. The same happens for TurretGraphic and Cost. What could be the problem? [CustomEditor(typeof(MyClass))] public class TowersEditor : Editor { public override void OnInspectorGUI() { var panel = target as MyClass; var towers = panel.towers; EditorGUIUtility.LookLikeInspector(); panel.showAllTowers = EditorGUILayout.Foldout(panel.showAllTowers, "Towers"); if (panel.showAllTowers) { var size = EditorGUILayout.IntField("Size", towers.Count); if (size < 0) size = 0; towers.Resize(size); panel.showTower.Resize(size); for (int i = 0; i < towers.Count; i++) { panel.showTower[i] = EditorGUILayout.Foldout(panel.showTower[i], "Tower" + (i + 1)); if (panel.showTower[i]) { if (towers[i] == null) towers[i] = new PanelTowersGUI.TowerInfo(); EditorGUI.indentLevel++; towers[i].TowerObject = (GameObject)EditorGUILayout.ObjectField("TurretObject", towers[i].TowerObject, typeof(GameObject), true); towers[i].BtnGraphic = (UISlicedSprite)EditorGUILayout.ObjectField("TurretGraphic", towers[i].BtnGraphic, typeof(UISlicedSprite), true); towers[i].Cost = EditorGUILayout.IntField("Cost", towers[i].Cost); EditorGUI.indentLevel--; } } } } } class MyClass { [HideInInspector] public bool showAllTowers; [HideInInspector] public List showTower; [Serializable] public class TowerInfo { public UISlicedSprite BtnGraphic; public GameObject TowerObject; public int Cost; } [HideInInspector] public List towers; } public static class ListExtensions { public static void Resize(this List list, int newSize, T c) { int cur = list.Count; if (newSize < cur) list.RemoveRange(newSize, cur - newSize); else if (newSize > cur) { if (newSize > list.Capacity)//this bit is purely an optimisation, to avoid multiple automatic capacity changes. list.Capacity = newSize; list.AddRange(Enumerable.Repeat(c, newSize - cur)); } } public static void Resize(this List list, int sz) where T : new() { Resize(list, sz, new T()); } } [1]: /storage/temp/9548-towers.png

Viewing all articles
Browse latest Browse all 171066

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>