꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 알 수 없는 사용자

게임 UX 기획 마지막편을 남기고 개인적인 이유로 한달여간 쉬게 되었습니다. 원고를 위해 키워드들은 정리해 놓았는데, 하고 싶은 말이 많았던건지 마무리를 빨리 못짓겠네요. 그래서 이번엔 잠시 다른 얘기를 써볼까 합니다.

 

국내에서 액션이나 RPG를 위시한 게임의 개발 기획 영역은 크게 시스템 디자인과 컨텐츠 디자인으로 나눕니다. 이 중 컨텐츠 디자인은 아이템이나 스크립트, 레벨 등등 포괄하는 범위가 좀 넓은 편이라, 그만큼 다방면으로 얽혀있는 부분이 많습니다. 레벨 디자인 같은 경우는 그 범위가 크고 아름답기에 아예 시스템/컨텐츠와 비등한 단계로 보기도 하지요.

레벨 디자인은 공간을 만든다는 부분에서 그래픽 파트와 얽히고, 상황에 따른 분기나 이벤트 트리거 등을 설치한다는 측면에서는 스크립트 파트와, NPC나 오브젝트를 배치하고 전투를 구성한다는 측면에서는 AI 파트와, 배치된 개체들의 속성값과 변수를 다루는 부분에서는 시스템 파트와도 얽힙니다. 그만큼 실질적으로 플레이어가 가장 많은 시간을 들여 체험하게 될 게임 플레이를 만드는 부분이기 때문에, 그 의도가 분명하게 들어갈수록 재미있어지는 분야이기도 합니다.

 

Halo / Top-Down Level Design

 

레벨 디자인의 본질은 캐릭터가 놓여지고 이동하게 될 동선으로 구성된 입체적/평면적 공간을 만들고, 그 위에 NPC나 오브젝트 등의 대상을 배치함으로써 플레이어의 행동을 촉발시키고 다변화시키는 것에서 시작합니다. 그 위를 이동하면서 길을 찾거나, 주변을 배회하는 몬스터를 사냥하거나 피하고, 주변의 환경을 조사해보고 채집하거나 봉인을 푸는 등 캐릭터의 성장과 수집에 필요한 시간을 소요시키는 공간으로써 사용됩니다.

플레이어는 이렇게 준비된 레벨을 플레이하면서도 최소의 시간과 노력으로 최대의 효과를 얻고자 합니다. 자신의 캐릭터 레벨이나 퀘스트 상황에 맞춰 필요한 곳에서는 사냥을 하겠지만 그렇지 않은 곳에서는 빨리 이동하려고만 할 것이고, 사냥을 한다면 가장 짧은 시간 내 처리할 수 있도록 몬스터의 특성을 파악해 장비를 맞추고 스킬을 사용할 것입니다. 맞닥뜨린 상황을 파악하고 그에 적합한 대응을 하는 행위를 메커니즘으로 본다면 '최적화'라는 단어로 표현할 수 있을 것입니다.

 

랄프코스터의 재미이론에 따르자면, 주어진 난관을 학습과 도전을 통해 극복했을 때 보상하는 형태로 재미를 만들 수 있다고 합니다. 난관을 맞닥뜨리게 되면 긴장하게 되고, 난관을 해소한다면 이완하게 되는 인간의 심리와 연계되는 것이겠죠. 게임에서는 몬스터 혹은 트랩, 심지어는 적대 세력 같은 대립되는 상대가 등장해 캐릭터의 진행을 방해하려 합니다. 이러한 요소를 거리 관계에 대입해 본다면, '적'이 가까이 온다는 것은 '내가 죽을 수도 있다'는 점에서 플레이어의 긴장감을 끌어올리고 반대로 '적'이 멀어진다는 것은 '내 피해를 줄이면서 대응할 준비를 할 수 있다'는 점에서 플레이어를 이완시키는 형태로 그려지게 됩니다. 거기에 갑작스럽게 맞닥뜨리는 몬스터나 트랩은 플레이어의 긴장감을 극대화시켜 드라마틱한 대응을 요구함으로써 재미를 끌어올리게 되죠.

 

 

 

이러한 거리 관계 메커니즘은 Vector Poem의 Coelacanth : Lessons from Doom(1993)라는 글을 통해 아래처럼 정리해 볼 수 있었습니다. 

 

Doom (1993) Level Design

 

- DOOM의 플레이는 근래의 현실적 FPS와는 달리, 추상적인 액션 자체에 집중해 있다

- 내 행동은 빠르지만, 상대는 느리게 행동하는 주제에 되도록 나에게 근접하려고 한다

- 날아오는 발사체를 눈으로 보고 피할 수 있을 정도의 슈팅 플레이를 갖는다

> 따라서, 유저는 상대 개체/그룹과 거리를 유지해가며 효율적으로 때려잡아야 한다

 

하지만 FPS나 TPS처럼 시야 내에서의 거리 관계를 통해 기민하게 행동해야 하는 액션 게임에만 통용되는 것은 아닌 것 같습니다. MMORPG를 하더라도 파티 플레이에서 몬스터 그룹이나 AI를 고려해 마킹하고 매즈하며 진행하는 것을 생각한다면 동일한 메커니즘이 분명 그 안에 깔려있다고 볼 수 있을 것 같습니다.

 

그렇다면 이러한 거리와 긴장의 함수 관계에 다양한 변곡을 줘 그 재미를 확장할 수 있을 것 같은데.. 긴장과 이완을 조율하는 확장적인 축을 어디에서 찾을 수 있을까요? 일단은 가장 대표적인 방해 요소인 몬스터의 다양한 속성을 통해 확장할 수 있을 것입니다. AI에 따른 선공/비선공을 비롯해 이동 방식의 차이 및 접근 속도, 원거리/근거리 공격, 일정 거리 유지, 추적 같은 고유의 값이 차등화 되고, 그런 다양성을 갖는 몬스터가 어떻게 조합 배치되며 스폰되는지에 따라 같은 공간에서도 상당히 다른 변주를 가능하게 해 줄 수 있습니다. 아래의 공간 최적화 변주의 기준을 본다면, 더 많은 기준들을 떠올려 볼 수 있을 것입니다.

 

 

- 거리형 : 인지 거리/각도 안에 들면 반응, 인지한 대상에 다가오거나 도망, 거리를 유지하며 이동 공격해 공간 최적화를 방해

  예) 스타크래프트 : 닥템으로 히드라 썰고 싶은데 얘들이 자꾸 도망가면서 침 뱉어서..

- 상태형 : 갑자기 캐릭터를 붙잡거나 매즈를 걸어 잠시 이동불가 혹은 상태이상을 촉발해 공간 최적화를 방해

  예) 던전앤파이터 : 냉기 걸리면 좌우이동 연타해야만 이동불가가 해소..

- 이동형 : 밀거나 당기는 형태로 캐릭터의 위치를 직접 옮김으로써 캐릭터의 공간 최적화를 방해

  예) 레프트4데드 : 스모커가 갑자기 파티 한명 잡아 당기면 어딨는지 찾느라 정신이 아득..

 

하지만 전투 중 짜증을 불러일으키지 않으려면, 플레이어가 인지할 수 있는 범위 혹은 시야 내에 문제의 원인이 보여질 수 있도록 레벨 디자인 되어야 합니다. TPS나 FPS 시점에서는 시야 범위가 한정되기 때문에 L4D에서 스모커가 날 붙잡던지 어디선가 부머가 오바이트 하면 순간 놀라 카메라 돌려서 어느 쪽인지 확인하려고 더 긴장감을 주는 부분이기도 하지만, 근거리/원거리 몹을 조화롭게 배치하지 못하고 언차티드3의 배 무덤처럼 스나이퍼 몹만 죽어라 리스폰한다던지, 에어리언브리드3처럼 쿼터뷰인데 화면에 보이지도 않는 거리에 있는 몬스터가 쏜 발사체가 날라와 나를 맞춘다던지 하는 부분 = 나의 피격 원인을 곧바로 파악할 수 없는 배치와 몬스터의 공격 범위 등은 그저 짜증만 유발할 수 있습니다.

 

몬스터를 통한 공간 최적화 변주와 마찬가지로, 지형과 지물을 통해서도 플레이어의 공간 최적화 욕구에 허를 찌르는 긴장 구성을 의도할 수 있습니다. 시점 상에 가려지는 사각 지대 영역을 동선 상에 배치한다던지, 층 혹은 높이에 의해 나뉘어 있어 곧바로 확인해 볼 수 없는 지형 같은 구성을 통해 거리와 인지 관계의 변주를 활용할 수도 있습니다. 

 

 

더불어, 이 지형/지물의 구성을 동적 사물 혹은 몬스터 스폰과 함께 사용함으로써 난이도와 소요 시간을 쉽게 조율할 수도 있습니다.

 

- 제약형 : 이동 경로 앞/뒤를 차단해 강제적으로 좁은 지역 내 마음대로 이동 못하게 만들어 공간 최적화를 방해

  예) 데빌메이크라이 : 특정 공간을 쪼개서 그 안에 몹 다 잡기 이전엔 앞으로도 뒤로도 못나가..

- 함정형 : 주기적으로 발동되는 바닥 트랩이나 무빙 타일을 이용해 타이밍을 잡아 움직이도록 공간 최적화를 방해

  예) 마비노기영웅전 : 회전 칼날이나 가시 톱니바퀴가 움직이는 패턴 파악하고 움직여야.. 몹에게 역이용 가능!!

- 전선형 : 캐릭터의 경로/위치에 따라 몹이 포메이션을 형성하고 스폰함으로써 전선을 형성해 공간 최적화를 방해

  예) http://www.slideshare.net/aishop/ss-10222052 이 좋은 글을 읽어보시면 레벨 디자인 총정리가..

 

플레이어가 게임을 할 때 무의식적으로 공간을 최적화 하려는 방법을 기준으로 삼아 그에 대응하는 방법으로 게임 플레이를 기획하는 접근이 더 재미있는 게임 디자인을 하는데 조금이나마 참고가 되었으면 합니다.

 

 

반응형
,
Posted by zinzza


제가 이런 글을 쓸 깜냥이 되는지는 조금 생각해봤습니다.  저는 게임 개발자도 아니고, 게임(3D)을 만들 능력도 안되는 쪼랩 유틸리티 개발자입니다. 여기 글을 쓰시는 분들과는 쨉도 안되는 사람이지요.


하지만 이 글을 쓰기로 결심한 이유는 제가 교사 출신이라는 한가지 작은 자부심을 갖고 있기 때문입니다.  머리속에 많은것이 있는것과 그것을 전달하는것과 다르거든요.  또 한가지 일에 전문가가 되는것과 그 일 전반에 걸쳐서 다른사람에게 두리뭉실 설명하는 능력도 좀 다르고요^^; 

아무튼 본론을 좀 시작해 보겠습니다.



자~ 우리("놀게영"에 드러와서 이 글을 읽는 사람들) 주변에 보면 이미 직업적으로 게임을 만들고 있는 사람도 있지만, 게임을 만들고 싶어하는 사람도 있고, 만들려고 공부하는 사람도 있습니다.
저는  위에서 한참 썰을 푼것처럼 게임을 만들고 싶어하거나 만들려고 공부하는 사람들을 대상으로 글을 쓰도록 하겠습니다.
우선 게임개발을 공부하는 사람들이 기본적으로 알고 있는 순서를 보면요. 보통...

1. C
2. C++
3. Win32
4. DirectX || OpenGL


이렇게들 공부합니다.

이 방법은 어쩔 수 없는 순서라고 생각하면 될거같습니다. 아~ 경우에 따라 "1. C" 가 빠질 수도 있겠네요(빼고 C++로 시작하시는게 좋을듯^^).

응? 우린 친군데-_-?


그런데 여기서 제가 생각하는 문제점은 저 위에 있는 순서대로 쭉~ 책보고 쭉~ 쭉쭉~ 진도를 빼는 사람들이 많다는겁니다.



좀 더 많이 해본걸로 예를 들어볼까요?
우리가 게임보다 정말 많이 공부한 영어! 자~ 저는 영어를 초딩때 카세트테이프(윤선생이니 정철이니)사서 공부한거 1년정도? 중학교 3년(학원3년), 고등학교 3년(역시 학원3년ㅜㅜ), 대학교 1년 + α... 정말 많이 공부했지만 다시 말해서 6~7년간 진도 쭊쭊~ 뺐지만
영어 공포증 + 실제로도 못함 입니다-_-;
비웃지 마세요~ 여러분도 마찬가지면서-o-+

그동안 저와 우리의 선조들을 비롯해 열심히 공부했지만 영어를 못하는 분들은 대부분 이렇게 생긴 문법책을 기본으로 공부했습니다.


(성문... 아우 이거 우리집에 아직도 있어 ㅜㅜ)

사전을 철근같이 씹어먹었습니다.

떡볶이를 철근같이... 가 아니고 사전이야?


아오 그니까 책을 왜 먹냐고... 양이냐-_-?

그런데 외국인 보면 얼어붙었고, 도망가기 바빴지요.

얼어붙고,

도망가고

 
이렇게 우리가 짤방에 지쳐있을 무렵... 이 문제에 대해 교육부는 엄청나게 고민하고 영어 몰입교육이니 뭐니 해서 해결책을 고민했습니다.
그리고 제가 학교에서 재직할때 해결의 실마리를 보았습니다. 제가 97년에 고등학교를 졸업하고 2003년부터 교직에 있었으니 그 사이에 있었던 일은 몰라겠네요^^;
아무튼 제가 본 실마리는 간단합니다.

영어선생님들이 학생들이랑 영어로 대화를 합니다^^;


아~ 물론 어버버버 하는 학생도 있고요, 제가 문법공부 좀 해봐서 아는데...가 이나고 누가봐도 헛소리를 하는 학생도 많습니다.  하지만 그냥 대화합니다.  원어민 선생님도 많이 오셨죠.

브로닌 보셨나요? 말도 안되는 말이지만 대충 알아먹습니다.

여자들 뽕 모~두 필요합니다. 현아! 필요없습니다. 뽕 엄마가 배속에서 달아줬습니다.


이런식의 대화가 학생과 선생님 사이에 오갑니다.

결국 어떠냐구요?
학생들은 영어로 말을 하고 외국인을 만나서 길을 알려주더군요.



아... 갑자기 영어공부 얘기만 했네요. 엄청 돌아왔습니다-_-;

다시 게임 얘기를 해볼까요?  위에서 얘기한것처럼 게임 개발진도를 잘 뺐는데도 불구하고 게임 개발이 어렵다~ 하는경우를 많이 봤습니다.  이에 대한 해결방법은 영어공부와 마찬가지의 방법으로 해결이 가능할것입니다.

바로 다른사람에게 미안하지 않을 게임을 만들어봐라!


먼저 언어를 배우면서 숫자야구라도 만들어봐야 합니다.  숫자야구는 소스가 널려있다구요?  책에도 나와요?  하지만 버그 없이 친구에게 줘도 미안하지(부끄럽지가 아닙니다)않을 수준인가요?

급조한 숫자야구 이미지 (출처 http://rabe.egloos.com/1284555)

숫자를 입력해야 하는데 아무것도 입력 안하고 엔터를 누르면 어떻게 되죠?
알파벳을 넣으면요?
숫자를 입력할때  책에 나온데로 붙여쓰지 않고 그냥 띄어쓰기만 했다면?
숫자를 3개만 넣어야 하는데 100개 정도 넣어주면 어떻게 될까요?
혹시 한글 넣어보셨나요?
한판 끝나면 다시 할 수 있나요? 그냥 끝 아니고? y/n이라고 써있는데 yes를 넣으면?
혹시 최고 기록을 저장하고 싶은 생각은 안해보셨나요?
숫자를 랜덤하게 만들었는데 게임을 실행할때마다 똑같이 나오진 않던가요? 

 
제가 적어놓은 8줄이 왜 에러인지 아신다면 이제...Win32로 넘어가시...ㅁ ㅡ.ㅡ;



자... 이제 Win32로 넘어와서 테트리스를 만들어볼까요?  이것도 책에보면 소스가 나와있습니다.(제가본 책에는 꼭 있더라구요--)  하지만 대부분의 책에 나온 소스는 기본에 충실하기때문에 모자라는 점이 있기 마련이지요.  여기에도 버그가 있고 개선할 방향이 있을껍니다.


역시 급조한 테트리스 이미지(출처  http://aseuka.tistory.com/entry/%ED%85%8C%ED%8A%B8%EB%A6%AC%EC%8A%A4 )

블럭의 색깔이 구릴껍니다. 
모양도 구리겠네요.
배경에 테트리스 성이라도 넣고 싶을껍니다.
배경음악이 없네요-o-?
한줄이 사라질때 뾱! 하는 효과음도 넣고 싶지 않으세요? 
여러줄이 사라질때 한번에 3줄,4줄이  사라지는게 아니고 한줄씩 뾱뾱뾱! 하면서 사라지면 멋지겠네요 




위에 내용을 해결하기 위해 여러가지 공부를 더 해야하며 대표적으로 GDI를 공부해야 이쁘게 만들 수 있을꺼 같습니다.

GDI를 공부하고 그 다음은 갤러그를 만들어봅시다. 아... 좀 어려우니까 스페이스 인베이더? 이제는 좀 한다고 책에 소스가 없어도 만들거 같습니다.

당연히 급조한 인베이더.(내가 갤러그보단 좀 더 쉽지)

어! 이상하다! 테트리스에서는 상관없었는데 비행기 움직임이 버벅버벅 느립니다-_-;
총알이 나갈때 잔상이 마구 생기네요.
총알을 다다다다다닷 눌렀더니 삐삐삐삐삐 키보드 에러음이 납니다-o-;;;;;


자... 이걸 해결하려면  Win32 API로는 힘들어요~  결국 DX로... 넘어가서 열심히 DirectDraw, DirectInput, DirectSound를 사용해야 할껍니다.  그런데 제가 게임 제작쪽은 여기까지밖에 공부를 안해봤어요. 더이상 설명하면 밑천이 들어나니까 이쯤에서 그만하고...ㅡ.ㅡ;;



이제 주저리주저리 늘어놓은 글의 정리를 좀 해보겠습니다.
 
틀린 표현이지만 완성된 문장을 말해본 학생들은 외국인과 대화(억지로 끼워맞춰가면서라도)가 가능하지만 완성된 문장을 말해보지 못하고 선생님이 물어보신 말에 억지로 책보고 대답했던 사람들은 결국 아무 말도 못하게 되더라는거죠.

프로그램도 마찬가지입니다.  퀘퀘묵은 아저씨 프로그래머들에게 물어보면 공부, 경력이 중요하단 말을 할껍니다.  여기서 경력이란 그냥 프로그램을 짜는게 아닌 어떤문제가 닥쳤을때 그 문제를 분석하는 능력과, 해결하는 능력과, 해결하려면 어디를 뒤져야 하는지... 하는 등의 능력을 보기 위해 확인하는겁니다.  
하지만 아무 고민도 안하고 책을  참고해서 만들어본 학생이 경력을 만들기는 쉽지 않죠.  틀려본적이 없거든요.(안틀렸는데 왜 고민하겠습니까-_-?)  하지만 본인이 직접 버그도 없에고 업데이트도 하고, 개선도 하려고 노력한 그 프로그램이 바로 하나의 완성된 프로젝트고 경력(인정은 안해줄지 모르지만)이 되는겁니다.

물론 그 프로그램(프로젝트)을 스샷도 뜨고, 만든 과정도 정리하고, 
개선한 부분도 정리해서 포트폴리오로 만들면 말이 달라지지만 말이죠.

이건 취업에 관련된 팁입니다.  이런게 중요하지 않아보이게 도둑방구처럼 나오는 핵심이란거죠.

결국 프로그램을 공부하는것에 가장 중요한점은 하나의 완성된 프로그램을 만드는것이라고 생각합니다. 그 프로그램이 잘 돌아가던 돌아가지 않던 말이죠(그레도 잘 돌아가는게 좋죠-_-)



사실 너무 부족한 설명입니다.  또한 게임개발이라고 하기엔 다른 모든 공부에 적용해도 될법한 내용이라 "놀게영"에 어울리지 않는 글일 수도 있구요.
하지만 학교에 있으면서,  이 일을 하면서, 이력서를 받아보면서(저희회사는 이력서를 받으면 메일로 공유합니다-_-) 주변 사람들이 조금 모자라다고 느낀점들을 좀 정리해서 적어봤습니다. 

마지막으로 한번만 더 강조하겠습니다.
아무튼 버그 투성이의 소스코드를 한번 타이핑해보고 넘어가면 안됩니다.  발전이 없죠~  
문제 생길 부분을 해결하고 개선할 부분을 찾아서 개선해봐야 합니다.

그렇지 않으면 ... 

형처럼 되고싶냐? (인권아저씨 죄송... 저보다 훨씬 훌륭하신분입니다)
 
그럼 전 이만 자러 가겠습니다.


반응형
,
Posted by 알 수 없는 사용자
잉 예약 걸어놨었는데 제대로 안 올라갔네요 ㅠ 지금이라도 올려봅니다.

선배 블로그에서 확률에 대한 글을 보고 충격과 공포에 빠졌음. 몬티 홀 문제나 Bertland's box도 재밌고 헷갈리기 쉬운 확률 문제인데 마지막 화요일에 태어난 아들 이야기는 정말 말도 안 되는 거 아닌가!? 문제는 다음과 같다.

어떤 집에 자식이 둘이 있다. 그 중 하나가 아들인데 화요일에 태어났다.
다른 한 명도 아들일 확률은?


정답은 1/2이 아니라 13/27이라고 함. 어째서 아들이 화요일에 태어났다고 해서 다른 애가 아들일 확률이 13/27로 줄어들지? 독립사건 개념은 어디에 처박은 거냐! 한 놈이 화요일에 태어났든 수요일에 태어났든 전혀 상관없어야 될 건데. 테이블 그려놓은 걸 보면 13/27이 맞는 것도 같은데...

아무리 그래도 일단 이건 내가 초등학교 때부터 받아온 산수 교육의 근간을 뒤흔드는 얘기이기 때문에 이 문제는 사기다라고 가정하고 시작했다. 뭔가 함정이 있는 게 틀림없음!

그러고나서 댓글과 문제를 곱씹다보니 슬슬 문제에 숨어있는 낚시가 보이기 시작하더라.

어떤 집에 자식이 둘이 있다. 그 중 하나가 아들이다. 다른 한 명도 아들일 확률은?

이 문제의 답이 1/2이 아니라 1/3이라는 것. 이 문제의 답 역시 화요일 문제와 똑같이 초등교육의 근간을 뒤흔들며 직관을 거스른다.

직관적으로 당연히 1/2이 나와야할 것 같은데 따져보면 1/3이 맞다. 둘 중 하나는 아들인데 다른 애는 뭘까? 했을 때 직관적으론 둘 중 하나를 찝었더니 걔가 아들인 상태를 생각하기 쉬운데 이러면 낚이는 거다.

문제에 제시된 상태는 한 명만 추출해서 본 상태가 아니라 두 자식을 모두 추출해서 본 상태다. 왜냐면 하나가 아들이라고 확실히 얘기하려면 둘을 다 봐야 그렇게 얘기할 수 있거든. 한 명만 봤는데 걔가 딸이면 어쩔 건가? 다른 애까지 두 명 다 확인해봐야 둘 중 하나가 아들이라고 얘기할 수 있는 상태가 된다. 문제의 함정은 바로 그 중 하나가 아들이다라는 말이 둘 다 관찰한 상태를 마치 한 명만 본 상태인 것처럼 속이는 것이었다. 하나가 아들이라는 말은 아들이 하나거나 둘이라는 말과 똑같은데 이렇게 얘기했었으면 훨씬 덜 낚일 듯.

함정을 파악하고도 이걸 다른 사람에게 어떻게 하면 쉽게 설명할 수 있을까 한참을 고민했는데 다음과 같이 트리형태로 경우를 모두 나열해서 설명하는 게 가장 좋을 것 같았다.




직관적으로 떠오르는 둘 중 하나를 봤더니 아들이더라, 다른 애가 아들일 확률은? 에 대한 해답. 0단계는 두 자식이 가질 수 있는 모든 상태이다. 1단계에선 둘 중 하나를 랜덤으로 선택해 추출한다. 까만 테가 둘러진 애가 추출된 애. 어느 쪽을 추출했느냐에 따라 경우가 두 갈래로 파생된다. 남남인 경우는 첫째를 선택하든 둘째를 선택하든 모두 추출한 애가 아들이므로 통과지만 남녀의 경우는 여자를 선택해서 본 경우는 배제된다. 하나를 봤더니 아들이더라를 만족시키지 못하기 때문. 그렇게 해서 다른 애는 뭘까? 라고 물어보는 상황에서 가능한 상태는 2단계의 4가지로 줄어든다. 그 중 다른 애가 아들인 경우는 2가지. 직관이 기대했던 독립사건의 50% 확률이다!




자 이제 문제의 그 둘 중 하나가 아들인데 다른 한 명도 아들일 확률은? 에 대한 해답. 사실 이 문제와 랜덤 추출 문제가 다르다는 사실만 깨달아도 일사천리인 듯-_- 둘 중 하나가 아들이라고 얘기할 수 있는 상태는 1단계에서 여여는 안 되니까 배제된다. 한 명만 추출해서 보는 게 아니니 경우가 파생되지 않음. 그리고서 보면 3가지 경우 중 남남 한 경우만 다른 한 명도 아들이라 얘기할 수 있음. 고로 1/3.

두 문제의 차이를 보면 남남을 선택할 때 랜덤 한 명 추출의 경우 얘를 골라도 되고 쟤를 골라도 되어서 남남의 확률이 2배로 뻥튀기 되는데 하나가 아들이라고 한 경우는 하나를 선택해서 보는 게 아니기 때문에 남남의 경우가 그대로 1배로 간다는 것.

바로 이것이 말도 안 되게 아들일 확률이 1/3, 13/27로 줄어드는 비밀이었다.

화요일 문제의 경우도 똑같이 확장해서 볼 수 있다. 직관적으로 한 명 랜덤 추출한 경우는 두 자식이 다 화요일생 아들일 때 얘를 추출한 경우도 해당, 쟤를 추출한 경우도 해당되어 경우의 수가 2인 반면 하나가 아들인데 화요일에 태어났다고 한 경우는 경우의 수가 1이라서 (표에서 크로스로 겹쳐진 부분) 13/27이 되는 것이다.


반응형
,
Posted by 알 수 없는 사용자

이번엔 조금 더 프랙티컬 한 주제를 다루어 보도록 하겠다. 지인들 중 적지않은 수가 잘못 알고있는 사실중 하나인 '인증서를 사용하는 것이 가장 안전한 암호화 방법이다'가 잘못 되었다는 것에 대해 이야기해 보고자 한다. 일반적으로 블럭 암호와 공개키 방식 암호로 이야기 되어지는 - 대칭 암호(Symmetric Cryptography)와 비대칭 암호(Asymmetric Cryptography)의 용도가 다르다는 것을 설명하는 것을 통해 각 방식이 사용되기에 적합한 상황에 대한 이해를 돕고자 한다.

  1. 스파이가 목숨을 걸고 운반하는 가방엔 뭐가 들었을까?

    드라마나 영화에 가끔 등장하는 
    이 아자씨가 목숨 걸고 운반하는 저 가방에는 뭐가 들었을까낭?

    스파이 영화를 보면 꽤 자주 나오는 것 중의 하나가 목숨을 걸고 배달 해야하는 골치 덩어리 가방이 하나 있다. 배달을 맡은 스파이는 가방과 자신의 손목을 수갑으로 연결해서 개고생을 하며 가방을 운반한다. 그런데, 자세히 보면 가방이 그닥 무겁지는 않은 것 같다. 대체 그 가방안에는 무엇이 들어있을까? 비밀 정보가 들어있을까? 그럴리는 없다. 무언가 비밀을 전달해야 할 일이 있을 때마다 스파이를 보낸다는 것은 발각의 위험도 높거니와 적에게 빼앗기면 그야말로 재미없는 일이다.

    비밀 정보를 안전하게 보내는 방법중 하나는 비밀정보를 암호화 한 다음에 암호화 된 정보와 암호를 푸는데 사용되는 정보를 따로 보내는 것 이다. 적에게 둘 다 빼앗기지 않는 한 문제가 발생하지 않는다. 위험성이 절반이 되는 것 이다. 게다가 암호화된 정보를 빼앗겼다면 암호를 푸는데 사용되는 정보를 보내지 않으면 된다. 암호화된 정보가 제대로 전달 되었다면 그때 암호를 푸는 정보를 보내면 된다.

    그러나 위의 방법역시 매번 스파이가 직접 가야 하기 때문에 인적 희생이 발생할 확률이 아주 높아진다. 보내야할 정보가 있을 때 마다 적진에 스파이를 두 명이나 매번 침투 시킨다는 것은 정말 힘들고 위험성도 많은 일이다. 둘 중 하나가 잡히면 다른 하나도 잡히게 될 가능성이 압도적으로 높아져 버린다.

    그러면 어떻게 해야 안전하게 정보를 전달 할 수 있을까요? 뿌잉뿌잉~~ 무선 통신을 이용해 데이터를 전달할 수 있게된지는 무지하게 오래 되었기 때문에 데이터를 무선으로 전달하는 것 자체는 어렵지 않~아요~ 전파를 이용한 무선통신은 1880년대에 발명 되었으며, 우리가 매일매일 사용하는 CDMA 방식은 1930년대에 개발된 것 이거든요. 그러니까 정보는 무선통신으로 날릴수 있어요~ 영화에 나오는 스파이 아저씨 들이 활동하던 2차대전 당시에는 무선으로 통신하는게 드믄일은 아니었답니다. 그러니, 암호문을 푸는 정보만 스파이 아저씨가 배달하면 돼요. 결국, 스파이가 목숨을 걸고 운반하던 그 가방 안에는 디코딩을 위한 코드 - 즉 복호화 키가들어 있었을 것 이예요.

    암호화된 통신을 하기 위해서 가장 먼저 해야하는 일은 공격자들이 키를 주고 받는 것이다. 안전하게 키를 주고 받는다는 것은 굉장히 어려운 일이고 많은 수학자들이 쉽고 안전하게 키를 주고 받기 위한 노력을 해왔고, 하고 있으며, 할 것 이다.


  2. 키를 전달하기 좋은 공개키 방식의 암호

    그러면 스파이의 목숨을 걸지 않고도 안전하고 쉽게 비밀 키를 상대방에게 넘겨주는 방식이 무엇이 있을까? 라는 고민을 수많은 수학자들이 고민을 때리기 시작했다. 물론, 이러한 암호화 방식에 가장 관심이 많았던건 정부기관이었다. 비싸게 기른 스파이가 암호화 키를 넘겨주려다가 붙잡히거나 저승으로 초 장기 출장을 가버리는 일은 정부기관 입장에선 그다지 선호할 만한 일이 아니었기 때문이다.

    그렇게 수많은 수학자들이 뇌세포를 작살내며 고민을 하다가 고안해낸 방식이 비대칭키 암호화 - 공개키 암호화 방식이다. 그 전까지는 암호화 할 때 사용하는 키와 암호를 다시 원 상태로 만드는 일을 할 때 - 즉, 복호화 할 때 사용하는 키가 같은 키였다. 그렇기 때문에 키를 전달하다가 빼앗기면 그것으로 끝이었다. 그에 반해서 비 대칭키 방식의 암호는 암호화 할 때의 키와 복호화 할 때의 키가 다르다.

    일반적으로 비 대칭키 방식의 암호는 한 쌍의 키로 구성이 되어있다. 한 쌍의 키를 A와 B라고 하면, 보통 A로 암호화 한 암호문은 B로 복호화 되고, B로 암호화 된 암호문은 A로 복호화 된다. 그리고, 키 A를 이용해서는 B를 알아내기가 아주 어렵고, 마찬가지로 키 B를 이용해서 키 A를 알아내는 것 역시 아주 어렵다. 일반적으로 두 키중 하나는 공개를 하고 다른 하나는 비밀로 보관을 하며, 공개를 하는 키를 '공개키 - Public Key', 비밀로 보관하는 키를 '개인키 - Private Key'라 부른다.

    공개키로 암호화 하면 개인키로만 복호화 할 수 있습니다.
    반대로, 개인키로 암호화 하면 공개키로만 복호화 할 수 있습니다.


    그렇기 때문에 공개키 방식의 암호를 사용하면 스파이는 몸만 침투하면 된다. 그 다음에 무선이던 무선이던 상관 없이 비대칭키 방식의 키중 하나 - 보통 누구든지 원하면 얻을 수 있다는 의미로 '공개키 - public key'라 부르는 키를 얻은 다음에, 원하는 정보를 암호화 해서 보내주면 된다. 위에서 언급 했듯이 비대칭 암호는 키 한쪽을 가지고 다른 키를 알아내는 게 아주 어렵기 때문에 키 한쪽을 가져가는 건 크게 문제가 되지 않는다.

    여기까지 읽고 나면 '키를 얻으려고 시도하는 놈을 잡으면 되지 않느냐?'라는 생각이 들 것이다. 그것이 어렵다는 것을 보이기 위해, 실제로 911 테러때 테러리스트들이 정보를 주고 받기 위해 사용된 방법 이라고 주장되고 있는 방법 하나를 소개해 보겠다. JPG 포멧은 손실 압축을 하기 때문에 중간 중간에 실제 이미지 데이터가 아닌 데이터가 끼어 있어도 표시되는 이미지의 퀄리티에는 크게 영향을 미치지 않는다는 점을 이용해서, 포르노그라피 이미지에 테러와 관련된 정보를 담아두고, 그 이미지를 통해 테러 시행에 대한 정보를 주고 받았다고 한다.

    예를 들자면, 소식을 주고 받을 때 "구글에서 '홀딱벗은 그녀'로 검색해서 나오는 여자중에 탄띠를 맨 여자"의 사진에 키를 포함해 두기로 약속했다고 하자. 설령 그 사실에 대해 미리 첩보를 입수했다 해도 홀딱벗은 그녀를 검색해서 이미지를 다운 받은 미국인을 체포 한다면... 남녀 불문하고 꽤 많은 사람이 잡혀 들어가야 했을 것 이다. 나무를 숨기려면 숲 속에 숨기라는 말이 있는 것 처럼, 흔히 존재하는 정보들 사이에 비밀 키를 숨겨둔다면 쉽게 찾을 수 없을 것이며, 찾는 사람이 많은 류의 - 주로 헐벗은 남녀의 사진속에 비밀 정보를 숨긴다면 그 사진을 다운받아 가는 사람중에 진짜 불순한 의도를 갖는 이가 누구인지 확인하기도 힘들다.

    이렇게 조낸 좋은 공개키 방식의 암호가 갖는 단점은 암/복호화 하기 위한 연산량이 많고, 충분한 안전성을 확보하기 위해서는 수천 비트에 해당하는 키를 사용해야 한다는 점이다. 기본적으로 대부분의 공개키 방식은 비슷한 근본 원리를 갖는다. 가장 많이 사용되는 RSA의 경우, 두 소수를 개인키로 사용하고, 두 소수를 곱한 값을 공개키로 사용한다[각주:1]. 그렇기 때문에 공개된 키를 소인수분해 해서 두 소수를 구하면 개인키를 얻어낼 수 있다. 그렇기 때문에, 가능한 큰 키를 사용해야 공격자가 공개키를 이용해서 개인키를 구하는데 많은 시간을 투자하게 되고, 공격에 성공하지 못할 수 있다. 예를 들어 공개키가 15라면, 누구든지 개인키가 3과 5라는 걸 쉽게 알아 낼 수 있을 것 이다. 그렇기 때문에 충분히 큰 값의 두 소수를 선택해야 안전해 질 수 있다[각주:2].  이 과정에서 큰 정수의 사칙 연산을 수행해야 하는데, 계산의 대상이 되는 정수값이 크면 클수록 연산시간이 많이 걸릴 수 밖에 없다. 또한, 더 안전하게 하려면 더 큰 소수를 골라야 하며, 더 큰 소수는 더 큰 키를 요구하게 된다. 최근에 가장 많이 사용되는 키의 크기는 1024비트 이며, 2048 비트 크기의 키를 사용하는 경향이 늘고 있다.

    공개키 방식 - 인증서를 이용하는 암호화 통신 방식에서 흔히 사용하는 암호화 방식이 암호의 안전성에 있어 뛰어나다고 생각하는 사람이 많지만 사실은 같은 크기의 키를 사용하는 블럭암호에 비해 안전성은 떨어진다.128비트의 AES와 2048비트의 RSA는 비슷한 안전성을 갖는 것 으로 간주된다[각주:3]. 아래 논문은 관련된 논문이다.

    Arjen K. Lenstra, Unbelievable Security: Matching AES security using public key systems, Proceedings Asiacrypt 2001, LNCS 2248, Springer-Verlag 2001, 67–86

    다음 링크를 통해 논문의 내용을 확인할 수 있을 것 이다.

    http://www.win.tue.nl/~klenstra/aes_match.pdf 

    위의 논문은 2001년에 발표된 논문이며, 실제 컴퓨터 성능의 향상 속도는 그 당시에 예측했던 것 보다는 덜 빠르게 발전한 것으로 알려져 있으므로, 위의 논문보다는 조금정도 안전하다는 가정을 할 수 있겠지만 안전과 관련된 문제는 비관적인 관점으로 볼 필요가 있다. 어찌 되었든, 공개키는 아무렇게나 뿌려도 상관이 없기 때문에  대칭키(Symmetric Key)를 사용하는 블럭암호와는 달리 키 전달을 위해 노력을 할 필요가 없다. 

    결론적으로, 키 전달이 쉽고 키가 안전하게 전달될 수 있을 것 이라는 것 때문에 때문에 공개키 방식을 많이 사용하는 것이지, 더 안전하기 때문에 공개키 방식을 사용하는 것은 아니다. 그러므로, 키가 공격자에게 빼앗기지 않으리라는 보장이 있다면, 공개키 방식을 사용하는 것 보다는 대칭키 방식을 사용하는 것이 같은 안전도를 갖는 경우에는 키의 크기가 작아지고, 같은 크기의 키를 사용하는 경우에는 더 안전한 대칭키 방식의 암호 - 블록암호를 사용하는 편이 더 좋다. 반대로, 키가 공격자에게 노출될 위험을 갖는다면 대칭키 방식을 사용하는 것이 나쁜 선택이 될 확률이 높다 할 수 있다.


*     *     *

다른 사람에 비해 실력이 떨어지는 주제에 비슷한 분량의 글을 쓰려고 하다보니 가랭이가 찢어졌습니다. 글을 쓰고 나서 내용을 확인하고, 논문 찾고 하다보니 시간이 많이 드네요. ㅡ,.ㅡa 앞으로는 스스로의 실력을 감안해서 글의 양을 좀 줄여 보도록 하겠습니다.

다음 번에는 블럭방식의 암호화의 특징에 대해 설명하고, PGP 방식이 어떤 식으로 동작하는지에 대해 설명을 하도록 하겠습니다.

*     *     *


  1. 물론, 구체적인 내용은 조금 다릅니다만, 큰 그림 안에서는 대충 맞습니다. 자세한 내용을 알기 원하시는 분은 http://ko.wikipedia.org/wiki/RSA_%EC%95%94%ED%98%B8 나 http://www.di-mgt.com.au/rsa_alg.html 를 참고하세요 [본문으로]
  2. 실제로 큰 두 소수의 곱을 소인수 분해하여 원래의 두 소수를 구하는 것은 어려운 일 이라는 것이 수학적으로 증명되어 있습니다. 그러므로 충분히 큰 값의 키를 사용한다면 공격자가 공격에 충분히 안전합니다. [본문으로]
  3. 이 내용은 Arjen K. Lenstra 의 논문에서 제시한 내용입니다. 논문에서 저자는 컴퓨터의 속도에 따라 각 암호화 방식이 깨지는 속도의 차이가 나기 때문에 2001년 당시의 하드웨어의 속도 향상의 추세를 놓고 볼때 2030년 까지는 128비트의 AES와 2048비트의 RSA가 비슷한 정도의 안전성을 가질 것 이라고 예측 했습니다. [본문으로]
반응형
,
Posted by 알 수 없는 사용자

안녕하세요. 자그마치 2달 정도를 연재를 쉬었던 rihwan (유인환)입니다.


음 오늘 쓰고 싶은 것은 실시간으로 진짜 Ambient Occlusion을 처리하는 것입니다. 근데 여기서 제가 보여드리는 방법은 사실은 실제로 적용 가능한 것은 아니며, 단지 가능하다는 것을 보여주며, 또 눈요기 정도는 가능하겠네요. 시작하기 전에 우선 CUDA와 Ambient Occlusion에 대해서 좀 설명을 드려야 겠습니다.


CUDA란?

그래픽 카드의 성능이 점점 발전하면서 그래픽 카드가 어느샌가 CPU의 연산 능력을 훌쩍 넘어버린 시대가 되어 버렸고, 그럼으로 인해서 CPU의 연산을 GPU에서 처리하고자 하는 시도가 2000년 넘어서부터 계속 되었죠. 그걸 그 당시에는 GPGPU (General Purpose Graphical Processing Units)라고 불렀고 그 당시 Shader를 사용해서 RenderTarget 텍스처에 계산 결과를 기록하는 방식으로 GPU의 연산 능력을 CPU가 사용하고 있었습니다.

사실 그래픽 카드 내의 GPU 연산 능력은 CPU에 비하면 상당히 떨어집니다. 한 1 Ghz 정도인데다가, 캐쉬 메모리는 1 KB도 안되는 정도로 약한 능력을 가졌습니다. 하지만 그래픽 카드는 어마어마한 장점을 가졌는데, 바로 GPU가 1개가 아니라는 점입니다. 그래픽 카드 내에는 요새는 512개 정도의 GPU (1 Ghz짜리)가 들어가고 있으며 곧 1024개 이상으로 증가할 예정입니다. 이렇게 엄청난 양의 병렬 GPU가 존재할 수 있는 이유는 어차피 그래픽 카드에서 처리하는 데이터는 주로 정점(삼각형)과 픽셀 단위이며, 이 데이터는 사실 모조리 완전히 병렬적으로 처리할 수 있었기 때문입니다. 그에 반해서 CPU의 경우는 GPU처럼 만들 수가 없었죠. 많아봐야 요새 16개의 CPU를 가질 수 있으려나요... 그 이유는 엄청나게 많은 명령어의 개수, L1 - L3 캐쉬 메모리,  메인 메모리, 컨트롤 명령, 동기화 등등을 가지고 있고 기존 시스템과의 호환성을 만족시켜야 하기 때문에 쉽게 병렬화 시킬 수가 없었습니다.

그리고 쉐이더 버전 1 - 3 당시였을 때, 사실 GPU는 매우 제한된 수의 명령어 집합(어셈블리 명령어)을 가지고 있었습니다. 그리고 캐쉬 메모리도 KB도 안될 정도로 작았던 것 등등 매우 GPGPU로의 변신은 매우 제한적이었죠. 하지만 2007년인가 2008년인가 상황이 급변합니다. NVIDIA에서 GPGPU가 발전 가능성이 있다는 사실을 깨닫고 아주 일반적으로 GPU의 연산 능력을 활용하는 프로젝트를 시작했고, 그렇게 해서 탄생한 것이 CUDA입니다.

CUDA는 C++등의 언어를 지원하고, C++과 거의 비슷하고 아주 약간의 변화를 주면 GPU 내의 임의의 메모리에 GPU를 이용해서 계산해서 계산 결과를 기록할 수 있습니다. 또한 CPU와 그래픽 카드 메모리 사이의 send & receive 함수 셋등을 지원하지요. 생각해보면 3 Ghz 짜리 CPU 4개 보다 1 Ghz 짜리 512개로 연산시키면 사실 연산 능력은 거의 수백배 차이가 날 것은 분명하겠죠. 심지어 GPU의 실수 계산 능력은 CPU와 비교했을 때 더 낳거나 거의 동급에 가까우니까요. 이 문서에서는 CUDA에 대해서 이렇게까지만 얘기드리고 궁금하신 분들을 위해서 책을 소개시켜드리겠습니다. "예제로 배우는 CUDA 프로그래밍" 이란 책이 매우 CUDA에 대해서 설명을 쉽게 잘해주고 있습니다 (왠지 책 장사하는 것 같군요...)

이번 글이 시작된 이유는 제가 한번 그럼 진짜 Ray를 활용하여 Ambient Occlusion을 CUDA에서 계산을 해봤기 때문입니다. 그리고 그 성능이 제 노트북에서 실시간으로 돌아갔기 때문이죠... 아래 링크를 한번 봐주시면 제가 작업했던 결과물이 나옵니다요.





실제로 Ray를 쏘아 진짜 Ambient Occlusion을 계산하고 있습니다. 실시간으로요!!!


Ambient Occlusion이란?

Ray Tracing등과 같이 Indirect Illumination을 계산하는 알고리즘은 사실 엄청나게 비싼 비용이 들어갑니다. 왜냐하면 Ray를 쏴서 Ray와 지형과의 충돌을 계산한 이후에 그 Ray가 어디로 반사 또는 굴절되는지, 그리고 어느 정도의 빛이 해당하는 재질에 흡수되고 반사되었는지를 계산하고, 다시 반사와 굴절 Ray를 쏴서 다시 지형과 충돌처리하고... 위와 같이 계속 재귀적으로 Ray를 쏴서 실제 해당하는 픽셀이 어떤 색상을 가지고 있는지 계산하기 때문에 엄청나게 비싼 연산입니다. 하지만 장점은 간접 조명을 표현할 수 있다는데 있죠. 빛은 다른 곳에서 팅기고 팅겨서도 눈으로 들어오게 되는데, 이런 간접 조명은 우리가 바로 느끼지는 못해도 전체 Scene에 엄청난 영향을 미치게 됩니다. 하지만 기존의 Lighting 연산들 Diffuse, Specular, Phong등등은 사실 간접 조명을 표현하지 못합니다. 단지 빛으로 부터 직접적으로 어떻게 들어오는지를 설명할 뿐이죠.

그렇다고 해서 Indirect Illumination을 진짜로 다 계산하자니 너무 비싸고 부드러운 그림자는 표현하고 싶고 해서 나온 것인 Ambient Occlusion입니다. 그리고 개념은 매우매우매우 명확하죠. "한 점이 있을 때 그 점의 주변(Ambient)에 빛을 가리는 물체가 많으면 그 점은 어두워야 하며, 주변(Ambient)에 아무런 차폐(Occlusion)이 없으면 그 점은 밝아져야 한다"가 기본 컨셉입니다.


(출처: http://www.interstation3d.com/tutorials/making_slow_decay/slow_decay_take07.htm)

위 이미지를 보시면 환경에 의해서 빛이 많이 가려지면 해당하는 점은 어두워지며, 가려지지 않으면 밝습니다. 우리 눈에 자연스럽게 느껴지지만 사실은 물리적으로는 사실이 아니며, 단지 그림자를 근사시킨 것이죠. 어쨋든 Ambient Occlusion은 매우 효과가 좋고 Indirect Illumination에 비해서 빠르게 계산할 수 있어서 자주 사용되게 됩니다. 처음에는 한 점에서 여러군데로 Ray를 다시 쏴서 어느 정도 차폐되었는지를 계산했었죠. (이 부분은 Ray Tracing과는 다릅니다. Ray Tracing은 재귀적으로 Ray를 계속 쏴야 하지만, Ambient Occlusion은 재귀적인 계산은 사용하지 않습니다.) 하지만 Ray를 쏘는 연산은 여전히 비싸기 때문에, 실시간으로 다시 Ambient Occlusion을 근사하는 방법들이 제시되었고, 요새는 그 방법이 게임에서는 널리 사용되고 있지요.


(출처: http://www.neilblevins.com/cg_education/ambient_occlusion/ambient_occlusion.htm)


그에 반해서 제가 처리한 방법은 우선 눈에서 Ray를 쏘아서 지형에 부딪치면, 해당하는 점에서 여러번 다시 한번 Ray를 쏘아서 주변에 의해서 그 부딪친 점이 얼마나 차폐(Occlusion) 되었는지를 거리의 비례해서 depth로 색상을 주었습니다. 위의 그림과 같지 진짜로 Ray를 쏘아 보내는 것이죠. 이렇게 진짜 Ambient Occlusion을 계산하는 것은 연산량이 극도로 높습니다. 하지만 CUDA로 연산을 했기 때문에 CPU 4개 코어를 모조리 사용한 것에 비해서 60배 가량 성능이 향상되었고 그로 인해서 실시간으로 처리된 것을 제가 업로드한 비디오에서 보실 수 있습니다. 사실 코드를 보는 것은 CUDA 코드로 인해서 매우 지저분하므로 실제로 정말 정말 보고 싶으시면 제게 이메일(rihawn 앳뜨 gmail 닷뜨 com)을 주시면 보내드리겠습니다.

반응형
,
Posted by ozlael


들어가며

이번에는 레벨 디자인에 관한 말씀을 드려보고자 합니다. 일개 코더 나부랭이가 기획에 대해 뭘 아냐구요? 죄송합니다 꾸벅 ㅠ 제가 뭐 이렇다 저렇다 할 철학이 있는건 아니고, 괜챦은 내용을 듣게 되서어 여러분께 소개해드리고자 합니다. 이번 GDC 2012때 레벨 디자인에 관한 세션인 "Level Design Case Studies: Trainyard and Cut the Rope"를 들었는데, 내용이 참 좋았습니다. 거기서 배운 교훈들을 여러분과 공유하고 싶어서 키보드를 끄적(?)거립니다. 


자료가 배포 되었네요.

http://www.gdcvault.com/play/1015344/Level-Design-Case-Studies-Trainyard


제목에서 이미 나와 있듯이 트레인야드와 컷더로프란 두 퍼즐 게임의 레벨 디자인에 관한 포스트모템입니다. 혹시 이 두 게임을 모르신다면 말로 설명드리는 것 보다는 아래 두 동영상을 보시는게 나을 것 같습니다.

컷더로프는 아이폰과 안드로이드용이지만 웹브라우져에서도 맛볼 수 있습니다 (http://www.cuttherope.ie/)

트레인야드는 현재 아이폰용으로만 출시되었습니다 ( http://itunes.apple.com/app/id348719156 )

보셨다시피 룰 자체는 매우 간단한 게임입니다. 컷더로프는 그냥 로프를 자르면 되고 트레인야드는 그냥 길만 만들어주면 되지요. 하지만 그 단순한 룰을 가지고 레벨을 잘 만들어 놓음으로써 많은 재미를 안겨다 주고 있는 게임들입니다. 바로 이 두 게임이 말하는 레벨 디자인의 원칙에 대해 정리를 해 볼까 합니다. 두 게임의 철학이 비슷해서 이야기 하는 순서가 원본과는 다를 수 있습니다. 게다가 제 사견도 섞어서 말씀드리고 있으므로 왜곡 없이 받아들이시려면 원본 자료가 공개되면 한번씩 보시길 추천드립니다.



요소 추가

새로운 퍼즐 요소를 추가하게 되는 경우 한 레벨에서 두 개 이상 한번에 추가하지 않습니다. 우리 모두 잘 알고 있는 앵그리버드를 예로 들자면 새의 종류를 한번에 모두 등장시키지 않지요. 처음에는 빨갱이만 등장시키고 게임 사용법을 가르치고 레벨을 넘기고 난 뒤에야 노랭이를 등장시키고  그 다음이 되어서야 깜댕이 등등을 차례 차례 등장시키지요. 모든 종류의 새를 한번에 등장시키고 컨트롤 하게 한다면 플레이어는 매우 힘들어 했을것입니다. 한번에 모든 요소를 등장시키지 않는 것은 난이도를 낮추고 사용자에게 게임을 가르치는 의미도 있지만, 요소를 조합함으로써 다양한 재미를 느낄 수 있는 레벨을 제공 할 기회도 되겠지요.

그럼 요소를 추가할 때도 그냥 한 레벨 당 하나씩 그냥 추가하면 되는 것일까요? 요소를 하나 하나 추가한다면 다음과 같이 순차적으로 추가를 하게 될 것입니다. 첫 레벨에는 A만 사용하고 다음 레벨에서는 B를 추가하고 그 다음 레벨에서는 C를 추가하겠지요.

A    →    + B    →    + B + C

하지만 다음과 같이 다양한 조합을 사용하면 더 효율적으로 사용을 할 수 있지요. 플레이어는 난이도가 급진적으로 올라는 것이 아니라 비슷한 난이도를 유지 하면서도 많은 요소를 접하게 되기 때문에 게임에 적응하는데 어려움이 없게 될 것입니다. 초반이나 튜토리얼 뿐 아니라 레벨을 계속 진행함에 있어서도 이러한 요소들을 조합함으로써 난이도를 제어하는 것이 가능합니다.

A    →    B    →    B     →    C    →    A + C    →    B + C    →    B + C



설명

튜토리얼 레벨이거나 새로운 요소가 추가되는 레벨이라면 반드시 그 원리를 설명해주어야 하지요. 다만 그때 그때 필요한 정보만 알려주어야 합니다. 2단계에서 B요소만 추가되었으면 B요소에 관한 설명만 해야지 쓸데없는 다른 요소들에 대하여 알려줄 필요도 없거니와 플레이어는 알고 싶지도 않을 것입니다. 

요소를 설명 해 줄 시 텍스트보다는 그림으로 설명 하는 것이 좋습니다. 앵그리버드는 새로운 새를 등장 시킬 때 마다 글자 하나 없이 이미지로 설명을 보여줍니다. 글자 하나 없어도 그 그림이 너무나도 명확하기때문에 바로 이해가 되게 설명을 해주고있습니다. 플레이어에게 정보 전달을 쉽게 할 수 있는 장점 외에도 개발자 입장에서는 로컬라이징에 대한 신경을 떨 써도 된다는 장점도 있겠지요.

사실 이미지에 대한 중요성은 게임 뿐 아니라 어느 분야에서나 공통적으로 하는 이야기입니다. 브레인 룰스의 저자인 존 메디나 박사는 여러 연구에 의해서 그림에 대한 인식룰은 글자의 두 배에 달하는 것이 증명되었다고합니다. 스티브잡스도 프레젠테이션에서 글자보다는 그림을 선호합니다. 글자를 사용하게 되더라도 최소한의 단어만 사용하지요.

설명해줘야 할 것이 복잡해서 그림만으로는 설명이 불가능하다면 글자가 필요하긴 하겠지만 최소한으로 줄여야 할 것입니다. 플레이 되는 과정을 동영상 등으로 보여준다면 금상첨화겠지요.



난이도

플레이어가 레벨을 넘기고 나면 다음 레벨을 기대하며 항상 배고픔을 느끼게 해 줘야 합니다. 이런 퍼즐류의 게임은 플레이어가 레벨 하나 하나 해결 할 때 마다 자신이 영리하다고 느끼게 되고 그로 인해 재미를 느끼게 됩니다. 그렇기 때문에 플레이어가 퍼즐을 풀고나서 "내가 어떻게 깬거지?"라는 생각을 갖도록 구성해서는 안됩니다. 그냥 "이것 저것 막 하다보니까 어찌어찌 되더라" 라는 느낌을 주는 것이 아니라, 퍼즐을 보고 플레이어가 해결 시나리오를 구성 할 수 있어야 합니다. 그렇기 때문에 레벨의 해결책은 논리적이고 명쾌하고 재현가능해 보여야 합니다. 그리고 실제 가능해 보이는 레벨을 구성해야 하겠지요.

장애물 역시 명확해야 합니다. 아래 그림을 보시면 사탕이 장애물을 피해서 어디로 가야 할 지 확실히 각인이 됩니다. 가시 장애물의 간격이 애매하게 좁아서 사탕이 지나갈 수 있을지 없을지 모르는 애매한 간격이 아니라 누가 봐도 지나 갈 수 있다고 판단되는 간격으로 설치 되어 있지요.

플레이어에게 지루함 대신 이러한 퍼즐을 해결하는 즐거움을 부여하기 위해 게임 레벨을 진행 할 수록 난이도가 증가합니다. 하지만 그 난이도의 증가를 무조건 일정하게 증가하게 두는 것 보다는 적당한 텐션을 두며 증가시기는 것이 좋습니다. 계속 계속 난이도가 높아지기만 한다면 플레이어는 그 난이도에 적응하지 못하고 쉽게 지쳐버릴 것입니다. 한 고비를 넘기고 나면 그 다음 레벨은 난이도를 조금 낮추어 플레이어가쉽게 지치지 않고 플레이를 진행 할 수 있도록 난이도가 구성되어야 합니다.

또 한가지 주의해야 할 점은 플레이어가 극악의 난이도에 좌절하게 두어서는 안된다는 것입니다. 가끔 어떤 게임을 보면 캐쥬얼 유저와 하드코어 유저를 모두 커버하기 위해 처음 난이도는 쉽지만 끝에는 거의 깨기 불가능한 난이도의 레벨을 두기도 합니다. 오로지 1%만이 클리어가 가능한 레벨을 게임 진행 과정에 두어서 나머지 99%가 플레이 진행을 못하도록 두는 것은 어리석은 짓입니다. 많은 플레이어가 마지막까지 진행을 해 볼 수 있도록 해야 합니다. 그리고서는 더 많은 레벨을 해 보고 싶은 배고픔을 느끼게 해야할 것입니다. 앵그리버드가 시즌을 지나 스페이스까지 나올 수 있는 이유중 하나가 그것에 있지 않을까 싶습니다.

하드코어 유저를 위한 레벨을 원한다면 보너스 레벨의 개념으로 두어야 할 것입니다. 플레이어가 "내가 똑똑해서 보너스 레벨을 깼어"라고 느끼는 것과 "내가 멍청해서 게임 진행이 안돼"라고 느끼는 것은 천지차이겠지요. 

또한 별점 및 랭크 개념을 두어 플레이어 스스로가 난이도를 조절 할 수 있게 두는 것도 좋은 방법입니다. 캐쥬얼 유저는 별점을 다 모으지 않더라도 레벨을 넘기는 것에 재미를 느끼며 진행하겠지만 하드코어 유저는 별점을 모두 모으려 노력하며 스스로의 난이도를 높이며 재미를 느끼겠지요.  



디바이스에 대한 고려

게임 엔진이나 하드웨어의 약점이 영향을 미치게 디자인 해서는 안됩니다. cut the rope는 안드로이드와 아이폰 뿐 아니라 PC에서도 플레이가 가능한 멀티플랫폼으로 제작되었습니다. PC에서는 마우스로 로프를 끊으면 되므로 섬세한 제어가 가능합니다만 스마트폰에서는 손가락으로 끊어야 하므로 PC처럼 섬세한 제어가 불가능합니다. 그렇기 때문에 애초에 로프를 충분히 길게 설치하여 플랫폼과 상관 없이 원활한 플레이가 가능하게 두었습니다. 

최근에는 대부분이 이러한 플랫폼에 대한 약점을 고려해서 개발을 하고 있습니다만 스마트폰 초창기에는 이에 대한 약점이 많이 발견이 되곤 했지요. 피쳐폰의 게임들을 그대로 포팅하면서 화살표 버튼을 화면에 올려버리는 바람에 손가락이 게임 UI를 가리게 되는 상황이 허다했습니다. 특히 감압식 디바이스가 존재하는 시기에는 게임 한판 하고나면 손톱이 빠질 것 같은 통증이 몰려오곤 했습니다. 망할 옴레기 요즘에는 그런 극단적인 현상까지는 찾아보긴 힘들지만 태블릿 폰 기준으로 만들어서 작은 스마트폰에서는 버튼 누르기가 힘든 게임들은 종종 보이곤 하지요.



데이터 기반

논쟁이 많긴 하지만 최근 게임 디자인들은 데이타 주도 개발에 많은 비중을 두고 있습니다. 테스터를 통해서 플레이어들이 어떤것을 힘들어하고 어떤 것을  재미있어 하는 지를 조사해야 합니다. 이미 많은 게임들이 포스트모템을 통해서 이러한 철학을 채용하며 개발을 하고 있습니다. 하프라이프의 개발사인 밸브의 경우는 테스터의 표정 변화까지도 기록을 하며 재미를 분석하기도 하고, 어쌔신크리드의 개발사인 유비소프트는 테스터의 이동 경로를 기록으로 남겨 레벨 디자인에 반영하기도 합니다. 건즈와 레이더즈의 개발사인 마이에트엔터테인먼트의 경우는 플레이어들의 케릭터가 죽은 위치를 히트맵으로 남겨 난이도 조절에 반영하기도 합니다.

하지만 플레이어의 피드백을 받을 시에는 주의 사항이 있습니다. 항상 플레이어들의 의견을 주시하고 피드백을 받고 개발을 해야 하는 것은 당연하지만 피드백을 생각없이 액면 그대로 받아들이면 안된다는 것입니다. 플레이어의 피드백을 받아들임에 있어서도 무엇이 본질인지 곰곰히 생각하고 반영을 해야 합니다. 이에 관하여 박일 저 위대한 게임의 탄생 2권에서는 가와사키 제트스키의 일화를 소개하고 있습니다. 

제트 스키를 개발한 가와사키(Kawasaki)사는 제트 스키 경험을 개선하기 위해 무엇을 해야할지 사용자들에게 물었다. 사용자들은 측면에 여분의 패딩을 추가해서 제트 스키를 서서 탈 때 자세가 더 편안하기를 원했다. 회사는 고객들이 요청한 것을 제공하는 데 집중을 했다. 그 동안 다른 제조사들은 앉아서 타는 모델을 개발했고, 가와사키를 시장 최고 자리에서 끌어내리게 되었다. 고객들이 원한 것은 제트 스키 이용시 더 편한 기립 자세였지만 그들은 앉아서도 탈 수 있다는 생각은 해내질 못했다. ‘앉아서 타는’ 모터싸이클 제조 업체였던 가와사키까지도. [내용출처link]



마치며

하드웨어 및 소프트웨어 기술은 눈이 부시게 빠른 속도로 발전하고 있습니다. 그리고 이에 맞게 게임 산업 역시 다른 산업 못지 않는 빠른 속도로 발전을 하고 있습니다. 하드웨어 기술이 발전함에 따라 게임을 즐길 수 있는 플랫폼의 영역이 넓어지고 있고 그 성능 또한 빠른 속도로 증가하고 잇습니다. 그 성능에 맞춰서 소프트웨어 역시 높은 퀄리티를 뽑아 낼 수 있게 진화하고 있습니다. 하지만 게임의 본질은 이런 하드웨어나 소프트웨어가 아니라 컨텐츠일 것입니다. 재미 요소를 찾아내고 재미있는 컨텐츠를 제작하는 능력이야 말로 제일 중요한 기술이 아닐까 싶습니다. 이런 디자인 기술은 직렬 직군 상관 없이 게임 개발자라면 항상 관심을 가지고 봐야한다는 생각에 여러분께 소개를 해드렸습니다만 재미는 있으셨는지 모르겠습니다. 지루한 글 끝까지 관심가지고 읽어주셔서 감사합니다. 


반응형
,