공포의 민주화: 메가 캣 스튜디오가 파이브 나이츠 앳 프레디스에 접근성을 어떻게 가져왔는가

이 블로그 포스트는 메가 캣 스튜디오의 UX 및 접근성 디렉터인 매디슨 페트릭이 작성했습니다.
10년 동안, 파이브 나이츠 앳 프레디 비디오 게임 프랜차이즈는 높은 난이도를 자랑해왔습니다. 궁극의 커스텀 나이트의 가장 가혹한 도전들 중 일부에서부터 원래의 파이브 나이츠 앳 프레디까지: 20/20/20/20 모드, FNAF 팬들은 여러 플레이 스타일에서 이 모드를 이기기 위해 수년간 도전해왔고, 결국 많은 시도 끝에 성공했습니다.
하지만 이러한 타이틀의 어려운 특성은 많은 이들에게 큰 만족을 줄 수 있지만, 다른 이들에게는 ‘악몽 모드’에서의 공포를 피하는 것과는 전혀 다른 도전이 될 수 있습니다.
최근 몇 년 동안 비디오 게임의 접근성이 기하급수적으로 증가했습니다. 한때 단순히 볼륨 설정을 변경할 수 있는 것에 국한되었던 것이 결국 밝기 조정, 재맵 가능한 컨트롤, 게임을 처음 시작할 때 설정 메뉴에 접근할 수 있는 것과 같은 삶의 질 변화로 발전했습니다. 2020년 너티 독의 더 라스트 오브 어스 파트 II 출시로 빠르게 진행되었고, 새로운 기준이 설정되었습니다. 이 2020년 올해의 게임은 60개 이상의 접근성 설정을 선택할 수 있었고, 연구 및 개발에 수백 시간이 소요되었습니다.
우리의 최신 출시작인 FNAF: 인투 더 핏, 우리는 게임에 접근성 기능을 추가하자는 아이디어를 제안받았습니다. 우리의 작은 팀은 연구에 수백 시간을 할애할 여유가 없었고, 여분의 ‘고양이 힘’도 없었습니다. 하지만 모든 개발자들이 도전에 응답하여 각자 접근성의 일부 측면을 개발하는 책임을 맡았습니다. 이것이 연구, 버그 테스트, 또는 새로운 코딩 기술을 즉석에서 배우고 동료들과 공유하는 것이든, 모든 사람이 FNAF를 플레이할 수 있는 기회를 제공하려는 우리의 동기였습니다. 구덩이로 들어가다 (그리고 많은 양의 커피)이 우리를 앞으로 나아가게 했다.
최종 빌드에 몇 가지기능을 통합하는 것이 목표가 되었지만 결국 20개 이상의 기능으로 바뀌었다. 안타깝게도 포함되지 못한 기능들이 있었지만, 우리는 오랜 역사를 가진 FNAF 프랜차이즈에 가져온 새로운 자원에 자부심을 느낀다.
FNAF의 접근성 기능
다음의 접근성 기능은 파이브 나이츠 앳 프레디의 사용 가능하다: 구덩이로 들어가다. 참고: 이 기능들 중 일부는 스포일러를 피하기 위해 표시되지 않는다!
색상 설정
플레이어는 게임의 색상 대비와 전반적인 밝기를 변경할 수 있다.
우리는 게임 출시를 위한 전체 달톤화(색상 대비) 조정 계획을 제때에 발표할 수 없었지만, 전반적인 밝기와 대비는 구현했다. 시각적 대비나 겹침이 최대한 제한되도록 흑백 스케일로 많은 시뮬레이션이 실행되었다.


유니티의 후처리 볼륨의 값을 변경하는 것은 몇 줄의 코드만으로 가능하여 플레이어가 밝기와 대비 수준을 쉽게 사용자 정의할 수 있다.

if (mainCameraVolume.TryGet(out ColorAdjustments colorAdjustments))
colorAdjustments.contrast.value =
contrastValueCurve.Evaluate(value);
(ContrastHandler.cs)
생물, 치카, 그리고 세계 소음 비네트
각 세계를 여행하는 NPC는 플레이어와의 근접성을 나타내기 위해 각기 다른 색상의 화면 비네트를 가지고 있습니다. 예를 들어, "생물"은 노란색, "치카"는 보라색입니다. 세계 주변의 일반적인 소음, 즉 소음 발생기도 오디오 시각화를 가지고 있으며, 회색 비네트가 있습니다.
접근성 피드백을 받을 때, 개발자들은 Into the Pit이 플레이어에게 위협을 알리기 위해 소리만 의존하지 않도록 하기를 원했습니다. 소음 비네트가 오디오 접근성을 수용하기 위해 추가되었지만, 이 기능은 더 시각적인 플레이 스타일을 선호하는 사람들에게도 이점이 있습니다. 또한, 비네트는 색상 의존성 이상으로 설계되었으며, 대비 및 밝기 설정을 수용하기 위해 맥동 효과를 보조 근접 지표로 통합했습니다.



메가 캣 스튜디오의 수석 개발자인 매튜 워이체코가 오디오 시각화 기능을 설명하는 방법은 다음과 같습니다:
"게임의 모든 중요한 소리를 시각화하기 위해 큰 노력을 기울였습니다." 우리는 게임을 살펴보고 세 가지 소음 출처를 찾았습니다: 노란 토끼의 발소리, 치카의 발소리, 그리고 잡다한 세계 소음입니다.
우리는 화면의 측면에 노란 토끼가 있는 쪽을 나타내기 위해 맥동 비네트를 두었지만, 이제는 두 가지 다른 범주를 통합해야 했습니다. 우리는 이들이 리듬에 맞춰 맥동하도록 만들기로 결정했습니다; 토끼를 위한 노란색 맥동, 치카를 위한 분홍색 맥동, 그리고 다른 모든 것을 위한 흰색 맥동입니다. 그 아이템이 소음을 내지 않는다면, 그 "비트"는 그냥 공백이 될 것입니다.
이 기능을 구현하는 데 가장 어려운 도전은 목표가 오스왈드에 대해 어느 쪽에 있는지를 결정하는 것이었습니다. 이것은 간단한 문제처럼 보이지만, Unity에서 3D 공간에 게임이 구현된 방식이 우리가 플레이어에게 전달하려는 현실과 일치하지 않는다는 사실을 제외하면 그렇습니다.
오스왈드가 보안실에 서 있고 노란 토끼가 저장실에 있는 예를 고려해 봅시다. 저장실이 보안실의 왼쪽에 있어야 하지만, 장면 뷰에서는 이 방들이 실제로 반대 방향으로 구현되어 있음을 볼 수 있습니다. 이 경우, 오스왈드와 노란 토끼의 위치 간의 간단한 비교는 신뢰할 수 없으며, 플레이어의 맵 이해가 게임 엔진의 현실과 일치하지 않기 때문입니다.
이것이 오스왈드와 사운드 타겟이 다른 방에 있을 경우, 게임이 Unity NavMesh 시스템(우리가 적의 AI에 이미 사용하는 시스템)을 사용하여 가장 가까운 유효 경로를 결정하고, 오스왈드에게 가장 잘 이끌 수 있는 문을 사운드의 방향으로 사용하는 이유입니다.


이 튜토리얼을 통해 Unity의 AI 내비게이션 시스템에 대해 더 알아보세요:
OpenDyslexic
플레이어는 글꼴 크기와 간격뿐만 아니라, 독서 장애인을 위해 특별히 제작된 글꼴인 OpenDyslexic을 선택할 수 있습니다.
OpenDyslexic을 활용함으로써, 우리는 Into the Pit의 거의 모든 텍스트의 가독성을 독서 장애인을 위해 높이기를 희망했습니다. 기본 텍스트는 크기를 완전히 사용자 정의할 수 있지만, 게임의 매우 텍스트 기반 장르로 인해 가독성을 높이기 위해 이 옵션에 조금 더 추가하고 싶었습니다.
OpenDyslexic 글꼴:

기본 글꼴:

단일 탭
일반 게임플레이/컷신에서의 퀵 타임 이벤트(QTE)는 무한한 시간으로 단일 탭으로 승리할 수 있는 옵션이 있습니다.
이 기능을 통해 퀵 타임 이벤트는 단일 버튼 탭으로 성공할 수 있으며, 시간에 의존하지 않습니다. 비디오 게임 산업에서 "버튼 망치기"는 일반적인 관행이지만, 이 모터 제어 옵션은 원하는 플레이어에게 버튼 피로를 줄이는 데 도움이 될 수 있습니다.
자동 숨기기 미니게임
미니게임 숨기기는 플레이어 입력 없이 자동으로 진행될 수 있습니다.
플레이어는 미니게임 액션을 성공적으로 완료하기 위해 정밀 모터 제어에 의존할 필요가 없으며, 이러한 액션은 자동으로 수행될 수 있습니다.
아래의 예시는 설정이 꺼져 있을 때(왼쪽)와 켜져 있을 때(오른쪽) 플레이어의 시각적 경험 사이에 사실상 차이가 없음을 보여주며, 이 기능이 더 적은 입력으로도 긴장감을 잘 재현함을 보장합니다.
토글 실행
우리의 토글 실행 옵션은 플레이어가 버튼을 누르지 않고도 달릴 수 있게 하여 버튼 피로를 줄이는 데 도움을 줍니다.
플레이어는 선택한 실행 버튼을 누르고 싶거나 게임 플레이 중 실행 버튼을 켜고 끄는 것으로 달리기를 토글할지를 선택할 수 있습니다. 오스왈드는 문에 가까이 달리면 자동으로 문을 통과하며, 달리는 동안 원활한 전환을 허용합니다(그의 생명을 위해).
게임은 Unity의 입력 시스템을 사용하여 입력을 처리하며, 이는 이벤트 기반 입력을 용이하게 합니다. 플레이어가 달리고 있는지 여부를 결정하는 우리의 논리는 하나의 입력 콜백에 있으며, 접근성 기능의 현재 설정을 고려합니다:
public override bool OnRunInput(InputAction.CallbackContext ctx)
{
if (ctx.started)
{
if (IsToggleRunEnabled())
Oswald.isRunning = !Oswald.isRunning;
else
Oswald.isRunning = true;
}
else (ctx.canceled)
{
if (!IsToggleRunEnabled())
Oswald.isRunning = false;
}
return Oswald.isRunning;
}
자동 힌트 시스템
자동 힌트 시스템은 플레이어에게 대화 힌트의 비율을 분 단위로 증가/감소시킬 수 있는 옵션을 제공합니다(예: 5분, 10분, 20분, 꺼짐).
다음에 어디로 가야 할지 모르는 것은 모든 플레이어에게 패배의 순간이며, 특히 지도나 지역을 모두 살펴본 후에는 더욱 그렇습니다. Into the Pit에서 플레이어는 오스왈드가 다음 목표로 안내하는 대화 힌트를 떨어뜨리는 비율을 사용자 정의할 수 있습니다. 이 힌트는 자동이며 언제든지 변경하거나 켜고 끌 수 있습니다.
원래 힌트 시스템은 동일한 비율로 켜져 있었고 조정할 수 없었습니다. 그러나 Into the Pit 개발자들은 일부 플레이어가 힌트를 더 빨리 받으면 더 나은 경험을 할 것이라는 것을 알고 있었고, 다른 플레이어는 원하지 않을 수도 있었습니다.
이는 접근성 설정에 의해 지정된 시간만큼 기다림으로써 구현됩니다. 플레이어가 새로운 목표를 받으면 타이머가 리셋됩니다. 이 구현에서 중요한 것은 개발자들이 엣지 케이스 버그를 피하도록 하는 것이었습니다. 이것이 ShowHint 함수에서 몇 가지 가드 절로 시작하는 이유입니다. 이는 오스왈드가 불리한 시점에 자신에게 이야기하지 않도록 하기 위함입니다.
protected void ShowHint()
{
if (GameManager.Instance == null ||
GameManager.Instance.Oswald == null ||
GameManager.Instance.Oswald.IsStumbling ||
InteractableDoor.isPlayerNearAnyDoor())
return;
if (AdventurePC.Instance && HintsManager.TryGetHint(out string hintText))
{
InvokeDelayed(new WaitUntil(() => TextBox.Instance), () =>
{
AdventurePC.Instance.Stop();
messageTemplate.speaker = AdventurePC.Instance;
messageTemplate.text = hintText;
TextBox.Instance.overrideBlockerDelay = .25f;
TextBox.Show(messageTemplate);
});
}
UpdateCurrentQuestObjectives();
ResetTimer();
}

아이콘 크기
아이콘은 크기를 조정할 수 있습니다. 가장 큰 크기조차도 게임의 시야를 방해하지 않습니다.

스테레오/모노 토글
플레이어는 소리를 스테레오(양쪽이 다름) 또는 모노(양쪽이 같음)로 설정할 수 있습니다. 모든 공포 게임의 소리는 불안하게 만들기 위해 설계되었을 뿐만 아니라, 게임 환경이 플레이어를 안내하려고 할 때 유용합니다. 결국, "생물"이 Into the Pit에서 숨어 있을 수 있는 위치를 아는 것은 생존에 매우 중요합니다.
재매핑 가능한 컨트롤
플레이어는 자신의 취향에 맞게 컨트롤을 재매핑할 수 있습니다. 컨트롤은 PlayStation®5 Access™ 컨트롤러 및 Xbox Adaptive Controller와 같은 접근성 장치와 호환됩니다.
우리 개발자들은 Unity의 새 입력 시스템을 활용하여 Into the Pit의 컨트롤을 위한 사용자 정의 레이아웃을 만들었습니다. 입력 시스템은 일부 사용자 정의 코드 수정이 있더라도 여러 바인딩을 갖기에 더 적합했으며, 이는 모든 공유 인터페이스와 UI 메뉴 간에 활용되었습니다. 이것은 입력 작업의 통합 덕분에 이전 입력 시스템보다 관리하기 쉬웠습니다. 이는 입력을 더 조직적이고 개발자에게 맞춤화할 수 있게 만들었습니다.
“우리는 플레이어가 게임 내에서 할 수 있는 모든 것에 대한 입력 작업이 있습니다.”라고 매튜 워이체코가 말합니다. “예를 들어, 손전등, 달리기, 이동, 미니게임에서의 사격 등을 위한 작업이 있습니다. 플레이어가 무언가를 재바인딩하면, 이는 작업의 바인딩을 변경합니다. 입력 작업에 응답하는 나머지 모든 코드는 바인딩이 무엇이든 관계없이 동일하게 유지됩니다. 입력 작업은 이러한 세부 사항을 추상화합니다.
Into the Pit에는 37개의 사용자 정의 입력 동작이 있습니다. 각 동작은 플레이어가 수행할 수 있는 특정 동작을 나타내며 이를 트리거하는 데 사용되는 입력을 나열합니다. 예를 들어, 손전등을 사용하는 것은 기본적으로 키보드의 F 키와 컨트롤러의 왼쪽 페이스 버튼에 바인딩되어 있습니다.
입력 바인딩을 조정하는 용이성은 원래 입력 관리자에서의 주요 업그레이드입니다. 편집기에서 이를 수정하는 것은 간단하며, 런타임에서 재바인딩하는 것은 더 효율적이지만 일부 코드가 필요합니다. 우리의 재바인딩 솔루션은 Unity의 RebindingOperation 클래스를 기반으로 하는 Input System 패키지에서 제공된 예제에 기반합니다.
입력 바인딩 메뉴를 구현할 때 발생하는 한 가지 엣지 케이스는 충돌하는 입력을 처리하는 것입니다. 이는 플레이어가 이미 다른 동작에 할당된 동작에 입력을 제공할 때 발생합니다. 이를 해결하는 한 가지 접근 방식은 플레이어가 충돌하는 입력을 할당하도록 허용하되, 문제가 해결될 때까지 설정을 저장하지 못하도록 하는 것입니다(즉, 동일한 입력의 두 인스턴스 중 하나를 다른 것으로 변경). 이것은 합리적인 접근 방식이지만, 우리는 이 경우 단순히 바인딩을 교환하기로 선택했습니다. 따라서 손전등이 F이고 달리기가 Shift인 경우, 플레이어가 손전등을 Shift에 바인딩하면 달리기는 F가 됩니다.
Input System을 사용하면 다른 코드와 관련하여 바인딩 정보가 추상화됩니다. 따라서 플레이어 입력을 듣는 스크립트나 화면에서 입력 아이콘을 조정하는 스크립트는 특정 입력을 다루지 않으며, 이는 작업을 더 간단하게 만듭니다.





퀵 타임 이벤트 (QTEs)
Into the Pit에는 두 가지 유형의 QTE 사용자 정의가 있습니다: 표준 게임플레이에서 쉬운 QTE를 위한 옵션과 미니게임 숨기기를 자동으로 만드는 옵션. Matthew Wojtechko는 처음에 미니게임 숨기기를 구현하는 작업을 많이 했으며, 이 접근성 기능을 구현할 때 간단하고 직관적인 방법으로 할 수 있다는 것을 알고 있었습니다.
각 숨기기 미니게임의 독특한 메커니즘은 공유 기본 클래스에서 상속됩니다. 이것은 플레이어가 이 설정을 켜거나 끄는지 확인하기 위해 저장 데이터를 검사하는 PlayAutomatic 플래그가 있습니다. 다음 코드는 단순화되었습니다:
public abstract class MechanicHidingMinigame
{
public bool PlayAutomatic { get; protected set; }
protected override void Awake()
{
PlayAutomatic = PlayerPrefs.GetInt(AccessibilityHandler.AUTO_HIDING_MINIGAMES_KEY) == 1;
}
}
그런 다음 각 숨기기 미니게임 스크립트는 이 플래그를 확인하여 게임을 자동으로 "재생"할 수 있습니다.
예를 들어, 숨을 참아야 하는 미니게임에서는 적절한 시간에 호흡 시스템을 제어합니다:
public class BreathGameMechanics : MechanicHidingMinigame
{
public void OnBonniePrepareLook()
{
if (PlayAutomatic)
{
BreathingSystem.Instance?.HoldBreath();
}
OnGoldBonnieAlmostLook?.Invoke();
}
public void OnBonnieEndLook()
{
isBonnieLooking = false;
if (PlayAutomatic)
{
BreathingSystem.Instance?.ReleaseBreath();
}
OnGoldBonnieStopLooing?.Invoke();
}
// There rest of the code in this class was removed for clarity
}
사용자 정의 가능한 플레이 스타일
다음 사용자 정의는 게임을 처음 시작할 때 메인 메뉴에서 제공됩니다. 대부분의 사용자 정의가 가장 어려운 Five Nights at Freddy’s 게임을 클리어한 후 전통적으로 잠금 해제된다는 것을 알고 있었지만, 우리는 플레이어가 어떤 난이도에서든 게임을 한 번 클리어한 후 사용자 정의에 접근할 수 있도록 하여 그 기준에 도전하고 싶었습니다. 플레이어는 선호하는 플레이 스타일 경험을 위해 다음을 사용자 정의할 수 있습니다:
- 캐릭터의 공격성을 사용자 정의합니다.
- 숨기기 미니게임의 난이도를 조정합니다.
- 체크포인트 빈도를 조정하여 게임의 체크포인트 수를 늘리거나 줄입니다.
- 플래시라이트 배터리의 지속 시간을 연장하는 배터리 품질을 높이는 옵션.
- 게임의 숨는 장소 수를 늘리거나 줄입니다.
- 게임의 소음 발생기 수를 늘리거나 줄입니다.
메가 캣 스튜디오에서는 모든 사람이 게임을 할 자격이 있다고 믿습니다. 마치 모든 사람이 Five Nights at Freddy’s에서 철저하게 점프 스케어를 당할 자격이 있는 것처럼: 구덩이로 (아니면 점프 스케어를 당하지 않도록 – 그런 설정이 있습니다). 우리는 모든 프로젝트에 우수성을 가져오고자 하며, 이는 우리의 지원 커뮤니티와 팬들을 위한 접근성 툴킷을 확장하는 것을 의미합니다. 그리고 그것이 게임 개발의 미지의 세계에 뛰어드는 것을 의미한다면, 우리는 매번 신나게 뛰어들 것입니다.
우리는 단지 그것이 유령이 없기를 바랍니다.
