Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

finding closest point on navmesh

Discussion in 'Navigation' started by Makari, Dec 9, 2014.

  1. Makari

    Makari

    Joined:
    Oct 19, 2013
    Posts:
    13
    I have a random wander script, it works fine as a prototype / testing so long as its on a flat surface and no obstacles, but now I want to clean it up some and have it use the navmesh

    so this random wander script waits a random amount of time and then generates a point (vector3)

    how can I then take that vector3 and find the closest point on navmesh? I've seen bits and pieces of like a navmesh.sample and some navmeshhit but I'm completely out of my element with these, so can someobody point me in the right direction? how would I take this random Vector3 point and get out a vector3 that is a point on the navmesh?
     
  2. tchris

    tchris

    Joined:
    Oct 10, 2012
    Posts:
    133
    Here is some code that is similar to what I am using. Hope this helps:
    Code (CSharp):
    1. public float distanceToNewPoint = 25f; //how far away is the new point
    2. NavMeshPath path = new NavMeshPath();
    3. Vector3 newDest;
    4. do {
    5.     //random vector3
    6.     Vector3 randomDirection = new Vector3 (Random.value, Random.value, Random.value);
    7.     //set the magnitude of the vector3 (this could be randomized too if you want)
    8.     randomDirection *= distanceToNewPoint;
    9.     //randomly pick a negative value for the x or z
    10.     if (Random.Range(0,2) == 0) randomDirection.x *= -1;
    11.     if (Random.Range(0,2) == 0) randomDirection.z *= -1;
    12.    
    13.     //add the random vector to the current position
    14.     Vector3 v = transform.position + randomDirection;
    15.    
    16.     //determine the y value by looking at the terrain height
    17.     float y;
    18.     y = Terrain.activeTerrain.SampleHeight (v) + Terrain.activeTerrain.transform.position.y;
    19.  
    20.     newDest = new Vector3 (v.x, y, v.z);
    21.    
    22.     //calculate the path
    23.     agent.CalculatePath(newDest, path);
    24.     Debug.Log(path.status);
    25.     yield return null;
    26. } while (path.status != NavMeshPathStatus.PathComplete); //keep looking for a new random value until the path is complete meaning it's a valid path
     
    radiantboy likes this.
  3. Gnimmel

    Gnimmel

    Joined:
    Apr 21, 2010
    Posts:
    358
    Is this what you are looking for?
    http://docs.unity3d.com/ScriptReference/NavMesh.SamplePosition.html

    If so, it's simple to use;

    Code (CSharp):
    1.  
    2. NavMeshHit myNavHit;
    3. if(NavMesh.SamplePosition(transform.position, out myNavHit, 100 , -1))
    4. {
    5. transform.position = myNavHit.position;
    6. }
    7.  
    That should snap the object onto the navmesh as long as it's within a range of 100 units.
     
  4. kilik128

    kilik128

    Joined:
    Jul 15, 2013
    Posts:
    909
    not sure understand why somethink's like that's does't works
    if (canWalk) {

    Vector3 vv = transform.position;
    vv += moveDirection * Time.fixedDeltaTime;


    NavMeshHit myNavHit;
    if (NavMesh.SamplePosition (vv,out myNavHit,2,-1)){

    collisionFlags = m_Controller.Move (moveDirection * Time.fixedDeltaTime);

    }


    }
     
  5. JosephNicholas22

    JosephNicholas22

    Joined:
    Oct 17, 2017
    Posts:
    1
    Saved my RTS. Thank you, my dude.
     
  6. MadeFromPolygons

    MadeFromPolygons

    Joined:
    Oct 5, 2013
    Posts:
    3,874
    It was 4/5 years ago so unsure if they will even get your message :p
     
  7. Wothanar

    Wothanar

    Joined:
    Sep 2, 2016
    Posts:
    122
    This is really great it saved my rts too thanks :D
     
    tchris likes this.