겨울팥죽 여름빙수
article thumbnail

매번 앱을 출시 할 때 마다, 헷갈리게 되고, 문제가 생기면 제법 시간을 많이 잡아 먹어, 정리하게 됐다.

 

1. Unity Firebase세팅

github.com/google/mechahamster

 

google/mechahamster

Mecha Hamster is a game where you roll through customizable environments that you can share with your friends. - google/mechahamster

github.com

 

여기서 sdk를 다운 받고,

  • FirebaseAnalytics.unitypackage
  • FirebaseAuth.unitypackage

이 두개만 임포트 한다(나머지 기능은 안쓰고 있어서..). 

여기서 중요한 건, Firebase 먼저 세팅하는게, 플러그인 들끼리 꼬이지 않는다. Gpgs를 먼저 하지말고, Firebase를 먼저 import하도록 하자

 

2. Unity GooglePlayGameService (gpgs)

github.com/playgameservices/play-games-plugin-for-unity

 

playgameservices/play-games-plugin-for-unity

Google Play Games plugin for Unity. Contribute to playgameservices/play-games-plugin-for-unity development by creating an account on GitHub.

github.com

마찬가지로 위 사이트에서, gpgs sdk를 다운받고, 프로젝트에 import하자. 나머지 세팅은 나중에 하도록 하자. 우선 import까지만.

 

 

 

3. 구글 프로젝트 생성 및 Gpgs프로젝트 생성

 

 우선 구글 개발자 콘솔에서, 해당 게임 프로젝트를 생성한다. 그 담에 앱 무결성을 보면 아직, apk나 앱번들을 올리지 않아 뜨지 않을 텐데, 테스토용 앱번들을 비공개 프로젝트로 만들어 올리면, 앱 서명키가 뜬다.

 

 

 위 그림과 같이, 두개의 앱 서명키가 있는데, 앱 서명 키는 실제 프로덕션 출시 후, 마켓에서 다운받은 클라이언트에서 쓰이는 키 값이고, 업로드 키 인증서는 테스트 용이라고 생각하면 된다.

 

 

 

 Gpgs프로젝트를 생성한다.

 

 프로젝트 생성 후, 사용자 인증 정보 만들기로 들어간다. 들어가면 OAuth동의 화면을 만들어야 한다고 한다. OAuth동의화면을 클릭하면,  구글 클라우드 플랫폼 페이지로 넘어간다.

 Gpgs프로젝트를 생성하면, 해당 프로젝트가 구글 클라우드 플랫폼에 자동 등록 된다. 나는 다른 프로젝트들도 많아, 헷갈리지 않게, 프로젝트 이름을 [rpg-client-gpgs]라고 변경해 뒀다. 안해도 되긴하는데, 나중에 헷갈리지 않게 미리 해주는게 좋을거다.

 

 

 

위 그림과 같이  OAuth를 만들고, 테스트를 앱 게시로 만든다. 그렇게 하면, 테스트 계정이 아니더라도, 정상적으로 구글플레이 접속 시 동의 화면이 뜬다. 안하면 테스트 계정만 동의화면이 뜨고, 나머지는 무한로딩에 걸린다.

2021/01/24 - [게임을 만들자/Unity] - Unity, Google Play Game Service 인증 무한 로딩 현상

 

 

이제 사용자 인증정보를 만들도록 하자.

 

 

 위 그림과 같이, 클라우드 플랫폼 페이지 왼쪽에, 사용자 인증정보를 클릭하고, OAuth클라이언트 ID를 만들도록 하자. 

서비스용, 테스트용 두개를 만들어야 하는데, 아까 위에서 말한 앱서명키 값이 필요하다. 각각 앱서명키를 넣어, 사용자 인증정보 2개를 만들도록 하자.

 

 

다 만들고 나면 위 그림과 같이 OAuth2.0클라이언트 ID가 두개 있을 것이다. 나는 이름을 [GPGS_RUNNING], [GPGS_TEST]라고 해 두었다. 다 했으면 다시, GPGS설정 페이지로 돌아가도록 하자.

 

 

사용자인정보를 두개 만들도록 하자. 마찬가지로, 서비스용, 테스트 용 두 개이다.  OAuth클라이언트 선택창에 내가 만든 인증키가 뜰 것이다. 각각 만들면 된다.

 

 

 

여기까지하면 우선, 구글 플레이 게임 서비스는 끝이다. 다음은 파이어베이스 프로젝트를 생성하고, 연결하도록 하자.

 

 

 

4. Firebase프로젝트 생성 및 설정

 

 

 Gpgs설정 -> 외부통합을 보면 Firebase추가 버튼이 있다. 누르도록 하자.

 

 

 누르고 Firebase콘솔 페이지에 들어가면, 위와같이 자동으로 프로젝트가 생성 돼 있을 것이다.

 

 

 생성 된 프로젝트에 들어가면, 위와같이 뜨는데, 동의하면 된다.

 

 

 위 그림과 같이 Authentication-> sign in method에 들어가서, Google을 사용 설정됨으로 바꾸자.

 

 

사용 설정으로 바꾸고 안에 내용을 보면 위와 같이 웹클라이언트 ID와 비밀 번호가 생성 될 것이다.

구글 플라우드 플랫폼으로 가보자.

 

 

 클라우드 플랫폼 페이지의 사용자 인증 정보 탭을 보면, 위와 같이 web client id가 생성된 것을 볼 수 있다. 처음에는 왼쪽 화면처럼 뜨는데, 몇 분 지나면 오른쪽 화면으로 뜨니, 몇 분 기다리도록 하자.

 다시 Firebase페이지로 가도록 하자..

 

 

 

프로젝트 설정을 보면, sdk 설정 및 구성, 이라는 곳이 있다. 여기서 디지털 지문을 추가하도록 하자.

총 4개를 등록하는데, 아까 위에서 사용자 인증 정보를 등록했듯이, 앱 무결성 페이지에 있는, sha값을 모두 등록하면 된다.

서비스용 2개(sha-1, sha-256), 테스트용 2개(sha-1, sha-256) 총 4개이다.

 

4개 모두 추가 후, google-service.json을 다운 받아. Unity 프로젝트 폴더 -> Assets폴더 안에 넣도록 한다.

 

 

 

5. Unity 설정

 이제 마무리 단계이다. Gpgs페이지로 가도록 하자.

 

 

리소르 보기를 눌러, 값들을 복사한다.

 

 

 유니티에서 window->google play games -> setup -> android setup을 클릭해 창을 연다.

 

 

gpgs페이지에서 복사한 값을 붙여넣고, Client Id 값은, 클라우드 플랫폼 페이지에 자동으로 생성된(firebase에서 만들어진), web client id 값을 복사해 넣도록 하자.

 

 마지막으로 Gpgs페이지 -> 게시 탭에 들어가 Gpgs 프로젝트를 게시하도록 하자. 게시가 안되면, 친절하게 해당페이지에 이유가 설명 돼 있을 것이다. 하라는 것을 모두하면, 게시가 정상적으로 된다.

 

 진짜 마지막으로  코드를 살펴보도록 하자.

 

 

6. 로그인 스크립트. 

 

public class GameCenterManager : MonoBehaviour
{
    private FirebaseAuth auth;
    public string FireBaseId = string.Empty;

    public static GameCenterManager Instance = null;

    void Start()
    {
        m_saved_state = GoogleSavedFileState.GOOGLE_SAVED_STATE_NONE;


        PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        // enables saving game progress.
        .EnableSavedGames()
        .RequestIdToken()
        .Build();

        PlayGamesPlatform.InitializeInstance(config);
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();

        auth = FirebaseAuth.DefaultInstance;

        Instance = this;
    }



    public void Login()
    {
        LogManager.Debug("GameCenter Login");
        if (!Social.localUser.authenticated) // 로그인 되어 있지 않다면
        {
            Social.localUser.Authenticate(success => // 로그인 시도
            {
                if (success) // 성공하면
                {
                    LogManager.Debug("google game service Success");
                    //SystemMessageManager.Instance.AddMessage("google game service Success");
                    StartCoroutine(TryFirebaseLogin()); // Firebase Login 시도
                }
                else // 실패하면
                {
                    LogManager.Debug("google game service Fail");
                    SystemMessageManager.Instance.AddMessage("google game service Fail");
                }
            });
        }
    }


    public void TryGoogleLogout()
    {
        if (Social.localUser.authenticated) // 로그인 되어 있다면
        {
            PlayGamesPlatform.Instance.SignOut(); // Google 로그아웃
            auth.SignOut(); // Firebase 로그아웃
        }
    }


    IEnumerator TryFirebaseLogin()
    {
        while (string.IsNullOrEmpty(((PlayGamesLocalUser)Social.localUser).GetIdToken()))
            yield return null;
        string idToken = ((PlayGamesLocalUser)Social.localUser).GetIdToken();


        Credential credential = GoogleAuthProvider.GetCredential(idToken, null);
        auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
            if (task.IsCanceled)
            {
                SystemMessageManager.Instance.AddMessage("SignInWithCredentialAsync was canceled!!");
                return;
            }
            if (task.IsFaulted)
            {
                SystemMessageManager.Instance.AddMessage("SignInWithCredentialAsync encountered an error: " + task.Exception);

                return;
            }

            Firebase.Auth.FirebaseUser newUser = task.Result;
            FireBaseId = newUser.UserId;

            //Debug.Log("Success!");
            //SystemMessageManager.Instance.AddMessage("firebase Success!!");
        });
    }
}

 

 위와 같은 코드를 만들고, Login함수를 호출하면, 로그인 될 것이다.

profile

겨울팥죽 여름빙수

@여름빙수

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!