EditTerrain.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using UnityEngine;
  2. using System.Collections;
  3. using TerrainComposer2;
  4. public class EditTerrain
  5. {
  6. static public float GetHeight(Vector3 worldPos)
  7. {
  8. Terrain t = GetTerrain(worldPos);
  9. if (t == null) return -1;
  10. Vector2 startPos = new Vector2(worldPos.x - t.transform.position.x, worldPos.z - t.transform.position.z);
  11. Vector3 size = t.terrainData.size;
  12. int resolution = t.terrainData.heightmapResolution;
  13. return t.terrainData.GetHeight(Mathf.RoundToInt((startPos.x / size.x) * resolution), Mathf.RoundToInt(startPos.y / size.x) * resolution);
  14. }
  15. static public void SetHeight(Vector3 worldPos, float height)
  16. {
  17. Terrain t = GetTerrain(worldPos);
  18. if (t == null) return;
  19. Vector2 startPos = new Vector2(worldPos.x - t.transform.position.x, worldPos.z - t.transform.position.z);
  20. Vector3 size = t.terrainData.size;
  21. int resolution = t.terrainData.heightmapResolution;
  22. float[,] heights = new float[1, 1];
  23. heights[0, 0] = height - t.transform.position.y;
  24. t.terrainData.SetHeights(Mathf.RoundToInt((startPos.x / size.x) * resolution), Mathf.RoundToInt(startPos.y / size.x) * resolution, heights);
  25. }
  26. static public Terrain GetTerrain(Vector3 worldPos)
  27. {
  28. TC_Area2D area2D = TC_Area2D.current;
  29. for (int i = 0; i < area2D.terrainAreas[0].terrains.Count; i++)
  30. {
  31. TCUnityTerrain t = area2D.terrainAreas[0].terrains[i];
  32. if (t.terrain == null) continue;
  33. if (t.terrain.terrainData == null) continue;
  34. Rect rect = new Rect(t.terrain.transform.position.x, t.terrain.transform.position.z, t.terrain.terrainData.size.x, t.terrain.terrainData.size.z);
  35. if (rect.Contains(worldPos)) return t.terrain;
  36. }
  37. return null;
  38. }
  39. }