큰 기능이 아니라 디테일의 연속. 실제로 플레이하면서 발견한 문제들을 하나씩 고쳤습니다.

NPC가 플레이어를 따라오게

대화 중 따라오기

대화 중인 NPC가 제자리에 고정되어 있었습니다. 플레이어가 걸어가면 NPC가 허공에 대고 말하는 상황.

// 대화 중 플레이어가 멀어지면 따라감 (멀수록 빠르게)
if (chatDist > 1.5) {
  const speedMult = chatDist > 5 ? 2.0 : chatDist > 3 ? 1.2 : 0.7;
  // ...이동
}

거리별 속도: 5타일 이상이면 뛰기(2x), 3타일 이상이면 빠른 걸음(1.2x), 가까이면 천천히(0.7x).

유진 접근 버그 (canStandInScene)

유진이 절대 못 걸어오는 버그가 있었습니다. 원인: canStandInScene(nx, ny, npc) — 세 번째 인자에 NPC 객체를 넘겼는데, 함수는 문자열("outdoor")을 기대. NPC 객체 !== "outdoor" → 항상 false → 한 발짝도 못 움직임.

// Before (모든 이동 차단)
canStandInScene(nx, ny, npc)

// After
canStandInScene(nx, ny, npc.currentScene || "outdoor")

NPC가 플레이어를 바라보게

대화 중 NPC가 플레이어를 안 쳐다보고 있었습니다. 렌더러에서 state === "chatting"일 때 rotation.y를 플레이어 방향으로 설정.

오디오

Web Audio API → HTML5 Audio

Web Audio API로 BGM을 재생하면 치지직/하울링이 발생했습니다.

원인:

  • gain.linearRampToValueAtTime 스케줄링 충돌
  • MP3 루프 시작점 인코더 갭
  • 다중 gain 노드 간섭

해결: Web Audio API를 버리고 <audio> 엘리먼트 사용. 브라우저가 루프를 네이티브로 처리해서 깨끗합니다.

BGM 교체

lo-fi → 동물의 숲 스타일 BGM (Pixabay: Chill Yume Animal Crossing).

LLM 프롬프트

Ambient 독백이 자기소개하는 문제

NPC 혼잣말인데 "안녕하세요, 처음 뵙죠? 저는 모카라고 해요"라고 함.

원인: 서버에서 ambient 요청도 일반 대화 프롬프트 전체를 받아서, "처음 만나는 사람입니다. 자기소개를 해주세요"가 포함됨.

해결: 유저 메시지에 "독백/중얼거/혼잣말" 키워드가 있으면 경량 프롬프트 사용:

당신은 모카입니다. 성격: 쾌활한 바리스타.
[말버릇] 커피에 빗대어 말함
시간: 21:26
→ 중얼거려

(+버그: payload.message 대신 payload.userMessage를 읽어야 했음)

유진 이중 인사 제거

4초 간격으로 2번 인사 → 1번만 인사하고 바로 대화 가능.

대화 중 다른 NPC 채팅 끼어듦 방지

conversationFocusNpcId가 있으면 ambient/gossip을 채팅 로그에서 제외. 말풍선은 유지.

인트로 카메라

Before

단순한 사인파 수평 패닝 → 밋밋

After

랜덤 NPC 4명 + 광장을 1.8초씩 순회 → 마을이 살아있는 걸 직접 보여줌 → 플레이어로 부드럽게 복귀.

NPC간 대화

간격 수정

2256분 → **1025초**. 혼잣말(8~20초)과 비슷한 빈도.

쌍 선택 개선

랜덤 NPC → 가장 가까운 쌍 우선. 거리 2.3 → 6타일. 멀면 서로 걸어가게.

Rule-base 혼잣말 → 이모티콘만

"흠흠", "와~", "그래?" 같은 텍스트 제거. 🎵 🎶 💭 ✨ 😄 😮 이모티콘만 남김. LLM 혼잣말은 여전히 텍스트.

같은 NPC 연속 혼잣말 방지

lastAmbientNpcId를 기억해서 직전과 같은 NPC면 2번째로 가까운 NPC 선택.

이번 커밋들

커밋 내용
NPC follow + face player 대화 중 따라오기 + 바라보기
canStandInScene fix NPC 이동 불가 버그 수정
Guide greeting teleport 8초 도착 못하면 텔레포트
Audio rewrite Web Audio → HTML5 Audio
BGM replace 동숲 스타일 BGM
Ambient prompt fix 독백 경량 프롬프트
Double greeting fix 유진 이중 인사 제거
Intro camera NPC 순회 시네마틱
Emoji-only ambient 텍스트 제거
NPC social frequency 10~25초 간격
Consecutive ambient fix 연속 혼잣말 방지