Beispiel #1
0
        /// <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);
            }
        }