void CreateNewLayerWithTexture(Texture2D texture) { Layer newLayer = ScriptableObject.CreateInstance <Layer>(); newLayer.AssignedLayer = new TerrainLayer(); newLayer.AssignedLayer.diffuseTexture = texture; m_PaletteLayers.Add(newLayer); m_LayerList.index = m_PaletteLayers.Count - 1; string path = "Assets"; foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) { path = AssetDatabase.GetAssetPath(obj); if (!string.IsNullOrEmpty(path) && File.Exists(path)) { path = Path.GetDirectoryName(path); break; } } newLayer.AssignedLayer.name = m_LayerName; TerrainToolboxLayer.AddLayerToTerrain(m_SelectedTerrain.terrainData, newLayer.AssignedLayer); AssetDatabase.CreateAsset(newLayer.AssignedLayer, AssetDatabase.GenerateUniqueAssetPath($"{path}/{m_LayerName}.terrainlayer")); }
void DrawLayerElement(Rect rect, int index, bool selected, bool focused) { rect.y = rect.y + kElementPadding; var rectButton = new Rect((rect.x + kElementPadding), rect.y, kElementToggleWidth, kElementToggleWidth); var rectImage = new Rect((rectButton.x + kElementToggleWidth), rect.y, kElementImageWidth, kElementImageHeight); var rectObject = new Rect((rectImage.x + kElementImageWidth + 10), rect.y, kElementObjectFieldWidth, kElementObjectFieldHeight); if (m_PaletteLayers.Count > 0 && m_PaletteLayers.ElementAtOrDefault(index) != null) { m_PaletteLayers[index].IsSelected = EditorGUI.Toggle(rectButton, m_PaletteLayers[index].IsSelected); EditorGUILayout.BeginHorizontal(); List <TerrainLayer> existLayers = m_PaletteLayers.Select(l => l.AssignedLayer).ToList(); TerrainLayer oldLayer = m_PaletteLayers[index].AssignedLayer; Texture2D icon = null; if (m_PaletteLayers[index].AssignedLayer != null) { icon = AssetPreview.GetAssetPreview(m_PaletteLayers[index].AssignedLayer.diffuseTexture); } GUI.Box(rectImage, icon); EditorGUI.BeginChangeCheck(); m_PaletteLayers[index].AssignedLayer = EditorGUI.ObjectField(rectObject, m_PaletteLayers[index].AssignedLayer, typeof(TerrainLayer), false) as TerrainLayer; EditorGUILayout.EndHorizontal(); if (EditorGUI.EndChangeCheck()) { if (m_PaletteLayers[index].AssignedLayer == null) { m_PaletteLayers.RemoveAt(index); TerrainToolboxLayer.RemoveLayerFromTerrain(m_SelectedTerrain.terrainData, index); m_SelectedTerrainLayer = null; } else if (existLayers.Contains(m_PaletteLayers[index].AssignedLayer) && m_PaletteLayers[index].AssignedLayer != oldLayer) { EditorUtility.DisplayDialog("Error", "Layer exists. Please select a different layer.", "OK"); m_PaletteLayers[index].AssignedLayer = oldLayer; } else { if (m_SelectedTerrain.terrainData.terrainLayers.Length < m_PaletteLayers.Count) { TerrainToolboxLayer.AddLayerToTerrain(m_SelectedTerrain.terrainData, m_PaletteLayers[index].AssignedLayer); } else { int layersLength = m_SelectedTerrain.terrainData.terrainLayers.Length; TerrainLayer[] layers = m_SelectedTerrain.terrainData.terrainLayers; layers[index] = m_PaletteLayers[index].AssignedLayer; m_SelectedTerrainLayer = m_PaletteLayers[index].AssignedLayer; m_SelectedTerrain.terrainData.terrainLayers = layers; } } } } }
void AddLayerElement(TerrainLayer layer) { if (LayerExists(layer)) { return; } Layer newLayer = CreateInstance <Layer>(); newLayer.AssignedLayer = layer; newLayer.IsSelected = m_ToggleAllElements; m_PaletteLayers.Add(newLayer); TerrainToolboxLayer.AddLayerToTerrain(m_SelectedTerrain.terrainData, newLayer.AssignedLayer); m_SelectedTerrainLayer = newLayer.AssignedLayer; m_LayerList.index = m_PaletteLayers.Count - 1; #if UNITY_2019_2_OR_NEWER m_LayerRepaintFlag = true; #endif }