using System.Collections.Generic; using UnityEngine; public class TerrainHeight : MonoBehaviour { public GameObject TerrainParent; private List terrains = new List(); private Rect[] terrainRects; public Transform cube; private void Awake() { Transform[] componentsInChildren = TerrainParent.GetComponentsInChildren(); for (int i = 0; i < componentsInChildren.Length; i++) { Terrain component = componentsInChildren[i].GetComponent(); if ((bool)component) { terrains.Add(componentsInChildren[i]); } } terrainRects = new Rect[terrains.Count]; for (int j = 0; j < terrains.Count; j++) { Terrain component = terrains[j].GetComponent(); terrainRects[j].x = terrains[j].position.x; terrainRects[j].y = terrains[j].position.z; terrainRects[j].width = component.terrainData.size.x; terrainRects[j].height = component.terrainData.size.z; } } private Terrain GetTerrainTile(Vector3 position) { for (int i = 0; i < terrains.Count; i++) { if (terrainRects[i].Contains(new Vector2(position.x, position.z))) { return terrains[i].GetComponent(); } } return null; } private float GetTerrainHeight(Vector3 position) { Terrain terrainTile = GetTerrainTile(position); if ((bool)terrainTile) { return terrainTile.SampleHeight(position); } return -1f; } private void Update() { float terrainHeight = GetTerrainHeight(cube.position); Debug.Log(string.Concat("Position: ", cube.position, " height: ", terrainHeight)); } }