game/prompt/62_animation_and_feedback_s...

4.1 KiB

62. 애니메이션 및 피드백 동기화 관련 이슈 진행 현황

1. 문제 발생 현상

  • 플레이어 공격 실패(MISS) 시, 화면에 MISS 텍스트가 두 번 올라오는 현상 발생.
  • 적의 방어 실패(FAILED) 시에도 유사한 중복 텍스트 현상 발생.
  • 로그상 ([UI Debug] Feedback Event)으로는 이벤트가 한 번만 발생했지만, UI에는 두 번 표시됨.
  • _addFloatingEffect 함수 내부에 eventId 기반의 중복 체크 로직이 추가되었음에도 현상 지속.

2. 진단 및 해결 시도

2.1. 원인 가설

  1. BattleScreen 인스턴스 중복: 가장 유력한 가설. 하나의 EffectEvent가 발생했을 때, 여러 BattleScreen 인스턴스가 각자 이벤트를 받아 화면에 피드백 텍스트를 띄우는 경우.
    • [UI Debug] BattleScreen initialized: ${hashCode} 로그로 확인 필요. (현재 확인되지 않음)
  2. _addFloatingEffect 내부의 setState 문제: setState 호출 시 _floatingFeedbackTexts 리스트에 위젯이 중복으로 추가되거나, 위젯 렌더링 과정에서 불필요한 복제가 발생하는 경우. (리스트 clear() 로직 추가로 해결 시도 중)
  3. UI 렌더링 타이밍/시각적 착시: FloatingFeedbackText 위젯의 생명주기가 꼬여서 이전 텍스트가 완전히 사라지기 전에 새 텍스트가 뜨거나, 애니메이션이 반복되는 것처럼 보이는 착시.

2.2. 현재까지 적용된 주요 조치

  • EffectEvent eventId 기반 중복 체크 (UI 레벨): _addFloatingEffect 함수에서 eventId를 기반으로 동일한 이벤트에 대한 피드백 텍스트가 이미 리스트에 있다면 추가하지 않도록 _floatingFeedbackTexts.any((e) => e.eventId == event.id) 로직 추가.
  • _floatingFeedbackTexts.clear() 도입: 새로운 피드백 텍스트(MISS/FAILED)가 뜰 때, 기존의 모든 피드백 텍스트를 리스트에서 제거한 후 추가하도록 수정. (화면에 항상 하나의 피드백 텍스트만 유지)
  • addPostFrameCallback 제거: _addFloatingEffectWidgetsBinding.instance.addPostFrameCallback 제거 (불필요한 비동기 지연 및 잠재적 문제 방지).
  • 디버그 로그 추가:
    • [UI Debug] BattleScreen initialized: ${hashCode} (BattleScreen 초기화 횟수 확인용)
    • [UI Debug] Feedback Event: ${event.id}, Type: ${event.feedbackType} (_addFloatingEffect 호출 확인용)
    • FloatingFeedbackTextevent.id 전체 표시 (화면상 ID 일치 여부 확인용)

3. 남아있는 문제 (현재 진단)

  • 로그상 [UI Debug] Feedback Event는 한 번만 찍히지만, 화면에는 MISS 텍스트가 두 번 표시됨.
    • 이는 UI 레벨에서의 렌더링 문제이거나, _addFloatingEffect 함수 내부 로직 중 setState가 비정상적으로 두 번 호출되는 문제일 가능성이 높습니다.
    • _floatingFeedbackTexts.clear() 로직이 추가되었으므로, 같은 리스트에 두 번 추가되는 것은 막혔을 것입니다.

4. 다음 단계 제안

  • [UI Debug] BattleScreen initialized: ... 로그 결과 확인: 이 로그가 두 번 이상 찍힌다면 BattleScreen 인스턴스가 중복된 것이므로, MainWrapper나 라우팅 구조를 점검해야 합니다.
  • 화면상 MISS 텍스트의 ID 확인: 화면에 보이는 두 개의 MISS 텍스트의 ID가 정확히 동일한지 확인 필요 (현재 event.id 전체를 표시하도록 수정됨).
    • ID가 동일하다면: 하나의 FeedbackTextData 객체가 UI에 중복 렌더링되는 문제. (Key 문제, Stack 리빌드 문제 등)
    • ID가 다르다면: _addFloatingEffect 자체가 두 번 호출된 것. (로그가 하나라는 것과 모순됨. 로그 시스템 확인 필요)

현재까지의 모든 문제 해결 노력은 BattleProvider 내의 로직 중복이나 타이밍 오류를 잡는 데 초점을 맞췄습니다. 하지만 MISS 텍스트 중복 문제는 BattleScreen (UI) 쪽에서 발생하는 현상으로 보입니다.