팀스파르타 내일배움캠프

Unity 대화 시스템 완전 구축 & 트러블슈팅

creator2041 2025. 8. 3. 16:00

TIL: Unity 대화 시스템 완전 구축 & 트러블슈팅 🎮

1. 설계서 기반 시스템 아키텍처 설계

DialogueManager (메인 로직)
├── DialogueInputManager (입력 처리)
├── DialogueUI (UI 관리)  
├── TypewriterEffect (타이핑 효과)
└── DialogueDatabase (데이터 관리)
  • 설계서를 코드로 변환하는 과정의 중요성 체감
  • 각 컴포넌트에 단일 책임 원칙(SRP) 적용
  • 이벤트 기반 통신으로 느슨한 결합 구조 구현

2. 싱글톤 vs 계층적 구조 선택

기존 구조: GameManagerPlayManagerDialogueManager

  • 기존 시스템과 일관성 유지
  • PlayManager에서 생명주기 관리
  • 씬별 독립적인 DialogueManager 운영

3. CSV 연동 시스템 구축

// IGetCSVData 인터페이스 구현
public class DialogueData : IGetCSVData {
    public string ID { get; set; }
}

DialogueDB = CSVConverter.LoadDialogues(LoadCsvFile("Dialogues"));
  • 인터페이스로 데이터 구조 표준화
  • 필드를 프로퍼티로 변경해 CSV 연동 최적화
  • 가중치 기반 랜덤 시스템 도입

4. 주요 트러블슈팅

문제 1: Input 시스템 충돌

// DialogueInputManager.Update()의 ESC 키 감지 제거로 해결

전역 키 입력 감지 시 다른 시스템과의 간섭 고려 필요

문제 2: 싱글톤 일관성 문제

DialogueDatabase를 Static 클래스로 변경해 구조 통일

문제 3: 메서드 시그니처 충돌

ShowLine 메서드를 객체 기반 매개변수 구조로 통합

5. 코드 리뷰 개선 사항

  • 문자열 대신 Enum 사용으로 타입 안전성 확보
  • 반복 접근 대신 인스턴스 캐싱
  • 매개변수 그룹화로 메서드 호출 단순화

6. 최종 성과

  • IInteractable 인터페이스로 NPC 대화 연동
  • 자동 아웃라인(하이라이트) 기능 구현
  • DialogueManager 부재 시 안전한 폴백 처리

7. 연관 기술

  • Unity Input System - 모드별 입력 전환
  • CSV 데이터 파이프라인 - 인터페이스 기반 설계
  • Event-Driven Architecture - 느슨한 결합
  • Command / Strategy 패턴 - 유연한 기능 확장

8. 결론

설계 → 구현 → 테스트 → 피드백 → 개선의 사이클을 반복하며, 기존 시스템과의 통합성 유지가 핵심임을 확인.