Version: 2021.2
언어: 한국어
메시 클래스 사용
텍스처 및 메시 데이터 로드

예제 - 사각형 생성

평평한 면을 나타내기 위해 Unity는 씬에서 인스턴스화할 수 있는 평면 및 사각형 프리미티브 게임 오브젝트를 제공합니다. 하지만 스크립트를 통해 사각형 메시를 만드는 방법을 알아두면 도움이 됩니다. 이는 절차적 메시 생성을 위한 필수 과정입니다.

참고: Unity는 사각형이 아니라 삼각형으로 지오메트리를 처리하고 표시합니다. 즉, 사각형 프리미티브는 두 개의 삼각형으로 구성됩니다.

버텍스 배열

제일 먼저 셰이프가 사용하는 버텍스 배열을 설정해야 합니다.

이 예제에서는 사각형이 x축과 y축에 놓여 있고, 스크립트에 너비 및 높이 변수가 들어 있다고 가정합니다.

Vector3[] vertices = new Vector3[4]
{
    new Vector3(0, 0, 0),
    new Vector3(width, 0, 0),
    new Vector3(0, height, 0),
    new Vector3(width, height, 0)
};
mesh.vertices = vertices;

이 예제는 다음 순서로 버텍스를 제공합니다. 하단-왼쪽 하단-오른쪽 상단-왼쪽 상단-오른쪽

Unity가 메시 데이터 프로퍼티를 검색해서 가져오는 방식 때문에, 개별 요소를 통해 프로퍼티 배열에 액세스하는 것보다 자체 배열에 데이터를 설정한 후 해당 배열을 프로퍼티(예: Mesh.vertices 또는 Mesh.normals)에 할당하는 편이 훨씬 더 효율적입니다.

삼각형

그런 다음에는 삼각형을 설정해야 합니다. 사각형은 두 개의 삼각형으로 구성되고, 앞서 생성한 버텍스 배열에서 각각 세 개의 포인트로 이루어집니다. 포인트를 지정하려면 각 삼각형을 버텍스 배열의 세 개 인덱스로 정의해야 합니다. 예를 들어 이 사각형의 왼쪽 하단 삼각형은 버텍스 배열의 좌표 (0, 0, 0), (0, 높이, 0), (너비, 0, 0)에 해당하는 인덱스 0, 2, 1을 사용합니다. 순서 지정은 중요하며, 시계 방향으로 모서리의 순서를 지정해야 합니다. 오른쪽 상단 삼각형은 인덱스 2, 3, 1을 사용합니다.

int[] tris = new int[6]
{
    // lower left triangle
    0, 2, 1,
    // upper right triangle
    2, 3, 1
};
mesh.triangles = tris;

노멀

버텍스와 삼각형이 있는 메시가 씬에 표시되지만, 아직 노멀이 없기 때문에 Unity에서 올바르게 셰이딩되지 않습니다. 이 예제의 노멀은 모두 동일하므로 매우 단순합니다. 모든 노멀 포인트는 사각형의 로컬 공간에서 음의 z축 방향을 가리킵니다. 노멀을 추가하면 Unity는 사각형을 올바르게 셰이딩하지만, 효과를 확인하려면 씬에 광원이 필요합니다.

Vector3[] normals = new Vector3[4]
{
    -Vector3.forward,
    -Vector3.forward,
    -Vector3.forward,
    -Vector3.forward
};
mesh.normals = normals;

노멀을 직접 정의하고 싶지 않다면 Mesh.RecalculateNormals()를 사용할 수 있습니다.

텍스처 좌표

마지막으로 메시의 머티리얼에 텍스처를 올바르게 표시하려면 메시에 텍스처 좌표를 추가하십시오. 텍스처 좌표는 0과 1 사이입니다. 메시의 각 버텍스에는 머티리얼의 텍스처에서 샘플링할 위치를 지정하는 텍스처 좌표가 있습니다. 사각형에 전체 텍스처를 표시하려면 각 버텍스의 텍스처 좌표 값은 0또는 1이어야 합니다. 그래야만 사각형의 각 모서리가 텍스처의 모서리와 일치합니다.

Vector2[] uv = new Vector2[4]
{
      new Vector2(0, 0),
      new Vector2(1, 0),
      new Vector2(0, 1),
      new Vector2(1, 1)
};
mesh.uv = uv;

최종 스크립트

다음 스크립트는 위의 모든 단계를 조합하여 씬에 사각형을 만듭니다. 사용하려면 다음 절차를 따르십시오. 새 C# 스크립트(메뉴: Assets > Create > C# Script)를 만들고 QuadCreator라고 이름을 지정합니다. QuadCreator 스크립트를 열고 예제 코드를 복사해 붙여넣은 후 스크립트를 저장합니다. 다시 에디터로 돌아와 씬에 새 게임 오브젝트를 만듭니다(메뉴: GameObject > Create Empty). 인스펙터에서 Add Component > Scripts > Quad Creator를 선택합니다. 원하는 씬 내 위치에 게임 오브젝트를 배치합니다. 플레이 모드를 시작합니다. 씬 또는 게임 뷰에 사각형이 표시되지 않으면 올바른 측면에서 보고 있는지 확인하십시오. Unity는 이 메시의 뒷면을 렌더링하지 않습니다.

using UnityEngine;

public class QuadCreator : MonoBehaviour
{
    public float width = 1;
    public float height = 1;

    public void Start()
    {
        MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
        meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));

        MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();

        Mesh mesh = new Mesh();

        Vector3[] vertices = new Vector3[4]
        {
            new Vector3(0, 0, 0),
            new Vector3(width, 0, 0),
            new Vector3(0, height, 0),
            new Vector3(width, height, 0)
        };
        mesh.vertices = vertices;

        int[] tris = new int[6]
        {
            // lower left triangle
            0, 2, 1,
            // upper right triangle
            2, 3, 1
        };
        mesh.triangles = tris;

        Vector3[] normals = new Vector3[4]
        {
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward
        };
        mesh.normals = normals;

        Vector2[] uv = new Vector2[4]
        {
            new Vector2(0, 0),
            new Vector2(1, 0),
            new Vector2(0, 1),
            new Vector2(1, 1)
        };
        mesh.uv = uv;

        meshFilter.mesh = mesh;
    }
}

참고: 이 예제 코드는 Start 함수에 있습니다. 즉 플레이 모드를 시작할 때 한 번 실행되며, 메시는 애플리케이션 전체에서 변경되지 않습니다. 하지만 Update 함수에 코드를 추가하여 프레임마다 메시가 변경되도록 만들 수 있습니다. 이 경우 메시 생성 시 리소스 소모가 매우 높아집니다.

메시 클래스 사용
텍스처 및 메시 데이터 로드