본문 바로가기
게임개발/유니티 엔진

에니메이션 Lerp

by do_ng 2024. 2. 22.

 

선형 보간법 의미

 

두 끝점 a ~ b 사이에 위치한 c를 계산하는 방법

 

출처:https://thepathfinder.co.kr/entry/Unity-%EC%84%A0%ED%98%95%EB%B3%B4%EA%B0%84-Lerp-%ED%95%A8%EC%88%98%EC%99%80-%EC%9C%A0%EB%8B%88%ED%8B%B0%EC%97%90%EC%84%9C%EC%9D%98-%EC%84%A0%ED%98%95%EB%B3%B4%EA%B0%84-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80Alpha-Blending-iTween

 

a와 b사이에 t가 위치한 값을 반환하는데 t는 percent의 개념(0~1)이기 때문에 t가 0이면 0(a)~1(b) 사이에서 t가 0인 지점을 계산하는데 t와 a와 동일하므로 a를 반환하고 t가 1이면 b를 반환한다.

즉, t가 a쪽에 가까워질수록 0쪽으로 가까워지는 값(0.4, 0.3 ... 0.001)을 반환하고 b쪽에 가까워질수록 1에 가까워지는 값(0.6, 0.7, 0.9999)을 반환한다.

 

사용 예시

 

멈춰있는 애니메이션과 움직이는 애니메이션을 blending 해서 움직이다가 멈추는 경우 또는 멈추다가 움직이는 동작을 자연스럽게 만들어 줌

bool moveToDest = false;
float wait_run_ratio = 0.0f;

private void Update()
    if (moveToDest)
    {
        wait_run_ratio = Mathf.Lerp(wait_run_ratio, 1, 10.0f * Time.deltaTime);
        Animator anim = GetComponent<Animator>();
        anim.SetFloat("wait_run_ratio", wait_run_ratio);
        anim.Play("Wait_Run");
    }
    else
    {
        wait_run_ratio = Mathf.Lerp(wait_run_ratio, 0, 10.0f * Time.deltaTime);
        Animator anim = GetComponent<Animator>();
        anim.SetFloat("wait_run_ratio", wait_run_ratio);
        anim.Play("Wait_Run");
    }
}

 

캐릭터가 멈춰있는 상태에서 이동하는 상태로 바뀌는 경우 0에서 1쪽으로 t의 위치를 이동시킨다.

t는 플레이어의 스피드 * Tiem.deltaTime(한 프레임을 진행하는데 걸린 시간) 만큼 이동시키는데 t의 값은 1을 넘어가지만 0과1의 사이의 비율로 조정해서 맞춰준다. 

 

Time.deltaTime을 사용하지 않고 Update() 함수에만 의존해서 계산할 경우 PC나 인터넷 환경에 의해서 FPS가 달라짐

온라인 환경에서 카트라이더 게임을 한다고 했을 때 10FPS 나오는 컴퓨터는 1초에 10m 이동하고 60FPS 나오는 컴퓨터는 1초에 60m 이동하게 되므로 동일한 결과가 나오지 않는 문제가 발생한다.

출처:https://www.youtube.com/watch?v=QGFaA3WYAwk

 

'게임개발 > 유니티 엔진' 카테고리의 다른 글

UI 앵커 사용법  (0) 2024.02.27
애니메이션 State 패턴 적용  (0) 2024.02.26
Raycast  (0) 2024.02.19
싱글톤 패턴 적용  (0) 2024.02.02
[스파르타 국비] 유니티로 만드는 게임개발 2주차  (0) 2024.01.23