Unity에서 오브젝트의 위치나 방향을 부드럽게 이동시키는 방법은 여러 가지가 있습니다. 그 중에서도 Lerp, SmoothDamp, MoveTowards 메서드는 가장 많이 사용되는 방법입니다.
이 세 가지 메서드는 모두 오브젝트의 현재 위치 또는 방향에서 목표 위치 또는 방향으로 부드럽게 이동시킵니다. 하지만 각각의 메서드에는 고유한 특징과 사용 방법이 있습니다.
Lerp
Lerp 메서드는 "선형 보간"을 의미하며, 두 개의 벡터 사이에서 선형적으로 보간된 값을 반환합니다. 시작 벡터와 목표 벡터, 그리고 보간 비율을 인자로 받습니다. 이 메서드는 주어진 비율에 따라 시작 벡터와 목표 벡터 사이에서 보간된 값을 반환합니다.
Vector3 newPosition = Vector3.Lerp(currentPosition, targetPosition, t);
이 코드는 현재 위치 currentPosition에서 목표 위치 targetPosition까지 t만큼 이동한 위치를 newPosition에 저장합니다. t는 0에서 1 사이의 값으로, 0은 현재 위치, 1은 목표 위치를 나타냅니다.
Lerp 메서드의 장점은 간단하고 이해하기 쉽다는 것입니다. 하지만 부드러운 이동을 위해서는 t 값을 조정해야 합니다. 또한, t 값이 0과 1 사이의 값이 아니면 원하는 결과를 얻지 못할 수 있습니다.
SmoothDamp
SmoothDamp 메서드는 "부드러운 감속"을 의미하며 Lerp 메서드와 비슷하지만, 보다 부드러운 이동을 하며 현재 위치를 목표 위치로 점진적으로 이동시키는 데 사용됩니다. 현재 위치, 목표 위치, 현재 속도 및 감속 시간을 인자로 받습니다.
SmoothDamp는 부드럽고 자연스러운 이동을 구현할 때 유용하며 현재 속도를 사용하여 이동 속도를 조절합니다.
Vector3 newPosition = Vector3.SmoothDamp(currentPosition, targetPosition, ref velocity, smoothTime);
이 코드는 현재 위치 currentPosition에서 목표 위치 targetPosition까지 smoothTime 동안 부드럽게 이동합니다. velocity는 현재 이동 속도를 나타내는 값으로, 이 값을 사용하여 이동의 부드러움을 조정할 수 있습니다.
SmoothDamp 메서드의 장점은 보다 부드러운 이동을 할 수 있다는 것입니다. 또한, velocity 값을 사용하여 이동의 부드러움을 조정할 수 있습니다. 하지만 Lerp 메서드에 비해 복잡하고 이해하기 어려울 수 있습니다.
MoveTowards
MoveTowards 메서드는 "지정된 속도로 이동"을 의미하며, 현재 위치에서 목표 위치로 일정한 속도로 이동시키는 데 사용됩니다. 현재 위치, 목표 위치 및 이동 속도를 인자로 받습니다.
주로 물체의 이동이나 직선적인 이동을 구현할 때 사용되며, 일정한 속도로 목표 위치에 도달합니다.
Vector3 newPosition = currentPosition + (targetPosition - currentPosition) * deltaTime;
이 코드는 현재 위치 currentPosition에서 목표 위치 targetPosition까지 deltaTime 동안 일정한 속도로 이동합니다. deltaTime은 프레임마다 경과하는 시간입니다.
MoveTowards 메서드의 장점은 간단하고 이해하기 쉽다는 것입니다. 또한, 일정한 속도로 이동하기 때문에 부드러운 이동을 할 수 있습니다. 하지만 Lerp 메서드나 SmoothDamp 메서드에 비해 이동 속도를 조정하기 어렵습니다.
구현
using UnityEngine;
public enum MoveType
{
Lerp, SmoothDamp, MoveTowards
}
public class MoveDiff : MonoBehaviour
{
[SerializeField] GameObject target;
[SerializeField] float speed;
[SerializeField] MoveType type;
Vector3 originPosition, velocity = Vector3.zero;
void Start()
{
originPosition = transform.position;
}
void Update()
{
switch (type)
{
case MoveType.Lerp:
transform.position = Vector3.Lerp(transform.position, target.transform.position, speed * Time.deltaTime);
break;
case MoveType.SmoothDamp:
transform.position = Vector3.SmoothDamp(transform.position, target.transform.position, ref velocity, speed * Time.deltaTime, 1);
break;
case MoveType.MoveTowards:
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, speed * Time.deltaTime);
break;
}
if (Vector3.Distance(transform.position, target.transform.position) < 0.1f) transform.position = originPosition;
}
}
구현코드를 실행한 모습으로 아래서부터 Lerp, SmoothDamp, MoveTowards입니다.
이동속도는 모두 Time.deltaTime이며 SmoothDamp의 최고 속도는 1로 설정했습니다.
속도를 10.f * Time.deltaTime로 설정하고 SmoothDamp의 최고 속도 제한을 없엔 모습
결론
요약하자면, Lerp는 보간 비율에 따라 직선적으로 이동하는 메서드입니다. SmoothDamp는 점진적인 감속을 사용하여 부드럽고 자연스러운 이동을 구현하는 메서드입니다. MoveTowards는 일정한 속도로 직선적으로 이동하는 메서드입니다. 상황에 맞는 메서드를 선택하여 물체의 위치 이동을 구현할 수 있습니다.
'Unity' 카테고리의 다른 글
Unity의 PointEventData 클래스 (0) | 2023.11.27 |
---|---|
간단하게 오브젝트 간의 각도 구하는 방법 (0) | 2023.11.24 |
헷갈리는 오브젝트 회전 방법 Part 2 (Lerp, Slerp, RotateTowards) (0) | 2023.11.22 |
시야 범위에 타켓 오브젝트가 들어와 있는지 확인하는 방법 (0) | 2023.11.21 |
C# 프로젝트 파일이 열리지 않을 때 (VSCode) (0) | 2023.11.21 |