public TileTypeCollection Clone()
    {
        TileTypeCollection result = new TileTypeCollection(Width, Height);

        for (int i = 0; i < InternalData.Length; i++)
        {
            result.InternalData[i] = InternalData[i];
        }

        return(result);
    }
示例#2
0
    public int TranslateTilePosition(TileTypeCollection tiles, int x, int y)
    {
        if (tiles == null)
        {
            return(0);
        }

        // Get the limits of the old tile array
        int maxWidth  = tiles.Width;
        int maxHeight = tiles.Height;

        if (y >= maxHeight || x >= maxWidth)
        {
            return(0);
        }

        return(tiles.GetTileType(x, y));
    }
示例#3
0
    public void ApplyChanges(MapSegmentLayer layer, GameObject gameObject, int layerIndex)
    {
        TileTypeCollection oldTiles = null;

        if (layer.TilesCollection != null)
        {
            oldTiles = layer.TilesCollection.Clone();
        }
        layer.TilesCollection = new TileTypeCollection(MapSegment.Width, MapSegment.Height);

        var tileSetLayer = layer.TileSetLayer;

        List <Vector3> vertices = new List <Vector3>();
        List <Vector2> uvs      = new List <Vector2>();
        List <int>     tris     = new List <int>();
        List <Vector3> normals  = new List <Vector3>();

        var  meshFilter = gameObject.GetComponent <MeshFilter>();
        Mesh mesh       = null;

        if (meshFilter.sharedMesh == null)
        {
            mesh = new Mesh();
        }
        else
        {
            mesh = meshFilter.sharedMesh;
            mesh.Clear();
        }

        var index = 0;

        for (int y = 0; y < MapSegment.Height; y++)
        {
            for (int x = 0; x < MapSegment.Width; x++)
            {
                int tmpTileType = 0;
                if (oldTiles != null)
                {
                    tmpTileType = TranslateTilePosition(oldTiles, x, y);
                }

                layer.TilesCollection.SetTileType(x, y, tmpTileType);
                AddVertices(x, y, vertices, GridTileSize);
                AddUvs(layer.TileSetLayer, tmpTileType, uvs);
                index = AddTris(index, tris);
                AddNormals(normals);
            }
        }

        mesh.vertices  = vertices.ToArray();
        mesh.uv        = uvs.ToArray();
        mesh.triangles = tris.ToArray();
        mesh.normals   = normals.ToArray();

        if (meshFilter.GetComponent <Renderer>().sharedMaterial != null)
        {
            meshFilter.GetComponent <Renderer>().sharedMaterial.mainTexture = tileSetLayer.Texture;
        }
        else
        {
            meshFilter.GetComponent <Renderer>().sharedMaterial             = new Material(Shader.Find("Sprites/Default"));
            meshFilter.GetComponent <Renderer>().sharedMaterial.mainTexture = tileSetLayer.Texture;
        }

        var totalWidth  = MapSegment.Width * GridTileSize.x;
        var totalHeight = MapSegment.Height * GridTileSize.y;
        var boxCollider = gameObject.GetComponent <BoxCollider>();

        UpdateBoxColliderSize(boxCollider, totalWidth, totalHeight);

        Undo.RegisterCompleteObjectUndo(meshFilter, "Updated map segment mesh");
        meshFilter.mesh = null;
        Undo.RegisterCompleteObjectUndo(meshFilter, "Updated map segment mesh");
        meshFilter.mesh = mesh;

        // Update the game object
        gameObject.hideFlags = HideFlags.HideInHierarchy;

        EditorUtility.SetDirty(layer);
    }