예: Billboard 평면 생성하기

유니티는 평면 원시 객체를 가지고 있는데 이것은 2D 게임이나 GUI에 유용한 간단한 평면이며 어쨌든 좋은 예의 시작입니다. 최소한의 평면은 두개의 삼각형으로 각 구석을 정의하는 네개의 꼭지점으로 이루어져 있습니다.

첫째로 꼭지점 배열을 설정합니다. 평면은 XY축에 있고 넓이와 높이는 파라미터로 정해진다고 가정합니다. 꼭지점의 순서는 왼쪽 아래, 오른쪽 아래, 왼쪽 위, 오른쪽 위의 순서로 제공합니다.

var vertices: Vector3[] = new Vector3[4];
 
vertices[0] = new Vector3(0, 0, 0);
vertices[1] = new Vector3(width, 0, 0);
vertices[2] = new Vector3(0, height, 0);
vertices[3] = new Vector3(width, height, 0);
 
mesh.vertices = vertices;

(메쉬 데이터 속성은 씬 뒤에서 코드를 실행시키므로 데이터를 사용자 자신의 배열에 설정하고 이것을 속성에 할당하는 것이 속성을 배열의 요소별로 접근하는 것보다 효율 적입니다.)

다음은 삼각형 입니다. 두 개의 삼각형을 원하므로 각 삼각형은 세 개의 정수로 정의되며 삼각형 배열은 총 여섯개의 요소를 가집니다. 각 구석을 시계 방향으로 정의하는 것을 생각 했을 때, 왼쪽 아래 삼각형은 0, 2, 1을, 오른쪽 위 삼각형은 2, 3, 1을 코너 색인으로 사용합니다.

var tri: int[] = new int[6];
 
//	Lower left triangle.
tri[0] = 0;
tri[1] = 2;
tri[2] = 1;
 
//	Upper right triangle.	
tri[3] = 2;
tri[4] = 3;
tri[5] = 1;
 
mesh.triangles = tri;

꼭지점과 삼각형으로만 이루어진 메쉬는 에디터에 보이긴하지만 설득력이 있지만 않습니다. 왜냐하면 법선없이 정확히 그림자지워지지 않기 때문입니다. 평면의 법선은 매우 간단한데 모두 같고 평면의 로컬 스페이스에서 Z의 음방향을 가리킵니다. 법선이 추가되면서 평면은 정확히 그림자를 만들지만 화면에서 효과를 보기 위해서는 빛이 필요합니다.

var normals: Vector3[] = new Vector3[4];
 
normals[0] = -Vector3.forward;
normals[1] = -Vector3.forward;
normals[2] = -Vector3.forward;
normals[3] = -Vector3.forward;
 
mesh.normals = normals;

마지막으로, 텍스쳐 좌표를 메쉬에 추가하는 것은 재료를 정확히 나타내는 것을 가능하게 합니다. 이미지 전체를 평면에 걸쳐 보여주고 싶다고 가정한다면 텍스쳐의 코너에 따라 UV값은 모두 0또는 1이 될것입니다.

var uv: Vector2[] = new Vector2[4];
 
uv[0] = new Vector2(0, 0);
uv[1] = new Vector2(1, 0);
uv[2] = new Vector2(0, 1);
uv[3] = new Vector2(1, 1);
 
mesh.uv = uv;

완성된 스크립은 아래와 같을 것입니다:-

var width: float;
var height: float;
 
function Start() {	
	var mf: MeshFilter = GetComponent(MeshFilter);
	var mesh = new Mesh();
	mf.mesh = mesh;
 
	var vertices: Vector3[] = new Vector3[4];
 
	vertices[0] = new Vector3(0, 0, 0);
	vertices[1] = new Vector3(width, 0, 0);
	vertices[2] = new Vector3(0, height, 0);
	vertices[3] = new Vector3(width, height, 0);
 
	mesh.vertices = vertices;
 
	var tri: int[] = new int[6];
 
	tri[0] = 0;
	tri[1] = 2;
	tri[2] = 1;
 
	tri[3] = 2;
	tri[4] = 3;
	tri[5] = 1;
 
	mesh.triangles = tri;
 
	var normals: Vector3[] = new Vector3[4];
 
	normals[0] = -Vector3.forward;
	normals[1] = -Vector3.forward;
	normals[2] = -Vector3.forward;
	normals[3] = -Vector3.forward;
 
	mesh.normals = normals;
 
	var uv: Vector2[] = new Vector2[4];
 
	uv[0] = new Vector2(0, 0);
	uv[1] = new Vector2(1, 0);
	uv[2] = new Vector2(0, 1);
	uv[3] = new Vector2(1, 1);
 
	mesh.uv = uv;
}

코드가 Start함수에서 한 번 실행이되면 메쉬는 게임 동안 계속 같은 상태를 유지합니다. 그러나 Update함수에 코드를 추가함으로써 프레임마다 메쉬를 바꾸는 것이 가능합니다(이것은 CPU오버헤드를 상당히 높힙니다).