Generated mesh from code - problem with transform.position

Hello everyone,

For a small project of mine, I generate a hex map. It kinda works, however the position data (transform.position) is screwed up for some reason - check out this picture:

I generate the Hexes at runtime, and I guess something with the following code is wrong and/or missing. This function creates a single hexagon:

function Hex (origin : Vector3, sideLength : float) : GameObject {
	var vert1 : Vector3;
	var vert2 : Vector3;
	var vert3 : Vector3;
	var vert4 : Vector3;
	var vert5 : Vector3;
	var vert6 : Vector3;
	
	var a : Vector3;
	var b : Vector3;
	var c : Vector3;

	a = Vector3.right*(0.5*sideLength);
	b = Vector3.forward*(0.866*sideLength);
	c = Vector3.right*sideLength;

	vert1 = origin;
	vert2 = vert1 + a + b;
	vert3 = vert2 + c;
	vert4 = vert3 + a - b;
	vert5 = vert4 - a - b;
	vert6 = vert5 - c;

	var newHex : GameObject = new GameObject();
	var newMesh : Mesh = new Mesh();
	newHex.AddComponent(MeshFilter);
	newHex.AddComponent(MeshRenderer);

	newMesh.vertices = [vert1, vert2, vert3, vert4, vert5, vert6];

	newMesh.RecalculateBounds();

	var uvs = new Vector2[newMesh.vertices.length];

	uvs = [Vector2(0.0, 0.5),
			Vector2(0.25, 0.0),
			Vector2(0.75, 0.0),
			Vector2(1.0, 0.5),
			Vector2(0.25, 1.0),
			Vector2(0.75, 1.0)];
			
	newMesh.uv = uvs;

	newMesh.triangles = [5, 0, 1, 5, 1, 4, 2, 4, 1, 2, 3, 4];		

	newMesh.RecalculateNormals();
	newHex.GetComponent(MeshFilter).mesh = newMesh;

	newHex.transform.parent = transform;
	
	newHex.AddComponent("MeshCollider");


	newHex.AddComponent("hex"); // custom script
	
	newHex.tag = "hex";

	return newHex;
	
}

Any idea what’s wrong with that?

Oh, I should add: Even though the coordinates in transform.position are wrong, I can click on any hex in game properly (using Camera.main.ScreenPointToRay (Input.mousePosition)) - so the world space is stored properly somewhere. I just don’t get where…

When generating terrain in blocks, I ran into the same problem.
The game object in each one is probably generated at 0,0,0
A mesh created at some point in space - already offset (not at 0,0,0) is than attached to the game object.

The solution is to either create the mesh without any offset, than offset the game object once it’s done or do what I did.

GO.collider.sharedMesh = mesh;
//xi is block number.  0-16 for example
    GO.transform.position = Vector3(GO.collider.bounds.size.x * xi , 0, GO.collider.bounds.size.z * yi)

You are right - the problem was here:

vert1 = origin;
vert2 = vert1 + a + b;
vert3 = vert2 + c;
vert4 = vert3 + a - b;
vert5 = vert4 - a - b;
vert6 = vert5 - c;

That offset the mesh to the proper coordinates, but the GameObject was at (0,0,0), as you said. I fixed it now:

vert1 = Vector3(0,0,0); //since this is a local coordinate in this context
vert2 = vert1 + a + b;
vert3 = vert2 + c;
vert4 = vert3 + a - b;
vert5 = vert4 - a - b;
vert6 = vert5 - c;

//...

newHex.transform.position = origin;

You saved me a night full of frustration :wink: Thank you!