예제 #1
0
        void BuildChunk()
        {
            cd = cRender.mm.map.chunks[position.x, position.y];
            int        hei = cRender.mm.chunkHeight;
            MapManager mm  = MapManager.instance;

            for (int i = 0; i < cRender.mm.chunkWidth; i++)
            {
                for (int j = 0; j < hei; j++)
                {
                    TileString tl = cd.GetTile(i, j, layer);
                    if (!ReferenceEquals(tl, null))
                    {
                        TileBase tb = mm.GetTileFromCollection(tl);
                        AddTile(i, j, tb);
                        if (tb.gameObject)
                        {
                            if (gameObjects[i, j] == null)
                            {
                                gameObjects[i, j] = GameObject.Instantiate(tb.gameObject, transform, false);
                                gameObjects[i, j].transform.localPosition = new Vector3(i, j) * scale;
                            }
                        }
                    }
                    else
                    {
                        if (gameObjects[i, j] != null)
                        {
                            Destroy(gameObjects[i, j]);
                        }
                    }
                }
            }
        }
예제 #2
0
        private void GenerateOutline(int x, int y)
        {
            points.Clear();
            realPts.Clear();
            dir            = Vector2Int.right;
            currentpoint.x = x;
            currentpoint.y = y;
            points.Add(currentpoint);
            realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionBtm(currentpoint.x, currentpoint.y));
            currentpoint += dir;
            while (!(points[0] == currentpoint))
            {
                if (dir == Vector2Int.right)
                {
                    if (currentpoint.x >= chu.GetLength(0))
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x - 1, currentpoint.y, layer)).GetCollisionRight(currentpoint.x - 1, currentpoint.y));
                        dir = Vector2Int.up;
                    }
                    else if (chu[currentpoint.x, currentpoint.y].tile == 0)
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x - 1, currentpoint.y, layer)).GetCollisionRight(currentpoint.x - 1, currentpoint.y));
                        dir = Vector2Int.up;
                    }
                    else if (currentpoint.y - 1 >= 0)
                    {
                        if (chu[currentpoint.x, currentpoint.y - 1].tile != 0)
                        {
                            realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y - 1, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y - 1));
                            dir = Vector2Int.down;
                        }
                        else
                        {
                            realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionBtm(currentpoint.x, currentpoint.y));
                        }
                    }
                    else
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionBtm(currentpoint.x, currentpoint.y));
                    }
                }
                else if (dir == Vector2Int.up)
                {
                    if (currentpoint.y >= chu.GetLength(1))
                    {
                        dir = Vector2Int.left;
                    }
                    else
                    {
                        if (chu[currentpoint.x - 1, currentpoint.y].tile == 0)
                        {
                            realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x - 1, currentpoint.y - 1, layer)).GetCollisionTopBk(currentpoint.x - 1, currentpoint.y - 1));
                            dir = Vector2Int.left;
                            if (currentpoint.x < chu.GetLength(0) && currentpoint.y < chu.GetLength(1))
                            {
                                if (chu[currentpoint.x, currentpoint.y].tile != 0)
                                {
                                    recalcPoints.Add(currentpoint);
                                }
                            }
                        }
                        else if (chu[currentpoint.x - 1, currentpoint.y].tile != 0)
                        {
                            if (currentpoint.x < chu.GetLength(0))
                            {
                                if (chu[currentpoint.x, currentpoint.y].tile != 0)
                                {
                                    dir = Vector2Int.right;
                                }
                                else
                                {
                                    realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x - 1, currentpoint.y, layer)).GetCollisionRight(currentpoint.x - 1, currentpoint.y));
                                }
                                ignorePoints.Add(new Vector2(currentpoint.x - 1, currentpoint.y));
                            }
                            else
                            {
                                realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x - 1, currentpoint.y, layer)).GetCollisionRight(currentpoint.x - 1, currentpoint.y));
                            }
                        }
                    }
                }
                else if (dir == Vector2Int.left)
                {
                    if (currentpoint.x - 1 < 0)
                    {
                        dir = Vector2Int.down;
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y - 1, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y - 1));
                    }
                    else if (chu[currentpoint.x - 1, currentpoint.y - 1].tile == 0)
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y - 1, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y - 1));
                        dir = Vector2Int.down;
                    }
                    else if (currentpoint.y < chu.GetLength(1))
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y - 1, layer)).GetCollisionTopBk(currentpoint.x, currentpoint.y - 1));
                        if (chu[currentpoint.x - 1, currentpoint.y].tile != 0)
                        {
                            dir = Vector2Int.up;
                            realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x - 1, currentpoint.y, layer)).GetCollisionRight(currentpoint.x - 1, currentpoint.y));
                        }
                    }
                    else
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y - 1, layer)).GetCollisionTopBk(currentpoint.x, currentpoint.y - 1));
                    }
                }
                else if (dir == Vector2Int.down)
                {
                    if (currentpoint.y - 1 < 0)
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y));
                        dir = Vector2Int.right;
                    }
                    else if (chu[currentpoint.x, currentpoint.y - 1].tile == 0)
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y));
                        dir = Vector2Int.right;
                    }
                    else if (currentpoint.x - 1 >= 0)
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y));
                        if (chu[currentpoint.x - 1, currentpoint.y - 1].tile != 0 && chu[currentpoint.x - 1, currentpoint.y].tile == 0)
                        {
                            //realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y - 1, layer)).GetCollisionTop(currentpoint.x, currentpoint.y - 1));
                            dir = Vector2Int.left;
                        }
                    }
                    else
                    {
                        realPts.AddRange(MapManager.instance.GetTileFromCollection(chd.GetTile(currentpoint.x, currentpoint.y, layer)).GetCollisionLeft(currentpoint.x, currentpoint.y));
                    }
                }
                points.Add(currentpoint);
                currentpoint += dir;
            }
            realPts.Distinct();
            realPts.Add(realPts[0]);
            for (int o = 0; o < realPts.Count; o++)
            {
                realPts[o] *= scale;
            }
            EdgeCollider2D ec = GetColl();

            ec.points = realPts.ToArray();
            ignorePoints.AddRange(points);
        }