[유니티] Unity Bezier Curve

안녕하세요 UnityBeginner입니다.
이번 글에선 유니티의 베지어 곡선에 대해 알아보겠습니다.

베지어 곡선이란 n개의 점으로부터 수학적 공식을 통하여 부드러운 곡선을 
생성하는데 주로 사용하는 공식입니다.

정확한 공식은 위키백과 링크를 걸어드리겠습니다.

https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%A7%80%EC%97%90_%EA%B3%A1%EC%84%A0


씬뷰



그림을 참고하면 각 깃발들은 n개의 점을 나타내며 수학적인 공식을 통해 
구해져 표시 된 동그라미들이 베지어곡선입니다.

2D슈팅 게임들을 보면 적 비행기들이 나타나서 이리저리 날아다니면서 
총알을 쏘는데 그때 적용된 기술이 베지어 곡선입니다.


하이어라키 - 오브젝트 구성



움직일 대상이되는 플레이어, 기즈모를 그릴 빈 오브젝트 플레이어가 
이동할 n점을 표시 할 웨이포인트들을 생성합니다.


스크립트 - OnDrawGizmos


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
   public Transform[] waypoints;
    private Vector2 gizmosPosition;

    private void OnDrawGizmos() {
        for (float t = 0; t < 1; t += 0.05f) {
            gizmosPosition =
                Mathf.Pow(1 - t, 3) * waypoints[0].position
                + 3 * t * Mathf.Pow(1 - t, 2) * waypoints[1].position
                + 3 * t * (1 - t) * waypoints[2].position
                + Mathf.Pow(t, 3) * waypoints[3].position;

            Gizmos.DrawSphere(gizmosPosition, 15f);
        }

        Gizmos.DrawLine(new Vector2(waypoints[0].position.x, waypoints[0].position.y),
                        new Vector2(waypoints[1].position.x, waypoints[1].position.y));

        Gizmos.DrawLine(new Vector2(waypoints[2].position.x, waypoints[2].position.y),
                        new Vector2(waypoints[3].position.x, waypoints[3].position.y));
    }


기즈모는 unity 생명주기글에서 짤막하게 설명했던 부분으로 
편집기에서 작업중인 동안에만 호출되는 함수로 

Game뷰에서 기즈모는 보이지 않게 됩니다. 
(위 이미지는 Scene뷰에서 캡쳐했습니다.)


스크립트 - BezierCurve


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public Transform[] p;
    public float speed = 0.5f;
    private float t = 0f;
    private Vector3 bezierPosition;

    void Update()
    {
        StartCoroutine(BezierCurveStart());
    }

    private IEnumerator BezierCurveStart() {

        t += Time.deltaTime * speed;

        while(t < 1) {

            bezierPosition = Mathf.Pow(1 - t, 3) * p[0].position
                    + 3 * t * Mathf.Pow(1 - t, 2) * p[1].position
                    + 3 * t * (1 - t) * p[2].position
                    + Mathf.Pow(t, 3) * p[3].position;

            transform.position = bezierPosition;
            yield return new WaitForEndOfFrame();
        }

        t = 0f;
    }

공식을 그대로 사용해 부드러운 곡선을 이동할 플레이어 스크립트를 코딩해줍니다.


결과화면


댓글