3D Click and Move via a Grid C#

Hello, I’ve been searching around everywhere looking for a tutorial or way to do this but I cannot find anything that helps me. What I would like is to have a grid system and when I click on a square in the grid my character moves to that position via moving through the grids along a calculated pathway which is the shortest distance (snapped to grid), so I would be able to move left and right along the grids and also diagonal. Also if there are any obstacles in my way the path works its way around it. The best example that I know and can give is in a game called Habbo however that is 2D wheras I would like to have this in 3D. I already have some scripts where I have a grid system and when my mouse hovers over the grid it is highlighted, what is the best way that this movement can be incorporated into this C# grid script?

TileMap Script

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshCollider))]
public class TileMap : MonoBehaviour {
   
    public int size_x = 100;
    public int size_z = 50;
    public float tileSize = 1.0f;
   
    // Use this for initialization
    void Start () {
        BuildMesh();
    }
   
    public void BuildMesh() {
       
        int numTiles = size_x * size_z;
        int numTris = numTiles * 2;
       
        int vsize_x = size_x + 1;
        int vsize_z = size_z + 1;
        int numVerts = vsize_x * vsize_z;
       
        // Generate the mesh data
        Vector3[] vertices = new Vector3[ numVerts ];
        Vector3[] normals = new Vector3[numVerts];
        Vector2[] uv = new Vector2[numVerts];
       
        int[] triangles = new int[ numTris * 3 ];

        int x, z;
        for(z=0; z < vsize_z; z++) {
            for(x=0; x < vsize_x; x++) {
                vertices[ z * vsize_x + x ] = new Vector3( x*tileSize, 0, z*tileSize );
                normals[ z * vsize_x + x ] = Vector3.up;
                uv[ z * vsize_x + x ] = new Vector2( (float)x / vsize_x, (float)z / vsize_z );
            }
        }
        Debug.Log ("Done Verts!");
       
        for(z=0; z < size_z; z++) {
            for(x=0; x < size_x; x++) {
                int squareIndex = z * size_x + x;
                int triOffset = squareIndex * 6;
                triangles[triOffset + 0] = z * vsize_x + x +            0;
                triangles[triOffset + 1] = z * vsize_x + x + vsize_x + 0;
                triangles[triOffset + 2] = z * vsize_x + x + vsize_x + 1;
               
                triangles[triOffset + 3] = z * vsize_x + x +            0;
                triangles[triOffset + 4] = z * vsize_x + x + vsize_x + 1;
                triangles[triOffset + 5] = z * vsize_x + x +            1;
            }
        }
       
        Debug.Log ("Done Triangles!");
       
        // Create a new Mesh and populate with the data
        Mesh mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.normals = normals;
        mesh.uv = uv;
       
        // Assign our mesh to our filter/renderer/collider
        MeshFilter mesh_filter = GetComponent<MeshFilter>();
        MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
        MeshCollider mesh_collider = GetComponent<MeshCollider>();
       
        mesh_filter.mesh = mesh;
        mesh_collider.sharedMesh = mesh;
        Debug.Log ("Done Mesh!");
       
    }
   
   
}

Here is the script for the highlight cube that appears when the mouse hovers over each individual square:

TileMapMouse Script

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(TileMap))]
public class TileMapMouse : MonoBehaviour {
   
    TileMap _tileMap;
   
    Vector3 currentTileCoord;
   
    public Transform selectionCube;
   
    void Start() {
        _tileMap = GetComponent<TileMap>();
    }

    // Update is called once per frame
    void Update () {
        Ray ray = Camera.main.ScreenPointToRay( Input.mousePosition );
        RaycastHit hitInfo;
       
        if( GetComponent<Collider>().Raycast( ray, out hitInfo, Mathf.Infinity ) ) {
            int x = Mathf.FloorToInt( hitInfo.point.x / _tileMap.tileSize);
            int z = Mathf.FloorToInt( hitInfo.point.z / _tileMap.tileSize);
            //Debug.Log ("Tile: " + x + ", " + z);
           
            currentTileCoord.x = x;
            currentTileCoord.z = z;
           
            selectionCube.transform.position = currentTileCoord*5f;
        }
        else {
            // Hide selection cube?
        }
       
        if(Input.GetMouseButtonDown(0)) {
            Debug.Log ("Click!");
        }
    }
}

TileMouseOver

using UnityEngine;
using System.Collections;

public class TileMouseOver : MonoBehaviour {
   
    public Color highlightColor;
    Color normalColor;
   
    void Start() {
        normalColor = GetComponent<Renderer>().material.color;
    }
   
    // Update is called once per frame
    void Update () {
       
        Ray ray = Camera.main.ScreenPointToRay( Input.mousePosition );
        RaycastHit hitInfo;
       
        if( GetComponent<Collider>().Raycast( ray, out hitInfo, Mathf.Infinity ) ) {
            GetComponent<Renderer>().material.color = highlightColor;
        }
        else {
            GetComponent<Renderer>().material.color = normalColor;
        }
       
    }
   
}

Thank you your help would be much appreciated.

sounds like you are looking for a node graph and A* search…

https://en.wikipedia.org/wiki/A*_search_algorithm
http://arongranberg.com/astar/

https://www.youtube.com/watch?v=mZfyt03LDH4

Aha yes I did follow those tutorials however he only demonstrates how to code for the pathfinding and not the actual movement, so I’m not sure where to go from there.

The “path” returned from the pathfinding is essentially a sequence of waypoints.

Oh right I see so I could have it so that the waypoint is created when I click - then it is deleted once the task is completed? Is that what you mean?

Also how could I restrict this to the grid movement so my character is only moving along the grid squares? (diagonal included)