Ad Block 한번만 꺼주시면 안될까요..?
게임 개발/유니티C#

유니티(C#)으로 그래프를 그리는 방법.

UniCoti(유니코티) 2022. 12. 25.

유니티는 어떤 UI개발 툴이 아니기 때문에

기본적으로 그래프를 그리는 기능은 없는 것으로 보인다.

그래서 나(필자)는 점을 오브젝트로 만들어 뒀음을

참고하고 이 방법이 자신의 프로젝트나 원하는 바에

어긋나지 않는다면 사용하길 바란다.


먼저, 2d 프로젝트를 하나 생성해 준다.

그리고 가장 처음으로 점 오브젝트를 

프리팹화 시켜줘야 하는데,

 

프리팹이란 일종의 복사본이다. (아래의 자세한 게시물)

https://alpaca-code.tistory.com/12(프리팹 게시물)

 

유니티 Prefab(프리팹)에 대해.

Prefab은 오브젝트를 Assets파일로 가져오면 생성되는 오브젝트의 복사본이다. 이걸 왜쓰냐하면, 똑같은 오브젝트를 굳이 여러개 만들 필요가 없고, 아웃렛 연결(인스펙터에서 연결) 할때 삭제되는

alpaca-code.tistory.com

 

옛날에 올린 글이라 글의 길이가 짧으니 간단히 읽어보길 바란다.

 

본격적으로 만들어보겠다.

2D Object -> Sprites -> Circle를 클릭하여 점?을 생성해 준다.

그리고 점을 검은색으로 바꿔준다.

우리는 검은색이 된 점을 위해서

카메라의 배경을 하얀색으로 바꿔줘야 한다.

Main Camera를 클릭해 준다.

카메라 오브젝트의

Camera 컴포넌트의 Background를 눌러서

하얀색으로 변경해 준다.

Clear Flags를 Solid Color로 변경해주면 더 좋다.

 

상관없지만 조금 더 적절한 세팅임.

그럼 대충 이런 화면일 텐데,

하이어리키 창에서 점 오브젝트를

프로젝트 창으로 끌고 와준다.(프리팹 화)

그럼 이렇게 Dot이라는 이름의 점 프리팹이 형성된다.


이제 본격적으로 코드를 짜보겠다.

public GameObject Dot; //점 오브젝트를 가져옴.
    
    void Start() //시작할때
    {
        for(float i = -45 ; i < 45; i += 0.05f) { //0.05씩 늘려가며 -45에서 45가 될때까지 반복
           	
        }
    }

먼저 이런 코드를 짜봤다. 

어떤 함수의 그래프는 조금씩 늘어가는

x좌표에 대응하는 y좌표의 집합이기에

for문을 이용해서 x를 조금씩 늘려가게 하여

선처럼 만드려고 노력했다. (잘 읽어보세요)


이제 점을 찍는 함수를 구현해 보자.

void DrawDot(GameObject obj, Vector2 posi) { //점 찍는 함수
        GameObject dot = Instantiate(obj) as GameObject; //점 생성
        dot.transform.position = posi; //점을 posi위치로 옮김.
}

이제 점을 찍는 함수까지 구현했다.

하지만 우리는 어디로 찍을 지도받아와야 한다.

 

지금은 처음 하는 것이기에

가장 쉬운 일차함수를 짜는 함수를 만들어보자.

Vector2 linearFunction(float Rotation, float plusY, float X) { //1차 함수
        float Y;
        Y = Rotation * X + plusY; //y = ax + b (일차함수) a가 기울기라서 Rotation으로 지정, b는 y절편이라고도 하기에 plusY로 지음.
        return new Vector2(X,Y); //우리가 넣은 X에 대응하는 Y를 계산하여 순서쌍 (X,Y)리턴
    }

이제 종합해 보자. (위의 주석을 잘 읽어보세요)

void Start() //시작할때
    {
        for(float i = -45 ; i < 45; i += 0.05f) { //(사실상) 무한대로 점 찍기
            DrawDot(Dot, linearFunction(1,0,i)); //점찍기(일차함수인데 기울기가 1이고, y절편이 0인 함수.)
        }
    }

드디어 완성하였다.

이제 유니티를 켜서

아무 오브젝트(카메라에 넣는 걸 추천)에

우리가 만든 스크립트를 넣어보자.

이제 Dot에 우리가 프리팹화 시킨 점 오브젝트를 넣어주면

실행할 준비는 모두 완성된다.

 

실행시켜 보면?

일차 함수가 잘 나타나는 걸 볼 수 있다.

기울기가 1이었기 때문에

각도는 45도 인걸 볼 수 있다.


여기까지 그래프를 그리는 방법이었지만,

사실 여기서 끝난다면 개발자가 아니지 않겠는가?

몇 가지 장난감들을 소개하겠다.

 

Vector2 linearFunction(float Rotation, float plusY, float X) {
        float Y;
        Y = Rotation * X + plusY;
        return new Vector2(X,Y);
    }

    Vector2 quadraticFunction(float a, float b, float c, float X) {
        float Y;
        Y = a*(X*X) + b * X + c;
        return new Vector2(X,Y);
    }

    Vector2 cubicFunction(float a, float b, float c, float d,float X) {
        float Y;
        Y = a*(X*X*X) + b * X * X + c * X + d;
        return new Vector2(X,Y);
    }

    Vector2 SinFunction(float X) {
        float Y;
        Y = Mathf.Sin(X);
        return new Vector2(X * 5 * (Mathf.PI/180),Y) * 5;
    }

    Vector2 CosFunction(float X) {
        float Y;
        Y = Mathf.Cos(X);
        return new Vector2(X * 5 * (Mathf.PI/180),Y) * 5;
    }

    Vector2 TanFunction(float X) {
        float Y;
        Y = Mathf.Tan(X);
        return new Vector2(X * 4 * (Mathf.PI/180), Y * 0.2f) * 7;
    }

독자분들 가즈고 놀라고 여러 가지 함수들을 준비했다.

for(float i = -45 ; i < 45; i += 0.05f) {
            //DrawDot(Dot, cubicFunction(1,4,-3,1,i));
            DrawDot(Dot, linearFunction(1,0,i));
            //DrawDot(Dot, quadraticFunction(1, 4, -3, i));
            //DrawDot(Dot, TanFunction(i));
            //DrawDot(Dot, SinFunction(i));
            //DrawDot(Dot, CosFunction(i));
            //DrawDot(Dot, linearFunction(1, 0, i));
        }

이렇게 만들어진 코드도 주석처리 시켜놨으니

원하는 함수를 보고 싶을 때마다 그 줄의 주석을

풀어서 실행결과를 봐도 좋다.

 

참고로 Linear은 1차,

Cubic은 2차,

quadratic은 3차(1차는 직선, 2차는 곡선으로 그 모양이 확연히 달라지는데 3차는 어떻게 될지 궁금해서 만들었다),

Sin은 사인함수,

Cos은 코사인 함수,

Tan은 탄젠트 함수이다.

 

함수 영역 내에서 알아서 배율조절을 해놨으니

편하게 볼 수 있을 것이다.

 

 

유니티 협력 글(어필리에이트)


이상으로 도움이 되었길 바라며,

 

끝.

댓글

💲 추천 글