Hey guys i created a grid map using 2d array problem is i cant get the movement quite right i want it to move using wasd and snap on grid movements here is the cell code
public class Cell
{
//walkable or not
public bool isWater;
public Cell(bool isWater)
{
this.isWater = isWater;
}
}
and i use this in a grid code to proceduraly generate random one every time and it works great
public Material edgeMaterial;
public Material terrainMaterial;
public float waterLevel = .4f;
public float scale = .1f;
public int size = 100;
public Player player;
public Cell[,] grid;
void Start()
{
float[,] noiseMap = new float[size, size];
(float xOffset, float yOffset) = (Random.Range(-10000f, 10000f), Random.Range(-10000f, 10000f));
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
float noiseValue = Mathf.PerlinNoise(x * scale + xOffset, y * scale + yOffset);
noiseMap[x, y] = noiseValue;
}
}
/* float[,] falloffMap = new float[size, size];
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
float xv = x / (float)size * 2 - 1;
float yv = y / (float)size * 2 - 1;
float v = Mathf.Max(Mathf.Abs(xv), Mathf.Abs(yv));
falloffMap[x, y] = Mathf.Pow(v, 3f) / (Mathf.Pow(v, 3f) + Mathf.Pow(2.2f - 2.2f * v, 3f));
}
}*/
grid = new Cell[size, size];
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
float noiseValue = noiseMap[x, y];
// noiseValue -= falloffMap[x, y];
bool isWater = noiseValue < waterLevel;
Cell cell = new Cell(isWater);
grid[x, y] = cell;
}
}
DrawTerrainMesh(grid);
DrawEdgeMesh(grid);
DrawTexture(grid);
// player.transform.position = new Vector3(grid[0, 0], 0, 0);
}
void DrawTerrainMesh(Cell[,] grid)
{
Mesh mesh = new Mesh();
List<Vector3> vertices = new List<Vector3>();
List<int> triangles = new List<int>();
List<Vector2> uvs = new List<Vector2>();
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
Cell cell = grid[x, y];
if (!cell.isWater)
{
Vector3 a = new Vector3(x - .5f, 0, y + .5f);
Vector3 b = new Vector3(x + .5f, 0, y + .5f);
Vector3 c = new Vector3(x - .5f, 0, y - .5f);
Vector3 d = new Vector3(x + .5f, 0, y - .5f);
Vector2 uvA = new Vector2(x / (float)size, y / (float)size);
Vector2 uvB = new Vector2((x + 1) / (float)size, y / (float)size);
Vector2 uvC = new Vector2(x / (float)size, (y + 1) / (float)size);
Vector2 uvD = new Vector2((x + 1) / (float)size, (y + 1) / (float)size);
Vector3[] v = new Vector3[] { a, b, c, b, d, c };
Vector2[] uv = new Vector2[] { uvA, uvB, uvC, uvB, uvD, uvC };
for (int k = 0; k < 6; k++)
{
vertices.Add(v[k]);
triangles.Add(triangles.Count);
uvs.Add(uv[k]);
}
}
}
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
mesh.uv = uvs.ToArray();
mesh.RecalculateNormals();
MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
}
void DrawTexture(Cell[,] grid)
{
Texture2D texture = new Texture2D(size, size);
Color[] colorMap = new Color[size * size];
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
Cell cell = grid[x, y];
if (cell.isWater)
colorMap[y * size + x] = Color.blue;
else
colorMap[y * size + x] = Color.green;
}
}
texture.filterMode = FilterMode.Point;
texture.SetPixels(colorMap);
texture.Apply();
MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
meshRenderer.material = terrainMaterial;
meshRenderer.material.mainTexture = texture;
}
void DrawEdgeMesh(Cell[,] grid)
{
Mesh mesh = new Mesh();
List<Vector3> vertices = new List<Vector3>();
List<int> triangles = new List<int>();
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
Cell cell = grid[x, y];
if (!cell.isWater)
{
if (x > 0)
{
Cell left = grid[x - 1, y];
if (left.isWater)
{
Vector3 a = new Vector3(x - .5f, 0, y + .5f);
Vector3 b = new Vector3(x - .5f, 0, y - .5f);
Vector3 c = new Vector3(x - .5f, -1, y + .5f);
Vector3 d = new Vector3(x - .5f, -1, y - .5f);
Vector3[] v = new Vector3[] { a, b, c, b, d, c };
for (int k = 0; k < 6; k++)
{
vertices.Add(v[k]);
triangles.Add(triangles.Count);
}
}
}
if (x < size - 1)
{
Cell right = grid[x + 1, y];
if (right.isWater)
{
Vector3 a = new Vector3(x + .5f, 0, y - .5f);
Vector3 b = new Vector3(x + .5f, 0, y + .5f);
Vector3 c = new Vector3(x + .5f, -1, y - .5f);
Vector3 d = new Vector3(x + .5f, -1, y + .5f);
Vector3[] v = new Vector3[] { a, b, c, b, d, c };
for (int k = 0; k < 6; k++)
{
vertices.Add(v[k]);
triangles.Add(triangles.Count);
}
}
}
if (y > 0)
{
Cell down = grid[x, y - 1];
if (down.isWater)
{
Vector3 a = new Vector3(x - .5f, 0, y - .5f);
Vector3 b = new Vector3(x + .5f, 0, y - .5f);
Vector3 c = new Vector3(x - .5f, -1, y - .5f);
Vector3 d = new Vector3(x + .5f, -1, y - .5f);
Vector3[] v = new Vector3[] { a, b, c, b, d, c };
for (int k = 0; k < 6; k++)
{
vertices.Add(v[k]);
triangles.Add(triangles.Count);
}
}
}
if (y < size - 1)
{
Cell up = grid[x, y + 1];
if (up.isWater)
{
Vector3 a = new Vector3(x + .5f, 0, y + .5f);
Vector3 b = new Vector3(x - .5f, 0, y + .5f);
Vector3 c = new Vector3(x + .5f, -1, y + .5f);
Vector3 d = new Vector3(x - .5f, -1, y + .5f);
Vector3[] v = new Vector3[] { a, b, c, b, d, c };
for (int k = 0; k < 6; k++)
{
vertices.Add(v[k]);
triangles.Add(triangles.Count);
}
}
}
}
}
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
mesh.RecalculateNormals();
GameObject edgeObj = new GameObject("Edge");
edgeObj.transform.SetParent(transform);
MeshFilter meshFilter = edgeObj.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
MeshRenderer meshRenderer = edgeObj.AddComponent<MeshRenderer>();
meshRenderer.material = edgeMaterial;
}
void OnDrawGizmos()
{
if (!Application.isPlaying) return;
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
Cell cell = grid[x, y];
if (cell.isWater)
Gizmos.color = Color.blue;
else
Gizmos.color = Color.green;
Vector3 pos = new Vector3(x, 0, y);
Gizmos.DrawCube(pos, Vector3.one);
}
}
}
}
would appreciate the help thanks for your time