유니티

유니티 목표지점으로 이동하기 - (Vector3) MoveTowards / SmoothDamp / Lerp / Slerp

nock_ji 2022. 4. 9. 23:21

 

 

[ 목표 지점으로 이동하기 ] & [ 이동 함수 ]

 

 

 

 

Vector3 클래스에서 제공하는 이동 함수

MoveTowards / SmoothDamp / Lerp / Slerp 

 

 

 

 

 

 

 

> position 과 Translate 비교 ! 

 

- transform.position

Wolrd 좌표 값 , 월드 좌표를 기준으로 물체를 이동

Vector에 해당하는 좌표로 이동 

 

- transform.Translate

Local 좌표 값 , 물체를 기준으로 물체를 이동

Vector값을 현재 위치에 더하는 함수 = 해당 오브젝트를 Vector3에 넣은 좌표값 만큼 이동

 

 

 


 

1.  MoveTowards  ( 단순 등속 이동 ) 

 

 

 

  • 기본 형식
Vector3.MoveTowards(현재위치, 목표위치, 속도);

 

MoveTowards의 매개변수는 (현재위치, 목표위치, 속도)로 구성됩니다 

 

 

 

 

  • 예제
public class Move : MonoBehaviour
{
	Vector3 target = new Vector3(8, 1.5f, 0);
    
    void Update()
    {
    	transform.position = Vector3.MoveTowards(transform.postion, target, 2f);
    }
}

 

오브젝트가 (8, 1.5f, 0) 좌표로 2f 속도로 단순 등속 이동하는 로직입니다 

.

.

.

.

결과

 

 


 

 

2.  SmoothDamp  (부드러운 감속 이동 / 미끄러지듯이 감속 이동)

 

 

 

  • 기본 형식
Vector3.SmoothDamp(현재위치, 목표위치, 참조속도, 속도);

 

SmoothDamp 매개변수는 (현재위치, 목표위치, 참조속도, 속도)로 구성됩니다

 

마지막 매개변수에 반비례하여 속도가 증가하며, 일자로 가다가 부드럽게 도달합니다 

 

 

 

 

 

  • 예제
Vector3 target = new Vector3(8, 1.5f, 0);

void Update()
{
	Vector3 velo = Vector3.zero;
    	transform.position = Vector3.SmoothDamp(transform.position, target, ref velo, 0.1f);
}

 

Vector3.zero는 좌표값이 (0, 0, 0)임을 의미합니다 

 

매개변수 참조속도에 위치한 ref 는 '참조 접근'으로, 실시간으로 바뀌는 값을 적용할 수 있습니다 (아직 어려운 이론) 

*속도 값이 작을 수록 빠르게 이동합니다 

.

.

.

.

.

 

오브젝트가 (8, 1.5f, 0)으로 0.1f 속도로 이동하는 로직입니다 

 

 

 


 

 

3.   Lerp  (선형 보간)

 

 

SmoothDamp 보다 감속시간이 깁니다

 

 

 

  • 기본 형식
Vector3.Lerp(현재위치, 목표위치, 속도);

 

 

 

 

 

  • 예제
void Update()
{
	transform.position = Vector3.Lerp(transform.position, target, 0.05f);
}

 

속도에 해당하는 마지막 매개변수에 비례하여 속도가 증가합니다 (최대값 1) 

 

* 마지막 매개변수가 작을 수록 느리게 이동합니다

.

.

.

.

.

 

 


 

 

4.  Slerp  (구면 선형 보간)

 

 

Lerp과 다른 점은 '호를 그리며 이동'한다는 것입니다 

 

 

 

 

 

  • 기본형식
Vecotr3.Slerp(현재위치, 목표위치, 속도);

 

 

 

 

 

  • 예제
void Update()
{
	transform.position = Vector3.Slerp(transform.position, target, 0.05f);
}

 

호선을 그리며 이동합니다 

.

.

.

.

.

 

 


 

 

[ 델타 타임 ]

 

 

이동거리를 공평하게 하기 위한 함수

 

기기의 성능에 따라 프레임 속도가 다를수 있는데, 이를 완화하여 똑같은 속도를 내는 함수입니다 

*끊김 방지 !! 

 

 

 

 

 

Time.deltaTime  :  이전 프레임의 완료까지 걸린 시간

 

deltaTime : 값은 프레임이 적으면 크고, 프레임이 많으면 작음 

 

 

 

 

[ Time.deltaTime 사용하는 방법 ]

 

Translate  : Vector 에 곱하기

transform.Translate(vec * Time.deltaTime);

 

 

Vector 함수  : 시간 매개변수 곱하기

Vector3.Lerp(Vec1, Vec2, T * Time.deltaTime);

 

 

예제

void Update()
    {
        Vector3 vec = new Vector3(Input.GetAxisRaw("Horizontal") * Time.deltaTime,
        Input.GetAxisRaw("Vertical")*Time.deltaTime, 0);

        transform.Translate(vec);
    }