오르막길
[1인게임개발] 야간경비일지(가제) 3주차 회고 - (1) 핵심로직 개발하기 본문
🧭 프로젝트 소개

《야간경비일지(가제)》는 Unity 기반 1인 개발 프로젝트로,
"스테이지 기반 라이트 공포 게임"이라는 콘셉트를 가진 모바일 게임입니다.
플레이어는 ‘야간 순찰’이라는 설정 아래 매일 새롭게 주어지는 나폴리탄 괴담 규칙을 알아가며,
이를 지키거나 파훼해 30일 동안 살아남아 일지를 남기는 것이 목표입니다.
게임의 핵심 재미는 죽음을 통해 규칙을 발견하고, 이를 매뉴얼에 스토리를 알아가는 반복 구조에 있습니다.
1일 차 루프를 완성하는 MVP(Minimum Viable Product)를 목표로,
가장 핵심이 되는 시스템 구조를 중심으로 개발을 진행하고 있습니다.
🧪 현재 진행 중인 핵심로직 범위
전체 게임은 30일간의 야간 근무를 배경으로 구성될 예정이며,
이번 1차 개발 목표(MVP)는 그중 1일 차 단일 루프만 완성하는 것이 핵심입니다.

시작 화면 ✅
→ 날짜 선택(달력 UI) ✅
→ 1일 차 플레이 ✅
→ 규칙을 지키면 생존 (2일 차로 넘어감) ❎ / 어기면 회귀 (1일 차로 돌아감) ✅
→ 성공 시 일지 자동 생성 ✅
→ 다시 달력으로 복귀 ✅
1일 차만 개발이 되었기 때문에 2일 차로 넘어가지 않고, 달력(메인메뉴)으로 넘어오도록 구성했습니다.
다행히 모든 핵심로직 구조 개발을 완료했고, 이제 게임이 좀 더 입체적으로 보일 수 있도록
새로운 계획을 단계적으로 진행할 예정입니다.
📊 현재까지의 개발 진행 상황
| 기능 | 상태 | 비고 |
| 캐릭터 이동 (WASD) | ✅ 완료 | 기본 키 입력 및 방향 반응 |
| 캐릭터 애니메이션 | ✅ 완료 | Idle / Walk 기준 애니메이터 연결 |
| Tilemap 세팅 | ✅ 완료 | GameScene 배경 구성 |
| RuleData / DayData 설계 | ✅ 완료 | ScriptableObject 기반, 구조 정리 완료 |
| RuleManager / DayManager / GameManager | ✅ 완료 | 각 역할 분리 및 기본 흐름 구현 |
| Calendar UI → GameScene 흐름 | ✅ 완료 | 날짜 선택 → Day1 진입 연결 |
| Day1 맵 배치 설계 | ✅ 완료 | 복도 / 교실 / 거울 등 배경 구성 |
| Rule01: 트리거 | ✅ 완료 | |
| Rule02: 트리거 | ✅ 완료 | 타이머 + 사망 판정 로직 구현 예 |
| Hidden Rule 퍼즐 구조 | ✅ 완료 | Mirror 조각 획득 → FullMirror 상호작용 |
| GameOver 루프 | ✅ 완료 | 사망 시 → Retry or Calendar 회귀 UI 패널 오픈 |
| Manual UI (규칙 매뉴얼) | ✅ 완료 | 해금된 Rule만 동적 리스트 출력 |
| Journal 시스템 | ✅ 완료 | 생존/사망/히든 로그 자동 작성 |
| UIManager 및 패널 전환 구조 | ✅ 완료 | Manual / Journal / GameOver 패널 제어 |
✅ 완료: 14개
🐎 느낀 점
이번 주는 게임 결과에 따라 일지를 작성하는 부분을 구현했고, 생각보다 빠른 시간 안에 끝낼 수 있었습니다.
1~2주 차에 구성한 규칙, 그리고 이를 관리하는 로직을 고민하느라 시간이 오래 걸렸었는데, 이 부분이 정말 도움이 되었습니다.
그 이유는 다음과 같습니다.
1. 각 Manager 스크립트를 통해 하나의 책임만 깔끔하게 맡도록 했다.
Rule Manager: 규칙의 상태 (해금, 파훼 여부) 관리
Day Manager: 일차의 흐름 (시작, 끝, 현재 일차 데이터) 관리
Game Manager: 게임의 큰 흐름 (Clear, Over) 관리
그래서 일지를 자동으로 작성되도록 개발할 때, 일차는 Day Manager에게 요청하고, 규칙 성공 여부는 Rule Manager에 요청하고, DayManager에서 일차가 끝나는 시점에 일지를 만드는 흐름을 쉽게 구현할 수 있었습니다.
2. 데이터와 로직 분리
Rule Data, Day Data와 같이 Scriptable Object를 사용해 게임의 내용물과 동작 방식을 분리했습니다.
따라서 Day Manager는 1일 차에 무슨 규칙이 있는지 몰라도, Day Data를 보고 규칙을 적용해 동작하도록 시킵니다.
즉, 로직이 알아서 지정된 Rule Data에서 가져와 쓸 수 있습니다.
그 예시로 Rule Data와 Day Manager를 들어 설명해 보겠습니다.
[CreateAssetMenu(fileName = "RuleData", menuName = "NightWatchLog/RuleData", order = 0)]
public class RuleData : ScriptableObject
{
[Header("기본 정보")]
public string ruleID; // "Rule01"
public string ruleName; // "복도에서 뛰지 마라"
[TextArea] public string description; // 규칙 설명 (Manual UI용)
public RuleType ruleType; // 필수 or 히든
[Header("트리거 조건")]
public string triggerTag; // ex) "Trigger_HallwayStart"
public string triggerConditionNote; // ex) "복도 진입 후 Shift 키 입력"
[Header("파훼 조건")]
public string solveConditionNote; // ex) "걷기 유지 시 생존"
[Header("해금 상태")]
public bool isUnlocked = false; // 플레이 중 동적 제어
public bool isRepeatable = false; // 반복 해금 여부
[Header("히든 규칙 보상 조건")]
public List<string> requiredItemIDs; // 특정 아이템 퍼즐에 필요한 경우
public string unlockHintText; // ex) "거울 조각을 모두 모아 전신거울을 보면…"
[Header("일지 내용")]
[TextArea] public string successDescription;
[TextArea] public string failDescription;
}
이 스크립트는 규칙을 구성하는 일종의 레시피입니다. 안에는 ruleID, description, suceesDescription과 같은 정보만 들어있습니다.
public void EndDay(bool isSuccess)
{
// 해당 일차 클리어 시 로직
if (isSuccess)
{
// 1. 기존에 있던 실패 기록
JournalEntry oldEntry = JournalManager.Instance.GetEntryByDay(currentDay);
int failureCount = oldEntry?.logLines.Count ?? 0; // 실패 횟수 카운트
// 2. 새로운 완성본 일지
JournalEntry finalEntry = new JournalEntry();
finalEntry.day = currentDay;
finalEntry.survived = true;
// 3. 실패 경험을 요약하는 문장 추가
if (failureCount > 0)
{
finalEntry.logLines.Add($"({failureCount}번의 꿈을 반복하고 나서야...)");
}
// 4. 해결한 모든 규칙의 성공 로그 추가
List<RuleData> allRulesToday = new List<RuleData>(currentDayData.essentialRules);
allRulesToday.AddRange(currentDayData.hiddenRules);
foreach (var rule in allRulesToday)
{
if (RuleManager.Instance.WasRuleSolved(rule.ruleID))
{
finalEntry.logLines.Add(rule.successDescription);
}
}
// 5. JournalManager의 기록을 이 '완성본'으로 덮어쓰기
JournalManager.Instance.OverwriteEntry(finalEntry);
Debug.Log($"[DayManager] Day {currentDay} 클리어 성공! 일지 출력 준비");
// 일지 출력 → CalendarScene 이동 등
GameManager.Instance.OnStageClear();
}
// 해당 일차 실패 시 로직
else
{
// 실패 로그 추가
string failureLog = "";
foreach (var rule in currentDayData.essentialRules)
{
if (!RuleManager.Instance.WasRuleSolved(rule.ruleID))
{
failureLog = rule.failDescription;
break;
}
}
JournalManager.Instance.AddLog(currentDay, isSuccess, failureLog);
Debug.Log($"[DayManager] Day {currentDay} 실패. 회귀 처리");
// 회귀 → CalendarScene 이동
}
}
이 스크립트는 DayManager의 EndDay 함수입니다. 일차를 끝내고 일지를 만드는 내용입니다.
RuleManager에게 규칙 성공 여부를 물어보고, 성공했으면 RuleData에서 succeessDescription을 가져옵니다.
실패했으면 failDescription을 가져와 JounalManager에게 넘깁니다.
이는 규칙 내용이 규칙 1번인지, 2번인지 판단하지 않습니다. 주어진 Rule Data를 읽고 행동할 뿐입니다.
따라서 1일 차에 새로운 규칙을 추가할 때, 코드를 전혀 건드릴 필요가 없어집니다.
RuleData를 기반으로 한 규칙을 추가하고 1일 차 에셋에 연결해 주면 됩니다.
결론적으로 어떤 데이터를 (Rule Daya) 어디서 관리하고 (Rule Manager) 어떤 시점에 (Day Manager. EndDay()) 처리할지가 뚜렷하게 나뉘게 되었고, 모든 매니저에 싱글톤 패턴을 사용해 어디서든 쉽게 접근이 가능했기 때문에
나머지 기능을 구현하는 데에 큰 어려움 없이 빠르게 MVP 개발이 마무리되었습니다.
물론 아직 큰 뼈대 줄기 하나만을 만든 것이지만, 부족한 부분을 채워나가며 게임을 완성도 있게 마무리해 볼 계획입니다.
'혼자 개발하기 > 포트폴리오' 카테고리의 다른 글
| [1인게임개발] 야간경비일지(가제) 2주차 회고 - (1) 핵심로직 개발하기 (0) | 2025.06.30 |
|---|---|
| [1인게임개발] 야간경비일지(가제) 1주차 회고 - (1) 핵심로직 개발하기 (0) | 2025.05.26 |