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.