/// <summary> /// 拆分地形 /// </summary> /// <param name="iSaveDir">保存路径</param> /// <param name="iLayerLevel">地形层级</param> /// <param name="iTileIndex">地形的Tile索引</param> /// <param name="iSlicingCount">单个地形的拆分个数。(如:2x2 则为2)</param> /// <param name="iTerrainObj">地形对象</param> /// <param name="iChunkTileIndex">单个地形的拆分成chunk后的tile索引</param> /// <param name="iUpdateProgress">进度更新委托</param> private void SplitTerrains( string iSaveDir, int iLayerLevel, Vector2 iTileIndex, int iSlicingCount, GameObject iTerrainObj, Vector2 iChunkTileIndex, ProgressBarUpdate iUpdateProgress = null) { if (string.IsNullOrEmpty(iSaveDir)) { return; } if (0 >= iSlicingCount) { return; } if (null == iTerrainObj) { Error("SplitTerrains():The gameobject is null or invalid in hierarchy!!!"); return; } var terrain = iTerrainObj.GetComponent <Terrain>(); if (null == terrain) { Error("SplitTerrains():There is no component named terrain in the gameobject(name:{0})!!!", iTerrainObj.name); return; } // 地形数据 var terrainData = terrain.terrainData; // 地形尺寸 var terrainSize = terrainData.size; // 得到地图分辨率 var newHeightmapResolution = (terrainData.heightmapResolution - 1) / iSlicingCount; var newAlphamapResolution = terrainData.alphamapResolution / iSlicingCount; var newbaseMapResolution = terrainData.baseMapResolution / iSlicingCount; // 溅斑原型列表 var splatProtos = terrainData.splatPrototypes; var x = (int)iChunkTileIndex.x; var y = (int)iChunkTileIndex.y; //创建资源 // 地形拆分chunk保存路径 var morton = TerrainsSettings.Morton(iTileIndex, iChunkTileIndex, iSlicingCount, iLayerLevel); var chunkName = string.Format("{0}{1}.asset", TerrainsSettings.ChunkNamePrefix, morton); var savePath = string.Format("{0}/{1}", iSaveDir, chunkName); // 更新进度 - 拆分开始 if (null != iUpdateProgress) { var statusTxt = string.Format("拆分开始:{0}...", chunkName); iUpdateProgress(statusTxt, false); } var newData = new TerrainData(); if (null == newData) { Error("SplitTerrains():Failed!!(SavePath:{0})", savePath); return; } AssetDatabase.CreateAsset(newData, savePath); //设置分辨率参数 newData.heightmapResolution = newHeightmapResolution; newData.alphamapResolution = newAlphamapResolution; newData.baseMapResolution = newbaseMapResolution; //设置大小 newData.size = new Vector3(terrainSize.x / iSlicingCount, terrainSize.y, terrainSize.z / iSlicingCount); //设置地形原型 var newSplats = new SplatPrototype[splatProtos.Length]; for (var i = 0; i < splatProtos.Length; ++i) { newSplats[i] = new SplatPrototype { texture = splatProtos[i].texture, tileSize = splatProtos[i].tileSize }; var offsetX = (newData.size.x * x) % splatProtos[i].tileSize.x + splatProtos[i].tileOffset.x; var offsetY = (newData.size.z * y) % splatProtos[i].tileSize.y + splatProtos[i].tileOffset.y; newSplats[i].tileOffset = new Vector2(offsetX, offsetY); } newData.splatPrototypes = newSplats; //设置混合贴图 var alphamap = new float[newAlphamapResolution, newAlphamapResolution, splatProtos.Length]; alphamap = terrainData.GetAlphamaps( x * newData.alphamapWidth, y * newData.alphamapHeight, newData.alphamapWidth, newData.alphamapHeight); newData.SetAlphamaps(0, 0, alphamap); //设置高度 var xBase = (terrainData.heightmapWidth - 1) / iSlicingCount; var yBase = (terrainData.heightmapHeight - 1) / iSlicingCount; var height = terrainData.GetHeights(xBase * x, yBase * y, xBase + 1, yBase + 1); newData.SetHeights(0, 0, height); AssetDatabase.SaveAssets(); // 更新进度 - 拆分成功 if (null != iUpdateProgress) { var statusTxt = string.Format("拆分成功:{0}", chunkName); iUpdateProgress(statusTxt, true); } }