Beispiel #1
0
    /// <summary>
    /// 保存单个地形数据
    /// </summary>
    private void SaveTerrainData(Terrain terrain, string folderName, string fileName)
    {
        TerrainData terrainData = terrain.terrainData;

        // 新建一个TDData并赋值
        TDData tDData = new TDData();

        tDData.name        = terrain.name;
        tDData.terrainPos  = terrain.GetPosition();
        tDData.heightMap   = terrainData.GetHeights(0, 0, terrainData.heightmapResolution, terrainData.heightmapResolution);
        int[][,] detailMap = new int[terrainData.detailPrototypes.Length][, ];
        for (int i = 0; i < detailMap.Length; i++)
        {
            detailMap[i] = terrainData.GetDetailLayer(0, 0, terrainData.detailResolution, terrainData.detailResolution, i);
        }
        tDData.detailMap = detailMap;
        tDData.alphaMap  = terrainData.GetAlphamaps(0, 0, terrainData.alphamapResolution, terrainData.alphamapResolution);

        Vector3[][]      treePoses = new Vector3[terrainData.treePrototypes.Length][];
        List <Vector3>[] temp      = new List <Vector3> [treePoses.Length];
        for (int i = 0; i < treePoses.Length; i++)
        {
            temp[i] = new List <Vector3>();
        }
        foreach (var item in terrainData.treeInstances)
        {
            temp[item.prototypeIndex].Add(item.position);
        }
        for (int i = 0; i < treePoses.Length; i++)
        {
            treePoses[i] = temp[i].ToArray();
        }
        tDData.treePoses = treePoses;
        runedCount      += 0.2f;

        //序列化TDDate并保存
        Task.Run(() =>
        {
            runedCount += 0.2f;
            byte[] data = null;
            data        = TDDataSerialize(tDData);

            runedCount += 0.4f;
            data        = IOUtility.Compress(data);
            File.WriteAllBytes(savePath + "/" + folderName + "/" + fileName + ".terrainData", data);
            runedCount += 0.2f;
        });
    }