인터페이스의 비활성 상태
최근에 게임 사용 로그를 설계하면서 버튼 사용 여부와 결과를 추적할 수 있도록 준비하기로 합니다. 고객의 인터페이스 사용에 대한 로그는 한때 웹에서 주로 남기고 있었지만 웹 기반 수집 도구들이 실시간으로 서버에 연결되지 않아도 로그를 남길 수 있는 모양으로 개선되면서 게임에서도 비슷한 방식으로 로그를 남길 수 있게 되었습니다.
대강 게임 상의 인터페이스를 사용할 때 팝업이 열리면 팝업이 열린 시각, 세션 정보, 이 팝업을 열게 만든 이전 행동, 열린 팝업 이름 따위를 기록하고 버튼을 클릭하면 클릭한 시각, 세션 정보, 클릭한 버튼 이름 따위를 기록하는데 여기서 좀 더 자세한 이야기로 들어가면 버튼을 클릭할 때 팝업의 설정 상태를 함께 기록해 분석에 활용할 수 있지만 데이터를 많이 수집한다고 해서 항상 효과적으로 분석할 수 있는 것은 아닙니다. 분석을 전담하는 조직이 있지 않은 이상 로그 대부분은 서버 구석의 스토리지를 차지한 채 ‘언제 한번 봐야지’ 하는 생각으로 맴돌 뿐 다음 일정에 치여 항상 가장 낮은 우선순위에서 영원히 밀리곤 합니다.
이 요구사항의 개발을 진행하면서 ‘비활성 상태인 버튼의 로그 발생 여부’에 대한 질문을 받았습니다. 비활성 상태인 버튼을 클릭할 때 이를 로그에 어떻게 기록해야 하는지에 대한 질문이었는데 사실 비활성 상태인 버튼에 클릭을 시도하는 행동을 기록해 두면 이 비활성 상태인 버튼이 고객에게 그 의미를 제대로 전달하고 있는지 파악할 수 있는 수단이 되기는 하지만 일단 버튼의 비활성 상태를 사용하기로 결정한 이상 비활성 상태인 버튼의 사용 시도를 기록할 필요는 없다고 판단했습니다.
이전에 다른 팀에서 인터페이스 버튼의 상태와 동작을 정의하면서 이 ‘비활성 상태의 버튼'에 대한 서로 다른 인식을 항상 경험해 왔습니다. 그래서 이번에는 ‘비활성 상태 버튼’의 정의에 대해 이야기하고 비활성 상태의 버튼을 잘 못 인식해서 일어날 수 있는 잘못된 요구사항을 소개하겠습니다.
윈도우 인터페이스를 기준으로 인터페이스의 ‘비활성 상태'는 상호작용 할 수 있는 인터페이스가 화면에 표시되어 있기는 하지만 어떤 조건에 의해 인터페이스가 상호작용에 반응하지 않는 상태를 말합니다. 버튼이 표시되어 있지만 버튼을 클릭해도 클릭 이벤트 자체가 일어나지 않습니다. 이런 상태는 조건을 만족하지 않아 버튼을 클릭하면 일어나는 어떤 행동을 지금 일으킬 수 없는 상태임을 의미합니다.
가령 가상의 MMO 게임에 새 캐릭터를 만들 때 캐릭터 이름 입력 팝업이 떠 있다면 텍스트박스에 캐릭터 이름을 입력하기 전에는 확인 버튼이 활성화 되지 않아 확인 버튼을 클릭할 수 없습니다. 텍스트박스에 유효한 캐릭터 이름을 입력하면 그 때 확인 버튼이 활성화 되어 클릭을 통해 버튼의 동작 - 이름 중복 검사를 하거나 이름을 확정 - 을 수행하게 됩니다.
이 관점에서 ‘비활성 상태인 버튼을 클릭할 때 실패 사운드가 재생되게 해 주세요’나 ‘비활성 상태인 버튼을 클릭하면 이 동작을 실행할 수 없는 이유 메시지가 나타나게 해 주세요’ 같은 요구사항은 인터페이스의 비활성 상태를 오인했기 때문에 나오는 것입니다. 물론 플랫폼에 따라, 또 기반한 기술에 따라 비활성 상태 버튼으로부터 이벤트를 받을 수 있긴 하지만 이런 구현은 인터페이스의 비활성 상태를 헛갈리게 만들곤 합니다.
수많은 재화를 지탱하는 보조 장치에서 조건을 만족하지 않아 버튼을 클릭할 때 동작이 실패할 거라는 사실을 이미 알고 있을 때 실행 버튼을 비활성화 하지 않고 재화 표시에 이미 실패할 예정임을 표시하고 또 실행 버튼을 클릭하면 동작에 실패한 이유 - 재화 부족 - 를 설명하기도 합니다. 특히 최근 수 년 사이에 나온 게임 대부분이 이 방식을 사용하고 있습니다.
이미 비활성 버튼이나 비활성 메뉴를 적극적으로 도입하던 90년대 말에서 2천년대 초반부터 비활성 상태인 풀다운 메뉴나 버튼이 비활성 상태가 된 원인과 비활성 상태를 해소하기 위한 방법을 안내하지 못하기 때문에 좋은 인터페이스는 아니라는 지적이 있어 왔습니다. 그래서 조건을 만족하지 않을 때 버튼을 비활성화 하기 보다는 버튼을 클릭할 수 있도록 두고 인터페이스 자체에서 이미 버튼을 클릭하면 실패할 예정임을 알려주고 버튼을 클릭하면 이 상태를 해소할 방법을 알려주거나 버튼 주변에 실패 원인을 상호작용 없이 표시하기도 합니다.
이런 접근은 버튼에 두 가지 상태가 있으면 됩니다. 하나는 ‘활성화 및 성공 예정’ 상태입니다. 버튼을 클릭할 수 있으며 조건을 만족하고 있으므로 클릭하면 버튼에 해당하는 동작이 실행되어 성공할 것을 예상할 수 있습니다. 물론 항상 동작에 성공하지 않을 수도 있습니다. 가령 이 인터페이스가 표시되는 순간까지는 골드가 충분했지만 구입 버튼을 클릭하기 직전에 인터페이스 뒤에서 자동 사냥을 하던 캐릭터가 자동으로 골드를 소모하는 바람에 골드가 부족해졌지만 인터페이스에 그 사실이 반영되지 않은 상태일 수 있습니다. 이럴 때는 일단 성공할 예정으로 버튼을 클릭하지만 동작에 실패하고 실패 메시지가 표시됩니다.
다른 하나는 ‘활성화 및 실패 예정’상태입니다. 여전히 버튼을 클릭할 수 있지만 조건을 만족하지 않아 클릭해도 버튼에 해당하는 동작이 실행되지 않을 것임을 미리 알려줍니다. 똑같이 이 동작에 항상 실패하지 않을 수 있지만 이 경우 서버에 요청을 보내지 않고 클라이언트에서 바로 실패 메시지를 보내는 경우가 많아 실패 예정은 항상 실패한다고 예상해도 됩니다.
이 구분은 전통적인 버튼 상태와 일치하지 않기 때문에 미들웨어에서 제공하는 인터페이스 상태 구분을 그대로 사용하거나 전통적인 상태만 제공하는 다른 플랫폼에서 버튼 동작을 설계할 때 버튼 상태와 동작 요구사항이 일치하지 않는 상황을 만들 수 있습니다. 가령 전통적인 버튼 상태는 ‘활성화’, ‘비활성화’의 두 가지 구분만 있는데 이를 앞에 설명한 사례에 적용하면 실패할 것이 확실한 상황에서 버튼을 비활성화 해 달라고 요청한 다음 이어서 비활성화된 버튼을 클릭하면 실패한 이유를 표시해 달라는 앞뒤가 맞지 않는 요구사항을 말하게 됩니다. 이 경우 ‘비활성화’상태는 아예 사용하지 않으며 ‘활성화’ 상태에 기반한 두 가지 새로운 상태를 구분해야 앞뒤가 맞지 않는 요구사항을 말하지 않을 수 있습니다.
결론. 윈도우 인터페이스를 기준으로 버튼에는 활성 상태와 비활성 상태가 있는데 이 중 비활성 상태는 사실상 아무 상호작용을 일으키지 않는 상태라는 의미입니다. 현대에 게임 인터페이스에서 종종 실패가 확실한 경우에도 버튼을 클릭할 수 있게 해서 실패 원인을 설명하는데 이는 활성 상태에 기반한 성공 예정 상태와 실패 예정 상태로 구분해야 하며 비활성 상태는 아예 사용하지 않습니다.