역자의 말:
정신없이 매일 튜토리얼을 올리다보니 벌써 마지막 차례가 되었는지도 몰랐습니다 =ㅁ=;;; 이번 회차에는 튜토리얼의 마지막 챕터인 최적화를 다루고 '마치기 전에' 챕터도 같이 올려드립니다.
최적화
오래된 G4 iBook부터 현재의 최신 메모리와 한두 개의 최신 그래픽카드가 끼워진 Intel기반의 Mac Pro까지, 게임들은
어떠한 플랫폼에도 실행되도록 요구 될 수 있습니다. 우리의 게임이 이 두 가지에서 실행되게 하려면, 최적화가 필요합니다...
이제 우리는 마무리 짓는 단계에 도달해있습니다. 최적화란 프로젝트 막바지에 모든 핵심 요소들이 제자리에 위치해있고 고정되어 있을 때 진행되는 작업입니다. 무엇을, 어디서, 그리고 어떻게 자신의 프로젝트를 최적화하는 것은 자신의 프로젝트 디자인과 내용에 따라 좌우되기 때문에 본 챕터는 주로 좀 더 흔한 종류의 최적화에 대해서 논할 것입니다.
최적화를 해야하는 이유
유니티 프로젝트들은 흔히 메인스트림, 즉 큰 예산이 들어가는 게임보다는 오래된 컴퓨터들을 대상으로 제작됩니다. 퍼즐 게임, 캐주얼 타이틀, 그리고 그 외에 다른 프로젝트 종류들은 256MB의 램 메모리 카드와 아주 오래된 그래픽 칩셋을 가진 G4 iBook부터 최신 그래픽가드와 함께 면판에 메모리 램 카드로 도배한 현재의 Intel기반의 Mac Pro 까지 어떠한 플랫폼에서도 실행되도록 요구될 수 있습니다.
때문에, 우리는 최종출시를 겨냥하여 우리의 프로젝트를 최적화하는 것을 고려할 필요가 있습니다. 이 경우, 우리는 이미 적 로봇을 범위에 있을 때만 나타나도록 최적화했기 때문에, 그 부분은 완료되었습니다.
그러나 씬을 렌더링 하는 것은 약간 느릴 수도 있으며 이것이 바로 우리가 깊게 들어갈 가치가 있는 부분입니다.
최적화 렌더링: 초당 프레임 모니터링
사용자의 게임이 최적화가 필요한지 알아보는 최상의 방법은 프레임 레이트(Frame rate)-- 초당 렌더링 되는 이미지의 수 --를 찾아서 표시하는 것입니다. 숫자가 낮을수록, 게임의 실행 속도는 느립니다.
본 튜토리얼을 진행하면서 나타난 스크린샷에서 이미 이 숫자 또는 글자 "FPS"를 눈치 챘을 것입니다. 이들이 나타나는 이유는 우리가 살펴볼 매우 중요한, 그렇지만 감사하게도 매우 짧은 초당 프레임 수 리포팅 스크립트가 실행중이기 때문입니다. 이 스크립트는 간단히 FPS라 이름 붙여졌으며 Project Pane의 scripts->GUI 폴더에서 찾아볼 수 있습니다.
이 스크립트는 철두철미하게 작성되어있기 때문에, 자세한 내용은 다루지 않을 것이지만 이 스크립트를 추가하기 위해서는 GUIText 구성요소가 필요하다는 것만 밝혀둡니다. (이는 유니티 1.x GUI 구성요소 종류로서 새 유니티 2 GUI와는 대조되는 것입니다.)
FPS 카운터가 있으면, 어디에 최적화가 필요한지에 대한 좋은 방안을 얻기가 쉽습니다.
☆ 참고
유니티 에디터에서 게임을 실행시킬 때에는 FPS 스크립트는 제한적입니다. 이는 에디터의 렌더러는 화면의 프레임레이트에 고정되어 있을 수도 있기 때문입니다. 또한 에디터는 씬 뷰를 업데이트하고 무대를 재생하는 동안 더 많은 에러 확인 작업을 주로 진행해야합니다. 더 정확한 결과를 위해서는, 프로젝트의 독립적 빌드를 사용하십시오.
통계화면 이해하기
유니티 2에 새로 추가된 점은 게임 뷰 위에 위치한 "Stats" 버튼입니다. 이를 활성화하면, 우리의 게임 내에 폴리곤 카운트 또는 다른 객체의 복잡함을 해결하는 데에 대한 사안이 있는지 알아내는데 도움이 되는 약간 의 추가적인 측정값들을 얻을 수 있습니다.
통계 패널이 작동 중에 있습니다.
이 통계들은 렌더링 되는 카메라를 기반으로 하기 때문에, 씬을 돌아다니는 것은 통계적으로 많은 변화를 불러올 것입니다. 이에 있어 중요한 요소들은:
Draw Calls -- 지나가는 렌더링의 수.
씬에 있는 요소들: 그림자들, 다중 카메라들, 텍스쳐에 적용되는 렌더링들, 픽셀라이트, 등은 여러 번 렌더링 될 필요가 있을 수도 있습니다. 복잡한 쉐이더들은 특히 반사 또는 굴절 같은 현상이 계산될 때 추가적인 Draw Call을 야기할 수 있습니다.
Tris-- 화면에 그려지는 삼각형의 수.
모든 3D 모델들은 삼각형으로 만들어집니다. 삼각형이 적을수록, 더 빠르게 렌더링 될 것입니다. 둥그렇고 곡선의 객체들은 기본적이고, 직선적인 모양의 정육면체 또는 단면보다 더 많은 삼각형을 사용합니다.
Verts-- 그래픽 칩에 보내지는 꼭짓점들(Vertices)의 수
꼭짓점(Vertex)은 3D 공간에서의 점입니다. 삼각형들 끼리 공유하는 꼭짓점이 더 많아 질수록, 렌더링 할 수 있는 삼각형이 많아져 좀 더 복잡한 모델을 구현할 수 있습니다.
Used Textures(사용된 텍스쳐)-- 사용자가 볼 수 있도록 한 렌더링에 사용된 텍스쳐의 수.
물체는 물체가 사용하는 쉐이더 스크립트와 물체가 어떻게 정의됐느냐에 따라 하나 또는 그 이상의 텍스쳐를 사용할 수 있습니다. 쉐이더는 텍스쳐들이 어떻게 혼합되어 범프매핑, 광이 나는 하이라이트, 반사 또는 굴절 같은 효과들을 만드는지를 정의합니다.
★ 팁
파티클 시스템은 각 파티클마다 두개의 삼각형을 사용하며 최소 하나의 삼각형을 하나의 텍스쳐에 사용합니다. (텍스쳐들은 주로 파티클 시스템의 모든 파티클들에 의해 공유됩니다.) 처음 접하는 사용자는 이 효과들에 매우 흥분할 수도 있기 때문에 과도하게 사용을 하지 않도록 주의하시기 바랍니다.
Render Textures- 화면에 직접 표시하기보다 텍스쳐로 출력하는 카메라의 수. 이는 생각보다 명확하지 않습니다..
렌더링 텍스쳐들은 후처리 효과, 레벨의 다른 지역을 표시하기 위한 CCTV 화면, 또는 물, 거울 또는 유리의 반사효과와 같은 여러 가지의 효과를 내기 위해서 사용됩니다. 추가적으로, 대부분의 그림자들 또한 이 기술을 이용하여 제작되기 때문에 씬 뷰에 특별히 추가적인 카메라를 볼 필요가 없을 것입니다.
최적화 렌더링: 이원 카메라 시스템
만약 이미 완성된 프로젝트를 플레이 해보았다면, 프로젝트 내에 실제로는 두개의 카메라: Near Camera와 Far Camera가 존재하고 있음을 알 수 있을 것입니다. 이 두개의 카메라 시스템은 각 프레임에 필요한 렌더링의 양을 줄여주는 역할을 합니다.
Near Camera는 가까운 거리의 모든 것을 렌더링하며; 이 경우, 0.4에서 50유닛까지 입니다.
★ 팁
유닛이라고 하는 것은, 이론적으로 사용자가 선호하는 어느 임의적인 길이일수 있지만, 대부분의 개발자들은 분별력을 위해 "1유닛 = 1미터"라는 공식에 충실합니다. 여기서 가장 중요한 팁은 사용자의 아티스트들이 사용자가 어떠한 크기 비율을 사용하는지 알도록 하는 것입니다.
Far Camera는 50 유닛부터 500 유닛 정도까지를 렌더링 합니다. 그러나 Far Camera는 오직 신 데이터의 일부분만 렌더링 합니다. 이 일부분은 레이어를 통해 정의됩니다. 씬 위의 각 객체들은 거주할 레이어를부여 받습니다. Near Camera는 레이어와 관계없이 모든 요소들을 렌더링 하지만, 아래의 스크린샷에서 볼 수 있듯이, Far Camera는 "cameraTwo" 또는 "cameraTwoIgnoreLights"레이어에 포함된 아이템들을 무시하도록 되어있습니다. 우리는 또한 연료통과 체력아이템도 무시하기를 원합니다. 이 아이템들은 "noShadow"레이어에 포함되어있으므로 이것 또한 카메라에 체크되어있지 않습니다.
☆ 참고
"noShadow" 레이어를 체크하지 않는 것은 플레이어 또한 렌더링하지 않는다는 뜻이지만 Near Camera부터 멀리 떨어진 곳에서는 플레이어도 보일 가능성이 농후하기 때문에 괜찮습니다.
Far Camera의 Culling Mask 설정.
☆ 참고
Far Camera는 또한 스카이박스를 렌더링 하는 카메라이기도 합니다.(위의 Clear Flags설정을 확인하십시오.) Near Camera의 Clear Flag 설정은 "깊이" 만을 다루기 때문에 이것의 내용은 Far Camera의 내용위에 겹쳐놓아집니다. Far Camera의 내용이 먼저 렌더링 됩니다.
이 설정은 카메라 구성요소의 Culling Mask 속성에 의해 정의됩니다. 체크된 레이어들은 렌더링 되며, 그렇지 못한 레이어들은 렌더링 되지 않습니다. 레이어는 Inspector 창에서 정의될 수 있으며, 어느 게임 객체에라도 배정할 수 있습니다. 사용자는 이와 같은 최적화를 경비로봇과 아이템에서 작동하는 것을 발견할 수 있습니다. 플레이어가 아이템 쪽으로 움직이면, 아이템 주위의 배경은 언제나 렌더링 되어 있지만 아이템 자체는 플레이어와 상대적으로 가까워 져야 나타납니다.
마치기 전에 - 길의 끝
우리가 여기까지 배운 내용과 이후 우리가 가야할 길에 대해 다룹니다.
아직도 가야할길
(The Road Less Travelled)
이 문서를 작성하는 입장에서, 본 튜토리얼은 유니티가 작성한 가장 긴 문서라는 불명예를 안게 됐습니다.
우리는 3D 플랫폼 게임이라는 장르적 범주 안에서 게임의 한 레벨을 만드는 방법을 보았으나, 그 이후 페이지에서도, 우리는 유니티 2가 가지고 있는 가능성, 또는 심지어 3D 플랫폼 게임이라고 하는 장르의 극히 일부분만을 건드려보았습니다.
여기까지 함께한 여행은 여기까지입니다: 이제는 사용자가 자전거의 보조 바퀴들을 떼어내고 혼자 계속 나아가야 합니다. 그러나 다시 길을 떠나기 전에, 본 튜토리얼이 튜토리얼 수료 이후 해볼 만한 것들을 추천해보고자 합니다...
추가 개선사항
럽츠 탈출은 일부러 완료되지 않은 상태로 남겨두었습니다. 우리는 매우 간단한 시작메뉴와 게임오버 화면이 있지만, 게임에는 오직 하나의 레벨밖에 없으며, 현재시점에선 분명히 본 게임의 마지막 레벨로서 의도되어 있습니다. 이는 어떻게 개선될 수 있을까요?
의도적인 실수 고치기
그렇습니다, 게임의 현재 상태 그대로는 약간의 검토할 사안이 남아있습니다. 아래의 사안들은 사용자의 기술을 연마시키기 위해 의도적으로 남겨졌습니다:
• 플레이어가 로봇을 죽인 후 범위 밖으로 나가기도 전에 새 로봇이 근처에 리스폰되었지만, 사망한 로봇은 계속 남아있습니다.
• 레이저트랩은 플레이어를 튕겨내지 않기 때문에, 플레이어의 체력을 예상했던 것보다 빨리 빼앗을 가능성이 있습니다.
위의 두 사안들은 본 튜토리얼에서 배운 것을 적용하여 해결할 수 있습니다.
레벨추가
Project Pane은 "Build Your Own(자신만의 레벨을 만들자)"폴더를 포함하며 레벨을 만드는 데에 필요한 각 에셋을 포함하고 있기 때문에 새 레벨을 추가하는 것은 어렵지 않을 것입니다.
DontDestroyOnLoad() 함수를 이용하여 레벨 간에 현재 점수, 남아있는 목숨의 수 등, 게임 상태 정보를 가져갈 수 있도록 해야할 것입니다.
적 추가
본 게임에는 보행하는 적인 경비 로봇만이 존재합니다. 적을 좀 더 추가하는 것은 어떻습니까? 다른 형태의 적을 추가하는 것은 사용자가 애니메이션과 AI측면에서 잘 이해하고 있는지 확인하는 좋은 방법입니다. 이는 또한 사용자가 모델을 만들고 유니티에 가져오는 방법을 잘 이해하도록 도와줄 것입니다.
점수 시스템 추가
럽츠 탈출은 점수 시스템이 없습니다. 점수 시스템을 추가하는 것은 어렵지만 플레이어가 점수를 향상시킬만한 행동에 맞춰 시각적 효과를 부여하는 것은 사용자에 달려있습니다. (그리고 당연히, 씬 사이사이에 이 점수를 기록하고 싶을 것입니다.)
네트워킹을 이용한 고득점 시스템 추가
유니티 2는 탄탄한 네트워킹 지원과 웹사이트들과의 통합을 지원합니다. 사용자의 고득점을 중앙 서버에 올려서 흡족해하는 것보다 자신을 자랑하는 데에 더 좋은 방법이 어디 있겠습니까? 이를 구현하는 것은 기본 네트워킹을 머릿속에 정리하는 좋은 방법입니다.
멀티플레이어 지원기능 추가
네트워크를 이용한 멀티플레이어 게임 지원은 아마도 어떠한 게임에게도 구현하기 까다로운 것 중 하나일 것입니다. 당연히, 유니티는 이 부분에 대해서 도움을 줄 수 있으나, 복잡한 스크립팅을 하는 것을 피할 수는 없습니다. 이는 훌륭하고 고급레벨의 개선사항을 추가하는 일입니다.
추가 읽을 거리
더 많은 정보를 찾기 위해 가장 먼저 보아야 할 곳은 언제나 유니티 고유의 문서들입니다.
유니티 본사 홈페이지에는 또한 (동영상 입문서를 포함한) 많은 튜토리얼들이 존재합니다.
http://unity3d.com/support/documentation/
추가적으로, 유니티 위키는 사용자가 기여한 정보의 훌륭한 원천입니다.
http://www.unifycommunity.com
그리고 마지막으로, 우리의 번성하는 포럼에서 전문가들과 사용자와 같은 초심자들과 대화를 나눌 수 있습니다:
http://forum.unity3d.com/
본 튜토리얼 번역서는 (주)지피엠스튜디오가 운영하는 "유니티코리아" 회원님들을 위한 메뉴얼 번역 자료 입니다.
본 자료를 다른 곳에 개제 하실 때에는 아래의 번역과 출처를 명확히 밝혀 주시기 바랍니다.
본 자료는 제3자가 상업적인 용도로 사용 할 수 없음을 밝힙니다.
번역 : 유니티코리아 [U3K]게임인생
출처 : 유니티코리아(www.unity3dkorea.com
'Game Engine > Unity' 카테고리의 다른 글
Unity tutorial 모음 (0) | 2010.08.09 |
---|---|
No.12 Unity 3D Platform Tutorial "Script Appendix" [보너스 - 스크립트 부록] (0) | 2010.08.09 |
No.10 Unity 3D Platform Tutorial "Audio & Finishing Touches #2" (0) | 2010.08.09 |
No.9 Unity 3D Platform Tutorial "Audio & Finishing Touches #1" (0) | 2010.08.09 |
No.8 Unity 3D Platform Tutorial "Adversaries" (0) | 2010.08.09 |