한국어
    • 한국어
    • ENGLISH
    • 日本語
    • 中文-繁體

    2023.07.06 The Originality

    Server Programmer, 변세진

    〈TECH TRACK〉 시리즈는 엔씨가 개발 중인 게임의 개발자들을 조명합니다. 게임 개발에 필요한 다양한 직무와 하는 일, 그리고 전문가가 되기 위해 쌓아온 커리어패스를 살펴보세요.

    이번 주인공은 엔씨의 신작 <THRONE AND LIBERTY>에서 서버 프로그래머로 일하고 있는 변세진 님입니다.

    THRONE AND LIBERTY | 엔씨의 신작 오픈월드 MMORPG 게임으로, 입체적인 세계관과 지형과 환경 요소에 따라 전투 구도가 변화하는 다채로운 플레이가 특징이다.

    TRACK 1 | my CAREER

    게임 세계의 시스템을 설계하고, 구현하는 일

    생활감이 살아있는 NPC를 만들어야 한다

    ‘NPC 같다’라는 말이 밈처럼 쓰인 지 꽤나 오래됐다. NPC는 ‘Non-Player Character’의 약자로 플레이가 불가능한 캐릭터, 즉 항상 고정된 위치에서 입력값대로만 움직이는 캐릭터다. 때문에 종종 따분한 사람에게 ‘NPC 같다’라는 말이 쓰이곤 한다. 나는 게임서버팀에서 NPC의 서버 시스템을 설계하고, 움직임과 전투 등의 행동을 결정하는 시스템을 구현하는 NPC AI를 맡고 있다. 따분한 캐릭터처럼 보이지만 실은 어떻게 입력값을 설정하고 얼마나 디테일을 더하느냐에 따라 같은 NPC도 천차만별로 디벨롭할 수 있다. 때문에 나는 NPC 같지 않은 NPC를 고민한다.

    프로그래머는 귀찮은 것을 싫어한다

    사실 프로그래머의 일은 어떻게 하면 자동화할 수 있을까 하는 고민이 8할인 것 같다. 자동화가 일의 능률과 최적화랑 직결되기 때문이다. 우리 팀도 서버와 관련하여 자동화할 수 있는 지점을 다양하게 고민하고 있다.

    그중 서버에서 클라이언트 없이 구동될 수 있도록 PC BOT 기능을 구현한 작업이 특기할 만하다. 이전에는 여러 사람이 파티를 맺고 보스를 잡는 상황을 테스트하려면 여러 개의 클라이언트를 띄워야 했다. 여러 클라이언트를 조작해야 하므로 많은 리소스가 필요했다. 그러나 지금은 자동화하는 BOT을 띄워서 단 하나의 클라이언트로도 테스트할 수 있게 개발했다. 나아가 튜토리얼 구간에 콘텐츠를 자동으로 따라가며 플레이하는 BOT도 만들었다. 이 자동화 테스트 덕분에 지난해 서버팀의 업무 효율이 극대화되었다. 해당 기능을 이용해서 콘텐츠를 구현하기도 하고 PC 부하 테스트도 하고 있다. 이 BOT은 다른 팀도 유용하게 사용하고 있는데, 여러 사람의 리소스를 아껴주고 있다는 생각이 들어 뿌듯한 결과물 중 하나다.

    CAREER PATH | ‘서버 프로그래머’가 되기까지

    나의 커리어는 사실상 끊임없는 공부의 연속이었다. 대학교 다닐 때 게임 제작 동아리에 들어가서 Cocos2d와 Unity로 게임을 만들고 DirectX 스터디도 하는 등 게임 관련 분야를 많이 공부했다. 이 시기에 게임 개발자들을 만날 기회들이 있었는데, 게임 개발자에 대한 당시의 동경이 지금까지 개발 커리어를 이어온 원동력 아니었나 싶다. 대학생 때는 특히 그래픽스 과목을 좋아했고, 학생들에게 튜터링해주기도 했다.

    첫 직장으로 엔씨에 입사하여 게임 클라이언트팀에서 3년간 일했고 이후 서버팀으로 옮겨서 일하고 있다. 신입 때 실무에 바로 투입되었지만 혼자서 공부해야 하는 것이 많았다. 처음 몇 달간은 매일 퇴근 후 800페이지 정도 되는 C++ Programming 책을 읽었다. 클라이언트에서 서버 개발로 직무를 옮겼는데, 이 과정에서도 계속 세미나를 찾아 듣거나 혼자 공부하는 시간을 많이 들였다. 클라이언트와 달리 NPC는 수천, 수만 개가 존재하기 때문에 NPC에 영향을 미치는 요인을 한 개만 바꿔도 전체에 영향이 간다. 서버팀으로 옮긴 후 이 멀티 스레드 환경을 생각하면서 프로그래밍해야 하는 일이 쉽지 않았다. 그만큼 퍼포먼스를 더 자주, 다양하게 체크해야 했다. 서버팀에서 일한 시간이 길어진 이제야 서버 개발자의 눈으로 바라보는 데 익숙해진 것 같다. 지금껏 공부에 들인 시간이 헛되지 않았던 것 같다.

    TRACK 2 | my PROJECT

    디테일이 전체 그림을 좌우한다

    기술력을 바탕으로 새로운 플레이를 그리다

    〈TL〉에 처음 합류했을 때 가장 놀란 점은 거대한 스케일 안에서도 각 팀이 무수한 디테일을 추구하고 있다는 것이었다. 트리플 A 게임에 맞게 퀄리티를 높이기 위해 계속 연구하고 수정하는 작업을 반복한다. 〈TL〉에서는 높낮이 차가 큰 지형을 이용하여 플레이하거나, 움직이는 물체나 시시각각 변하는 지형 위에서 전투하는 등 기존 MMORPG에서 보기 힘들었던 새로운 시도를 많이 하고 있다. 새로운 개념과 플레이 방식을 도입하는 만큼 이를 구현하는 디테일한 요소들에도 많은 공을 들이고 있다. 프로젝트의 기조에 맞게 내가 맡은 NPC AI 기능을 구현하는 과정에서도 디테일한 개성과 자연스러움을 살리기 위해 심혈을 기울이고 있다.

    NPC에 개성을 더하다

    (<TL> 동물, 사람, 좀비의 캐릭터 배회 프론트뷰 영상)

    현실 세계의 인간과 동물은 저마다의 걸음걸이가 있다. 그렇다면 인간 NPC, 동물 NPC도 남녀노소 혹은 종에 따라 걸음걸이와 자세가 달라야 하지 않을까. 하물며 좀비까지도. 사람과 좀비가 배회하는 모습, 그리고 네 발 달린 동물이 배회하는 모습을 각각 다른 움직임으로 표현할 수 있도록 개별적 개성을 살리고자 했다. 동물은 부드러운 커브를 돌면서, 사람은 직선으로, 좀비는 비틀비틀하면서 걷도록 만드는 것이 과제였다. 널리 쓰이는 배회 행동 알고리즘으로 기본 배회 활동을 만들고 노이즈를 부드럽게 생성해서 곡선 이동과 직선 이동 등 여러 타입을 만들었다. 여기에 데이터로 수치를 조금씩 조정할 수 있게 만들어서 기획팀에 전달했다. 플레이어는 느끼지 못할 수도 있을 만큼 디테일한 기획이었지만, 그처럼 세세한 면에서의 차이가 모일 때 게임의 전체 퀄리티가 높아질 것이다.

    자동으로, 그러나 자연스럽게

    개발 초기에는 NPC가 목표 지점까지 이동하는 과정에서 서로 충돌하거나, 도보로 자연스럽게 경로를 설정하지 않는 경우가 있었다. 전체 오픈 월드 안에 있는 모든 NPC의 이동 경로를 하나하나 설정해주는 것은 사실상 불가능하다. 때문에 NPC가 목표 지점까지 자동으로 이동할 수 있도록 만들어야 한다. 단, 자연스럽게.

    NPC는 Navigation Mesh(내비게이션 메시1)를 사용해서 이동한다. Navigation Mesh는 기본적으로 흙길과 보도를 구분하지 않기 때문에 기획자들이 목표 지점까지 가는 그래프 경로를 깔아줘야 한다. 그런데 이 경우 NPC가 서 있는 지점에서부터 그래프 경로의 시작점을 찾는 과정이 문제가 된다. 바로 앞에 두고도 빙 돌아서 가거나 골목으로 가는 등 부자연스러운 이슈가 발생하는 것이다. 때문에 그래프의 시작점을 점이 아니라 선으로 영역을 넓혀, 캐릭터가 보다 쉽게 그래프에 가 닿을 수 있도록 수정해주는 작업이 필요했다. 이처럼 자동으로 이동해서 공수를 줄이되, 자연스럽게 행동하는 NPC를 만들기 위해 NPC AI 기능을 계속 폴리싱하는 작업을 거듭하고 있다.

    1게임 월드 내에서 이동할 수 있는 영역을 뜻하며, 내비메시를 사용하여 한 위치에서 다른 위치로 이동할 수 있는 경로를 찾을 수 있다.

    TRACK 3 | my ENVIRONMENT

    한 방향으로 나아가기 위한 〈TL〉의 조감도

    여러 사람의 관점에서 더 넓게 보기

    우리 팀은 애니메이션, 네트워크, 의료기기 개발, 전자 등 배경이 다양한 사람들이 모여 있다. 커리어가 각기 다른 사람들이 모여 있다는 것은 다양한 관점을 접할 기회가 많다는 뜻이기도 하다. 우리 팀은 아이디어를 디벨롭하고 의사 결정하는 데 이 점을 적극 활용하고 있다.

    최근 팀에서 기존에 사용하던 Rule Based AI를 대체할 만한 새 알고리즘이 필요해졌다. 새로운 알고리즘을 찾아야 한다는 방향성이 결정된 후에는 의사 결정을 위해 팀원들이 발표하는 방식을 택했다. 각자 자신이 생각하기에 베스트인 알고리즘을 리서치하고 발표하는 자리를 마련했다. 배경이 다양한 사람들이 모여 있어서 그런지 FSM, HFSM, GOAP 알고리즘 등 다양한 대안들을 제시했다. 각 의견은 연차나 경력과 관계없이 동등하게 검토되었고, 어느 대안이 가장 효율적일지를 두고 자유롭게 토의하는 시간을 가졌다. 그 결과 Behavior Tree로 결정되었다. 직접 리서치하고 논의하는 시간을 보내면서 사용하는 알고리즘에 대한 이해도가 높아지고, 팀원들끼리 한 방향을 향해 함께 노력하며 나아가고 있다는 느낌이 들어서 유익했다.

    함께 내다볼 수 있는 창구를 내다

    실무자로서 눈앞에 놓인 일감에만 집중해서 처리하다 보면 조직의 일부분으로 소모되고 있다는 느낌이 들 때가 있다. 그럴 때 전체 프로젝트의 시각을 공유받는 것이 아주 중요하다고 생각한다. 다른 조직에서는 1년에 한 번 할 법한 전체 조직 단위의 미팅을 〈TL〉에서는 3개월에 한 번 정도 연다. 더군다나 〈TL〉이 규모가 큰 프로젝트임을 감안하면 꽤 이례적이다. 몇백 명 가까운 사람이 모여 전체 방향성과 현재 마일스톤, 코어 시스템 변경 등에 관해 공유한다. 실무자 입장에서는 자신의 일에만 매몰되기 쉬운데, 전체 상황을 파악하는 이 자리는 업무 능률뿐 아니라 소속감과 동기를 높이는 데 유의미한 시간이 된다.

    또한 〈TL〉에 소속되었다면 팀이나 직무에 국한되지 않고 누구나 플레이에 대해 피드백할 수 있는 창구가 운영되고 있다. 실무자의 관점에서는 놓칠 수 있는 부분을 다른 팀분들이 플레이어의 시각으로 바라보면 발견하게 되는 이슈들이 있다. NPC AI 기능을 구현하는 과정에서도 해당 피드백 창구의 도움을 왕왕 받고 있다. 넓고 다양한 시야에 관한 공유가 개인과 조직의 성장에 아주 중요한 자양분이 된다는 것을 피부로 느끼고 있다.