@@@ UNITY/이론

[UNITY] 다양한 이동 방법 (1)

HTG 2023. 1. 20. 14:40
728x90

이동 방법에는 여러 가지 방법이 있는 거 같았다.

현재 쓰고 있는 방식은 

transform.position += moveDir * Time.deltaTime * Speed;

의 강제로 위치를 이동시켜주는 방식으로 하였다.

 

이렇게 할 경우 문제점은 벽이나 물체를 뚫고 지나갈 수 있다는 것이다.

하지만 보통 이동을 검색하면 왜 이걸알려주는거지?

 

 

1. Transform.position

  • 가장 기본이 되는 방식으로 오브젝트의 위치를 직접 변경해주는 방식.
  • 절대좌표는 월드좌표를 따른다.
  • 사실 이동이라기보다는 위치를 강제로 변경해주는거에 가까운 방식
    Transform의 구성요소인 position을 강제로 변경해서 이동시킨다.
  • Vector3로 변경을 해주거나 가감해주는 방식
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3 (3.0f, 4.0f, 5.0f);
    void Update()
    {
        // 원하는 위치를 직접 대입하거나
        Transform.position = new Vector3(1.0f, 2.0f, 3.0f);

        // 현재위치를 기준으로 이동을 원하는 만큼 추가해주거나
        Transform.position += destination;
    }

}

 


2. Transform.localPosition

  • 1번 방식과 대부분 유사한 방식
  • 게임오브젝트의 상대좌표를 나타낸다.
    게임오브젝트의 부모가 있을 경우 부모로부터 떨어진 좌표를 나타낸다.
    부모가 없을 경우에는 
    Transform.position과 동일함.
  • 절대좌표는 부모의 (rotation이 기울어져 있다면 기울어진) 좌표를 따른다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3 (3.0f, 4.0f, 5.0f);
    void Update()
    {
        // 원하는 위치를 직접 대입하거나
        Transform.localPosition = new Vector3(1.0f, 2.0f, 3.0f);

        // 현재위치를 기준으로 이동을 원하는 만큼 추가해주거나
        Transform.localPosition += destination;
    }

}

 


3. Transform.Translate (이동 방향, 좌표기준)

  • 게임오브젝트를 이동시키기 위한 함수
  • 현재 게임오브젝트의 위치를 기준으로 상대적인 Vector3의 방향으로 이동한다. 이동할 Vector3를 인자로 넘겨주면 된다. 절대좌표 기준으로 움직일 경우에는 Space.World 옵션을 사용하면 된다.
  • 방식은 position += Vector3 방식과 같다.
  • 절대좌표는 스스로의 좌표를 따른다.
  • 방향을 인자값으로 받고 그 방향으로 이동 - 1인칭 캐릭터의 이동이나 총알 발사에 유리 할 것으로 보임
public class Translate : MonoBehaviour 
{
    void Update () 
    {
        // 게임 오브젝트 기준으로 이동
        transform.Translate(Vector3.right * Time.deltaTime);

        // 절대 좌표 기준으로 이동
        transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
    }    
}

 


4. MoveTowards (현재 위치, 목표 위치, 속력)

  • 현재 위치에서 목표 위치로 일정한 속도로 이동하는 함수
  • (현재 위치, 목표 위치, 속도)를 인자로 넘겨주고 Transform.position에 대입
  • transform.postion() 은 오브젝트의 위치를 결정하는 함수입니다.
  • Vector3.MoveTowards(현재 위치, 목표 위치, 속력) 은 해당 값들을 매개변수로 사용합니다.
  • 자신의 현재위치에서 목표점을 향하여 이동 - 3인칭 탑 뷰 캐릭터의 마우스 클릭 이동이나 유도탄
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3 (3, 4, 5);
    void Update()
    {
        transform.position =
            Vector3.MoveTowards(transform.position, destination, 1);
    }

}

 


5. SmoothDamp (현재 위치, 목표 위치, 참조 속력, 소요 시간)

  • SmoothDamp (현재위치, 목표위치, 참조 속력, 소요 시간) 은 해당 값들을 매개변수로 사용합니다.
  • 목표위치에 부드럽게 도착합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3 (3, 3, 3);

    void Update()
    {
        /*
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
        */

        Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
        transform.position = Vector3.SmoothDamp(transform.position, destination, ref speed, 0.1f);
    }

}

 


6. Lerp (현재 위치, 목표 위치, 보간 간격)

  • Lerp (현재 위치, 목표 위치, 보간 후 위치) 는 선형보간을 이용한 이동 함수
  • t 가 작을수록, 간격이 작아지므로 속도가 느려짐 - 부드러운 움직임을 보여줄 수 있음

선형보간은 영어로 Linear interpolation 이라고 하는 수치해석의 한 방법인데,

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3(3, 3, 3);

    void Update()
    {
        /*
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
        */

        Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
        transform.position = Vector3.Lerp(transform.position, destination, 0.001f);
    }

}

 


7. Slerp (현재 위치, 목표 위치, 보간 간격)

  • Slerp (현재 위치, 목표 위치, 보간 간격) 은 구면 보간을 이용
    움직임도 호을 따라감.
  • 매개변수에 대한 개념은 선형보간과 같음
    다만, 선형이 아니라 구의 겉면을 따라 간다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    Vector3 destination = new Vector3(-5, -3, 0);

    void Update()
    {
        /*
        transform.position =
            Vector3.MoveTowards(start , destination, 1);
        */

        /*
        Vector3 speed = Vector3.zero; // (0,0,0) 은 .zero 로도 표현가능
        transform.position = Vector3.Lerp(transform.position, destination, 0.001f);
        */

        transform.position = Vector3.Slerp(transform.position, destination, 0.01f);
    }

}

'@@@ UNITY > 이론' 카테고리의 다른 글

[UNITY] 다양한 이동 방법 (2) - Rigidbody 활용한 이동  (0) 2023.01.20
[UNITY] OnCollision & OnTrigger  (0) 2023.01.20
[UNITY] 오브젝트 상호작용  (0) 2023.01.19
[UNITY] 벽 뚫기 방지  (0) 2023.01.19
[UNITY] 문 열고 닫기  (0) 2023.01.17