Unity 게임개발

2. 기본적인 배경 구현

딴짓거리 2023. 4. 1. 15:59

시작부터 상당히 많은 고민을 하게 만들었다

슈퍼 헥사곤은 게임도중 배경이 육각형, 오각형, 사각형으로 변하는 기믹이 존재한다.

원래는 기본 배경들은 삼각형 이미지를 적당히 붙여서 만드려고 했지만 그럴경우

최소한 본인은 저런식으로 다각형 전환 기믹을 절대로 만들 수 없을 것 같았다.

 

꽤 오랜시간 고민한 끝에 directX11에서 그랬던것 처럼 직접 도형의 정점을 구하고 파이프라인에 집어넣어 도형을 생성해주기로 했다.

 

public Vector3[] PolygonFunc(float radius, int vertex)
    {
        Vector3[] node = new Vector3[vertex * 3];
        int deg = 360/vertex;
        for (int j = 0; j < vertex; j++)
        {
            node[j * 3] = new Vector3(0, 0);
            for (int i = 1; i <= 2; i++)
            {
                var rad = Mathf.Deg2Rad * (deg * (j + i - 1));
                var x = radius * Mathf.Sin(rad);
                var y = radius * Mathf.Cos(rad);
                node[j * 3 + i] = new Vector3(x, y);
            }
        }

        return node;
    }

힘들게 만든 범용 다각형 꼭짓점 노드 생성 함수이다.

도형의 크기와 정점의 갯수(어떤 다각형을 만들것인가)를 받으면

필요한 정점수x3을 생성한다

 

3배를 생성하는 이유는 물론 다각형을 구성하는 삼각형 폴리곤마다 다른 색을 지정해주어야 하기 때문에

각각의 삼각형마다 별개의 노드가 필요하기 때문이다.

 

public void createProceduralMesh(Vector3[] vertex)
    {
        mesh.Clear();

        mesh.vertices = vertex;
        
        if (vertex.Length == 18)
        {
            mesh.subMeshCount = 2;
            mesh.SetTriangles(hexagonIdx1, 0);
            mesh.SetTriangles(hexagonIdx2, 1);
        }
        if (vertex.Length == 15)
        {
            mesh.subMeshCount = 3;
            mesh.SetTriangles(pentagonIdx1, 0);
            mesh.SetTriangles(pentagonIdx2, 1);
            mesh.SetTriangles(pentagonIdx3, 2);
        }
        if (vertex.Length == 12)
        {
            mesh.subMeshCount = 2;
            mesh.SetTriangles(squareIdx1, 0);
            mesh.SetTriangles(squareIdx2, 1);
        }
        mesh.RecalculateNormals();
    }

화면에 삼각형을 그리는 함수이다.

정점 생성 함수에서 생성한 정점의 배열을 GameManager가 받아 그 값을 다시 위 함수로 넘겨준다

정점의 갯수로 몇각형을 생성할지 판단하며

미리 순서에 맞게 정해둔 정점 인덱스와 오브젝트에 할당해둔 색 메터리얼을 통해 

지정한 삼각형에 알맞은 색을 입힌다.

 

배경은 두가지 혹은 세가지 색깔이 번갈아가며 나타나므로 이런식으로 두개 이상의 metarial을 받아와 

두개 이상의 정점 인덱스 배열을 사용했지만

중앙에 위치한 다각형은 단색이므로  그럴 필요가 없어서 더 간단한 함수로 구성했다.

 

void Update()
    {
        if (polyold != polygon)
        {
            polyold = polygon;
            //배경
            BackGroundNode = BackGroundpoly.PolygonFunc(radius,polyold);
            BackGroundpoly.createProceduralMesh(BackGroundNode);

            //중앙 바깥
            MiddleOutNode = MiddleOutPoly.PolygonFunc(radius2, polyold);
            MiddleOutPoly.createProceduralMesh(MiddleOutNode);

            //중앙 중앙
            MiddleInNode = MiddleInPoly.PolygonFunc(radius3, polyold);
            MiddleInPoly.createProceduralMesh(MiddleInNode);
        }
    }

일단은 GameManager에서 이런식으로 다각형을 그리도록 해줬다. 끊임없이 계속 다각형을 재생성하면 안되므로

꼭짓점의 갯수가 변할때마다 한번씩 실행해준다.

그리고 적당한 반지름 값을 입력하여 보기좋게 배열한다.

 

GameManager에 public으로 선언되어있는 꼭짓점의 갯수값을 바꿔주면

정상적으로 다각형이 변화하는걸 볼 수 있다.

 

이젠 다각형간의 전환이 부드럽게 이어지도록하는 방법을 고민 해봐야겠다.