유니티

[유니티] 월드좌표(Space.World)와 로컬좌표(Space.Self)

da_log 2023. 1. 11. 11:03

 

월드좌표와 로컬좌표 구분의 필요성

 

// 오브젝트 상승
transform.Translate(Vector3.up * Time.deltaTime * upSpeed);
//오브젝트 회전
transform.Rotate(Vector3.one * turnSpeed * Time.deltaTime);

다음은 오브젝트가 회전함과 동시에

위로 올라가능 기능을 만들고 싶어서 작성한 코드이다.

 
 
실행을 해보니 아래 영상과 같이 오브젝트가 곧게 위로 올라가지 않았다.
오브젝트가 계속해서 회전하기 때문에 바라보고 있는 방향도 바뀌어서
위를 향하는 방향도 바뀌는 것이었다.
 
 
 
 
오브젝트 축의 기준이 변화하지 않고 절대적인 위치를 기준으로 하는
방법을 찾아보다가 알게 된 게 로컬좌표와 월드좌표다.
 

 
로컬좌표와 월드좌표
 
로컬좌표는 오브젝트가 향하고 있는 방향이 기준이 되는 좌표이다.
즉, 플레이어가 왼쪽으로 회전을 하면 회전한 왼쪽이 정면이 되는 것이다.
 
 
월드좌표는 반면에 화면에서 보이는 좌표계가 기준이 된다.
그래서 플레이어가 회전을 하더라도 기준 축이 변하지 않는다.
 
 
 
 
 
유니티에 따르면 Translate의 첫번째 매개변수로는 이동할 벡터값을,
두번째 매개변수로 로컬좌표와 월드좌표를 설정해줄 수 있다.
 
 
이때 두번째 인자를 따로 작성하지 않으면 로컬좌표를 기본으로 설정해준다고 한다.
그래서 아래와 같이 Space.World를 추가해서 코드를 수정해주었다.
 
 
// 오브젝트 상승
transform.Translate(Vector3.up * Time.deltaTime * upSpeed, Space.World);
// 오브젝트 회전
transform.Rotate(Vector3.one * turnSpeed * Time.deltaTime);

 

 

실행해보면 오브젝트는 회전을 하면서도 수직으로 위로 올라가게 된다.

 

 

아래 블로그에 있는 영상 보면 이해하는데 도움이 될 것 같다.

 

 

 

Translate로 이동할 때, Space.World와 Space.Self의 차이점

유니티에서 이동을 위해서 자주 사용하는 메서드 중에 하나인 Transform.Translate는 매개변수를 딱 두 가지 갖고 있습니다. 하나는 익히 알다시피 얼마나 이동할 것인지의 벡터이고 하나가 어느 축

nakedgang.tistory.com