#if UNITY_EDITOR using System.IO; using UnityEditor; #endif using UnityEngine; namespace WSMGameStudio.TerrainTools { public class WSM_TerrainBackup : MonoBehaviour { /// /// Save terrain backup to disk /// public void SaveBackup() { #if UNITY_EDITOR Terrain terrain = GetComponent(); if (terrain == null) return; TerrainData originalData = terrain.terrainData; string originalDataFileName = AssetDatabase.GetAssetPath(originalData); string backupDataFileName = originalDataFileName.Replace(".asset", "_backup.asset"); FileInfo fileinfo = new FileInfo(backupDataFileName); if (fileinfo != null) { AssetDatabase.CopyAsset(originalDataFileName, backupDataFileName); } #endif } /// /// Load terrain backup from disk /// public void LoadBackup() { #if UNITY_EDITOR Terrain terrain = GetComponent(); if (terrain == null) return; TerrainData originalData = terrain.terrainData; string originalDataFileName = AssetDatabase.GetAssetPath(originalData); string backupDataFileName = originalDataFileName.Replace(".asset", "_backup.asset"); FileInfo fileinfo = new FileInfo(backupDataFileName); if (fileinfo != null && fileinfo.Exists) { TerrainData backupData = AssetDatabase.LoadAssetAtPath(backupDataFileName); if (backupData != null) { // Heightmap if (originalData.heightmapResolution == backupData.heightmapResolution) originalData.SetHeights(0, 0, backupData.GetHeights(0, 0, backupData.heightmapResolution, backupData.heightmapResolution)); else Debug.LogWarning(string.Format("{0} - Not possible to restore HEIGHTMAP due to resolution disparity. Current: {1}x{2} Backup: {3}x{4}", terrain.gameObject.name, originalData.heightmapResolution, originalData.heightmapResolution, backupData.heightmapResolution, backupData.heightmapResolution)); // Textures if (originalData.alphamapWidth == backupData.alphamapWidth && originalData.alphamapHeight == backupData.alphamapHeight && originalData.alphamapLayers == backupData.alphamapLayers) originalData.SetAlphamaps(0, 0, backupData.GetAlphamaps(0, 0, backupData.alphamapWidth, backupData.alphamapHeight)); else Debug.LogWarning(string.Format("{0} - Not possible to restore TEXTURES due to resolution disparity. Current: {1}x{2} Backup: {3}x{4}. Original Layers: {5} Backup Layers: {6}", terrain.gameObject.name, originalData.alphamapWidth, originalData.alphamapHeight, backupData.alphamapWidth, backupData.alphamapHeight, originalData.alphamapLayers, backupData.alphamapLayers)); //Trees and details are not supported yet // Trees //originalData.treeInstances = backupData.treeInstances; // Grasses //originalData.SetDetailLayer(0, 0, 0, backupData.GetDetailLayer(0, 0, backupData.detailWidth, backupData.detailHeight, 0)); terrain.terrainData.SyncHeightmap(); } } #endif } } }