🧠 오늘의 핵심 정리
- 시간 제한 UI 추가 → 시간 종료 시 결과 화면 + 최고 점수 저장
- 점수 시스템 추가 → 적 처치 시 score 증가
- 사망 처리 안정화 (isDead + onPlayerDie)로 UI/오디오 분리
- 시점 변경(1인칭/3인칭) + 무기 “허공 휘두름/두 개 보임” 이슈 해결
- 튜토리얼 + 영상 재생 + BGM/상황별 효과음까지 마무리
⏰ 4시 제출… 3시 반까지 오류 고치기
오늘은 진짜 레전드였습니다. 4시까지 제출인데 3시 반까지 오류를 고치고 있었다니…
시간이 조금만 더 있었으면 효과음도 더 다듬고 싶었는데, 화요일에 시작했으니 당연히 부족하죠… (핑계 아님 진짜임)
팀 프로젝트 때는 시간관리부터 제대로 하자고 다짐했습니다.
♥️ 생존/실패 두 가지 전개 + 결과 화면
플레이 영상을 보면 전개가 생존 / 실패 두 가지로 나뉩니다.
- 생존 : 시간 게이지를 끝까지 버티면 결과 화면 출력
- 실패 : 적에게 죽으면 사망 UI 출력
시간 종료/사망 둘 다 점수 + 최고 점수를 보여주게 만들었고, 최고점수는 PlayerPrefs로 저장했습니다.
핵심 코드 1) 시간 종료 시 결과 출력 + 최고 점수 저장
// TimeLimit.cs
public static event Action onTimeEnd;
void LateUpdate()
{
if (condition.curValue <= 0)
{
if(Time.timeScale != 0) onTimeEnd?.Invoke();
Time.timeScale = 0f;
TextSet(); // best score 저장 포함
resultPanel.gameObject.SetActive(true);
Cursor.lockState = CursorLockMode.None;
}
}
⚔️ 점수 시스템 : 적 처치 시 score 증가
점수는 “적을 잡으면 올라가게” 단순하게 시작했습니다. 이게 있어야 결과화면이 재미가 생기더라고요.
핵심 코드 2) 적 죽을 때 score 증가
// NPC.cs
if(health <= 0) { CharacterManager.Instance.Player.score += 1; Die(); }
💀 사망 처리(중복 방지) + UI/사운드 분리
사망은 한 번만 실행되게 isDead로 막고, 죽는 순간 onPlayerDie 이벤트를 날려서 UI랑 오디오가 각각 반응하도록 정리했습니다.
이렇게 해두니까 “죽음 처리” 로직이 UI/사운드랑 섞이지 않아서 디버깅이 훨씬 편했습니다.
핵심 코드 3) isDead + onPlayerDie
// PlayerCondition.cs
public event Action onPlayerDie;
public bool isDead;
public void Die()
{
if (isDead) return;
isDead = true;
onPlayerDie?.Invoke();
}
👁️ 시점 변경(1인칭/3인칭) 때문에 생긴 무기 이슈
여기서 시간이 제일 많이 털렸습니다…
1인칭에서는 플레이어를 안 보이게 해두고 칼을 따로 배치했는데, 3인칭으로 바꾸자마자 칼이 허공에서 휘두름 + 칼이 두 개처럼 보이는 문제가 발생했습니다.
결국 해결 방향은 “장착 시에만 칼 오브젝트를 켜고”, “공격 판정도 현재 시점 기준 Transform에서 쏘도록” 조정했습니다.
핵심 코드 4) 공격 Ray 기준을 cameraContainer로 통일
// EquipTool.cs
attackSourceTransform = CharacterManager.Instance.Player.controller.cameraContainer;
Vector3 origin = attackSourceTransform.position;
Vector3 direction = attackSourceTransform.forward;
Physics.Raycast(origin, direction, out hit, attackDistance);
🎥 튜토리얼 + 영상 재생 + BGM
시작 씬에는 튜토리얼을 만들었고, 유니티에서 처음으로 VideoPlayer도 다뤄봤습니다. (다음에 진짜 써먹을 듯)
그리고 BGM은 기본 재생 + 사망/시간 종료 상황에서 클립을 바꿔 재생하게 만들었는데, 이벤트 구독 해제를 안 하면 씬 전환 때 난리 나서 OnDestroy에서 해제까지 처리했습니다.
핵심 코드 5) 오디오 이벤트 구독/해제
// AudioManager.cs
CharacterManager.Instance.Player.condition.onPlayerDie += PlayDieSound;
TimeLimit.onTimeEnd += PlayTimeEndSound;
public void OnDestroy()
{
CharacterManager.Instance.Player.condition.onPlayerDie -= PlayDieSound;
TimeLimit.onTimeEnd -= PlayTimeEndSound;
}
📌 오늘의 회고
이번 과제는 진짜 “시간이 없어서 생긴 문제”가 대부분이었는데, 그래도 필수 기능은 다 구현했습니다.
특히 사망/시간 종료를 이벤트로 분리하고, 점수/최고점수까지 연결한 구조는 다음에도 그대로 써먹을 것 같습니다.
다음 팀 프로젝트는… 제발… 초반에 일정부터 잡자… 🥲
'내일배움캠프 본캠프' 카테고리의 다른 글
| [내일배움캠프 35일차 TIL] 플레이어 움직임 (0) | 2025.11.17 |
|---|---|
| [내일배움캠프 34일차 TIL] 3D팀 프로젝트 (0) | 2025.11.14 |
| [내일배움캠프 32일차 TIL] 개인 프로젝트 제출 D-1 (0) | 2025.11.12 |
| [내일배움캠프 31일차] 3D 서바이벌 게임 세팅 (0) | 2025.11.12 |
| [내일배움캠프 30일차 TIL] 3D 게임의 지옥 (0) | 2025.11.10 |