유니티 이동(Movement)
유니티에서 게임 오브젝트를 이동시키는 방법은 다양합니다. MoveTowards, SmoothDamp, Lerp, Slerp 등 다양한 함수들이 제공되며, 각각의 함수는 특정한 용도와 특성을 가지고 있습니다.
이동 방향으로 가까워지기(MoveTowards)
MoveTowards 함수는 현재 위치에서 목표 위치로 일정 속도로 직선 이동할 때 사용합니다.
// MoveTowards 함수 정의 public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);
// 예제: MoveTowards 사용 void Update() { Vector3 targetPosition = new Vector3(10, 0, 5); transform.position = Vector3.MoveTowards(transform.position, targetPosition, 0.1f); }
부드러운 감속 이동(SmoothDamp)
SmoothDamp 함수는 현재 위치에서 목표 위치로 부드럽게 감속하며 이동할 때 사용합니다. 가속도와 감속을 자동으로 조절하여 자연스러운 이동을 구현합니다.
// SmoothDamp 함수 정의 public static Vector3 SmoothDamp(Vector3 current, Vector3 target, ref Vector3 currentVelocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime);
// 예제: SmoothDamp 사용 private Vector3 velocity = Vector3.zero; void Update() { Vector3 targetPosition = new Vector3(10, 0, 5); transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 0.3f); }
선형 보간(Lerp)
Lerp 함수는 두 점 사이를 일정한 비율로 이동할 때 사용합니다. t 값이 0이면 시작점, 1이면 끝점이며, 그 사이의 값을 입력하면 그 비율에 해당하는 위치로 이동합니다.
// Lerp 함수 정의 public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
// 예제: Lerp 사용 void Update() { Vector3 startPosition = new Vector3(0, 0, 0); Vector3 endPosition = new Vector3(10, 0, 5); float t = Mathf.PingPong(Time.time, 1); // 0과 1 사이를 반복 transform.position = Vector3.Lerp(startPosition, endPosition, t); }
구면 선형 보간(Slerp)
Slerp 함수는 두 벡터 사이를 일정한 비율로 구면상에서 이동할 때 사용합니다. 주로 회전과 관련된 이동에서 사용됩니다.
// Slerp 함수 정의 public static Vector3 Slerp(Vector3 a, Vector3 b, float t);
// 예제: Slerp 사용 void Update() { Vector3 startDirection = Vector3.forward; Vector3 endDirection = new Vector3(1, 1, 0); float t = Mathf.PingPong(Time.time, 1); // 0과 1 사이를 반복 transform.position = Vector3.Slerp(startDirection, endDirection, t); }
일정 속도로 이동(Simple Move)
SimpleMove 함수는 CharacterController 컴포넌트를 사용하는 경우, 중력을 포함하여 일정한 속도로 이동시킵니다.
// SimpleMove 함수 정의 public void SimpleMove(Vector3 speed);
// 예제: SimpleMove 사용 CharacterController controller; void Start() { controller = GetComponent<CharacterController>(); } void Update() { Vector3 speed = new Vector3(0, 0, 5); controller.SimpleMove(speed); }
물리 기반 이동(Rigidbody 이동)
Rigidbody를 사용하여 물리 기반 이동을 구현할 수 있습니다. Rigidbody의 velocity를 설정하여 이동합니다.
// 예제: Rigidbody 이동 Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { Vector3 moveDirection = new Vector3(1, 0, 0); rb.velocity = moveDirection * 5; }
시간 기반 이동(Time.deltaTime 사용)
시간 기반 이동은 프레임 속도와 상관없이 일정한 속도로 이동하게 합니다. 주로 Update 함수 내에서 Time.deltaTime을 곱하여 구현합니다.
// 예제: 시간 기반 이동 void Update() { float speed = 5f; Vector3 moveDirection = new Vector3(1, 0, 0); transform.Translate(moveDirection * speed * Time.deltaTime); }
다양한 예제(Diverse Examples)
- 목표를 따라가며 이동하기
void Update() { Vector3 targetPosition = new Vector3(10, 0, 5); transform.position = Vector3.MoveTowards(transform.position, targetPosition, 0.1f); }
- 물리 기반 부드러운 감속 이동
private Vector3 velocity = Vector3.zero; void Update() { Vector3 targetPosition = new Vector3(10, 0, 5); transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 0.3f); }
- 반복적인 선형 보간 이동
void Update() { Vector3 startPosition = new Vector3(0, 0, 0); Vector3 endPosition = new Vector3(10, 0, 5); float t = Mathf.PingPong(Time.time, 1); transform.position = Vector3.Lerp(startPosition, endPosition, t); }
- 캐릭터가 목표를 향해 회전하며 이동하기
void Update() { Vector3 targetPosition = new Vector3(10, 0, 5); Vector3 direction = targetPosition - transform.position; Quaternion rotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime); transform.position = Vector3.MoveTowards(transform.position, targetPosition, 0.1f); }
유니티에서는 다양한 이동 함수를 활용하여 게임 오브젝트의 이동을 제어할 수 있습니다. 각 함수의 특성을 잘 이해하고 상황에 맞게 사용하면 보다 자연스럽고 효과적인 이동을 구현할 수 있습니다.