본문 바로가기
Programming/Unity 기초탈출기

[Unity] 유니티 기초 탈출기 - Part.01 - 로컬, 글로벌 좌표계

by 타임박스 2022. 5. 2.
반응형


✔ Unity3D - Transform Local, Global 

로컬변수, 글로벌 변수 값 가져오기

Positon, Rotation, lossyScale 값 변경하기



 

안녕하세요.

유니티에서는 로컬 좌표와 글로벌 좌표의 두가지를 가지고있습니다.

 

● Local 좌표

로컬좌표란? : 오브젝트 기준 시점의 좌표

▷ Local 좌표 확인하기

유니티에서 Cube를 하나 생성합니다.

 그리고 Position1,0,0으로 셋팅합니다.

다시 Cube를 하나 더 복사합니다.

그리고 아까 생성한 Cube의 자식으로 넣고 Position을 1,0,0을 넣어줍니다.

1번째 Cube와 2번째 Cube 모두 Positon의 값을 1,0,0 을 입력했는데 같은 위치가 아니라 2번째 Cube는 x축 1만큼 더 이동되어있는것을 볼 수 있습니다.

Local 좌표는 이처럼 부모객체의 영향을 받습니다.

1번째 부모객체가 x축으로 1만큼 이동되고 2번째 자식객체는 부모의 기준으로부터 1만큼이 이동된 것입니다.

자식 좌표값 >>> 1(부모 X값) + 1 (자식 X값) = (이동된값) 2

참고로 Inspector 창에서 보이는 Transform의 값은 모두 Local 좌표 기준으로 화면에 표시됩니다.

이제 부모객체의 x값을 2로 변경해봅니다.

자식도 따라서 같이 움직이죠? 하지만 자식의 Position값은 변경이되지 않고 1,0,0을 유지하고 있습니다.

부모 기준으로 자식개체는 1,0,0이니까요.

▷ 스크립트에서 Transform Local 값 활용 방법

void Start()
{
    // 로컬 위치값 가져오기
    Vector3 localPosition = transform.localPosition;

    //로컬 위치값 변경
    transform.localPosition = new Vector3(0, 0, 0);


    //로컬 회전값 가져오기
    Vector3 localRotation = transform.localEulerAngles;

    //로컬 회전값 변경
    transform.localEulerAngles = new Vector3(0, 0, 0);

    //로컬 스케일값 가져오기
    Vector3 localScale = transform.localScale;

    //로컬 스케일값 변경
    transform.localScale = new Vector3(1f, 1f, 1f);
}

 

● Global 좌표 

글로벌좌표란? : 유니티의 가상 공간의 기준 좌표

유니티의 가상공간의 0,0,0의 기준점이 있습니다.

이건 유니티에서 관리되며 변경할 수 없습니다.

 

▷ Global 좌표 확인하기

위에서 만들어놓은 Cube 기준으로 설명드리겠습니다.

위에서 만들었던 큐브 2개입니다.

부모의 Position은 2,0,0으로 입력되어있고 자식은 1,0,0으로 입력했었죠?

그럼 글로벌 좌표 기준에서는 값이 어떨까요?

부모는 최상위 객체라 글로벌 좌표기준으로 2,0,0입니다.

하지만 자식은 글로벌 좌표기준으로 3,0,0으로 됩니다.

이렇게 계산되면 쉬워보이는데 각도가 틀어지면 머리로는 계산이 힘들어집니다.

부모 객체의 Rotation Y값을 45로 변경합니다.

좌측 상단에 Local -> Global로 변경합니다.

 

뭔가 달라진게 보이시나요?

Local로 한 경우는 오브젝트의 방향이 기준축이되어 표시되어있습니다.

Global로 변경하니 씬 전체 설정된 축이 기준축이되어 방향이 표시됩니다.

부모자식 색상을 좀바꿔서 설명드릴게요

Gizmo가 있는 곳이 글로벌좌표 원점입니다.

부모의 객체의 Y축을 45도 변경한 후

부모의 Position은 처음부터 최상위 객체니까 글로벌좌표기준으로 2,0,0이 그대로일 것입니다.

하지만 자식의 경우에는 이미 위치가 많이 변경된것같죠? 

자식의 위치는 글로벌좌표로 출력한 결과는 2.71, 0, -0.71 로 나타납니다.

이해가 가시죠 ? ㅎㅎㅎㅎ

 

▷ 스크립트에서 Transform Global 값 활용 방법

void Start()
{
    //글로벌 위치값 가져오기
    Vector3 globallocalPosition = transform.position;

    //글로벌 위치값 변경
    transform.position = new Vector3(0, 0, 0);


    //글로벌 회전값 가져오기
    Vector3 globallocalRotation = transform.eulerAngles;

    //글로벌 회전값 변경
    transform.eulerAngles = new Vector3(0, 0, 0);

    //글로벌 스케일값 가져오기
    Vector3 globalScale = transform.lossyScale;

    //글로벌 스케일값 변경하기
    Transform parent = transform.parent;
    transform.parent = null;
    transform.localScale = new Vector3(1f, 1f, 1f);
    transform.parent = parent;

}

Global Scale 값을 변경할때는 일반적으로 조금 다르다.

lossyScale이 읽기전용으로 변경할 수 없다. 그래서 약간 편법을 써야합니다.

그래서 부모객체를 null로 만들고 부모관계를 끊은뒤에 크기조절 후 다시 부모 설정을 하는 방법으로 해야합니다.

 

이제 축개념을 조금 아시겠죠? ㅎㅎ

다음 포스트에서 만나요~ 

 

반응형

댓글