유니티 부드러운 곡선이동

2020. 4. 25. 16:00유니티실습

반응형

안녕하세요 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

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

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;
    }

 

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

 

결과 화면

 

반응형