이전 개발 일지에서 언급했던 Loading 기능을 구현하기 위해 LoadingScene을 새로 추가했다.
또한 인게임 요소 중 하나인 플레이어의 체력과 쉴드를 확인할 수 있도록 기본적인 UI도 연동해두었다.
UI 에셋은 아직 정식 디자인이 아닌, 기본 구성 요소들만 배치해 위치와 흐름만 먼저 잡아둔 상태이다.
1. LoadingScene
일반적인 모바일 게임들처럼, Scene 전환 시 로딩 화면을 거쳐 다음 Scene으로 이동하는 구조를 구현했다.
- 새로운 LoadingScene을 생성
- 목적지 Scene 이름을 전달받아 로딩 처리
- 로딩이 완료되면 자동으로 다음 Scene으로 이동

그리고 Scene이 넘어갈 때 일러스트나 짧은 4컷만화를 볼 때 약간의 시간이 걸리더라도 게임 속 캐릭터들의 이야기나 세계관을 유저들에게 보여줄 수 있는 공간이라고 생각했습니다.
플레이어의 지루함을 줄이고, 대기 시간을 유용하게 활용하며, 게임에 대한 몰입도를 높일 수 있다고 생각했습니다.

기존에는 SceneManager의 LoadScene을 직접 호출하여 각 Scene으로 이동했지만,
이번에는 Static 클래스를 새로 만들어, 해당 클래스 내부의 메서드를 통해 LoadingScene을 거쳐 Scene이동하도록 구조를 변경했다.
Scene 이동 및 LoadingScene 구조
현재 게임에서는 Scene 이동을 단순화하기 위해 SceneLoader라는 static 클래스를 활용하고 있다.
SceneLoader.LoadScene("SceneName")을 호출하면 먼저 LoadingScene으로 이동하고, 이후 실제 목표 씬으로 전환되는 구조다.
로딩씬에서는 실제 씬을 비동기 로드하며, 진행률을 기반으로 UI(Slider, 텍스트)를 갱신하고, 로딩 이미지도 랜덤으로 변경하도록 구현했다.
using System.Collections;
using System.Collections.Generic;
public static class SceneLoader
{
public static string nextSceneName;
public static void LoadScene(string nextScene)
{
nextSceneName = nextScene;
UnityEngine.SceneManagement.SceneManager.LoadScene("LoadingScene");
}
}
로딩 연출을 위해 다음 요소들을 배치했다.
- LoadingBar: 씬 로딩 진행률을 시각적으로 표시
- 로딩 이미지: 로딩 중 사용자에게 보여줄 일러스트 또는 이미지
- LoadingBarPercentText: 진행률을 퍼센트로 표시

또한, 로딩이 너무 빠르게 완료되어 화면이 금방 넘어가는 경우 사용자가 로딩 이미지를 제대로 보지 못하는 문제를 방지하기 위해, 연출 목적의 1초 정도 딜레이를 추가했다.
- 씬 로딩은 비동기 방식으로 진행
- 실제 로딩 진행률이 90% 이상일 때는 **fakeLoading**을 통해 천천히 100%까지 증가하도록 구현
- progress 값이 1이 되어야만 씬이 활성화되도록 설정하여, 로딩 화면의 이미지와 연출을 충분히 확인할 수 있도록 했다

비동기 로그인을 구현하던 중 하나의 문제가 발견되었다.
LoadingProgress는 클리어 후나 다른 씬으로 이동할 때는 정상적으로 작동했지만, 클리어 실패 후 재시작을 눌러 같은 씬을 불러올 때 멈춰버리는 현상이 발생한 것이다.
문제를 조사한 결과, 캐릭터의 체력이 모두 감소하면 Time.timeScale을 0으로 변경하는 로직이 있었고, 이로 인해 LoadingProgress 코루틴이 멈춰 LoadingScene에서 진행되지 않는 현상이 발생한 것이 원인임을 확인했다.
해결 방법으로, 클리어 실패 UI가 출력될 때 Time.timeScale을 다시 1로 변경하도록 수정하자 LoadingProgress가 정상적으로 작동하였다.
이번 경험을 통해, TimeScale 변경이 yield return new WaitForSeconds(float seconds)를 사용하는 코루틴은 Time.timeScale의 영향을 받는 점을 알 수 있었다.
Day 68 - 유니티에서 시간을 멈춰도 코루틴이 작동하게 하는 방법 🎮
유니티에서 시간을 멈춰도 코루틴이 작동하게 하는 방법주제>> 기본 문제: Time.timeScale = 0;>> 코루틴에 Real-Time 적용하기>> Real-Time을 사용하는 이유>> 실전 예제: 정지 화면에서
unity4th-shin.tistory.com
2. 플레이어 체력 및 쉴드 UI 연동
게임 플레이 중 플레이어의 체력과 쉴드 상태를 쉽게 확인할 수 있도록, UI를 좌측 상단에 배치하여 화면을 가리지 않도록 구현했다.
- 플레이어가 선택한 캐릭터 정보를 기반으로 체력과 쉴드 UI를 업데이트
- 체력과 쉴드 오브젝트를 게임 내 UI에 추가
- 초기값 설정과 체력/쉴드 증감 시 호출되는 체력과 쉴드 Update 메서드들을 통해 실시간으로 UI 갱신
동작 방식
- 체력이 감소하면 UI 상의 체력 오브젝트가 순차적으로 감소한다.
- 쉴드를 획득하면 쉴드 UI 오브젝트가 활성화되어 표시된다.
이를 통해 플레이어는 게임 플레이 중 자신의 상태를 직관적으로 확인할 수 있게 되었다.


3. Fade In 효과
게임 시작 시, 유닛과 맵이 생성되는 과정이 그대로 노출되는 현상이 있어 이를 개선하기 위해 Fade In 효과를 추가했다.
- 화면을 검은색에서 점차 밝아지도록 연출
- 맵과 캐릭터가 생성되는 과정이 자연스럽게 감춰지며, 게임 시작이 보다 부드럽게 보이도록 구현


플레이 영상
이후 개발 예정 내역
누락된 UI 내역 및 새로운 UI 및 기능추가
- 게임 플레이 도중 옵션 및 일시정지 기능 추가 및 UI 연동
- 일시정지 해제 및 게임 복귀 기능 추가 및 UI 연동
- 옵션 UI 추가
- 상점 UI 추가
- 뽑기 UI 추가
게임 시스템 설계 준비 및 기획 예정 내역 정리
현재 개발 중인 게임의 전체 구조를 확장하기 위해, 다음과 같은 게임 시스템 요소들에 대해 기획을 진행할 예정이다.
특히 상점, 아이템, 경쟁 콘텐츠, 캐릭터 등 게임의 전반적인 구조를 결정하는 핵심 요소들에 대한 구체적인 방향성 설정이 필요하다.
1. 상점에서 구매한 아이템의 사용처
- 아이템을 스토리 모드에서는 사용하지 않는 방향으로 고려 중
- 그렇다면 아이템을 사용할 수 있는 별도의 모드가 필요
- 아이템 사용처를 어떻게 정의할지에 대한 고민 필요
- ex) 무한 모드, 도전 모드, 데일리 모드 등
2. 새로운 게임 모드 추가 여부
- 스토리(탐색) 외에 새로운 모드 추가 가능성 검토
- 새로운 모드 의 구체적인 진행 방식 기획
- 난이도 증가 방식
- 장애물/플랫폼 패턴
- 점수 산정 방식
- 사용 가능한 상점 아이템 적용 규칙
3. 점수 기반 대시보드(랭킹 시스템) 설계
- 플레이어 점수를 기록하는 대시보드를 어떤 콘텐츠에 연동할 것인지 결정할 것
- 경쟁 콘텐츠가 되는 만큼 순위 보상 시스템 기획이 필요하다.
- 주간 보상? 월간 보상?
- 상위 % 보상? 티어 보상?
4. 뽑기 시스템 설계
- 뽑기를 통해 어떤 아이템을 제공할 것인지 기획
- 게임의 수익 구조와도 연결될 수 있는 중요한 요소 이지만 실질적인 수익구조는 생각 X
5. 캐릭터 해금 방식
- 캐릭터 획득 접근 방식 정의
- 스테이지 클리어 보상
- 재화 구매
- 뽑기
- 해금 난이도 및 조건을 어떤 기준으로 설정할지도 포함할 것
6. Gem(가칭)의 사용처 정의
- Gem은 고급 재화의 역할이므로 소비처를 확실히 정해야 한다.
- 뽑기
- 상점 고급 아이템 구매
- 추가 부활(제자리 부활) - 게임 도중 단 1회만 사용 가능
게임 설정 기획 예정내역
- 상점 주인 캐릭터 설정 및 디자인
- 상점 판매 아이템 이름 설정
- 뽑기 상점 캐릭터 설정 및 디자인
- 기획한 캐릭터들과 챕터 정보 기반 간단한 스토리 기획
점차 코드와 스크립트가 많아지면서, 예전에 작성했던 부분을 제대로 확인하지 못하는 상황이 늘어나기 시작했다. 이번에 겪은 비동기 로딩 문제도 그 영향이 컸다.
클리어 실패 후 재시작을 할 때 LoadingProgress가 멈춰버리는 문제가 있었는데, 원인은 캐릭터 사망 시 Time.timeScale = 0으로 설정하는 로직이었다. TimeScale이 0이 되면서 코루틴 자체가 멈춰버린 것이다. 하지만 처음엔 이 부분을 떠올리지 못하고, 로딩 로직이나 비동기 처리 방식에 원인이 있다고 생각하며 한참을 들여다보는 시행착오를 겪었다.
돌이켜보면 이 문제는 “이 메서드가 실행되기 전에 어떤 흐름이 있었는지”만 조금 더 빨리 생각했더라면 금방 해결할 수 있는 문제였다. 하나의 기능만 집중해서 보다가, 정작 영향을 주는 다른 스크립트나 로직을 제대로 확인하지 못한 것이 원인이었다.
이번 경험을 통해, 문제가 생기면 현재 코드뿐 아니라 이전 흐름 전체를 함께 바라보는 습관이 얼마나 중요한지 다시 느꼈다. 앞으로는 로직 간의 연결 관계를 더 체계적으로 점검하며 문제를 해결할 수 있도록, 개발 접근 방식을 조금씩 개선해 나가야겠다.
'Unity' 카테고리의 다른 글
| 개발 일지 - 포션 아이템 추가 및 점수, 골드 아이템 스크립트 변경(Interface) (0) | 2025.11.26 |
|---|---|
| 개발일지 - 프로토타입 구현 기획 작성 및 구현 내역 (PrototypeStage, Chapter, FirebaseLogin, Save, Load) (1) | 2025.11.19 |
| 개발일지 - 프로토타입 구현 기획 작성 및 구현 내역 (0) | 2025.10.16 |
| 개발 일지 - 간단한 기획 및 게임 틀 제작기획 (0) | 2025.10.07 |
| Unity-Firebase등록 및 추가 (0) | 2025.09.26 |