이 블로그는 스스로 공부한 것을 복습하고 정리하기 위해 만든 것이기 때문에, VR 뿐만 아니라 Unity에 관한 기초적인 내용도 포함될 것이다.
이제, 지난 글에서 생성한 프로젝트를 실행시키면 다음과 같이 Assets 폴더 안에 GoogleVR과 Plugins 폴더가 Import 되었을 것이다.
이전 글에서도 언급하였듯이 이 2개의 폴더는 Google VR SDK 패키지를 Import하면 생성되는 폴더로써, VR 카메라의 생성과 제어를 담당하게 된다.
VR SDK를 활용하여 플레이어의 시선을 처리하는게 이번 어플리케이션의 핵심이겠지만, 이번 장에서는 그에 앞서서 플레이어가 이동할 경로를 생성해보고자 한다. 따라서 이번 장의 내용은 카드보드에 관련되기 보다는 Unity에서 오브젝트를 생성하고 관리하는 내용이 주를 이룰 것이기 때문에 Unity에 익숙한 분들은 다음 장에서 Google Viewer Prefab을 활용하는 방법으로 넘어가는 것이 좋을 것 같다.
그럼 본격적으로 시작하기에 앞서서 현재 Scene을 저장해 놓도록 하자.
물론 지난 글에서 대부분 VR SDK를 Import 한 후 Scene을 저장 해놓았겠지만, 만약 Scene을 저장해 놓지 않았다면, [File] -> [Save Scene] 혹은 Ctrl + s 키를 눌러서 Scene을 저장할 수 있다.
Save 창이 화면에 나타나면, Scene의 이름을 'Play'로 변경한 다음, 저장 버튼을 클릭하여 저장을 완료하자.
그럼 위의 그림과 같이 Project 창에 Play라는 이름의 아이콘이 추가된 것을 확인할 수 있을 것이다. 해당 아이콘은 Scene을 나타내는 아이콘으로써, Scene은 뜻 그대로 게임의 한 장면을 담당하게 되며, 다양한 오브젝트를 포함하여 플레이어가 어플리케이션과 상호작용 할 수 있는 공간을 제공한다.
이번 어플리케이션에서는 1개의 Scene만을 사용할 것이며, 정리를 위해서 Project 창 안에 'Scenes' 폴더를 생성하여 Play Scene을 옮겨놓도록 하자.
이제 본격적으로 Scene을 구성할 준비를 마쳤으므로, 플레이어가 이동할 도로를 만들어보도록 하겠다.
먼저 위의 화면과 같이 [GameObject] -> [3D Object] -> [Cube]를 선택하여 Scene에 Cube를 생성한다.
생성이 끝났으면, 다음 화면과 같이 Transform 우측의 톱니바퀴 모양을 클릭한 후, Reset을 선택하여 Transform의 Position과 Rotation을 0으로, 그리고 Scale을 1로 초기화 시켜준다.
이렇게 Reset을 시켜주면, 우리가 기준 좌표로 사용하고자 하는 (0,0,0)에 Cube가 위치하게 되는 것을 Scene에서 확인할 수 있다.
지금 우리는 Cube 위에서 플레이어가 이동할 수 있게 하고자 한다. 그렇기 때문에 Cube를 위아래로 적당히 늘려서 길처럼 만들어 줄 필요가 있다.

따라서 Cube의 Inspector에서, Scale의 값을 (5, 1, 20)으로 변경하자.
변경을 마치면, Z 축을 따라 길게 늘어난 Cube의 모습을 Scene에서 확인할 수 있을 것이다.
이제 우리는 도로의 일부분을 완성하였다. 지금 우리가 완성한 Cube와 동일한 Cube를 여러개 생성하여 이어준다면, 실제 도로와 비슷한 길을 만들 수 있을 것이다.
이 때 방금 만든 도로를 Ctrl+c, Ctrl+v로 직접 복사하여 붙이는 방식을 사용할 수도 있겠지만, 현재 Scene에 존재하는 오브젝트를 Project 창에 Drag&Drop으로 끌어넣어서 Prefab으로 만들어 사용할 수도 있다.
Prefab이란, Scene에서 생성된 오브젝트를 프로젝트에 저장하여, 필요할 때마다 Scene에 복제하여 사용하는 요소로써, Prefab으로 저장된 시점에 설정되어 있던 모든 Component를 포함하고 있기 때문에 여러번 반복하여 사용해야 하는 오브젝트를 Prefab으로 설정해 두면 필요할 때마다 Scene으로 가져다가 사용할 수 있다는 장점이 있다.
Cube를 Prefab으로 만들기 전에 다른 Prefab과 구별하기 위해 이름을 Road_Horizon로 변경한 후, Hierarchy에 있는 Road 오브젝트를 Project 폴더로 Drag&Drop 하자.
정상적으로 Prefab이 생성되었다면, 위의 화면과 같이 Project 폴더 안에 Prefab이 생성된 것을 볼 수 있다.
생성된 Prefab 역시 Scene과 마찬가지로 구분을 쉽게 하기 위해 'Prefabs' 폴더를 생성한 후 이동시키도록 하자.
Prefab을 완성했으니 이제 우리는 만들어진 Prefab을 복제하여 반복적으로 사용할 수 있다.
Prefab을 Drag&Drop으로 Hierarchy 창으로 끌어오면 Prefab이 생성되는 것을 확인할 수 있다.
생성된 Prefab을 기존에 있던 Road_Horizon 오브젝트 오른쪽에 연결하여 길을 만들어보도록 하자. 오브젝트를 배치할 때 'v'키를 누른 채 오브젝트 모서리에 마우스 커서를 가져가 좌클릭 한 상태로 주변 오브젝트 모서리 근처로 마우스를 옮기면, 위의 화면과 같이 주변 오브젝트 모서리에 밀착하여 오브젝트를 배치할 수 있다. 이 기능을 활용하면 정확하고 편리하게 Road 오브젝트를 배치할 수 있다.
배치를 마치고 Scene을 확인하면 이제 제법 도로가 만들어진 것을 볼 수 있다. 하지만 아직은 제대로 된 도로라고 부르기에는 짧은 감이 없잖아 있으므로, Prefab을 2개 더 생성하여 방금 전과 같이 오른쪽에 연결해보겠다.
이제 제법 긴 거리의 도로가 완성되었다. 하지만 한쪽 방향으로만 나아가면 캐릭터가 이동한다는 느낌이 적어질 수 있기 때문에 여기서부터는 90도 꺽은 방향으로 도로를 이어가도록 하자.
수직 방향의 도로를 생성하는 방식은 처음에 Road_Horizontal을 생성할 때와 같다. 다만, 이번에는 x 축을 향해 길게 뻗어나가야 하기 때문에 Cube 오브젝트의 Scale 값을 (20, 1, 5)로 설정해 주어야 한다.
생성한 오브젝트의 이름을 수평 방향 도로 오브젝트와 구분해주기 위해 'Road_Vertical' 로 변경한 후, Prefabs 폴더로 이동시키자.
이제 Right_Horizon과 마찬가지로 Road_Vertical Prefab을 복제하여 도로를 구성하는 일만 남았다.
오브젝트를 배치하다보면 멀리 있는 오브젝트가 잘 안 보이는 경우가 있다. 이 경우에는 마우스로 직접 이동하는 방법도 있지만 오브젝트를 더블 클릭하면 해당 오브젝트로 카메라가 이동하므로 활용하도록 하자
이제 Prefab을 적당히 배치하여, 위와 같은 도로를 만들 수 있게 되었다. 만들어진 도로는 총 15개의 오브젝트를 모아서 완성하였다.
그런데 상황에 따라서 모든 오브젝트를 하나의 오브젝트처럼 움직일 필요가 발생 할 수 있다. 즉 그룹을 지어줄 필요가 있는 것이다.
그룹을 만들기 위해서는, 먼저 [GameObject] -> [Create Empty]를 선택하거나, Hierarchy 창에서 우클릭 후 [Create Empty]를 선택하여 빈 오브젝트를 생성한다.
생성이 완료되면, Hierarchy 창에 Transform 외에는 어떤 Component도 가지고 있지 않은 GameObject라는 오브젝트가 생성된 것을 확인할 수 있다. 오브젝트가 필수적으로 가지고 있어야 할 Transform 외에는 아무런 정보를 가지고 있지 않기 때문에 이것을 Empty Object라고 부른다.
생성된 빈 오브젝트(GameObject)는 Reset을 선택하여 값을 초기화 시키고 이름을 'Road'로 변경한 후, 모든 Road_Horizon과 Road_Vertical 오브젝트를 선택하여 Road 오브젝트로 Drag&Drop 시키면, 선택된 모든 오브젝트들이 Road 오브젝트 밑으로 포함되는 것을 확인할 수 있다.
오브젝트가 다른 오브젝트의 하위로 포함되는 경우, 포함되는 오브젝트의 좌표는 자신의 상위 오브젝트의 좌표에 상대적인 값으로 변경된다는 점을 알고 있으면 후에 좌표값을 제어하는데 도움이 된다.
이제 플레이어가 이동한 길의 구성이 모두 끝났다. 하지만 현재 길이 전부 하얀색이기 때문에 1인칭 시점으로 이동할 시에 방향 구분이 불편하다는 문제점이 있다. 그렇기 때문에 구간별로 도로의 색을 변경한 후 이번 장을 마치도록 하겠다.
각각의 Road_XXX 오브젝트의 Inspector를 확인해 보면, Mesh Renderer component가 있는 것을 확인할 수 있다.
Mesh Renderer Component를 살펴보면, Materials 항목을 발견할 수 있는데, 항목 하단에 'Element 0' 라는 항목이 있는 것을 확인할 수 있다. Element 항목은 오브젝트에 Material을 적용하여 색을 입히거나 Texture를 적용할 수 있는 항목으로써, 여기서 우리가 Road_XXX 오브젝트에 색을 입히기 위해서는 'Element 0'에 적용할 Material을 만들어야 한다.
그럼 먼저, Project 창에서 Assets 폴더(최상위 폴더)에 'Resources' 폴더를 생성한 후, 다시 Resources 폴더 내부에 'Materials' 폴더를 생성하자.
폴더를 생성하였으면, Materials 폴더로 들어간 후, [마우스 우클릭] -> [Create] -> [Material] 순으로 선택하여 새로운 Material을 생성하고, 이름은 'Red'로 설정한다.
Material 생성이 완료되었다면, Red Material을 선택하여 Inspector 창을 연 후, Main Maps 하단의 Albedo 우측에 있는 Color picker를 선택한다.
Color picker를 선택하면, 색을 고를 수 있는 창이 열리게 되며, 창에서 색을 선택하면 Material의 색이 실시간으로 변경되는 것을 확인할 수 있다. 여기에서는 이름에 맞는 빨간색을 선택한 후 창을 닫도록 하자.
이제 생성한 Material을 오브젝트에 적용해보도록 하자. 길의 첫번째 구간을 구성하고 있는 4개의 오브젝트 Road_Horizon부터 ~ Road_Horizon (4)를 모두 선택한 후, 'Red' Material을 Inspector 창 하단에 Drag&Drop 하면 자동으로 Element 0에 Red Material이 적용되는 것을 확인 할 수 있다.
Material이 적용되면, Material의 가시적인 속성이 오브젝트에 적용되기 때문에, 오브젝트의 색이 붉은 색으로 변경된 것을 Scene에서 확인할 수 있다.
이제 같은 방법으로 나머지 구간에도 파랑, 노랑, 녹색을 적용하여 구간을 구분해보도록 하자. 제대로 적용이 되었다면, 아래와 같은 결과물을 얻을 수 있을 것이다.
이제 정말로 길의 구성을 마치게 되었다. 다음 번에는 만들어진 길 위를 자동으로 이동하는 플레이어와 Google VR SDK를 활용하여 이동하는 플레이어의 시점에서 머리 회전에 따른 시점 이동을 구현하는 방법에 대해서 알아보도록 하자.























댓글 없음:
댓글 쓰기