내일배움캠프 70일차 TIL : 매니저스 분리 초기화, UGS 개발환경 분리

woollim·5일 전
1

내일배움캠프TIL

목록 보기
63/65
post-thumbnail

■ 개요

○ 오늘 계획

  • 매니저스 초기화 튜터님께 여쭤보기
  • UGS
    • 유저닉네임 저장법 알아보기
    • 개발환경 데이터 수집 분리법 알아보기
  • 저장시스템 만들기


■ 매니저스 초기화

○ 기존

  • 씬로드 비동기 코루틴에서 첫로딩(타이틀->인게임으로 갈때 무조건 첫로딩)인지 확인하고 이때 캐릭터매니저와 게임매니저를 초기화 했음
  • 이유: 매니저스가 타이틀에서 초기화되고 있는데, 캐릭터 매니저와 게임매니저는 초기화 구문에 플레이어 프리펩을 포함한 초기화와 소환이 이루어지고 있음. 타이틀에서 플레이어를 소환하면 안되므로 그 둘만 따로 초기화 해야함.
    때문에 인게임으로 넘어가며 초기화가 이루어져야함.
  • 문제: 씬로드가 발생할때마다 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

0개의 댓글