Unity3D/Game

Unity3D) Vector3.Lerp()

JJORY 2021. 1. 29. 18:12

* 선형보간이란?

위키백과, 우리 모두의 백과사전.

선형 보간법(線型補間法, linear interpolation)은 끝점의 값이 주어졌을 때 그 사이에 위치한 값을 추정하기 위하여 직선 거리에 따라 선형적으로 계산하는 방법.

 

쉽게말해, 선형보간이란 내가 어떠한 위치좌표에서 어떠한 도착좌표까지 이동하면서 한번에 이동하지않고 

천천히(=부드럽게) 움직이면서 이동한다를 의미한다.

 

* 유니티에서의 선형보간

 - Mathf.Lerp() => 숫자에서의 선형보간을 의미

 - Vecter2.Lerp() => Vecter2에서의 선형보간을 의미

 - Vecter3.Lerp() => Vecter3에서의 선형보간을 의미

 - Quaternion.Lerp() => Quaternion에서의 선형보간을 의미

    - Quaternion : 회전을 표현하기 위해 사용

       https://docs.unity3d.com/kr/530/ScriptReference/Quaternion.html

 

Unity - 스크립팅 API: Quaternion

쿼터니언은 작지만, 짐벌 락(gimbal lock)에 걸리지 않고, 쉽게 보간될 수 있습니다. 유니티는 내부적으로 쿼터니언을 모든 회전을 포현하기 위해 사용합니다. 쿼터니언은 복잡한 수를 기반으로 하

docs.unity3d.com

 

* Lerp()

 - 오브젝트를 부드럽게 이동 or 회전하도록 하기위해 사용

 - ex) 인게임내 카메라시점에 사용 / 캐릭터 이동or회전에 사용

 

<실제 프로젝트에서 쓰인 코드>

private void Update()
    {
        if (photonView.IsMine)
        // 캐릭터가 local인 경우
        {
            v = inputVec.GetVerticalValue();
            // inputVec(JoyStickControll)으로부터 수직이동값을 가져온다
            h = inputVec.GetHorizontalValue();
            // inputVec(JoyStickControll)으로부터 수평이동값을 가져온다

            Vector3 moveDir = (Vector3.right * h) + (Vector3.up * v);
            // 이동방향을 의미하는 변수
            playerTransform.Translate(moveDir * Time.deltaTime * speed);
            // player의 위치를 옮기는 메서드

            // player의 이미지 좌우반전 관련
            if (h > 0)
            // 캐릭터가 오른쪽(h의 값이 양수)으로 이동할 때
            {
                this.gameObject.transform.localScale = new Vector2(5.0f, 5.0f);
                this.playerAnim.SetBool("isMove", true);
                this.playerAnim.SetBool("isIdle", false);
            }
            else if (h < 0)
            // 캐릭터가 왼쪽(h의 값이 음수)으로 이동할 때
            {
                this.gameObject.transform.localScale = new Vector2(-5.0f, 5.0f);
                this.playerAnim.SetBool("isMove", true); 
                this.playerAnim.SetBool("isIdle", false);
            }
            else
            // 캐릭터의 움직임이 0일 때(=가만히 있는 상태)를 의미
            {
                this.playerAnim.SetBool("isMove", false);
                this.playerAnim.SetBool("isIdle", true);
            }
        }
        else
        {
            playerTransform.position = Vector3.Lerp(playerTransform.position, currPos, Time.deltaTime * 10.0f);
        }
    }

 

 

Vecter3.Lerp(위치 1, 위치 2, 0) => 위치1 반환

Vecter3.Lerp(위치 1, 위치 2, 1) => 위치2 반환한다.

 

Update()내에서 선형보간(Lerp)를 사용할 수 있다.

단, MonoBehavior를 상속받아야 사용할 수 있다.