Exemple #1
0
        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();
                }
            }
        }
Exemple #2
0
 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);
            }
        }