Version: 2019.4
언어: 한국어
그래픽스 방법론
렌더링 최적화

스크립트와 게임플레이 방법론

이 섹션에서는 모바일 개발자들이 게임의 실행 속도를 높이기 위해 코드를 작성하고 구조를 짜는 방식을 설명합니다. 핵심 아이디어는 게임 설계와 최적화가 알고 보면 별개의 절차가 아닙니다. 게임을 설계할 때 내리는 결정이 게임을 재미있고도 빠르게 할 수 있습니다.

과거 예제

플레이어가 화면에서 발사를 한 번만 할 수 있고 재장전 속도도 타이머가 아니라 탄환이 명중했느냐 아니냐 여부에 좌우되었던 옛날 게임을 기억합니다. 오브젝트 풀링(object pooling)이라는 기술은 메모리 관리를 간편하게 해 프로그램이 더욱 부드럽게 실행되게 합니다.

Space Invaders의 제작자는 RAM 용량이 작아서 프로그램이 사용 가능한 이상의 메모리를 할당하지 않는지 확인해야 했습니다. 플레이어가 1초마다 발사하고 재장전 시간을 0.5초로 줄이는 파워업을 제공하는 경우, 최대한 빨리 발사를 하고 탄환도 모두 오랫동안 체공한다면 발사체에 할당할 메모리 공간이 충분한지를 확인할 필요가 있었습니다. 충분히 문제가 될 수 있는 상황이었기 때문에 제작자는 다른 방법을 취했습니다. 발사체 하나를 할당하고 그대로 두는 대신, 발사체가 소멸되면 간단히 비활성화하고 위치를 변경한 후 다시 발사되면 활성화했습니다. 발사체가 메모리에서 동일한 공간에 살아있기 때문에 이동하거나 계속 지우고 재생성할 필요가 없습니다.

최적화 또는 게임플레이의 핵심

현실적이지는 않지만 재미있는 일입니다. 외계 침입자가 지상에 가까워지면 마치 영화나 소설의 클라이막스처럼 긴장이 최고조에 달합니다. 침입자들이 다가오는 인접도는 능숙한 플레이어에게 거의 동시적인 재장전 시간을 주며 플레이어는 완벽한 시기에 발사 키를 눌러 기적적으로 지구를 지킵니다. 훌륭한 게임 디자인은 대화형의 이야기와 이를 작동시키는 배경 기술 사이의 절묘한 공간에서 탄생합니다. 이처럼 환상적이고 재미가 있으며 효과적인 게임을 구상하기란 어려운 일입니다. 코드의 세부 계획과 사용자의 상호작용은 꽤 거리가 있고 매우 까다로워 둘을 결합해 신선하고 재미있는 결과물을 만들기까지 상당한 사고와 실험이 필요하기 때문입니다.

상호작용과 더불어 모바일 하드웨어에서 동시에 멋진 플레이를 할 수 있는 게임을 만들기 위해 각각의 요소를 세세하게 계획하기란 어렵습니다. 그보다는, 실험을 하는 도중에 두 요소가 조화를 이루는 “보석”을 우연히 발견할 가능성이 높습니다. 그렇다고 하더라도 하드웨어에서 코드가 어떻게 실행되는지 제대로 이해하는 것은 도움이 됩니다. 오브젝트 풀링이 더 나은 이유에 대한 자세한 기술적 설명을 읽고, 또 메모리 할당을 이해하려면 스크립트 최적화 페이지를 참조하십시오.

X는 모바일에서 빠르게 실행됩니까?

게임 작업에 착수한 경우를 가정해보겠습니다. 플레이어들에게 다양한 동작과 현란한 볼거리로 깊은 인상을 남기고자 합니다. 그런 게임은 어떻게 계획해나가야 합니까? 어디가 한계인지 어떻게 알 수 있습니까? 코인이 몇 개인지, 좀비가 몇인지, 상대 자동차가 몇 대인지 등 게임 용어는 또 어떻습니까? 모두 게임을 어떻게 코딩하느냐에 달려 있습니다.

일반적으로 자신의 게임 코드를 쉽고 가장 일반적이며 다목적 방식으로 작성하면 퍼포먼스 문제에 훨씬 일찍 부딪칩니다. 게임을 실행할 때 특정 구조체와 트릭에 의존하면 할수록 시야를 넓히고 화면에 더 많은 요소를 넣게 됩니다.

쉽고 다목적이지만 느립니다

  • 2D 게임에서는 리지드바디가 2차원으로 제한됩니다.
  • 발사체에 리지드바디가 있습니다.
  • 인스턴스화를 사용하고 많이 파괴합니다.
  • 수집품이나 캐릭터의 개별 3D 오브젝트가 많습니다.
  • 매 프레임마다 연산을 수행합니다.
  • GUI나 HUD에 OnGUI를 사용합니다.

복잡하고 제한적이지만 빠릅니다

  • 자신만의 2D 게임 물리 코드를 작성합니다.
  • 발사체에 대한 충돌 검사를 스스로 처리합니다.
  • 인스턴스화와 파괴 대신 오브젝트 풀링을 활용합니다.
  • 단순한 오브젝트를 나타내기 위해 파티클에 애니메이션화한 스프라이트를 사용합니다.
  • 몇 프레임에 한 번씩 복잡한 계산을 수행하고 그 결과를 캐싱합니다.
  • 커스텀 GUI 솔루션입니다.

예제

화면 속에서 수백 개의 동전이 회전하고 동적으로 빛나며 수집 가능한 상태를 한번에 구현

  • NO: 각각의 동전이 회전하고 수집이 가능한 리지드바디와 스크립트를 가진 별도의 오브젝트입니다.
  • YES: 동전은 애니메이션화한 텍스처가 있는 파티클 시스템으로, 한 스크립트가 모든 동전의 충돌 테스트를 하며 광원으로부터의 거리에 따라 컬러를 설정합니다.
    • 예제는 스크립트 최적화 페이지에서 구현되었습니다.

커스텀 빌드한 소프트 바디 시뮬레이션

  • NO: 월드 도처에 베개가 널려있어 던지고 쌓을 수 있습니다.
  • YES: 캐릭터가 베개이고 하나만 있으며 상황이 어느정도 예측 가능합니다(오로지 구체 및 축에 정렬된 큐브와 충돌). 기능이 완벽하지 않은 소프트바디 시뮬레이션을 코딩할 수도 있지만 인상적이면서도 빨리 움직이는 듯 보입니다.

적 캐릭터 30명이 플레이어를 향해 한꺼번에 발사하는 상황

  • NO: 각각의 적마다 스킨드 메시가 있고 무기는 별도의 오브젝트이며 리지드바디 기반의 발사체가 발사될 때마다 인스턴스화합니다. 각각의 적마다 같은 편의 상황을 복잡한 AI 스크립트에 반영해 매 프레임마다 실행합니다.
  • YES: 대다수의 적이 멀리 있고 하나의 스프라이트로 대표되거나 적이 2D이면서 소수의 스프라이트입니다. 적의 모든 탄환은 동일한 파티클 시스템으로 그려지며 기초적인 물리에 불과한 스크립트로 시뮬레이션됩니다. 각각의 적은 섹터의 다른 적의 상황에 따라 AI 상태를 1초에 두 번 업데이트합니다.

최적화를 하는 방법과 이유

스크립트 최적화 페이지를 참조하십시오.

그래픽스 방법론
렌더링 최적화