작성일: 2026-06-12 / 최종 수정: 2026-06-13
대상 프로젝트:FPSGame(6)
✅ 확정된 결정사항 (2026-06-13)
좀비는 3종 구성(Normal / Runner / Tank) 으로 확정 (A안).
Exploder·Shrieker는 죽은 코드 정리 시 제거 — 이펙트/사운드 연결 부담이 크고, Runner/Tank는 스탯 차이가 플레이에서 바로 보여 동작 증명이 확실함.
타입 모델 특징 시각 구분 (코드 자동) 애니메이션 Normal Zombie1 기본 기본 크기/색 Z_WalkRunner Zombie2 빠르고 약함 크기 0.8배, 노란빛 Z_Run(달리기)Tank Zombie3 느리고 강함 크기 1.4배, 붉은빛 Z_Walk1(느린 재생)과제의 "능력·모델링·애니메이션 교체" 요구를 모두 충족하는 구성 — 모델 3종 + 애니메이션 3종 모두 보유 어셋으로 해결
| 항목 | 내용 |
|---|---|
| 게임 플레이 씬 | Assets/Scenes/MainScene.unity |
| 씬 흐름 | LoginScene → LoadingScene → MainScene (3씬 구성) |
| 핵심 스크립트 | Assets/Scripts/ (PlayerFire, EnemyFSM, PlayerMove, GameManager, BombAction, HitEvent, CamRotate 등 13개) |
| 좀비 에셋 | FBX 3종(Zombie1/2/3) + 애니메이션(Idle/Walk/Run/Attack/Falling 등) |
| 무기/투척 에셋 | M67 수류탄 모델(old/modern), 폭발·탄흔 이펙트 |
| 사운드 | Workshop/Audio/Rifle.wav (소총 사운드 이미 보유), 폭발음 |
| Easy FPS 팩 | Assets/Easy FPS/ — 씬에서 미사용(GUID 검색 0건). 단, GunScript.cs에 반동·조준점 벌어짐·탄창/재장전 참고 구현 보유 + 소총 모델/총구화염 에셋 포함 → 과제 2·3·4① 참고용 |
⚠️ 중요: 코드에는 5종이 있지만, 실제로는 전부 Normal 1종으로만 동작함
EnemyFSM.cs에 5종 타입(Normal/Runner/Tank/Exploder/Shrieker) 코드는 존재zombieType 값이 설정되어 있지 않음 → 모든 좀비가 기본값 Normal(0번)findDistance: 8 / attackDistance: 2 / moveSpeed: 5
attackPower: 3 / moveDistance: 20 ← zombieType 필드 자체가 없음 = Normal 고정→ 결과: 아래 능력들이 단 한 번도 실행되지 않는 "죽은 코드"
| 기능 | 코드 | 실제 동작 | 미동작 이유 |
|---|---|---|---|
| Runner/Tank 스탯 | 있음 | ❌ | ApplyTypeStats()가 Normal만 처리 → 스탯 변화 없음 |
| 독 공격 | 있음 | ❌ | canPoison은 Tank만 true → Normal이라 항상 false |
| 자폭 (Exploder) | 있음 | ❌ | zombieType==Exploder 조건 → 절대 진입 안 함 |
| 포효 (Shrieker) | 있음 | ❌ | zombieType==Shrieker 조건 → 절대 진입 안 함 |
| 격노 모드 | 있음 | ⚠️ | 타입 무관이라 유일하게 동작하나 시각 피드백 없음 |
explosionEffect 미연결, 포효 사운드/이펙트 없음 → 능력이 발동해도 피드백 없음Zombie1/2/3 3종뿐 (5타입에 부족)→ 단순 에셋 연결이 아니라, 타입 설정 + 능력별 피드백 구현 + 모델 분배가 모두 필요한 실제 작업
PlayerFire.cs의 2번키는 스나이퍼 줌 모드로 동작 (연사 소총 아님)WeaponMode enum이 Normal/Sniper 2개뿐 → Rifle 모드 추가 + 마우스 홀드 연사 로직 필요Rifle.wav 사운드가 이미 있어 연결만 하면 됨Easy FPS/Scripts/GunScript.cs에 연사·탄창 참고 구현 있음 (씬 미사용 팩이지만 코드 참고 가능)GunScript.cs의 CrossHairExpansionWhenWalking()·recoil 계산이 참고 구현으로 유용CamRotate.cs(마우스 회전 담당)와 연동 필요| 항목 | 현재 상태 | 보유 에셋 |
|---|---|---|
| ① 수류탄 회전 / 탄창 | ⚠️ 투척만 구현됨 | M67 모델, 폭발 이펙트 |
| ② Wave / 스테이지 | ❌ 없음 (좀비 고정 배치) | 좀비 프리팹 3종 |
| ③ 아이템 (체력/데미지/이속) | ❌ 없음 | — |
| ④ 시간별 좀비 생성/강화 | ⚠️ 개별 격노만 있음 | — |
| 위치 | 증상 | 상태 |
|---|---|---|
GameManager.cs:75 CloseOptionWindow() | Time.timeScale = 0f로 잘못 설정 → 옵션창 닫아도 게임 멈춤 | ✅ 수정됨(1순위) |
LoadingNextScene.cs:14 | 매개변수 num 무시하고 씬 번호 1 하드코딩 | 미수정(영향 적음) |
EnemyFSM.cs Move()/Return() | 좀비가 스폰점에서 moveDistance(20) 이상 멀어지면 추격 포기하고 귀환 + 체력 풀회복 → "다가오다 도망가는" 현상 | ⏳ 2순위에서 수정 |
PlayerFire.cs에 Rifle 모드 추가됨 (2번키 → 마우스 홀드 연사)Crosshair.cs 신규 작성 — 4방향 벌어짐 + 위로 튐(복원) + 탄퍼짐. CamRotate는 복원되는 반동으로 수정rifleAudio 1개 연결로 공용)GameManager timeScale 버그 수정, 빌드 깨뜨리는 using UnityEditor* 2건 제거, 한글 주석 인코딩 복구Wave 스포너(3순위)가 좀비 3종 프리팹을 등록해야 하므로 반드시 게임성보다 먼저 작업
EnemyFSM.cs 슬림화moveDistance 리쉬 + 귀환 + 체력회복 전부 제거 → 한 번 발견하면 끝까지 추격ApplyTypeStats() 외형 자동화Zombie Type 지정 (아래 체크리스트 A)Z_Run 등) — anim.speed 차별화로 이미 움직임은 구분됨PlayerFire 확장 — 잔탄/예비탄 + R키 재장전 + 0발 시 자동 재장전 + 탄약 UI. Rifle·Normal 모드 모두 탄약 적용(Sniper는 무제한 ∞), 재장전 사운드(reloadSound.wav) 연결 슬롯 추가PlayerMove.DamageAction에 hurtAudio 추가(hit_sound.wav)PlayerFire에 bloodEffect 추가 — Enemy 명중 지점에 피 파티클 생성(2초 후 자동 제거). FBX 불필요, 보유 파티클 프리팹(CFXR2 Blood (Directional) 등) 연결만EnemyFSM에 zombieAudio+클립(attack/hit/die/growl) 추가 — 평상시 랜덤 그르렁(5~12초) + 공격/피격/사망 사운드. (사운드 클립은 Asset Store에서 다운 필요)PlayerMove에 hurtLight/Medium/Heavy + 임계값(3/6) — Tank/격노 강타는 강한 ouch, Runner 약타는 가벼운 ouch 자동 선택🔊 사운드 전략(2026-06-14 확정 — 린): 오디오는 채점 항목 아닌 연출 보조 → 과투자 금지. "정보 주는 소리"에 집중.
- 플레이어 ouch: 데미지별 3단계 (소스 1개라 안 겹침) ✅
- 좀비: 공격/사망/그르렁 1개씩. AudioSource를 3D(Spatial Blend=1) 로 설정 → 거리감쇠로 가까운 좀비만 들림 = 떼 좀비 소음 자동 해결. 그르렁은 5~12초로 드물게.
- 체력별 그르렁 단계는 생략(소음만 늘고 효과 약함). BGM은 조용한 베드로 나중에.
- 좀비 떼는 웨이브로 점증(WaveManager 3→+2)해야 재밌고 요구4 어필됨 — 단 3D 사운드 필수.
✅ 코드완료 2026-06-14 : Wave별 좀비 자동 스폰(수↑) + 웨이브당 체력+15%/공격+10%/이속+5% 강화 (②+④ 동시 해결).WaveManager.csEnemyFSM에hpMultiplier/damageMultiplier/speedMultiplier주입 필드 추가 — 스폰 시 배율 주입 →ApplyTypeStats()에서 반영
- ⏳ (에디터) 좀비 프리팹화 + 스폰 위치 배치 + 배열 연결 필요 (아래 C 섹션)
✅ 코드완료 2026-06-14 : 체력/공격력/이동속도 아이템 (③). 트리거 충돌 시 효과 적용 후 소멸 + 회전 연출.ItemPickup.csPlayerMove.Heal()추가수류탄 회전 + 던지기 세기(차지) + 폭발음✅ 코드완료 2026-06-14 (①)
BombAction: 날아가며 회전(angularVelocity) + 폭발음(explosionSound,ExplosionNoDebris보유) + 폭발 데미지 널 안전 처리PlayerFire: 우클릭 홀드 차지 — 길게=멀리(maxThrowPower 25)/짧게=가까이(min 8), 풀차지 1.2초. 던질 때 외침(throwVoice) 슬롯(선택)- 에디터: Bomb 프리팹의
BombAction→Explosion Sound에 폭발음 클립 연결 (E 섹션)- 씬에 WaveManager·아이템·Crosshair UI 배치 및 변수 연결
GameManager에 score+AddScore()+scoreText+1점씩 카운트업(countSpeed). 명중 1회당 타입별 점수(Normal 1/Runner 2/Tank 5) — EnemyFSM.HitEnemy에서 가산. (에디터: Score UI 연결)PlayerFire.SetMode에서 switchSound 재생 (pullweapon.wav 보유). (에디터: 클립 연결)PlayerFire에 bloodScale=2로 피 파티클 확대ItemPickup.pickupSound — 클립만 연결하면 됨PlayerMove에 jumpSound(jump.wav 보유, hurtAudio 소스 재사용)countSpeed=40/초) → 큰 점수도 굴러 올라가 눈에 띔ScoreText("Score: N"). 우상단 설정 버튼과 겹쳐 좌상단 배치EnemyFSM.HitEnemy() → GameManager.AddScore() / 표시는 GameManager.Update() 카운트업🧊 마감 판단(2026-06-14): 요구1~4 충족 완료 = 제출 가능 수준. 폴리시는 싼 것만(딸칵/피/점프/점수/아이템음/BGM). 버림: 탄피 배출, 헤드샷(비용↑). 멀티킬은 시간 남을 때만.
✅ 요구사항 4 충족 현황: 탄창/재장전(①) 완료 + 피격사운드/피효과(연출 보강) = 이미 게임성 1종 확보. WaveManager(②④) + 아이템(③)까지 더하면 3종 이상 확실히 충족.
⚠️ 요구사항 1은 "이미 됨"이 아니라 타입 설정·피드백·모델 분배가 필요한 실제 작업임에 유의
🔁 (정정) Zombie1/2/3은 서로 다른 모델이 아니라 같은 좀비의 LOD였음 → 외형 다른 좀비는 Mixamo(Skeletonzombie T Avelange)로 추가 완료. 따라서 외형: 기존 좀비 + Mixamo 좀비 = 2종 + 타입별 색/크기 차별화
📌 우선순위 근거: 1·2순위는 필수 항목(과제 1·2·3번), 3순위는 선택지가 있는 4번. 시간 부족 시에도 필수가 먼저 완성되도록 배치
아래 항목은 코드만으로는 완성되지 않고, Unity 에디터에서 직접 드래그·연결해야 하는 작업입니다.
⚠️ 에셋 재확인 결과 (2026-06-13 정정):
Zombie1/2/3은 서로 다른 모델이 아니라 같은 좀비의 LOD 3단계(파일 1.27→1.03→0.84MB, 텍스처Zombie.tga1세트 공유). 즉 프로젝트 내 좀비 외형은 1종뿐. 군인(Soldier_demo)·FPS캐릭터는 리그(Humanoid)·애니 불일치로 좀비 사용 불가, JMO는 전부 파티클. → 헤어/착장/체중이 다른 좀비는 외부 에셋 임포트 필요.✅ 결정: Mixamo로 외형 다른 좀비 추가 → 별도 가이드
Mixamo_좀비_추가_가이드.md참고
- 코드 준비됨:
EnemyFSM에attackByCode옵션 추가 → Mixamo 클립에 애니메이션 이벤트 안 걸어도 타격 동작Runner Mesh/Tank Mesh슬롯은 유지(사용자 요청). 단 같은 리그 공유 메쉬에만 유효(LOD엔 효과 없음)
1) 좀비에 타입 지정 (필수)
EnemyFSM의 Zombie Type 드롭다운 지정 (추천: Normal 2 / Runner 2 / Tank 1)2) 타입별 다른 외형(몸 모델) 적용 (이번 요청 — 메쉬 드래그 2개)
EnemyFSM → Runner Mesh 슬롯에 Zombie2 메쉬 드래그Assets/Zombie/FBXs/Zombie2.FBX 왼쪽 ▶ 펼치면 나오는 Mesh 아이콘을 드래그)EnemyFSM → Tank Mesh 슬롯에 Zombie3 메쉬 드래그3) 플레이 테스트
Runner/Tank Mesh 슬롯을 비우고, 대신 Zombie2.FBX·Zombie3.FBX를 씬에 직접 배치해 AI 컴포넌트를 붙이는 방식으로 전환 (백업 플랜)4) (선택) 실제 애니메이션 클립 교체: Animator Override Controller로 Move 클립을 Z_Run/Z_Walk1로 교체 — anim.speed 차별화로 이미 움직임은 구분됨
크기·색상·애니속도·몸 모델까지 코드(
ApplyTypeStats())가 자동 적용 → 머티리얼/프리팹 작업 없이 드롭다운 + 메쉬 2드래그로 끝
Crosshair, 앵커 중앙·Pos(0,0)Up(폭3×높이12), Down(3×12), Left(12×3), Right(12×3), 색상 흰색Crosshair 오브젝트에 Crosshair.cs 스크립트 추가 → Up/Down/Left/Right 칸에 4개 이미지 드래그PlayerFire 컴포넌트: Crosshair 칸에 위에서 만든 Crosshair 오브젝트 드래그Workshop/Audio/Rifle.wav 할당 → PlayerFire의 Rifle Audio 칸에 드래그Easy FPS/Prefabs의 소총 모델 활용 가능필요한 에셋 전부 프로젝트 내 보유 — 다운로드 불필요
탄약 UI / 재장전 사운드 (PlayerFire)
AmmoText, 화면 우하단) → Player의 PlayerFire Ammo Text 칸에 드래그Easy FPS/Sounds/reloadSound.wav → PlayerFire의 Reload Audio 칸에 드래그플레이어 피격 ouch 사운드 (PlayerMove)
Easy FPS/Sounds/playerSound/hit_sound.wav → PlayerMove의 Hurt Audio 칸에 드래그좀비 피격 시 피 효과 (PlayerFire)
PlayerFire의 Blood Effect 칸에 피 파티클 프리팹 드래그Assets/JMO Assets/Cartoon FX Remaster/CFXR Prefabs/Liquids/CFXR2 Blood (Directional).prefabAssets/Easy FPS/Prefabs/bloodEffectParticlePrefab_melee.prefab테스트 (B-2 전체)
⏸ 에디터 배치 시점: WaveManager 코드는 배경과 무관(스폰위치 Transform + NavMesh만 의존)이라 다시 수정할 일 없음. 단 스폰 위치 배치 + NavMesh 베이크는 배경 지오메트리 완성 후에 해야 재작업이 없음 → 이 섹션은 배경 작업 직후 진행
⚠️ 의존성: 좀비 사운드까지 연결한 완성 좀비를 먼저 프리팹으로 저장한 뒤 배열에 등록할 것 (안 그러면 스폰된 좀비마다 사운드 재설정 필요)
- 완성된 좀비(사운드 포함)를 Project로 드래그해 프리팹화 (Normal/Runner/Tank/Mixamo)
- 빈 GameObject 생성 후
WaveManager스크립트 부착- 좀비 스폰 위치(Spawn Point) 빈 오브젝트 여러 개 배치 후
Spawn Points배열에 연결- 스폰할 좀비 프리팹들을
Zombie Prefabs배열에 연결- (선택) Wave 표시용 UI 텍스트 생성 →
Wave Text/Info Text에 연결- (선택) 씬에 미리 배치된 고정 좀비는 비활성화(웨이브 스폰만 쓰려면) — 제거 아님, 비활성화
효과/회전/소멸은 코드가 자동. Collider(Is Trigger) + Player 태그만 맞으면 동작
- 빈 아이템 만들기: Hierarchy 우클릭 → 3D Object → 예: Capsule (또는 Cube)
- 그 오브젝트에 Collider의
Is Trigger체크 (Capsule이면 Capsule Collider 기본 있음)ItemPickup스크립트 부착 →Item Type드롭다운으로 종류 선택(Health/Damage/Speed)- (구분용) 색 머티리얼 다르게: 빨강=Health, 노랑=Damage, 파랑=Speed 등
- ⚠️ Player 오브젝트에
Player태그가 있는지 확인 (트리거 판정 조건)- 씬에 종류별로 1~2개씩 배치 → 플레이어가 밟으면 효과 + 사라지는지 테스트
- (배경 의존) 최종 배치 위치는 배경 완성 후 조정 / 또는 좀비 처치 드롭으로 확장 가능
Assets/Prefabs/Bomb.prefab 클릭 → Inspector의 Bomb Action → Explosion Sound 칸에 Assets/Workshop/Audio/ExplosionNoDebris EXP022601.wav 드래그Spin Speed/Min·Max Throw Power는 기본값 그대로 OK)PlayerFire → Throw Voice 칸에 연결Assets/M67/Prefabs/에 모델 보유보유 에셋 전수 확인 결과: 건물/벽/간판/거리 등 3D 환경 구조물 에셋 없음. 있는 건 이펙트/파티클(JMO), 무기(M67), 좀비, 군인(Soldier_demo, 좀비 대용 불가), 그리고 2D 배경 이미지(
Materials/BackGround.png,Workshop/etc/Buildings.png= 현재 씬의 평면 배경)뿐.
→ 도톤보리 야경 골목(비주얼 중요)은 보유 에셋만으론 불가 → 에셋스토어 무료 팩 또는 기본 도형+밤 라이팅.렌더 파이프라인: Built-in 확정 (Unity
6000.3.10f1,GraphicsSettings에 SRP 없음, manifest에 URP/HDRP 패키지 없음).
→ 에셋스토어에서 받을 땐 Built-in 호환 팩만 (URP/HDRP면 머티리얼 분홍색 깨짐).야경 전략: 어둠+네온이 디테일 부족을 가려줌 → 앰비언트↓ + 약한 디렉셔널(달빛) + Fog + Emissive 머티리얼/컬러 라이트로 네온. JMO 파티클(글로우/연기/네온)로 분위기 보조 가능.
배경은 채점 요구(1~4)에 없음 = 완성도/가산점. 시간 부족 시 기본 도형+밤 라이팅이 안전판.
- 배경 방식 결정 (에셋팩 / 기본도형)
- 배경 제작 후 NavMesh 재베이크 → C 섹션(WaveManager 배치) 진행
GunScript.cs 참고 구현 활용 가능)CloseOptionWindow timeScale, LoadingNextScene 하드코딩)도 함께 수정 권장| 스크립트 | 경로 | 역할 |
|---|---|---|
PlayerFire.cs | Assets/Scripts/ | 발사/무기 모드 (← 연사 소총 추가 대상) |
EnemyFSM.cs | Assets/Scripts/ | 좀비 AI/타입/능력 (← 3종 슬림화 + 시각 피드백 추가 대상) |
PlayerMove.cs | Assets/Scripts/ | 플레이어 이동/체력 (← 아이템 연동 대상) |
BombAction.cs | Assets/Scripts/ | 수류탄 폭발 (← 회전/탄창 확장 대상) |
GameManager.cs | Assets/Scripts/ | 게임 상태 관리 (← Wave 연동 대상, CloseOptionWindow 버그 수정 대상) |
CamRotate.cs | Assets/Scripts/ | 카메라 상하 회전 (← 반동(recoil) 연동 대상) |
GunScript.cs | Assets/Easy FPS/Scripts/ | 씬 미사용 / 반동·조준점·탄창 참고 구현 |