Unity3D/유니티 공부

[Unity / C#] 유니티 오브젝트 이동(1) - Transform.Translate

상연 2022. 5. 4. 03:04

목차

    [유니티 오브젝트 이동 시리즈 모음]

     

    유니티 오브젝트 이동


    사람이 현실에서 이동할 수 있는 방법은 다양하다.

    직접 걸어서 움직인다던지, 운송수단에 탑승하여 이동한다던지.

    마찬가지로 유니티에서 오브젝트의 이동도 구현 방법에 따라 아주 다양하다.

     

    그리고 그 중에서도 가장 기초가 되고, 대표적으로 사용되는 방법 중 하나인 Translate에 대해 알아보자.

    Transform


    유니티에서 어떠한 오브젝트를 생성하더라도 Transform Component는 무조건 존재한다. 왜일까?

    Transform의 구성을 살펴볼 필요가 있다.

    • Position - 오브젝트의 위치 값을 갖는다.
    • Rotation - 오브젝트의 회전값을 갖는다.
    • Scale - 오브젝트의 확대비율값을 갖는다.

    오브젝트라는 것은, Scene에 존재하는 객체라는 것인데

    존재한다는 것은 어딘가에 위치한다는 의미와도 같기 때문에 Transform은 필수라는 것이다.

    그리고 더 나아가 생각해보면 오브젝트를 이동시키기 위해서는 이 Transfrom의 값을 변경하면 된다는 것을 알 수 있다.

     

    Translate


    Transform의 값을 변경하여 이동하는 방법 중 하나인 Translate이다.

    Moves the transform in the direction and distance of translation.
    If relativeTo is left out or set to Space.Self the movement is applied relative to the transform's local axes. (the x, y and z axes shown when selecting the object inside the Scene View.) If relativeTo is Space.World the movement is applied relative to the world coordinate system.

    공식문서에 의하면 위와 같이 설명되어있다.

    Transform의 방향 그리고 Translation의 거리로 이동한다.

    그리고 Translate 메서드의 인자로 relativeTo 가 존재하는데 그 값에 따라 로컬 좌표계로 이동하는지 월드 좌표계로 이동하는지가 결정된다고 한다. 기본적으로는 로컬 좌표계로 설정되어있다고 한다.

    그렇다면 예시를 통해 살펴보자.

    위의 오브젝트를 Translate를 활용하여 이동시킬 것이다.

    보면 알겠지만, 현재 오브젝트는 Y축 회전을 한 상태로 월드 좌표계와는 다른 방향을 갖고 있다.

    void Start()
        {
            transform.Translate(new Vector3(3, 0, 0));
        }

     인자로 별 다른 값이 없다면 오브젝트의 로컬 좌표 기준으로 이동하기 때문에 위의 코드를 실행하면

    오브젝트 기준으로 X축으로 3만큼 움직이게 될 것이다.

    우측 상단의 월드 좌표의 X축과 오브젝트의 로컬 좌표의  X축이 가리키는 방향이 다르다는 것이 보이는가?

    이제 스크립트를 실행해보겠다.


    로컬 좌표 기준으로 X축으로 3만큼 이동한 것을 볼 수 있다.

    현재 Inspector 창에 있는 오브젝트의 Transfrom은 부모 오브젝트가 없는 상태로

    오브젝트의 월표 좌표 값을 나타내는데

    오브젝트 기준으로 X축 방향이 월드 좌표에서 Z축의 반대방향이므로 올바르게 Z 값이 -3이 됨을 볼 수 있다.

    X좌표의 값의 경우에는 회전이 된 상태에서 로컬 좌표로 이동하면서 발생한 오차값으로 보인다.

    -4.768372 e-07 실제로 값 또한 거의 0에 근사하다. 아주 미세한 오차이니 무시하자.

    void Start()
        {
            transform.Translate(new Vector3(3, 0, 0), Space.World);
        }

    이번에는 인자로 Space.World를 주어 월드 좌표 기준으로 이동하게 해 보겠다.

    오브젝트의 방향에 영향을 받지 않고 월드좌표 기준으로 이동함을 볼 수 있다.

    이번에는 다른 오브젝트의 좌표계에 따라 이동하는 것을 봐 보겠다.

    이와 같이 이동의 기준 좌표계가 될 'Cube' 오브젝트를 생성 후,

    Y축 기준으로 -90도 회전을 시켜주었다.

    이 상태에서 Translate를 시키면 Capsule은 어떻게 이동할까?

    GameObject refCoordinate; // 이동의 기준 좌표계가 될 오브젝트
        void Start()
        {
            refCoordinate = GameObject.Find("Cube");
            transform.Translate(new Vector3(3, 0, 0), refCoordinate.transform);
        }

    Cube가 가리키는 X축 방향으로 3만큼 이동했음을 확인할 수 있다.

     

    즉, Translate를 사용하면 움직일 오브젝트의 위치에서 정해준 인자의 좌표계에 따라 이동한다.