Game teardown

천 번 타점: 유니티의 이벤트 기반 입력 시스템이 Backyard Baseball 2026에서 컨트롤을 구현하는 방법

MATTHEW WOJTECHKO / MEGA CAT STUDIOSLead Game Developer
Jun 22, 2026
Backyard Baseball 2026_Mega Cat Studios and Playground Productions_Rebinds
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.

이번 글은 Mega Cat Studios가 실제 상업용 게임 개발에서 발생하는 문제에 대한 Unity 전문 지식과 해결책을 공유하는 블로그 시리즈의 두 번째 글입니다. 이 글에서 Matthew Wojtechko는 Unity의 이벤트 기반 입력 시스템 패키지를 활용하여 응답성을 향상시키고 비효율적인 폴링을 줄이는 방법을 살펴봅니다.

이 시리즈의 첫 번째 게시물을 읽어보세요: Unity 워크플로 확장: 중대형 프로젝트에서 얻은 교훈

게임 개발을 시작할 때 입력 기능을 가장 먼저 구현하는 경우가 많은데, 그럴 만한 이유가 있습니다. 캐릭터를 움직이거나 메뉴를 탐색할 수 없다면 다른 모든 것은 의미가 없습니다. 하지만 "일단 작동하게 만들자"라는 입력 코드는 영구적으로 고정되는 경향이 있습니다. 몇 줄의 간단한 폴링 코드로 시작하더라도, 실제 요구 사항(예: 키 재지정 가능한 컨트롤이나 로컬 멀티플레이어)이 발생하면 조용히 무너져버리는 취약한 코드베이스로 변질될 수 있습니다.

메가캣 스튜디오 에서는 프레임 단위로 지속적으로 확인하는 방식(폴링)에서 이벤트 기반 워크플로로 전환했습니다. 점프스케어 반응에 대한 QTE를 개발하든, 파이브 나이츠 앳 프레디: 구덩이 속으로 또는 Backyard Baseball 2026 의 로컬 멀티플레이어 모드에서 Unity의 입력 시스템 패키지를 활용하면 게임 플레이가 반응성이 뛰어나고 유지 관리가 용이합니다.

입력값을 프로그래밍할 때 다음과 같은 기능들을 최우선으로 고려하지 않으면 나중에 지원하기가 어려워집니다.

  • 다양한 입력 장치(키보드, 컨트롤러, 터치)
  • 재바인딩 가능한 컨트롤
  • 게임플레이 입력과 충돌하지 않는 UI 탐색
  • 로컬 멀티플레이어
  • 타이밍이 중요한 게임플레이

이 글에서는 입력 시스템을 사용하여 이러한 문제를 해결하는 방법을 단계별로 설명하겠습니다. 이 과정에서 우리는 건축에 대해 이야기할 것입니다. 우리 프로젝트가 확장될 수 있도록 하는 요소와 자체 무게를 견디지 ​​못하고 무너지는 경향이 있는 요소는 무엇인지 살펴볼 것입니다.

유니티의 입력 시스템이 진화했습니다. 저희도 마찬가지입니다.

Unity 2020년에 새로운 입력 시스템을 출시했을 때, 그것은 단순히 기존의 Input.GetAxis 및 Input.GetButtonDown 함수를 개선한 것만이 아니었습니다. 이는 이벤트 기반이며, 기기에 구애받지 않고, 플레이어의 의도에 초점을 맞춘 근본적으로 다른 입력 방식 입니다. 다음은 우리가 내면화한 핵심 개념들입니다.

행위

행동은 구성 요소입니다. Backyard Baseball 2026 에서는 다음과 같은 모습입니다.

  • 액션 맵은 입력 컨텍스트를 나타냅니다.
    • 게임플레이
    • 메뉴
    • 디버그/개발자 도구
  • 행동은 플레이어의 의도입니다.
    • 그네
    • 슬라이드
    • 스틸 베이스
    • 확정
    • 취소

우리 게임 코드는 기기가 아닌 의도를 기반으로 작동합니다. 어쩌면 플레이어가 스페이스바를 누를지도 모릅니다. 아니면 PlayStation 컨트롤러의 십자 버튼을 누르는 걸지도 모르죠. 어떤 경우에도 우리 플레이어 코드는 "스윙" 동작이 수행되는 시점만 신경 쓰면 됩니다. 그러한 추상화 수준은 우리의 삶을 더 편리하게 만들어 줍니다.

바인딩

바인딩은 여러 제어 방식을 추가적인 복잡성 없이 처리할 수 있도록 해주는 구체적인 장치-액션 매핑입니다. 하나의 동작이 여러 기기에서 오는 여러 입력에 반응할 수 있습니다.

이렇게 하면 코드를 불필요하게 분기시키지 않고도 키보드+마우스, 컨트롤러, 터치 및 접근성 설정을 모두 지원할 수 있습니다. 에디터와 런타임 모두에서 액션을 쉽게 다시 바인딩할 수 있습니다. 이 부분은 뒷부분에서 더 자세히 살펴보겠습니다.

민감도

기존의 정보 수집 방식은 여론조사에 의존합니다.

if (Input.GetButtonDown("Swing Bat"))
{
    SwingBat();
}

간단하지만, 입력 감지를 프레임 루프에 연결합니다. 입력이 프레임 속도보다 빠르게 눌렸다가 떼면 입력이 전혀 인식되지 않을 수 있습니다.

격투, 리듬, 정밀한 플랫폼 게임처럼 빠른 반응 속도가 중요한 게임에서는 입력이 일관되지 않으면 게임 경험이 망가질 수 있습니다. 그리고 게임 진행 속도가 느린 경우에도, Backyard Baseball 2026 에서 타자가 중요한 스윙을 하는 순간처럼 결정적인 순간에 입력값을 놓치면 치명적일 수 있습니다.

입력 시스템은 이벤트를 중심으로 설계되었습니다. 한 번만 구독하면 입력이 발생할 때 Unity 알림을 보내줍니다. 이렇게 하면 CPU 오버헤드가 줄어들고 논리가 단순화되며 입력 누락이 문제가 되지 않습니다. 버튼을 누르고 떼는 것부터 축 값 변경까지 모든 것이 대기열에 저장되므로 입력이 손실되는 일은 없습니다. 가변 프레임 속도 또는 프레임 속도 미만의 속도에서도 이러한 이벤트는 순서대로 처리되어 콜백 함수에 안정적으로 전달됩니다.

결과는 어땠을까요? 완벽한 입력.

로컬 Multiplayer

로컬 멀티플레이어는 입력 시스템이 기존 입력 관리자보다 훨씬 유리한 영역 중 하나입니다.

PlayerInput 컴포넌트 및 제어 방식을 사용하면 다음과 같습니다.

  • 각 플레이어는 자신만의 액션 인스턴스 갖습니다.
  • 기기들은 동적으로 페어링될 수 있습니다.
  • 분할 키보드, 여러 컨트롤러 또는 하이브리드 설정이 "그냥 작동합니다."

중요한 점은 플레이어 조작이 의도적으로 분리되어 있다는 것입니다. 더 이상 기기 색인이나 플레이어 간 입력 충돌이 발생하지 않습니다. 이는 Mega Cat 팀이 Backyard Baseball 2026 에 로컬 협동 플레이 기능을 구현했을 때 큰 이점이었습니다.

프로젝트에서 로컬 멀티플레이어 기능을 구현할 가능성이 있다면, 입력 시스템 패키지부터 시작하는 것이 나중에 많은 재작업을 줄이는 데 도움이 될 수 있습니다.

입력 시스템 덕분에 로컬 멀티플레이어 기능을 기존 입력 관리자를 사용할 때보다 훨씬 쉽게 구현할 수 있었습니다.
입력 시스템 덕분에 로컬 멀티플레이어 기능을 기존 입력 관리자를 사용할 때보다 훨씬 쉽게 구현할 수 있었습니다.

개발자들이 입력 시스템을 사용하면서도 폴링 방식을 계속 사용하는 경우가 있습니다. 별도의 설정 없이 Keyboard.current.spaceKey.isPressed만 입력하는 것에는 나름의 매력이 있습니다. 이 방법은 특정 프로젝트에서는 괜찮을 수 있지만, 장기적인 관점에서 개발한다면 입력 작업 콜백을 구독하는 것이 더 나은 접근 방식이라는 점을 명심하십시오.

규모 확장을 위한 구조

입력 바인딩을 통해 게임 플레이와 UI 컨텍스트 간 전환이 원활해지고 다양한 컨트롤러 유형을 처리할 수 있습니다.
입력 바인딩을 통해 게임 플레이와 UI 컨텍스트 간 전환이 원활해지고 다양한 컨트롤러 유형을 처리할 수 있습니다.

입력값을 읽는 것은 쉽습니다. 진정한 과제는 다양한 메뉴, 게임 플레이 모드 및 게임 플레이 시스템에 입력값을 적용할 수 있는 아키텍처를 구축하는 것입니다.

다음은 저희가 출시된 여러 게임에서 사용한 패턴입니다.

  • 입력 컨텍스트 분리 : 최소한 대부분의 프로젝트는 다음과 같은 이점을 누릴 수 있습니다.
    • 게임플레이 맵 - 플레이어 이동, 전투, 상호작용
    • UI 맵 - 탐색, 확인/취소, 스크롤링
    • 디버그 맵 - 콘솔 토글이나 시간 스케일링과 같은 개발자 전용 단축키

      이것이 왜 중요할까요? 입력 데이터 유출을 방지하기 위해. 컨텍스트를 분리하지 않으면, 예를 들어 스페이스바를 누르면 메뉴가 확인되는 동시에 플레이어가 점프하는 등의 예외적인 상황이 발생하기 쉽습니다. 액션 맵을 사용하면 게임 상태 변화에 따라 전체 입력 컨텍스트를 명시적으로 활성화하거나 비활성화할 수 있습니다. 이렇게 하면 입력 누출이 사실상 문제가 되지 않습니다.
  • 중앙 입력 관리자 : 입력 시스템은 객체별 InputActionReferences를 지원하지만, 대규모 프로젝트에서는 단일의 권위 있는 입력 관리자가 더 효율적입니다. 훌륭한 입력 관리자는 일반적으로 다음과 같은 특징을 가지고 있습니다.
    • 액션 맵을 활성화/비활성화합니다.
    • 입력 콜백을 구독합니다.
    • 기기 변경을 처리합니다.
    • 입력과 게임플레이 로직 사이의 경계 역할을 합니다.

다음은 간단한 예입니다.

public class GameInputManager : MonoBehaviour
{
    public PlayerInput playerInput;
    public PlayerController player;

    private void OnEnable()
    {
        playerInput.actions["Jump"].performed += OnJump;
        playerInput.actions["Shoot"].performed += OnShoot;
    }

    private void OnDisable()
    {
        playerInput.actions["Jump"].performed -= OnJump;
        playerInput.actions["Shoot"].performed -= OnShoot;
    }

    private void OnJump(InputAction.CallbackContext context) 
    {
        Player.Jump();
    }

    private void OnShoot(InputAction.CallbackContext context) 
    {
        Player.Shoot();
    }
}

저희 코드베이스의 상당수에는 게임 입력을 위한 사용자 지정 클래스가 있으며, 이 클래스에는 문자열 키 하나만 제공하면 콜백을 등록 및 등록 해제할 수 있는 함수가 포함되어 있습니다. 또한 위에서 언급한 입력 컨텍스트와 같은 특정 시나리오에서 특정 입력을 수신하지 않도록 하는 우선순위 시스템을 추가했습니다. 이 관리자를 사용하여 플레이어 입력을 연결하는 방법은 다음과 같습니다.

InputManager.Register(“Swing”, Priority.Character, SwingBat);

입력에 의해 제어되는 게임 오브젝트는 해당 오브젝트를 제어하는 ​​입력 로직과 분리되어 있습니다. 이렇게 하면 나중에 리팩토링하는 데 드는 비용이 줄어들 뿐만 아니라 코드를 다루는 개발자에게도 코드가 더 단순해집니다.

재결합을 받아들이세요

키 재설정 기능은 더 이상 선택 사양이 아닙니다. 접근성, 기기 다양성 및 기본적인 사용자 경험을 고려할 때 이러한 사항들이 요구됩니다.

메가캣 스튜디오의 많은 직원들이 기존 입력 관리자를 사용하여 키 재지정을 구현해 본 경험이 있어, 그 과정이 얼마나 힘들었는지 잘 알고 있습니다 (그리고 그 때문에 저희 수염에 흰머리가 몇 가닥 생긴 것일지도 모릅니다). 다행히 입력 시스템 패키지는 이 기능을 거의 무료로 제공합니다.

InputActionRebindingExtensions.PerformInteractiveRebinding() 메서드가 핵심적인 작업을 처리하므로, 우리는 이 메서드를 게임 코드에 연결하기만 하면 됩니다. 일반적으로 프런트엔드와 백엔드 간의 역할을 분리하는 두 개의 스크립트를 사용하여 이 작업을 수행합니다.

  • RebindsManager
    • 현재 작업을 처리하여 한 번에 하나의 작업만 다시 바인딩되도록 합니다.
    • 재바인딩 중 콜백 비활성화
    • 입력 동작 참조를 포함합니다.
  • RebindActionUI
    • 작업 시작 및 종료를 위한 상호 작용을 처리합니다.
    • 각 UI 패널에 연결되어 입력값을 다시 매핑합니다.

Backyard Baseball 2026 의 개발자인 소피아 나시오날은 "처음에는 이 부분을 담당할 관리자가 없어서 UI 스크립트만으로 상호 작용과 키 재설정 작업을 모두 처리했습니다."라고 말합니다. "이 방식은 확장성이 떨어지고 여러 개의 재바인딩 작업이 동시에 활성화될 수 있었습니다."

백엔드에서 입력값을 적절하게 구성하면 플레이어는 프런트엔드에서도 더 자유롭게 설정을 맞춤 설정할 수 있습니다. 입력 컨텍스트를 예로 들어보겠습니다. 야구 경기에서 선수들의 행동은 타격, 투구, 수비, 주루와 같이 뚜렷하게 구분되는 단계로 이루어집니다. 저희 게임에서는 플레이어가 "배트 휘두르기"와 "도루" 두 동작에 버튼을 할당할 수 있습니다. 왜냐하면 이 두 동작은 동시에 발생하는 경우가 없기 때문입니다. 입력 컨텍스트를 사용하면 올바른 중복 바인딩을 허용하는 동시에 여러 입력 작업이 실행되도록 하는 문제가 있는 바인딩을 방지할 수 있습니다.

입력은 시스템입니다

팀들이 저지르는 가장 큰 실수는 입력값을 핵심 게임 시스템이 아니라 구현 세부 사항으로 취급하는 것입니다. 입력 방식은 게임 플레이 감각, UI 사용성, 장기적인 유지보수성 등 모든 것에 영향을 미칩니다. 프로토타입을 제작하거나 소규모 제품을 출시하는 경우, MonoBehaviours 안에 숨겨진 산발적인 폴링 방식을 사용해도 괜찮을 수 있습니다. 하지만 게임의 확장성을 고려한다면, 견고한 시스템이 필요합니다.

비디오 게임 개발자로서 우리는 플레이어를 위해 일합니다. 플레이어가 게임 제대로 즐길 수 있도록 필요한 도구를 제공하는 것이 우리의 임무입니다! 이벤트 기반 아키텍처를 도입함으로써 코드 최적화뿐만 아니라, 플레이어의 조작감을 저해하는 버그로부터 게임을 보호하고 최고의 게임 경험을 제공할 수 있습니다.

입력 시스템에 대해 자세히 알아보세요.