728x90
비동기 작업들을 순차적으로 실행하기
문제점
오늘 사용자 익명 인증(게스트로그인)을 추가하면서 어느 시점에 사용자 인증을 실행해야할지 고민해보다가 몇가지 개선점을 발견했다.
- 로딩화면이 어드레서블 그룹라벨 로드하는 동안에만 나온다. (다른 로드는 기다려주지 않음)
- 게임을 시작하기 전에 필요한 비동기 작업들이 여기저기 흩어져 있어 파악하기 어렵다.
- 게임을 시작하는 함수도 상황에 따라 다른 곳에서 호출하기 때문에 게임 시작 시점이 직관적이지 않다.
=> 게임을 시작하기 전에 해야하는 비동기 작업들을 순차적으로 실행시키고 싶은 욕망과 약간의 필요성이 있었음.
해결 과정
순서를 지켜서 실행시켜야 할 작업들을 정리하면 다음과 같다.
- 로딩 화면 켜놓기
- 사용자 인증 (에디터에서는 실행X) (비동기)
- 리소스 그룹 로드 (비동기)
- 필요한 오브젝트들 생성
- 게임 데이터 로드 (첫 실행이면 디폴트 데이터로 세팅) (비동기)
- 로딩 화면 끄고 게임 시작
이 각각의 흩어져있던 작업들을 코루틴 기반으로 순서대로 실행하도록 구성했다.
비동기 작업들은 yield return new WaitUntil(() => isGroupLoadFinished); 와 같은 형태로 생각했다. 그런데 더 메모리 친화적(?)인 코드를 위해 while문과 yield return null; 로 대기를 걸어주는 방식을 선택했다.
사실 코드 자체가 어렵진 않았다. 여기저기 흩어진 코드를 정리하는 게 어려웠지... 😭
IEnumerator LoadGameScene()
{
// 0. 로딩 화면 보여주기 =======================================================
GameObject loading = GameObject.Find("LoadScene");
// 1. 사용자 인증 ==============================================================
#if UNITY_EDITOR
#else
yield return Managers.Auth.AnonymousLoginCoroutine();
#endif
// 2. 그룹 로드 완료되면 넘어가기 ==============================================
bool isGroupLoadFinished = false;
Managers.Resource.LoadResourceLocationAsync(LabelAsync, () =>
{
isGroupLoadFinished = true;
});
while (!isGroupLoadFinished)
{
yield return null;
}
// 3. 필요한 것들 생성 =========================================================
InstantiateGameObjs();
// 4. 정보 로드 ================================================================
Managers.Data.LoadGameData(() =>
{
// 로드 실패 시
// 파이어베이스에 데이터가 없으면 디폴트 인벤토리로 세팅
DefaultTowerAdd();
DefaultUnitAdd();
});
while (!Managers.Data.IsGameDataLoadFinished)
{
yield return null;
}
// 5. 로딩창 끄고 게임 시작 ====================================================
if (loading != null) Managers.Resource.Destroy(loading);
Managers.Wave.GameStart();
}
이전 코드들
1. SceneManager의 ChangeScene에서 그룹로드를 비동기 실행시켜둠
(처음에는 비동기 로드할 것이 리소스 로드밖에 없을 것이라고 생각해서 작성한 코드)
2. GameScene의 Enter에서 필요한 것들을 생성하는데, 특정 오브젝트가 생성되고 나서 파이어베이스에서 데이터 불러오기 실행(29번 줄)
(BuildingSystem이 꼭 있는 상태여야 하기 때문에 이렇게 작성했는데 너무 개연성없어보이는 코드라고 생각)
결과 코드
728x90
'프로젝트 일지 > Unity' 카테고리의 다른 글
[Unity/TIL] Firebase Cloud Functions - 서버에서 뽑기 로직 돌리기(2) (5) | 2025.06.24 |
---|---|
[Unity/TIL] Firebase Cloud Functions - 서버에서 뽑기 로직 돌리기(1) (2) | 2025.05.19 |
[Unity/TIL] 트러블 슈팅 - 예상치 못한 생성자 호출과 텅 빈 생성자 Parameter 에 당황한 썰 (3) | 2025.05.07 |
[Unity/TIL] UI Button 클릭 안 먹는 이유 뭐였게-요 (5) | 2025.05.02 |
[Unity/TIL] '오집마' 프로젝트 개발 일지 - 그리드 배치 시스템 (8) | 2025.05.01 |