public void Init() { if (m_instance != null && m_instance != this) { Destroy(gameObject); return; } DontDestroyOnLoad(gameObject); m_instance = this; BeginFromStartTheme(); m_tileSize = tilePrefab.GetComponent <MeshFilter>().sharedMesh.bounds.extents.x * 2 * tilePrefab.transform.localScale.x; tilePrefab.Init(this); m_yPos = tilePrefab.cachedTransform.localPosition.y; tilePool = new Tile[m_tileCount, m_tileCount]; var halfSize = (m_tileSize * m_tileCount) / 2; for (int x = 0; x < m_tileCount; x++) { for (int z = 0; z < m_tileCount; z++) { var t = Instantiate(tilePrefab); t.transform.SetParent(transform); t.transform.localPosition = new Vector3((m_tileSize * x) - halfSize + (m_tileSize / 2), m_yPos, (m_tileSize * z) - halfSize + (m_tileSize / 2)); t.transform.localEulerAngles = new Vector3(0, 0, 0); t.Init(this); t.name = string.Format("tile_x{0}_z{1}", x, z); tilePool[x, z] = t; t.x = x; t.z = z; t.groups = new LayoutGroup[themes.Count]; if (z == 1 && x == 1) { t.empty = true; } } } tilePrefab.gameObject.SetActive(false); m_cachedTransform = transform; foreach (var t in themes) { if (t.groups.Count < 9) { int size = 9 - t.groups.Count; for (int i = 0; i < size; i++) { t.groups.Add(t.groups.Random().Clone()); } } } foreach (var theme in themes) { foreach (var g in theme.groups) { g.InitPool(); g.DisableAll(); } } }
public void Init(GroundBuilder ground) { m_ground = ground; m_cachedTransform = transform; m_rend = GetComponent <MeshRenderer>(); }
public override void OnInspectorGUI() { base.OnInspectorGUI(); EditorGUILayout.Space(); ground = target as GroundBuilder; theme = ground.themes.Count > 0 && ground.currentTheme < ground.themes.Count ? ground.themes[ground.currentTheme] : null; if (theme == null) { return; } groups = theme.groups; if (ground.GetComponentInChildren <Tile>() == null) { var plane = GameObject.CreatePrimitive(PrimitiveType.Plane).AddComponent <Tile>(); plane.transform.SetParent(ground.transform); plane.transform.localPosition = Vector3.zero; plane.transform.localEulerAngles = Vector3.zero; ground.tilePrefab = plane; EditorUtility.SetDirty(ground); } tile = ground.transform.GetChild(0); if (GUILayout.Button("Create Layout Group")) { var group = new GroundBuilder.LayoutGroup(); group.obstacles = FindObjectsOfType <Obstacle>(); for (int i = 0; i < group.obstacles.Length; i++) { group.obstacles[i] = PrefabUtility.GetPrefabParent(group.obstacles[i]) as Obstacle; } group.index = groups.Count; ground.currentGroup = groups.Count; groups.Add(group); var layout = new GroundBuilder.Layout(); var obstacles = FindObjectsOfType <Obstacle>(); ground.spawned = obstacles; layout.objects = new GroundBuilder.Layout.LayoutObject[obstacles.Length]; for (int i = 0; i < obstacles.Length; i++) { var obs = obstacles[i]; layout.objects[i] = new GroundBuilder.Layout.LayoutObject() { euler = obs.transform.eulerAngles.y, index = i, position = tile.InverseTransformPoint(obs.transform.position) }; } layout.index = group.layouts.Count; group.layouts.Add(layout); Undo.RecordObject(target, "Create Layout Group"); EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } if (GUILayout.Button("Add Layout")) { if (ground.currentGroup >= 0 && ground.currentGroup < groups.Count) { var group = groups[ground.currentGroup]; var layout = new GroundBuilder.Layout(); var obstacles = ground.spawned == null || ground.spawned.Length == 0 ? FindObjectsOfType <Obstacle>() : ground.spawned; layout.objects = new GroundBuilder.Layout.LayoutObject[obstacles.Length]; for (int i = 0; i < obstacles.Length; i++) { var obs = obstacles[i]; layout.objects[i] = new GroundBuilder.Layout.LayoutObject() { euler = obs.transform.eulerAngles.y, index = i, position = tile.InverseTransformPoint(obs.transform.position) }; } layout.index = group.layouts.Count; group.layouts.Add(layout); Undo.RecordObject(target, "Add layout"); EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } else { Debug.Log(string.Format("no group found with {0} index.", ground.currentGroup)); } } if (GUILayout.Button("Save Layout")) { if (ground.currentGroup >= 0 && ground.currentGroup < groups.Count) { var group = groups[ground.currentGroup]; var layout = new GroundBuilder.Layout(); if (ground.spawned == null) { Debug.Log(string.Format("{0}", "saving failed")); return; } var list = new List <GroundBuilder.Layout.LayoutObject>(); for (int i = 0; i < ground.spawned.Length; i++) { var obs = ground.spawned[i]; if (obs != null) { list.Add(new GroundBuilder.Layout.LayoutObject() { euler = obs.transform.eulerAngles.y, index = i, position = tile.InverseTransformPoint(obs.transform.position) }); } } layout.objects = list.ToArray(); group.layouts[ground.currentLayout] = layout; EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } else { Debug.Log(string.Format("no group found with {0} index.", ground.currentGroup)); } } if (GUILayout.Button("Spawn Group")) { SpawnCurrent(); } if (GUILayout.Button("Delete Spawned")) { for (int i = 0; i < ground.spawned.Length; i++) { if (ground.spawned[i] != null) { Undo.DestroyObjectImmediate(ground.spawned[i].gameObject); } } } if (GUILayout.Button("Delete Obstacles Only")) { for (int i = 0; i < ground.spawned.Length; i++) { var o = ground.spawned[i]; if (o != null && o.obstacleType == Obstacle.Type.Obstacle) { Undo.DestroyObjectImmediate(o.gameObject); } } } if (GUILayout.Button("Randomize Euler")) { var obstacles = FindObjectsOfType <Obstacle>(); for (int i = 0; i < obstacles.Length; i++) { obstacles[i].transform.eulerAngles = new Vector3(0, isometricAngles.Random(), 0); } } if (GUILayout.Button("Find Spawned")) { ground.spawned = FindObjectsOfType <Obstacle>(); EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } if (GUILayout.Button("Shuffle All")) { var obstacles = ground.spawned == null || ground.spawned.Length == 0 ? FindObjectsOfType <Obstacle>() : ground.spawned; var tileBounds = ground.transform.GetChild(0).GetComponent <BoxCollider>().bounds.extents * .7f; foreach (var obstacle in obstacles) { var pos = new Vector3(Random.Range(-tileBounds.x, tileBounds.x), 0, Random.Range(-tileBounds.z, tileBounds.z)); foreach (var other in obstacles) { if (other != obstacle) { int c = 0; while (Vector3.SqrMagnitude(other.transform.position - pos) < 50) { c++; if (c > 100) { Debug.Log(string.Format("{0}", "too much man...")); break; } pos = new Vector3(Random.Range(-tileBounds.x, tileBounds.x), 0, Random.Range(-tileBounds.z, tileBounds.z)); } } } obstacle.transform.position = ground.transform.InverseTransformPoint(pos); } } if (GUILayout.Button("Fix Height")) { foreach (var t in ground.themes) { foreach (var g in t.groups) { foreach (var l in g.layouts) { foreach (var o in l.objects) { o.position.y = 0; } } } } EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } if (GUILayout.Button("Spawn Next")) { SpawnNext(); } if (GUILayout.Button("Sort")) { ground.themes.Sort((t1, t2) => t1.order.CompareTo(t2.order)); EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } if (GUILayout.Button("Save Sun Euler")) { theme = ground.themes[ground.currentTheme]; EditorUtility.SetDirty(ground); EditorUtility.SetDirty(theme); } }