Unity Movement


유니티 이동(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);
  }

유니티에서는 다양한 이동 함수를 활용하여 게임 오브젝트의 이동을 제어할 수 있습니다. 각 함수의 특성을 잘 이해하고 상황에 맞게 사용하면 보다 자연스럽고 효과적인 이동을 구현할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *