Game

DelRev

위험을 소리로 알려 주는 3D 잠입 게임

기간
2025.04 ~ 2026.01
역할
4인 팀 · 플레이어, 맵, 위험게이지, 방해자 AI, 사운드
  • Unity 2022.3
  • C#
  • NavMesh
  • FSM
  • URP
  • Logic Pro X

Impact

  • 4구간위험도를 틱 간격과 볼륨으로 나눠 화면 대신 귀로 전달
  • 11종방해자마다 따로 만든 상태 기계
  • 57개게임 사운드를 직접 만들고 재생 시점까지 코드로 연결

Background

도우미 로봇으로 위장한 스파이가 집과 유치원, 공장에 잠입해 정보를 모으는 게임입니다. 맵을 오래 뒤질수록 얻는 것은 많아지지만 날짜가 가기 때문에, 언제 빠져나올지를 플레이어가 계속 저울질하게 만드는 것이 목표였습니다.

조장을 맡아 일정과 역할을 배분했고 플레이어 시스템과 맵, 위험게이지, 방해자 AI, 사운드를 담당했습니다. 공장 로봇 계열과 세이브와 상점은 권예진, 유치원 방해자 계열은 김도현이 만든 파일 위에 이어서 작업했습니다.

영상 youtu.be/M8obEdlshRk

게임플레이: 스테이지별 몬스터를 피해 아이템을 모은다.

Architecture

게임 구조

맵마다 씬을 나누고, 플레이어와 인벤토리는 씬 수명에서 떼어내 전환 뒤에도 남게 했습니다.

위험 계통과 감지 계통은 서로 모릅니다. 위험게이지는 업무 구역을 벗어난 시간만 보고 오르내리다가 가득 차면 IDangerTarget으로 그 스테이지의 최종 방해자에게 통보만 합니다. 감지는 그와 별개로 감시 장치가 플레이어를 보면 추격자를 부르는 쪽이고, 방해자는 공통 부모 없이 각자의 상태 집합으로 돕니다.

Contributions

위험도는 구역 밖 시간, 전달은 소리로

게이지가 오르는 조건은 적에게 들킨 정도가 아니라 업무 구역을 벗어난 시간입니다. 구역 밖에서는 초당 20씩 차올라 5초면 가득 차고, 구역으로 돌아가면 초당 10씩 빠져 10초에 가라앉습니다. 맵을 털수록 위험해지고 일하러 돌아가면 잦아드는 구조라, 언제 돌아갈지가 플레이어의 판단이 됩니다. 한 번 100%에 닿으면 다시 내려가지 않습니다.

만들어 놓고 플레이해 보니 잠입 중에는 화면 구석의 막대를 볼 여유가 없었습니다. 그래서 위험도를 틱 사운드로도 내보냈습니다. 값에 비례해 간격을 줄이면 변화를 느끼지 못해서 네 구간으로 끊었고, 틱은 구역 밖일 때만 울립니다. 안전한 곳에 있는 동안까지 재촉하면 구역이 안전지대로 읽히지 않습니다.

게이지가 차오를수록 틱 간격이 좁아진다. 값에 비례해 줄이면 변화를 못 느껴서 네 구간으로 끊었다.

게이지와 방해자 분리

게이지가 가득 찼을 때의 반응이 맵마다 달랐습니다. 게이지가 그 차이를 전부 알게 만들면 맵을 추가할 때마다 게이지를 고쳐야 해서, IDangerTarget 인터페이스로 의존을 끊었습니다. 방해자를 늘려도 게이지 쪽은 건드리지 않습니다.

감지하는 쪽과 쫓는 쪽 분리

플레이어가 왜 들켰는지 모르면 가장 답답합니다. 보는 객체와 쫓는 객체를 나눠서 감시 장치만 피하면 추격이 끊기도록 했습니다. 구조는 세 맵이 같지만 세부는 아직 같지 않습니다. 유예 시간이 공장 포탑 0.5초, 연구소 CCTV 3초인데 가정주택 카메라는 타이머 없이 바로 반응하고, 추격자를 부르는 방식도 공장만 static 이벤트로 느슨하게 끊었을 뿐 나머지는 직접 참조입니다. 스쳐 지나가는 것과 들키는 것을 구분해 주려던 의도가 가정주택에는 아직 적용되지 않았습니다.

방해자별 상태 집합

공통 부모 클래스를 두지 않았습니다. 유치원 Director는 순찰 앞에 Greeting 상태를 둬서 인사를 하고 나서 의심하도록 했고, 공장 Security_B는 플래시로 플레이어 시야를 마비시킵니다. 같은 FSM을 돌려쓰면 상태 이름이 그 방해자의 성격을 담지 못합니다.

소리와 화면을 같이 설계

사운드 57개를 만들고 재생 시점까지 코드로 붙였습니다. 발소리는 바닥 재질마다 변주를 두고 이동 속도 3단계에 따라 간격을 바꾸며, 발이 닿는 순간 카메라를 흔듭니다. 유치원 배경음악은 같은 동요를 단2도 위로 겹치고 주파수를 미세하게 어긋낸 뒤 증4도로 다시 겹치고, 전부 끊습니다.

영상 youtu.be/TNu-wWInctg

인트로 시네마틱: 뉴스 음성, 기계음, 발소리, 앰비언스를 25개 트랙으로 쌓았다.

Troubleshooting

씬을 넘어갈 때 아이템이 사라지거나 두 개가 된다

문제
맵을 옮길 때마다 씬을 새로 불러오는데, Unity는 씬을 내리면서 그 씬의 오브젝트를 전부 파괴합니다. 들고 있던 아이템도 트레일러에 실어 둔 아이템도 같이 사라졌고, 매번 일어나지 않아 재현부터 어려웠습니다.
원인
원인이 네 개였습니다. DontDestroyOnLoad가 루트 오브젝트에만 걸리는데 아이템은 플레이어의 자식이었고, 트레일러에 실으면 다시 자식이 됐습니다. 씬을 다시 불러오면 원래 배치된 사본과 넘어온 사본이 함께 남았고, 중복을 정리하기 전에 트리거가 먼저 발동했습니다.
해결
순서를 고쳤습니다. SetParent(null)로 루트를 떼어낸 다음 DontDestroyOnLoad를 호출합니다(1.Player/InventoryUI.cs:18-19). 트레일러에 실을 때도 각각 보호하고, 씬 이름으로 사본을 판별해 제거하고, 준비가 끝나기 전에는 트리거가 동작하지 않게 막았습니다.
결과
이후 재발하지 않았습니다.

남은 것

스테이지는 네 개를 설계해 셋을 빌드에 넣었습니다. 연구소 씬을 끝내지 못해 맵 선택 코드에 /* 연구소 생기면 추가 case 4 */ 주석이 남아 있습니다. 할당량을 못 채웠을 때의 판정도 구현하지 않았습니다.