🧠 오늘의 핵심 정리

  • 시간 제한 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;
}

 

 

📌 오늘의 회고

이번 과제는 진짜 “시간이 없어서 생긴 문제”가 대부분이었는데, 그래도 필수 기능은 다 구현했습니다.

특히 사망/시간 종료를 이벤트로 분리하고, 점수/최고점수까지 연결한 구조는 다음에도 그대로 써먹을 것 같습니다.

다음 팀 프로젝트는… 제발… 초반에 일정부터 잡자… 🥲