Unity에서는 Mesh를 만들기위한 코드를 제공하며 DX와 비슷하기 때문에 DX를 좀 하신분이라면 어렵지 않게 접근할 수 있습니다. DX를 전혀 모르시더라도 네이티브 언어로 접근하는게 아니기에 Mesh가 만들어지는 원리에 대해 조금만 이해하시면 어렵지않게 접근하실 수 있습니다. 



    간단히 빈 오브젝트 하나를 만들어서 Mesh Filter 컴포넌트와 Mesh Renderer 컴포넌트를 추가합니다.  Mesh Filter는 Mesh를 렌더링하기위해 꼭 필요하고 Mesh Renderer는 Material을 적용히시키기위해 필요합니다. 마테리얼을 적용시키지 않을거라면 굳이 Mesh Renderer는 필요하지 않습니다. 이 두 컴포넌트는 코드로 추가시켜도 상관없습니다.



    그런 다음 적당히 스크립트를 하나 만듭니다. 전 'MeshCreator'라는 이름으로 만들었습니다.
    코드에 들어가기 앞서 아주 조금 이론에 대해 얘기하겠습니다.




    우리가 흔히 Mesh라 부르는 것들은 꼭지점(Vertex)이 이어진 Triangle Polygon들이 모여 만들어진 것입니다. 오른쪽 상자에 보이는 v0, v1, v2... 이런 것들이 Vertex고 그것들이 이어진 삼각형이 Triangle Polygon입니다. 우리가 지금 해야 할 일은 좌표를 가진 꼭지점을 만들고 그것들을 이어서 Triangle Polygon을 만들어 하나의 Mesh로 합치는 일입니다. 이제 스크립트로 가보겠습니다.



    저희는 먼저 간단히 이차원 사각형 하나를 만들어보겠습니다.
    가장 먼저 할 일은 꼭지점을 만들어주는건데요. Vector3로 꼭지점의 좌표를 배열로 만들어주시면 됩니다.  이 부분은 List를 이용해서 꼭지점을 추가한다음 ToArray 함수를 통해 배열로 만드셔도 됩니다. 그 다음에는 Triangle Polygon을 만들어줘야하는데요. int형 배열을 만들어서 3개씩 이을 꼭지점들의 배열 인덱스 값을 넣어주면 됩니다. Triangle Polygon이기 때문에 꼭 꼭지점을 3개씩 맞춰줘야합니다. 참고로 꼭지점을 Vertex라고 부르듯이 이 int형 값들을 index라고 부릅니다.



    저는 이렇게 이었습니다.
    triangles를 다 채웠다면 Mesh 클래스를 생성하고 vertices와 triangles에 만든 값들을 세팅한 뒤, 오브젝트에 붙어있는 MeshFilter 컴포넌트를 가져와 mesh에 만든 mesh를 세팅합니다.




    만든 스크립트를 처음에 만든 오브젝트에 붙이면 이런 결과가 나옵니다. 근데 색이 이상하죠? Material이 없어서 그렇습니다. 그럼 이제 마테리얼을 추가해봅시다. 마테리얼을 직접 추가할 수도 있겠지만 코드를 통해 만들어서 추가해보겠습니다.



    간단히 Material 클래스를 만드는데 인자값으로 Shader.Find(쉐이더 이름)을 넣어줘야합니다. 저는 딱히 만든 Shader가 없으니 기본 Standard Shader를 넣겠습니다.



    결과는 다음처럼 굉장히 잘 나옵니다~
    이번에는 Texture도 한번 넣어보겠습니다.



    Texture를 넣을려면 UV 좌표를 설정해줘야하고 UV의 길이는 Vertex와 동일해야합니다. UV의 수치는 0~1까지이며 다음과 같습니다.



    다른 엔진이나 DX는 0, 0이 왼쪽 위인데 유니티는 왜인지 왼쪽 아래가 0, 0입니다. 저처럼 Vertex 순서에 맞게 UV 배열을 만들어주시면됩니다. 그런 다음 mesh.uv에 만든 uv 배열을 세팅해주고 Bound와 Normal를 재계산해주는 함수를 실행하셔야합니다. 두 함수는 이름 그대로 Vertex의 방향값과 경계 볼륨을 재계산해주는 함수입니다. 마지막으로 인스펙터창에서 세팅할 수 있게 Texture 변수를 만들어주고 Shader의 Main Texture로 지정해줍니다.




    유니티의 무료 텍스쳐를 사용한 저는 아주 멋들어지게 나왔습니다!


    이로써 Mesh 코드로 만들기가 끝이났습니다. 지금 만든건 단순 2D Plan일뿐이고 Box를 만들려면 Vertex, index, uv 세팅 모두 조금 더 복잡해집니다. 보통 Mesh를 직접 만들어야하는 경우는 평면 이외에 거의 없기 때문에 Box에 대해서는 다음에 기회가 된다면 소개하겠습니다.


    Posted by Muramasa