Skip to content

Instantly share code, notes, and snippets.

@dentedpixel
Last active March 26, 2018 18:56
Show Gist options
  • Save dentedpixel/a04e9145add77bab71f5c066f3530749 to your computer and use it in GitHub Desktop.
Save dentedpixel/a04e9145add77bab71f5c066f3530749 to your computer and use it in GitHub Desktop.
A cube mesh created with code including uv mapping mesh and normals
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[ExecuteInEditMode] // Added to be able to tweak the script without having to hit play ever time
public class ProceduralCube : MonoBehaviour
{
// size of the cube sides
public float cubeSize = 0.2f;
// hardcoded values for a single cube
private static Vector3[] cubeVertices = new Vector3[]{
// Front Side
new Vector3(0f, 0f, 0f),
new Vector3(1f, 0f, 0f),
new Vector3(0f, 1f, 0f),
new Vector3(1f, 1f, 0f),
// Right Side
new Vector3(1f, 0f, 0f),
new Vector3(1f, 0f, 1f),
new Vector3(1f, 1f, 0f),
new Vector3(1f, 1f, 1f),
// Back Side
new Vector3(1f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(1f, 1f, 1f),
new Vector3(0f, 1f, 1f),
// Left Side
new Vector3(0f, 1f, 0f),
new Vector3(0f, 1f, 1f),
new Vector3(0f, 0f, 0f),
new Vector3(0f, 0f, 1f),
// Top Side
new Vector3(0f, 1f, 0f),
new Vector3(1f, 1f, 0f),
new Vector3(0f, 1f, 1f),
new Vector3(1f, 1f, 1f),
// Bottom Side
new Vector3(1f, 0f, 0f),
new Vector3(0f, 0f, 0f),
new Vector3(1f, 0f, 1f),
new Vector3(0f, 0f, 1f),
};
private static Vector3[] cubeNormals = new Vector3[]{
// Front Side
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
// Right Side
new Vector3(0f, 1f, 0f),
new Vector3(0f, 1f, 0f),
new Vector3(0f, 0f, -1f),
new Vector3(0f, 0f, -1f),
// Back Side
new Vector3(0f, 1f, 0f),
new Vector3(0f, 1f, 0f),
new Vector3(0f, 0f, -1f),
new Vector3(0f, 0f, -1f),
// Left Side
new Vector3(0f, -1f, 0f),
new Vector3(0f, -1f, 0f),
new Vector3(0f, -1f, 0f),
new Vector3(0f, -1f, 0f),
// Top Side
new Vector3(-1f, 0f, 0f),
new Vector3(-1f, 0f, 0f),
new Vector3(-1f, 0f, 0f),
new Vector3(-1f, 0f, 0f),
// Bottom Side
new Vector3(1f, 0f, 0f),
new Vector3(1f, 0f, 0f),
new Vector3(1f, 0f, 0f),
new Vector3(1f, 0f, 0f),
};
// Updating mesh ever frame just for convenience sake, in a game you would only want to update the mesh when you need it to change
void Update()
{
MeshFilter mf = GetComponent<MeshFilter>();
var mesh = new Mesh();
mf.mesh = mesh;
int sides = 6;
Vector3[] vertices = new Vector3[sides * 4];
Vector3[] normals = new Vector3[vertices.Length];
Vector2[] uv = new Vector2[vertices.Length];
int[] tri = new int[sides * 6];
for (int i = 0; i < sides; i++)
{
int i4 = i * 4;
// vertice layout
vertices[i4 + 0] = cubeVertices[i4 + 0] * cubeSize;
vertices[i4 + 1] = cubeVertices[i4 + 1] * cubeSize;
vertices[i4 + 2] = cubeVertices[i4 + 2] * cubeSize;
vertices[i4 + 3] = cubeVertices[i4 + 3] * cubeSize;
normals[i4 + 0] = cubeNormals[i4 + 0];
normals[i4 + 1] = cubeNormals[i4 + 1];
normals[i4 + 2] = cubeNormals[i4 + 2];
normals[i4 + 3] = cubeNormals[i4 + 3];
uv[i4 + 0] = new Vector2(0, 0);
uv[i4 + 1] = new Vector2(1, 0);
uv[i4 + 2] = new Vector2(0, 1);
uv[i4 + 3] = new Vector2(1, 1);
// assign triangles to the vertices
int i6 = i * 6;
tri[i6 + 0] = i4 + 0;
tri[i6 + 1] = i4 + 2;
tri[i6 + 2] = i4 + 1;
tri[i6 + 3] = i4 + 2;
tri[i6 + 4] = i4 + 3;
tri[i6 + 5] = i4 + 1;
}
mesh.vertices = vertices;
mesh.normals = normals;
mesh.uv = uv;
mesh.triangles = tri;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment