-
Unity SmoothDampUnity 2024. 1. 16. 16:24
SmoothDamp는 유니티에서 대상 값을 부드럽게 변화시키는 데 사용되는 함수 중 하나이다
주로 카메라나 캐릭터의 움직임을 부드럽게 조절하는 데 자주 사용한다.
Vector3.SmoothDamp(현재위치 , 타겟위치, ref 가속도, 걸리는상대적인 시간);
의 구조로 되어있는데
public class SmoothDampExample : MonoBehaviour { public Vector3 targetPosition; // 타겟위치를 지정후 사용 private Vector3 velocity = Vector3.zero; public float smoothTime = 0.3f; void Update() { transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime); } }
이런 방식으로 사용할 수 있다.
이 중 3번째 매개변수인 ref velocity의 경우 다른 매개변수들과 달리 참조형으로 되어있는데 그 이유는 이 변수가 하는 역할에 있다.
이 변수는 부드러운 이동을 위해서 현재 위치에서 목표 위치로 가는 데 필요한 속도를 추적하는 용도로 쓰인다. SmoothDamp 함수는 내부에서 현재 속도를 계산하고 currentVelocity에 저장하여 다음 호출때 참고하여 사용한다.
이렇게 함으로써 함수가 호출될 때마다 처음부터 다시 시작하는 것이 아니라 이전 호출에서의 속도 정보를 참고하여 이번 호출에서 적용해야할 속도를 계산할 수 있게된다.
velocity.x값을 보기 편하게 정수형태로 올림한 값이다. 속도가 점점 빨라졌다가 목표에 근접해지자 급격하게 느려진다 velocity는 Update()내부가 아니라 class의 프로퍼티로써 선언되었고, Smoothdamp()함수에서 ref를 이용해 값을 복사해오는게 아닌 참조주소를 불러와 함수내부에서 이 프로퍼티를 직접 수정하거나 참고하며 사용한다
.
인터넷에 있는 예제들을 보다보면 이 velocity변수가 Update()안에서 선언되어있는 경우가 있는데 이는 잘못된 예제이다.
velocity가 Update()가 호출될때마다 매번 초기화(새로 선언)되어버린다면 Smoothdamp는 참고할 속도값을 가진 변수가 없는 셈이니 정상적으로 동작하지않고 뚝뚝끊기며 매우 느리게 동작할것이다.
잘못된 예제가 은근 많이 떠돌고있는것같아 복습할겸 작성했다.