/// <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; }); }