■ 개요
○ 오늘 계획
■ 매니저스 초기화
○ 기존
- 씬로드 비동기 코루틴에서 첫로딩(타이틀->인게임으로 갈때 무조건 첫로딩)인지 확인하고 이때 캐릭터매니저와 게임매니저를 초기화 했음
- 이유: 매니저스가 타이틀에서 초기화되고 있는데, 캐릭터 매니저와 게임매니저는 초기화 구문에 플레이어 프리펩을 포함한 초기화와 소환이 이루어지고 있음. 타이틀에서 플레이어를 소환하면 안되므로 그 둘만 따로 초기화 해야함.
때문에 인게임으로 넘어가며 초기화가 이루어져야함.
- 문제: 씬로드가 발생할때마다 if문으로 첫 로딩인지 검사하는것은 비효율적이라 생각함.
○ 오버로드
- 씬로드 함수를 오버로드 하여, 캐릭터 매니저, 게임 매니저 초기화 코드를 매개변수로 넘길때만 호출되게끔 함
- 타이틀매니저
private void StartGame()
{
if (!startCheck)
{
Managers.Sound.PlaySFX(SFX.UI_ButtonClick);
// BGM 정지
audioPlayer.StopTitleBGM();
// 게임 시작 - 실제 게임 씬으로 전환
Managers.Scene.LoadScene(ESceneName.Village, () =>
{
Managers.Character.Init();
Managers.Game.Init();
if (!Managers.SaveLoad.FileExists()) // 저장데이터가 없으면 필드에 있는것을 이름으로 설정
{
Managers.Character.Player.saveData.SetCharacterName(inputField.text);
}
});
startCheck = true;
}
}
/// <summary>
/// 지정된 씬을 로드합니다.
/// </summary>
/// <param name="sceneName">로드할 씬의 이름</param>
public void LoadScene(ESceneName sceneName)
{
DOTween.KillAll();
if (!isLoading)
{
// 이전 코루틴이 실행 중이라면 중지
if (loadingCoroutine != null) return;
// 로드하는 씬을 저장합니다.
curScene = sceneName;
loadingCoroutine = StartCoroutine(LoadSceneAsync(sceneName.ToString(), loadingPortal.OnProgress));
Utils.SetInputLock(true);
}
else
Logger.Log("이미 씬 로드중입니다.");
}
/// <summary>
/// (오버로드) 캐릭터, 게임 매니저 초기화 코드를 콜백으로 받고, 지정된 씬을 로드합니다.
/// </summary>
/// <param name="sceneName">로드할 씬의 이름</param>
/// <param name="callBack">캐릭터매니저, 게임매니저 초기화 코드</param>
public void LoadScene(ESceneName sceneName, Action callBack = null)
{
DOTween.KillAll();
if (!isLoading)
{
// 이전 코루틴이 실행 중이라면 중지
if (loadingCoroutine != null) return;
// 로드하는 씬을 저장합니다.
curScene = sceneName;
callBack?.Invoke();
loadingCoroutine = StartCoroutine(LoadSceneAsync(sceneName.ToString(), loadingPortal.OnProgress));
Utils.SetInputLock(true);
}
else
Logger.Log("이미 씬 로드중입니다.");
}
■ UGS
○ 유저닉네임 저장
- 유저 ID를 원하는데로 설정하여 변경할 수 있음
- 기존 ID는 유니티에서 자동으로 생성해주고 같은 유저는 같은 ID를 유지함
UnityServices.ExternalUserId = "custom-user-id";
- 이 코드로 변경할 수 있으나. ID가 달라질때마다 새로운 유저로 수집하기 때문에, 한명이서 이름을 계속 바꿔서 이벤트를 발생시킨다면 각기 다른 여러명의 유저들로 기록됨
- 이벤트 데이터의 신뢰도가 떨어지고, 많은 유저수로 측정되어 UGS 요금을 내야할 수도 있음😶
○ 개발환경 데이터 수집 분리법
- 프로젝트 세팅 -> 개발환경을 '에디터'로 설정
- UGS 대쉬보드 이벤트 브라우저에서 발생 이벤트 환경을 선택할 수 있다
- 현재는 프로덕션으로 설정되어있지만 에디터로 변경가능
○ 에디터 환경 정보 저장 원천 봉쇄
- 하지만 생각해보니 굳이 에디터에서 발생하는 이벤트 데이터를 저장할 필요가 없을거 같음
#if UNITY_EDITOR
#else
private async void Start()
{
await UnityServices.InitializeAsync();
if (UnityServices.State != ServicesInitializationState.Initialized)
{
Logger.Log("USG 세팅 실패");
return;
}
Logger.Log("USG 성공");
AnalyticsService.Instance.StartDataCollection();
}
#endif