Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Experimental runtime terrain editing with TerrainPaintUtility.

Discussion in 'World Building' started by Lesnikus5, Jan 28, 2021.

  1. Lesnikus5

    Lesnikus5

    Joined:
    May 20, 2016
    Posts:
    131
    How to edit terrain using TerrainPaintUtility? There is no information on the internet on how to use this API.

    This code doesn't work correctly. It looks like it does not overlap the brush additively, but completely replaces the heights. Oddly enough, the vertices go below the zero level of the terrain height, which should not be.

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.Experimental.TerrainAPI;
    5.  
    6. namespace Test
    7. {
    8.     public class TerrainPaintUtilitySystem : MonoBehaviour
    9.     {
    10.         public Texture brushTexture;
    11.         public Vector2 rectSize;
    12.         public Terrain terrain;
    13.  
    14.         private Vector3 terrainPosition;
    15.  
    16.         void Start()
    17.         {
    18.             terrainPosition = terrain.transform.position;
    19.         }
    20.  
    21.         void Update()
    22.         {
    23.             if (Input.GetMouseButtonDown(0))
    24.             {
    25.                 RaycastHit rayHit;
    26.                 var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    27.  
    28.                 if (Physics.Raycast(ray, out rayHit))
    29.                 {
    30.                     int terrainCoordinateX = Mathf.FloorToInt(((rayHit.point.x - terrainPosition.x) / terrain.terrainData.size.x) * terrain.terrainData.heightmapResolution);
    31.                     int terrainCoordinateY = Mathf.FloorToInt(((rayHit.point.z - terrainPosition.z) / terrain.terrainData.size.z) * terrain.terrainData.heightmapResolution);
    32.  
    33.                     ModifyTerrain(terrainCoordinateX, terrainCoordinateY);
    34.                 }
    35.             }
    36.             else if (Input.GetMouseButtonUp(0))
    37.             {
    38.                 terrain.terrainData.SyncHeightmap();
    39.             }
    40.         }
    41.  
    42.         void ModifyTerrain(int xCoordinate, int yCoordinate)
    43.         {
    44.             Rect area = new Rect(xCoordinate, yCoordinate, brushTexture.width, brushTexture.height);
    45.             PaintContext paintContext = TerrainPaintUtility.BeginPaintHeightmap(terrain, area, 10);
    46.             Graphics.Blit(brushTexture, paintContext.destinationRenderTexture);
    47.             TerrainPaintUtility.EndPaintHeightmap(paintContext, "???");
    48.         }
    49.     }
    50. }