공간과 움직임

Unity 2021. 7. 30. 16:51

유니티 공간

좌표계(coordinate system) : 물체가 어디에 배치되어 있는지 표현하는 기준과 체계. 공간에서 '어떤 방향으로' 얼마만큼 이동한 거리에 배치할 것인지 결정하는 기준으로 씬 창에 표현되는 평행이동 툴의 화살표가 좌표계를 표현한 것

전역 공간(global space)(=월드공간(world space)) : 전역 공간에서 X, Y, Z방향을 정하고 좌표를 계산하는 기준을 전역 좌표계(global coodinate system)이라고 하며, 전역 공간에서는 게임 월드의 원점 (0, 0, 0)이 존재하며 모든 오브젝트가 원점에서 얼마만큼 떨어져 있느냐가 오브젝트의 좌표가 됨

트랜스폼 기즈모 전환 버튼

Local/Global 전환 버튼 : 씬 창에서 편집 툴이 표현되는 방식(기즈모)을 오브젝트 공간과 전역 공간 사이에서 전환

Pivot/Center 전환 버튼 : 피벗은 '오브젝트의 실제 기준점'을 기준으로 오브젝트를 배치하며, 센터는 '눈으로 보이는 중점'을 기준으로 오브젝트를 배치

전역 공간 모드로 전환(Local/Global 전환 버튼을 클릭하여 Global로 전환) -> 전역 공간에서는 게임 월드의 X, Y, Z 방향(전역 좌표계)으로 오브젝트를 배치

오브젝트 공간 모드로 전환(Local/Global 전환 버튼을 클릭하여 Local로 전환) -> 유니티 상단 툴바에 표시되는 공간 모드는 Local이지만 Local 모드에서 씬 창에 표현되는 좌표계의 모습은 로컬 공간이 아니라 오브젝트 공간으로 오브젝트 자신이 기준이 됨. 오브젝트 공간에서의 평행이동은 오브젝트는 가만히 있고, 주변 풍경이 움직이는 것으로 이해할 수 있음

sphere을 cube의 자식으로 넣어주었을 때 : cube의 위치를 변경하면 자식인 sphere의 위치도 변하는 것을 확인할 수 있음. 이 상태에서 sphere 게임 오브젝트의 위치를 인스펙터 창에서 확인해보면 좌표축은 편하지않았지만 sphere 게임 오브젝트의 위치가 cube 게임 오브젝트를 따라 변경되었음을 알 수 있음. sphere의 좌표가 자신의 부모인 cube에 상대적으로 측정됨

sphere을 부모 cube로 부터 풀어주었을 때 : sphere 게임 오브젝트의 위치를 인스펙터 창에서 확인해보면 좌표가 변경된 것을 확인할 수 있음. 

-> 모든 게임 오브젝트는 자신의 부모를 세상의 중심으로 여기고 좌표를 측정하기 때문이며, 이것이 지역 공간이며, 인스펙터 창에 보이는 위치, 회전, 스케일은 언제나 지역 공간을 기준으로 표시됨. 부모 게임 오브젝트가 없는 경우에 한해서만 인스펙터 창에 표시되는 지역 위치, 지역 회전, 지역 스케일이 전역 공간에서의 전역 위치, 전역 회전, 전역 스케일가 일치하게 됨

부모에 의한 자식의 회전과 스케일 변경 확인하기(Sphere를 Cube의 자식으로 만들기 -> 하이어라키 창에서 Cube 선택 > Cube의 위치를 (0, 0, 0), 회전을 (0, 0, 90), 스케일을 (2, 2, 2)로 변경) : Sphere의 인스펙터 창을 확인해보면 부모 Cube 게임 오브젝트의 위치, 회전, 스케일을 변경해도 부모 Cube에 상대적으로 측정된 자식 Sphere 게임 오브젝트의 위치, 회전, 스케일은 여전히 같은 값으로 표시되는 것을 알 수 있음

구를 부모 Cube로부터 풀어주기 : Sphere 게임 오브젝트의 실제 위치, 회전, 스케일이 Cube 게임 오브젝트의 자식이었을 때와 다르게 측정되는 것을 볼 수 있음(지역위치->전역위치)

지역 공간과 오브젝트 공간의 차이 : 전역 공간은 게임 월드의 원점을 기준으로 위치를 측정하는 것이며, 지역 공간은 자신의 부모 게임 오브젝트를 기준으로 위치를 측정함. 오브젝트 공간은 자기 자신을 기준으로 위치를 측정.

유니티에서의 지역 공간 : 지역 공간에서 위치, 회전, 스케일값 측정 -> 부모 게임 오브젝트를 기준으로 측정(지역 공간), 지역 공간에서 평행이동 -> 게임 오브젝트 자신의 방향을 기준으로 평행이동(오브젝트 공간)

오브젝트의 이동과 회전

Move 스크립트 생성 : 

Time.deltaTime : Time.deltaTime을 곱하지 않으면 1초에 (0, 1, 0)만큼 이동하지 않고 한 프레임에 (0, 1, 0)만큼 이동한다는 점을 주의해야 함

전역 평행이동과 지역 평행이동 : Translate( ) 메서드에 의한 평행이동은 전역 공간이 아니라 지역 공간을 기준으로 이루어지지만, 평행이동 기준을 전역 공간으로 선택 가능. Translate( ) 메서드의 두 번째 값으로 Space 타입을 받아 평행이동의 기준을 전역 공간(Space.World)으로 할지, 지역 공간(Space.Self)으로 할지 지정할 수 있음

전역 회전과 지역 회전 : Rotate( ) 메서드 또한 지역 공간을 기준으로 동작하지만, 전역 공간을 기준으로 회전할 수 있음. Rotate( ) 메서드도 Translate( ) 메서드처럼 두 번째 입력값으로 기준 공간을 받을 수 있음

스크립트 적용하기(Sphere 게임 오브젝트에 Move 스크립트 추가 -> 하이어라키 창에서 Sphere 게임 오브젝트 선택 > 하이어라키 창의 Cube를 Move 컴포넌트의 Child Transform 필드로 드래그&드롭)

이동과 회전 테스트

벡터 연산으로 평행이동 구현하기

벡터의 속기 : Vector3 타입에는 속시(Shorthand)라는 미리 만들어진 변수들이 있으며 Vector3 position = Vector3.up; 과 같은 형태로 즉시 생성할 수 있음

          Vector3.forward : new Vector3(0, 0, 1)

          Vector3.back : new Vector3(0, 0, -1)

          Vector3.right : new Vector3(1, 0, 0)

          Vector3.left : new Vector3(-1, 0, 0)

          Vector3.up : new Vector3(0, 1, 0)

          Vector3.down : new Vector3(0, -1, 0)

트랜스폼의 방향 : 뒤쪽, 왼쪽, 아래쪽에 관한 변수는 다로 없지만 -1을 곱하여 방향을 뒤집어서 표현 가능

          transform.forward : 자신의 앞쪽을 가리키는 방향벡터

          transform.right : 자신의 오른쪽을 가리키는 방향벡터

          transform.up : 자신의 위쪽을 가리키는 방향벡터

'Unity' 카테고리의 다른 글

좀비 서바이버  (0) 2021.08.09
유니런_플레이어 제작  (0) 2021.08.02
방향, 크기, 회전  (0) 2021.07.30
닷지_게임 매니저와 UI, 최종 완성  (0) 2021.07.30
닷지_탄알 제작  (0) 2021.07.27
posted by 노랭이모찌