- Home /
Trying to keep an object 1.5 above the terrain at all times
I am working on unit movement for an RTS and I want to be able to keep my unit a set distance above the terrain which varies in height with hills and such. I was using a raycast from the bottom of the unit and then adjusting the height based on that. Below is the coroutine from where the function containing the height check is called:
IEnumerator Move(GameObject Unit, float targetX, float targetZ, float targetY)
{
Vector3 clickedPosition = new Vector3 (targetX, targetY + 2.5f, targetZ);
Vector3 startPosition = transform.position;
while(Vector3.Distance(startPosition, clickedPosition)>1f)
{
transform.position=Vector3.MoveTowards(transform.position, clickedPosition, 6 * Time.deltaTime);
HeightCheck();
yield return null;
}
Debug.Log("The object has reached the destination");
}
And here is the code for HeightCheck void HeightCheck () {
RaycastHit hit = new RaycastHit();
if (Physics.Raycast (transform.position, Vector3.down, Mathf.Infinity))
{
Vector3 tempPos = transform.position;
if(hit.distance > 1.5)
{
//float aboveOnePointFive = transform.position.y - hit.distance + 2.5f;
tempPos.y = transform.position.y - hit.distance + 2.5f;
Debug.Log("The distance is not right from the ground");;
}
if(hit.distance < 1.5)
{
//float belowOnePointFive = transform.position.y - hit.distance + 2.5f;
tempPos.y = transform.position.y - hit.distance + 2.5f;
Debug.Log("The distance is not right from the ground");;
}
}
}
This isn't working and I am unsure of why. I am also unsure if this is the most efficient way to go about doing something like this. Any help is much appreciated :)
Answer by siaran · Mar 15, 2015 at 09:11 PM
Are you using Unity's built in terrain? In that case, you may want to make use of the SampleHeight function and do something like this
transform.position.y = Terrain.activeTerrain.SampleHeight(transform.position) + 1.5f;
I have no idea how efficient that method is, though.
I'm not using the in built terrain, I have my own model :/