유니티 부드러운 곡선이동

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

반응형
728x170

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

 

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

 

결과 화면

 

반응형
그리드형