Posted in: Unity, 메서드 & 팁 정리

Scene 기즈모, 벡터 (유니티 게임 프로그래밍)

이번 시간에는 게임에 활용되는 벡터와 Scene 기즈모에 대해 알아봅시다. 단어만 보고 의미를 파악하자면 기즈모는 일단 잘 모르겠고, 벡터는 수학 시간에 봤었던 그 벡터가 맞습니다. 제 경우에는 학창 시절에는 왜 배워야 하는지도 몰랐고 무작정 문제만 풀어라고 하니 많이 어려워했었던 기억이 납니다.

하지만 게임에 활용되는 벡터 개념은 그만큼 어렵지 않습니다. 알아야 하는 이유가 명확하기 때문이라 생각되는데요. 우선 벡터의 기초 개념부터 알아봅시다.

1. 벡터 기초 개념


바로 아래에 벡터를 표현하는 방법을 설명합니다만 한 번 정도만 읽고 넘어가도 괜찮습니다. 개념만 이해하면 됩니다.

벡터(vector)는 수학 개념으로 크기와 방향을 갖는 물리량을 의미합니다. 일반적으로 벡터는 시작과 끝점을 연결하는 화살표로 표시할 수 있습니다. 아래 그림에선 화살표 a를 벡터 a라고 표현합니다.

벡터는 시작 좌표를 꼬리(tail)라고 표기하고 끝 좌표를 머리(head)라고 표기합니다. 꼬리와 머리의 x축 요소를 표현한다면 xt 와 xh로 표기하는데 꼬리와 머리를 의미하는 t와 h를 작은 첨자로 표기합니다. 화살표의 방향은 당연히 꼬리에서 머리를 향합니다.

벡터의 요소는 (머리 – 꼬리)이고 (Δx, Δy, Δz)라고 표기합니다. 벡터의 머리를 (xh, yh, zh) 꼬리를 (xt, yt, zt)로 표현한다면 벡터의 요소 (Δx, Δy, Δz) 는 (Δx = xh-xt), (Δy = yh-yt), (Δz = zh-zt) 로 표현합니다.

위 설명대로 벡터 a를 설명하면 벡터 a의 꼬리는 (xt, yt, zt) = (0, 0, 0)이고 머리는 (xh, yh, zh) = (ax, ay, az)입니다. 벡터 a의 요소를 표현하면 (ax, ay, az) = (ax-0, ay-0, az-0)입니다.

출처 : Wikipedia

게임 제작을 하면서 벡터를 표현하는 경우는 거의 없습니다만 벡터 연산이 필요하므로 벡터 연산에 대한 정보를 찾아볼 때를 대비해서 표현 방식을 알고 있는 게 좋습니다.

게임 안에선 대표적으로 위치, 회전을 표시할 때 사용합니다. 흔히 얘기하는 X축 Y축 같은 것이죠. 그리고 사용하는 축에 따라서 2차원(2D) 게임 3차원(3D) 게임이 나뉩니다.

예를 들면 메탈 슬러그 같은 플랫폼 게임은 X축, Y축이 있는 2차원 게임이죠.

반면에 검은사막 같은 3D MMORPG 게임은 X축, Y축, Z축이 있는 3차원 게임입니다.

사실 여러분은 이미 <게임 오브젝트 생성과 수정>에서 오브젝트의 Transform 값을 바꾸면서 벡터 값을 바꾸어 봤습니다. 그걸 생각해 보면 벡터로 위치를 나타낼 수 있다는 게 이해될 거예요.

게임을 제작하다 보면 기초적인 벡터 개념 말고도 어려운 벡터 연산(Vector Operation)이 필요합니다. 하지만 우리가 제작할 2D 게임에선 어려운 내용은 없습니다. 그리고 유니티와 함께하니 너무 걱정하지 마세요!

2. 벡터는 방향과 크기를 가진다


방향은 대충 의미를 알 수 있죠. 크기는 무슨 의미일까요? 벡터의 크기는 상황에 따라 거리, 길이, 속도를 의미합니다.

위 그림에서 상자에서 공까지 길이는 어떻게 구할까요? 한 칸당 크기가 1이라고 한다면 피타고라스 정리로 구할 수 있겠죠. 즉, 길이는 루트8입니다. 길이는 벡터의 크기를 의미한다고 했었죠? 그러므로 큐브와 공 사이 벡터의 크기는 |r| = 루트8 이 됩니다. |r|은 벡터 r 의 크기를 표현할 때 사용하는 기호입니다. 굳이 표현 방법을 외울 필요는 없습니다.

3. 목표 좌표에서 현재 좌표를 빼면 얼마나 움직여야 하는지 필요한 좌표가 나온다


상자가 공까지 이동하려면 얼마나 가야 할까요? 공 좌표(2, 2)에서 상자 좌표(0, 0)를 빼면 (2, 2)가 됩니다. 즉, 상자가 (2, 2)만큼 움직이면 공까지 이동합니다. 간단하지만 알아야 하는 개념입니다.

4. 벡터는 방향과 크기로 분리해서 정의할 수 있다


방향 벡터는 크기가 1인 벡터입니다. 예를 들어 (Δx, Δy) = (1, 0) 같은 벡터이지요. (Δx, Δy)는 벡터를 좌표에서 표현할 때 사용하는 기호입니다. 신경 안 쓰셔도 됩니다. 위 사진은 상자 기준으로 크기가 1인 무수히 많은 방향 벡터를 파란색으로 표현한 사진입니다. 하나의 좌표로 봤을 때는 점으로 표현할 수 있지만 무수히 많은 점이 모여서 선으로 표현되지요. 상자 기준으로 크기가 1인 벡터는 무수히 많다는 얘기가 됩니다.

왜 크기가 1인 벡터가 방향 벡터인지 이유보다는 방향 벡터가 활용되는 예시를 먼저 보겠습니다. 제 경우에는 원거리 공격 기능에 방향 벡터를 활용합니다. 공격 거리는 상황에 따라 달라지게 만들고 공격 방향은 마우스 클릭에 따른 방향 벡터를 설정하는 식인데요. 결과적으로 (방향 벡터) x (공격 거리) 라는 식이 됩니다.

적절한 예시를 가져오기 위해 이터널 시티를 다운로드 했습니다.

원거리 공격을 하면 마우스 클릭 방향으로 총을 발사합니다. 마우스 클릭 좌표와 캐릭터 좌표를 알고 있으면 벡터의 크기를 구할 수 있죠. 공격 거리는 그렇게 구할 수 있는데 거리에다가 방향만 곱하면 실제로 총알이 날아가는 벡터가 되지요. 이때 방향 벡터가 필요합니다.

방향 벡터는 모두 크기가 1 이지만 방향에 따라 좌표 값이 다릅니다. 크기가 1 이기 때문에 공격 거리가 달라지는 걱정을 할 필요가 없지요. 그러므로 다양한 방향으로 원하는 거리만큼 공격할 수 있습니다.

방향 벡터를 만드는 팁은 컨텐츠를 진행하면서 설명할 기회가 있겠지요.

벡터의 기초 내용은 설명하였으니 이제 Scene 기즈모를 알아봅시다.

5. Scene 기즈모


Scene 기즈모는 씬 카메라가 보이는 방식을 간단하게 바꿔주는 장치입니다. 2D 뷰를 해제하고 3D 뷰 상태여야 보입니다. 2D 뷰는 X축 Y축으로 이루어진 평면만 보이기 때문에 나타나지 않습니다.

오른쪽 위에 정육면체와 정육면체를 가리키는 원뿔들이 있는데, 씬 카메라의 현재 방향을 표시합니다. 각 원뿔을 클릭해 보면 씬 카메라의 방향을 정렬합니다. 꽤나 유용한 기능이죠.

그리고 정육면체를 클릭하면 투사 모드를 Perspective와 Orthographic 간에 전환할 수 있는데, 가장 중요한 기능이라고 생각합니다.

설명을 위해 간단하게 제 책상을 흉내 내봤어요. 같은 카메라 방향으로 Scene 창을 볼까요?

Perspective는 원근감이 있는 모드입니다. 가까이 있는 건 크게 보이고 멀리 있는 건 작게 보이죠. 가까이 있는 컴퓨터 본체는 크게 보이고 멀리 있는 모니터와 스피커는 작게 보입니다.

Orthographic은 원근감이 없는 모드입니다. 가까이 있던 멀리 있던 크기가 일정하게 보입니다.

Orthographic의 강력한 점은 Scene 기즈모의 원뿔을 클릭하여 정면도, 평면도 또는 측면도를 얻는 데 유용하다는 점입니다. 오브젝트 배치가 제대로 되었는지 확인하기도 좋죠.

6. 다양한 기즈모 옵션이 있다


Scene 창과 Game 창에는 Gizmos(기즈모) 메뉴가 있습니다. 둘 중 아무거나 사용해도 됩니다만 저는 Scene 창 기즈모 메뉴를 사용하는 편입니다. Scene 창에서 표시되는 기능들을 편집할 때 사용하는 메뉴입니다.

아이콘(카메라, Light 따위), Scene 평면에 표시되는 격자무늬인 그리드 표시, 게임 오브젝트 선택 윤곽선, 게임 오브젝트 와이어프레임, 등 여러 가지를 수정할 수 있습니다. 굳이 하나하나 알아볼 필요는 없어요.

다음 시간에는 무엇을 배우나요?


다음 시간에는 오브젝트의 피벗, 센터와 로컬, 글로벌을 알아봅시다. 게임 오브젝트를 Scene에서 배치할 때 중요한 개념입니다.

다음 시간에 만나요~ 제발~

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다