Базовый класс для инструментов рисования по Terrain, наследующих от Editor Tools.
Унаследуйтесь от этого класса, чтобы реализовать собственные инструменты рисования по ландшафту, которые также появятся в оверлее Terrain Tools.
using UnityEngine;
using UnityEditor;
using UnityEditor.TerrainTools;
class CustomTerrainToolWithOverlays : TerrainPaintToolWithOverlays<CustomTerrainToolWithOverlays>
{
private float m_BrushRotation;
// Return true for this property to show the brush selector overlay
public override bool HasBrushMask => true;
// Return true for this property to show the tool settings overlay
public override bool HasToolSettings => true;
// Return true for this property to display the brush attributes overlay
public override bool HasBrushAttributes => true;
// File names of the light theme icons - prepending d_ to the file name generates dark theme variants.
// public override string OnIcon => "Assets/Icon_on.png";
// public override string OffIcon => "Assets/Icon_off.png";
// The toolbar category the icon appears under
public override TerrainCategory Category => TerrainCategory.CustomBrushes;
// Where in the icon list the icon appears
public override int IconIndex => 100;
// Name of the Terrain Tool. This appears in the tool UI
public override string GetName()
{
return "Examples/Basic Custom Terrain Tool";
}
// Description for the Terrain Tool. This appears in the tool UI
public override string GetDescription()
{
return "This Terrain Tool shows how to add custom UI to a tool and paint height.";
}
// Override this function to add UI elements to the inspector
public override void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext)
{
EditorGUILayout.HelpBox("In Terrain Inspector", MessageType.None);
editContext.ShowBrushesGUI(5, BrushGUIEditFlags.All);
m_BrushRotation = EditorGUILayout.Slider("Rotation", m_BrushRotation, 0, 360);
}
// Override this function to add UI elements to the tool settings overlay
public override void OnToolSettingsGUI(Terrain terrain, IOnInspectorGUI editContext)
{
EditorGUILayout.HelpBox("In Overlays", MessageType.None);
m_BrushRotation = EditorGUILayout.Slider("Rotation", m_BrushRotation, 0, 360);
}
// Ease of use function for rendering modified Terrain Texture data into a PaintContext. Both OnRenderBrushPreview and OnPaint use this.
private void RenderIntoPaintContext(UnityEngine.TerrainTools.PaintContext paintContext, Texture brushTexture, float brushOpacity, UnityEngine.TerrainTools.BrushTransform brushXform)
{
// Get the built-in painting Material reference
Material mat = UnityEngine.TerrainTools.TerrainPaintUtility.GetBuiltinPaintMaterial();
// Bind the current brush texture
mat.SetTexture("_BrushTex", brushTexture);
// Bind the tool-specific shader properties
var opacity = Event.current.control ? -brushOpacity : brushOpacity;
mat.SetVector("_BrushParams", new Vector4(opacity, 0.0f, 0.0f, 0.0f));
// Set up the material for reading from/writing into the PaintContext texture data. This step is necessary to set up the correct shader properties for appropriately transforming UVs and sampling textures within the shader
UnityEngine.TerrainTools.TerrainPaintUtility.SetupTerrainToolMaterialProperties(paintContext, brushXform, mat);
// Render into the PaintContext's destinationRenderTexture using the built-in painting Material. The ID for the Raise/Lower pass is 0
Graphics.Blit(paintContext.sourceRenderTexture, paintContext.destinationRenderTexture, mat, 0);
}
// Render Tool previews in the Scene view
public override void OnRenderBrushPreview(Terrain terrain, IOnSceneGUI editContext)
{
// Don't render preview if this isn't a Repaint
if (Event.current.type != EventType.Repaint) return;
// Only do the rest if user mouse hits valid terrain
if (!editContext.hitValidTerrain) return;
// Get the current BrushTransform under the mouse position relative to the Terrain
UnityEngine.TerrainTools.BrushTransform brushXform = UnityEngine.TerrainTools.TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.raycastHit.textureCoord, editContext.brushSize, m_BrushRotation);
// Get the PaintContext for the current BrushTransform. This has a sourceRenderTexture from which to read existing Terrain texture data.
UnityEngine.TerrainTools.PaintContext paintContext = UnityEngine.TerrainTools.TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds(), 1);
// Get the built-in Material for rendering Brush Previews
Material previewMaterial = TerrainPaintUtilityEditor.GetDefaultBrushPreviewMaterial();
// Render the brush preview for the sourceRenderTexture. This shows up as a projected brush mesh rendered on top of the Terrain
TerrainPaintUtilityEditor.DrawBrushPreview(paintContext, TerrainBrushPreviewMode.SourceRenderTexture, editContext.brushTexture, brushXform, previewMaterial, 0);
// Render changes into the PaintContext destinationRenderTexture
RenderIntoPaintContext(paintContext, editContext.brushTexture, editContext.brushStrength, brushXform);
// Restore old render target
RenderTexture.active = paintContext.oldRenderTexture;
// Bind the sourceRenderTexture to the preview Material. This is used to compute deltas in height
previewMaterial.SetTexture("_HeightmapOrig", paintContext.sourceRenderTexture);
// Render a procedural mesh displaying the delta/displacement in height from the source Terrain texture data. When you modify Terrain height, this shows how much the next paint operation alters the Terrain height
TerrainPaintUtilityEditor.DrawBrushPreview(paintContext, TerrainBrushPreviewMode.DestinationRenderTexture, editContext.brushTexture, brushXform, previewMaterial, 1);
// Cleanup resources
UnityEngine.TerrainTools.TerrainPaintUtility.ReleaseContextResources(paintContext);
}
// Perform painting operations that modify the Terrain texture data
public override bool OnPaint(Terrain terrain, IOnPaint editContext)
{
// Get the current BrushTransform under the mouse position relative to the Terrain
UnityEngine.TerrainTools.BrushTransform brushXform = UnityEngine.TerrainTools.TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.uv, editContext.brushSize, m_BrushRotation);
// Get the PaintContext for the current BrushTransform. This has a sourceRenderTexture from which to read existing Terrain texture data
// and a destinationRenderTexture into which to write new Terrain texture data
UnityEngine.TerrainTools.PaintContext paintContext = UnityEngine.TerrainTools.TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds());
// Call the common rendering function that OnRenderBrushPreview and OnPaint use
RenderIntoPaintContext(paintContext, editContext.brushTexture, editContext.brushStrength, brushXform);
// Commit the modified PaintContext with a provided string for tracking Undo operations. This function handles Undo and resource cleanup for you
UnityEngine.TerrainTools.TerrainPaintUtility.EndPaintHeightmap(paintContext, "Terrain Paint - Raise or Lower Height");
// Return whether Trees and Details should be hidden while you paint with this Terrain Tool
return true;
}
}