전문가용 물결 무늬 스타일(평면)

17765 단어 Unity
Unity에서 스크립트로 격자를 만드는 방법에 대해 여러 차례 설명합니다.
  • 첫 번째 유니티 전문 이쑤시개 스타일링(삼각형, 사각형, 정다각형) - Qita
  • 두 번째 Unity의 전문 이쑤시개 스타일링(평면)
  • 제3회 카페(장방체)-Qita
  • 제4회 Unity 카페(원통)-Qita
  • 제5회 카페-Qita
  • 제6회 유니티 전문 패션 스타일
  • 이번에는 평면의 그물 모양을 만들어 보았다.

    Plane.cs
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
    public class Plane : MonoBehaviour
    {
        [SerializeField] private Vector2 size = new Vector2(4, 3);
        [SerializeField] private Vector2Int segment = new Vector2Int(4, 3);
    
        private void Awake()
        {
            Mesh mesh = new Mesh();
            GetComponent<MeshFilter>().mesh = mesh;
    
            Vector3[] vertices = new Vector3[(segment.x + 1) * (segment.y + 1)];
            int[] triangles = new int[segment.x * segment.y * 2 * 3];
    
    
            Vector2 halfSize = size * 0.5f;
            Vector2 sizeStep = size / segment;
            int vi = 0;
            for (int y = 0; y < segment.y + 1; y++)
            {
                for (int x = 0; x < segment.x + 1; x++)
                {
                    vertices[vi++] = new Vector3(sizeStep.x * x - halfSize.x, sizeStep.y * y - halfSize.y, 0);
                }
            }
            int ti = 0;
            for (int y = 0; y < segment.y; y++)
            {
                for (int x = 0; x < segment.x; x++)
                {
                    triangles[ti] = x + y * (segment.x + 1);
                    triangles[ti + 1] = triangles[ti + 5] = x + (y + 1) * (segment.x + 1);
                    triangles[ti + 2] = triangles[ti + 4] = (x + 1) + y * (segment.x + 1);
                    triangles[ti + 3] = (x + 1) + (y + 1) * (segment.x + 1);
                    ti += 6;
                }
            }
    
            mesh.vertices = vertices;
            mesh.triangles = triangles;
            mesh.RecalculateNormals();
        }
    }
    
    이번에 생성된 평면의 크기와 분할수sizesegment는 거리측정기에서 임의로 설정할 수 있다.
    메쉬 구성은 다음과 같습니다(분할 수는 기본값).숫자는 정점의 색인을 나타내고, 원으로 둘러싸인 숫자는 삼각형의 순서를 정의한다. (중도 생략)

    그림에서 보듯이 정점은 (segment.x + 1) * (segment.y + 1)만 있으면 된다.또한 망상물을 종횡으로 분할한 후의 사각형은 두 개의 삼각형을 만들 수 있으며 삼각형의 수량은 segment.x * segment.y * 2이다.따라서 triangles 어레이의 크기는 segment.x * segment.y * 2 * 3입니다.
    소스 코드의 다음 부분에서 정점을 정의했습니다.XY 평면에 만들어진 메쉬의 중심을 원점과 일치시키기 위해 정점을 설정합니다.
    Vector2 halfSize = size * 0.5f;
    Vector2 sizeStep = size / segment;
    int vi = 0;
    for (int y = 0; y < segment.y + 1; y++)
    {
        for (int x = 0; x < segment.x + 1; x++)
        {
             vertices[vi++] = new Vector3(sizeStep.x * x - halfSize.x, sizeStep.y * y - halfSize.y, 0);
        }
    }
    
    삼각형의 정의는 다음과 같은 곳에서 진행된다.쌍순환에서 두 삼각형의 직사각형을 구성하였다.두 삼각형에서 정사각형을 만드는 방법에 대해서는 이전 기사를 참조하십시오.
    int ti = 0;
    for (int y = 0; y < segment.y; y++)
    {
          for (int x = 0; x < segment.x; x++)
          {
              triangles[ti] = x + y * (segment.x + 1);
              triangles[ti + 1] = triangles[ti + 5] = x + (y + 1) * (segment.x + 1);
              triangles[ti + 2] = triangles[ti + 4] = (x + 1) + y * (segment.x + 1);
              triangles[ti + 3] = (x + 1) + (y + 1) * (segment.x + 1);
              ti += 6;
          }
    }
    

    좋은 웹페이지 즐겨찾기