[Unity] 오브젝트의 위치와 이동 (transform.position / transform.Translate / normalized)

2023. 8. 14. 16:53Unity

728x90
반응형

오브젝트의 위치 읽어오기

public class Test : MonoBehaviour
{
    void Start()
    {
        Vector3 pos;
        pos = transform.position;
        print(pos);
    }
}

해당 오브젝트의 현재 위치를 읽어오려면 위의 코드를 사용하면 되며, x, y, z 특정 위치를 알고자 한다면 pos = transform.position.x의 형식으로 지정해 주면 된다.

 

 


 

 

오브젝트 위치 입력하기

transform은 프로퍼티 get, set을 쓰기 때문에 transform.position.x = 10; 은 오류가 발생한다. Vector3 값을 transform.position에 대입하면 된다. 아래와 같은 예시로 살펴볼 수 있다.

public class Test : MonoBehaviour
{
    public struct MyTransform
    {
        private Vector3 _position;
        public Vector3 position
        {
            get { return _position; }
            set { _position = value; }
        }
        public MyTransform(int x, int y, int z)
        {
            _position.x = x; _position.y = y; _position.z = z;
        }
    void Start()
    {
        Vector3 vec = new Vector3(1,2,3);
        MyTransform myTransform = new MyTransform();
        myTransform.position = vec;
        print(myTransform.position);
    }
}

프로퍼티를 이용하여 position 변수에만 접근 가능하도록 하였고 MyTransform 생성자를 만들었다. 구조체 초기화를 하였고 vec 변수에 Vector3 값을 넣어 초기화 하여 구조체에 대입한다.

void Start()
{
    Vector3 vec = new Vector3(10,0,0);
    transfrom.position = vec;
    print(transform.position);
}

 

 


 

 

오브젝트 이동하기 (한 방향)

public class Test : MonoBehaviour
{
    void Start()
    {
        transform.position = new Vector3();
    }
    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += new Vector3(0, 0, 0.1f);
        }
    }
}

이동 화살표 위쪽을 누르고 있으면 0.1f 씩 계속 전진한다.

 

 


 

 

오브젝트의 속도와 거리

void Update()
{
    float dist = Time.deltaTime *2;
    Vector3 pos = transform.position;
    pos.x = pos.x + dist;
    transform.position = pos;
}

시간(Time.deltaTime) * 속도(2) 결과로 거리 값이 나온다. 현재 위치의 x 값에 해당 거리를 더하면서 속도의 값에 따라 거리가 결정된다.

void Update()
{
    Vector3 v = new Vector3(1,0,0) * Time.deltaTaime * 2
    transform.position += v;
}

방향을 가지는 단위 벡터 Vector3(1,0,0)를 사용해서 표현할 수도 있다.

 

 

Vector3.right //(1,0,0)
Vector3.left //(-1,0,0)
Vector3.up //(0,1,0)
Vector3.down //(0,-1,0)
Vector3.forward //(0,0,1)
Vector3.one //(1,1,1)
Vector3.zero //(0,0,0)

기본 벡터는 유니티에서 지원하고 있다.

void Update()
{
    transform.position += Vector3.right * Time.deltaTime * 2;
}

 

 


 

 

transform.Translate

void Update()
{
    transform.Translate(Vector3.right * Time.deltaTime * 2);
}

한 프레임 당 이동한 거리 값을 Translate에 입력한다. 위의 예시들과 동일하게 작동한다.

 

 


 

 

오브젝트의 이동 (4방향)

void Update()
{
    if (Input.GetKey(KeyCode.UpArrow))
    {
        transform.Translate(Vector3.forward * Time.deltaTime * speed);
    }
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.Translate(Vector3.left * Time.deltaTime * speed);
    }
    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.Translate(Vector3.right * Time.deltaTime * speed);
    }
    if (Input.GetKey(KeyCode.DownArrow))
    {
        transform.Translate(Vector3.back * Time.deltaTime * speed);
    }
}

종합하면 위와 같이 네 방향으로 이동하는 오브젝트 스크립트를 만들 수 있다. 하지만 대각선으로 움직일 때 두 개의 if문이 실행되면서 한 방향으로 움직일 때보다 빠르게 오브젝트가 이동하는 것을 볼 수 있다. 여기서 단위벡터가 필요하다.

45도 대각선으로 갈 때 좌표 평면 기준으로 (1, 1) 만큼이 아닌  (0.707, 0.707) 만큼만 가야한다.

 

 


 

 

오브젝트의 이동 (4방향) + normalized

public class Test : MonoBehaviour
{
    public float speed = 2;
    void Start()
    {
        transform.position = new Vector3();
    }
    void Update()
    {
        Vector3 dir = Vector3.zero;
        if (Input.GetKey(KeyCode.UpArrow))
        {
            dir += Vector3.forward;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            dir += Vector3.left;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            dir += Vector3.right;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            dir += Vector3.back;
        }
        transform.Translate(dir.normalized * speed * Time.deltaTime);
    }
}

벡터를 단위 벡터화 하는 normalized를 이용하여 대각선 움직임에도 같은 속도를 유지하도록 설정하였다.

728x90
반응형