[UNITY] 이동시키기

spixychz·2025년 7월 14일

Unity

목록 보기
9/14

오늘의 질문

Unity에서 GameObject를 코드로 이동시키는 다양한 방법들과 각각의 특징에 대해 설명하세요.

오늘의 대답

Unity에서 GameObject를 이동시키는 방법은 크게 Transform 조작과 Physics 기반으로 나뉩니다.
Transform 방식은 transform.position, transform.Translate 등으로 직접적인 위치 변경이 가능하며 즉시 반영되지만 물리 법칙을 무시합니다.
Physics 방식은 Rigidbody.velocity, AddForce 등으로 물리 엔진을 통한 자연스러운 이동이 가능하지만 충돌과 중력 등의 영향을 받습니다.
Physics 기반은 연산 비용이 높지만, Transform 기반은 가벼운 반면 충돌 처리가 부족하기 때문에 용도에 맞는 적절한 선택이 중요합니다.


Transform 기반 이동

물리 법칙을 무시하고 직접적으로 위치를 변경

1. transform.position (절대 위치 설정)

    void Update()
    {
        // 절대 좌표 이동
        transform.position += Vector3.forward * speed * Time.deltaTime;
    }
  • 즉시 위치 변경
  • 물리 엔진 무시
  • 충돌 감지 없음
  • 가장 직관적이고 간단

2. transform.Translate (상대 위치 이동)

    void Update()
    {
        // 로컬 좌표계 기준 이동 (기본값)
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
        
        // 월드 좌표계 기준 이동
        transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World);
    }
  • 현재 위치 기준 상대 이동
  • 로컬/월드 좌표계 선택 가능
  • 객체의 회전 상태 반영 (로컬 기준 시)

3. Vector3.MoveTowards (목표점까지 일정 속도)

    void Update()
    {
        // 목표점을 향해 일정한 속도로 이동
        transform.position = Vector3.MoveTowards
        (
            transform.position, 
            target.position, 
            speed * Time.deltaTime
        );
    }
  • 일정한 속도 보장
  • 목표점에서 자동 정지
  • 직선 경로 이동

4. Vector3.Lerp (부드러운 보간 이동)

    void Update()
    {
        // 부드럽게 목표점으로 이동 (점점 느려짐)
        transform.position = Vector3.Lerp
        (
            transform.position, 
            target.position, 
            lerpSpeed * Time.deltaTime
        );
    }
  • 부드러운 감속 이동
  • 목표점에 가까워질수록 느려짐
  • 애니메이션 효과에 적합

Physics 기반 이동

물리 엔진을 활용한 현실적인 이동

1. Rigidbody.velocity (속도 직접 설정)

    void Update()
    {
        // 입력에 따른 이동
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        
        Vector3 movement = new Vector3(horizontal, 0, vertical) * speed;
        rb.velocity = new Vector3(movement.x, rb.velocity.y, movement.z); // Y축 속도 유지
    }
  • 중력과 충돌 영향 받음
  • 관성 무시 (갑작스런 방향 전환 가능)

2. Rigidbody.AddForce (힘 적용)

    void Update()
    {
        // 순간적인 힘 적용
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * forceAmount * 10, ForceMode.Impulse);
        }
    }
  • 자연스러운 가속/감속
  • 질량과 중력 영향
  • 현실적인 물리 시뮬레이션
  • ForceMode 종류
    • ForceMode.Force: 질량 고려, 지속적인 힘 (기본 값)
    • ForceMode.Acceleration: 질량 무시, 지속적 가속도
    • ForceMode.Impulse: 질량 고려, 순간적 충격
    • ForceMode.VelocityChange: 질량 무시, 즉시 속도 변경

3. Rigidbody.MovePosition (물리 기반 위치 이동)

    void FixedUpdate()
    {
        // 물리 업데이트에서 사용
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        
        Vector3 movement = new Vector3(horizontal, 0, vertical);
        Vector3 newPosition = rb.position + movement * speed * Time.fixedDeltaTime;
        
        rb.MovePosition(newPosition);
    }
  • Transform과 Physics의 중간 형태
  • 충돌 감지 유지
  • 부드러운 이동
  • FixedUpdate에서 사용 권장

4. Rigidbody.AddTorque (회전력 적용)

    void Update()
    {
        // 회전 입력
        float rotation = Input.GetAxis("Horizontal");
        rb.AddTorque(Vector3.up * rotation * torqueAmount);
        
        // 앞으로 이동 (현재 바라보는 방향)
        if (Input.GetKey(KeyCode.W))
        {
            rb.AddForce(transform.forward * 10f);
        }
    }
  • 회전을 통한 방향 전환
  • 차량 움직임 구현에 적합
  • 관성 기반 회전

비교

방법물리 영향충돌 감지성능사용 용도
transform.positionXX최고UI, 단순 이동
transform.TranslateXX최고상대적 이동
Vector3.MoveTowardsXX높음일정 속도 이동
Vector3.LerpXX높음부드러운 이동
Rigidbody.velocityOO보통즉시 속도 변경
Rigidbody.AddForceOO보통현실적 물리
Rigidbody.MovePosition부분적O보통물리 기반 이동
CharacterController부분적O보통캐릭터 이동
NavMeshAgentX회피낮음AI, 경로 찾기
profile
UNITY로 게임 개발하는 사람

0개의 댓글