Version: Unity 6.0 (6000.0)
언어 : 한국어
메시 API를 통해 메시에 액세스
디테일 수준(LOD)으로 원거리 메시 단순화

스크립트를 통해 사각형 메시 생성

평면을 나타내기 위해 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;

이 예제에서는 다음 순서로 버텍스를 제공합니다.

  1. Bottom-left
  2. Bottom-right
  3. Top-left
  4. Top-right

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;

Normals

버텍스와 삼각형이 있는 메시는 씬에 표시되지만, 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;

최종 스크립트

다음 스크립트는 위의 모든 요소를 결합하여 씬에 사각형을 생성합니다. 사용하려면 다음 단계를 따르십시오.

  1. 새 C# 스크립트를 생성(메뉴: Assets > Create > MonoBehaviour Script)하고 이름을 QuadCreator로 지정합니다.
  2. QuadCreator 스크립트를 열고 예제 코드를 복사한 후 스크립트를 저장합니다.
  3. 에디터에서 씬에 새 게임 오브젝트를 생성합니다(메뉴: GameObject > Create Empty).
  4. 인스펙터에서 Add Component > Scripts > Quad Creator를 선택합니다.
  5. 씬에서 원하는 위치에 게임 오브젝트를 배치합니다.
  6. 플레이 모드를 실행합니다. 씬 또는 게임 뷰에서 사각형이 보이지 않으면 올바른 면에서 확인해야 합니다. 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 함수에 코드를 추가하여 프레임마다 메시가 변경되도록 만들 수 있습니다. 이 경우 메시 생성 시 리소스 소모가 매우 높아집니다.

메시 API를 통해 메시에 액세스
디테일 수준(LOD)으로 원거리 메시 단순화