콘텐츠로 이동
GameDesign

감지 시스템 작성완료구현밸런싱미완료

본 문서는 몬스터가 플레이어를 인지하는 시야청각 메커니즘, 그리고 그것을 트리거하는 소음 시스템을 정의한다. 몬스터 AI §2에서 인지 전환 트리거로 참조된다.

flowchart LR
subgraph PLAYER [플레이어 행동]
  MW[걷기 소음 30%]
  MR[이동 소음 100%]
  MS[질주 소음 150%]
  ATK[공격·행동 소음]
end
subgraph DETECT [인지 채널]
  NE[NoiseEmitter<br/>baseRadius × noisePower]
  SI[Sight<br/>120도 콘 + sightRange]
end
subgraph RESULT [인지 결과]
  AL[Alert 의심]
  AW[Aware 전투]
end

MW & MR & MS & ATK --> NE
NE -->|임계 30dB 초과| AL
SI -->|시야 각도 통과| AW
AL -->|재소음·피격| AW

classDef player fill:#e0f2fe,stroke:#0284c7,stroke-width:2px,color:#075985
classDef detect fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95
classDef alert fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f
classDef aware fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d
class MW,MR,MS,ATK player
class NE,SI detect
class AL alert
class AW aware
원칙규칙의미
두 채널 독립시야와 청각은 독립적으로 인지 전환을 만든다시야 각도 밖에 있어도 소리가 크면 걸린다
임계 기반 인지30dB 이상 소음 또는 시야 각도 진입 시 인지임계 이하 소음은 무시된다
결과 변경 시에만 이벤트OnSightResultChanged·OnNoiseResultChanged는 결과가 바뀔 때만 발행매 틱 이벤트 스팸 없이 효율적
이동 모드가 소음을 결정걷기 30% / 이동 100% / 질주 150%이동 선택이 곧 스텔스 선택이다
요소의미
sightRange시야 거리. SphereCollider.radius로 설정
sightAngle시야 각도 (전방 콘 — 좌우 각도 합)
includeRangeCharacterHitboxes시야 거리 안에 들어온 캐릭터 콜라이더 풀
closestRangeCharacter거리 안 가장 가까운 캐릭터
closestSightCharacter각도까지 통과해 실제 시야 안에 있는 가장 가까운 캐릭터
OnTriggerEnter (캐릭터가 sightRange 진입)
→ includeRangeCharacterHitboxes에 추가
FixedUpdate (매 틱)
→ 거리 가장 가까운 캐릭터 선택 (closestRangeCharacter)
→ CheckSightAngle: 모델 forward와 대상 방향의 각도가 sightAngle/2 이하인가
→ true: closestSightCharacter = 해당 캐릭터, IsInSight = true
→ false: closestSightCharacter = null, IsInSight = false
→ 결과가 바뀌면 OnSightResultChanged 발행
파라미터기본값
시야 각도120도 (전방 콘)
근접 인지 거리3m (시야 무관 자동 인지)

SetupSight(range, angle)로 몬스터별 차등 가능. 실제 시야 거리는 몬스터별 개별 설정.

DevTools.DrawMonsterSight가 활성화되면 Visualizer.UpdateMonsterSight로 시야 콘이 화면에 시각화된다. 시야 각도·거리·몬스터 상태가 색상으로 반영된다.

요소의미
AuditoryPerception청각 인지 능력 (=Stat.auditoryPerception)
emitters현재 청각 범위 내에서 활성화된 NoiseEmitter 리스트
ResultNoiseResult { IsHeard, ClosestNoiseEmitter }
NoiseEmitter가 소리를 내면
→ 영향 범위(EffectiveRadius) 내 NoiseReceiver들에게 AddEmitter
→ NoiseReceiver는 가장 가까운 Emitter를 ClosestNoiseEmitter로 캐시
→ IsHeard = true, OnNoiseResultChanged 발행
Emitter가 소리를 멈추거나 범위 밖으로 나가면
→ RemoveEmitter
→ 남은 emitter가 0이면 IsHeard = false 발행
  • 의심 단계 전환 임계: 몬스터별 차등 수치 (PDF 기준 예시 30dB).
  • 임계 자체는 스테이터스 영향을 받지 않는 고정 수치 (몬스터별로는 다름).
  • AuditoryPerception 스탯은 청각 인지 **범위(거리)**에 별도 영향을 준다.
요소의미
MinDistance음원에서 이 거리까진 최대 강도
MaxDistance이 거리를 넘으면 들리지 않음
baseRadius기본 영향 반경
noisePower소음 배수. 기본 1, 상황에 따라 조정
EffectiveRadius최종 유효 반경 (baseRadius × noisePower)
발생원강도 (기본 100% 기준)
걷기30%
일반 이동100%
질주150%
무기 휘두름(무기별 정의)
무기 타격(무기·재질별 정의)
환경 파괴(오브젝트 종속, 추후)
환경 소음 (총성·폭발 등)(이벤트성, 추후)

소음은 Unity AudioSource 거리 감쇠 모델을 사용한다.

  • MinDistance 이내: 최대 강도.
  • MinDistance ~ MaxDistance: 거리에 따라 감쇠.
  • MaxDistance 이상: 들리지 않음.

추후 환경 종속 감쇠(벽·실내·지형)는 별도 구현 필요 (현재 단순 거리 기반).

트리거결과
청각 임계 초과 소음 발생 (몬스터별 차등)UnawareAlert
시야 콘 안에 캐릭터 등장Unaware/AlertAware
강한 자극 (피격·폭발 등)Unaware/AlertAware 직접 전환
시야·청각 모두 일정 시간 부재AwareAlertReturnUnaware

상세 매트릭스는 몬스터 AI §2 참조.

이동 모드소음 강도
걷기기본 ×30%
일반 이동기본 ×100%
질주기본 ×150%
  • 공격: 무기 카테고리·콤보 단계별 소음 정의 (밸런싱 영역).
  • 막기: 방패 사용 시 추가 소음 — 미정.
  • 구르기: 모션 종속 — 미정.
  • 아이템 사용: 카테고리·이름별 정의.
  • 환경 상호작용: 상자·문 열기 등 — 미정.

각 항목의 정확한 dB 값은 시트화 예정. 현재는 코드 상수와 ScriptableObject로 운영.

시스템연결 지점
몬스터 AI인지 전환 트리거 (Alert·Aware 전이).
전투공격·이동·막기의 소음 발생원.
캐릭터 스테이터스auditoryPerception·visualPerception·Sensitive.
맵 모듈환경 종속 감쇠 (추후), 모듈별 청각 환경.
영역시트 / 위치
시야 거리·각도 (몬스터별)몬스터 마스터 / 인스턴스 데이터 (위치 미확정)
청각 인지 거리Stat.auditoryPerception (캐릭터 스탯)
청각 임계 (30dB)고정 상수 (시트 미관리)
소음 강도 (행동·아이템별)NoiseEmitter 인스턴스 / ScriptableObject
발자국 소음 배율(코드 상수 — 시트화 예정)
  • 근접 3m 자동 인지 — Sight 외 별도 로직 존재 여부 재확인 필요 (아마 있음).
  • Sensitive 스테이터스가 auditoryPerception 외에 visualPerception에도 영향을 주는 정확한 산식.
  • 환경 종속 청각 감쇠(벽·지형·실내)의 도입 시점.
  • 청각이 방향성을 가지는지 (단순 거리 vs 입체 음향).
  • 시야 라인 오브스트럭션 — 미구현, 추후 구현 필요.
  • 소음 발생원의 noisePower 동적 조정 케이스 (은신 아이템 등).