Game Programming/Game Engine

Unity3D :: Google Play Game Service (구글 플레이 게임 서비스 연동) #2 로그인 및 매니저 클래스 만들기

VallistA2015. 4. 5. 23:56

이번 구글 플레이 게임 서비스는 로그인 및 매니저 클래스를 만들어 볼 것이다.

만들기에 앞서 우리는 구글 플레이 서비스를 제대로 하기 위해서 다음과 같은 절차를 밟아야 한다.

 

1. 안드로이드 SDK를 최신 버전으로 업그레이드

 - 안드로이드를 최신 버전으로 업그레이드 하는 이유는 "zipalign.exe" 가 없다는 에러가 나올수 있기 때문이 첫 이유이다.

 - 그 다음 Google Play Game Service를 다운로드 하여아 한다.

 

아래부터는 사진으로 자세한 설명을 한다.

 

<사진 1: 안드로이드 SDK를 열고 SDK Tools, Platform-tools를 최신버전으로 업데이트 하고 SDK Build-tools 를 전부 다운로드>

 

<사진 2: 밑으로 내려서 Google Play services 다운로드 한다.>

 

사진과 같이 따라했다면 다운로드하는 과정을 끝낼 수 있다.

 

2. Android SDK 폴더 > build-tools > 최신 버전 폴더 > zipalign.exe 를 Android SDK 폴더 > tools 폴더로 옮긴다.

이 과정을 하는 이유는 혹시라도 모를 zipalign.exe 오류를 잡기 위해서이다.

 

 

<사진 3: build-tools 의 최신 버전 폴더, 맨 밑의 zipalign을 복사하면 된다.>

 

<사진 4: build-tools와 tools 두 가지 폴더를 유의해서 보면 된다.>

 

3. extras > google > google_play_services > libproject > google-play-services_lib 폴더 전체를 복사한 다음,

유니티 프로젝트 > Assets > Plugins > Android 에 복사한다.

 

이 과정을 하는 이유는 Google Play service의 리소스 파일들과 기능을 사용하기 위해서다.

 

<사진 5: 필자는 테스트를 위해 test 라고 유니티 프로젝트를 지엇다.>

 

 

이로써 기초 library 복사가 끝낫고 에러를 미연에 방지를 하였다.

그 다음 우리가 할 작업은 로그인을 만들어 보는 것 이다.

 

4. 유니티로 이동해서 스크립트를 하나 작성한다.

 

필자는 GPGS 사용을 전 범위적으로 활용하기 위해서 싱글톤이라는 용법으로 빼버렸다.

먼저 소스를 보도록 하자.

 

싱글톤 소스

 

 

메인 GPGS 매니저 소스

 


InitializeGPGS()는 말 그대로 GPGS를 초기화 하는 함수이다.

GPGSMng.GetInstance.InitalizeGPGS(); 를 Start 나 Awake 때 실행을 시켜주면 된다.

 

LoginGPGS() 는 로그인을 하는 함수이다.

버튼이나 어느 특정한 때에 불러주면 된다.

이 함수는 로그인이 안되어 있을때만 되므로 중복 호출될 위험이 없다.

 

LoginCallBackGPGS 는 결과를 산출하는 콜백함수다.

 

LogoutGPGS() 는 로그아웃 하는 함수이다.

이 구문은 게임을 끄거나, 버튼을 눌러 로그아웃 할때 호출해주면 된다.

 

GetImageGPGS() 는 사용자의 프로필 이미지를 가져오는 함수다.

사용법은 아래에 후술하겠다.

 

GetNameGPGS() 는 사용자의 이름을 가져오는 함수이다.

사용법은 아래에 후술한다.

 

이 매니저의 사용법을 설명한다.

필자는 버튼역할을 하는 스크립트를 하나 만들어서 거기다가 사용하였다.

 

 

해당과 같이 만들어 쓰면 된다.

댓글

  • 이전 댓글 더보기
  • 이수진2015.10.18 03:34 아이디나 다른 토큰 정보들을 가져 올수 없나요? Social.localUser.id 호출해보면 값이 안와서요.-.-
  • BlogIcon VallistA2015.10.19 08:59 신고 음.. Initialize 를 안하셨거나.
    Unity 한글 폰트에 문제가 있어서 안나오는 경우가 있습니다.

    자세한 오류가 뭔지 몰라서 말씀을 못드리겠네요.. ㅠ
    소스나 자세한 무언가가 있어야 할 것 같습니다.
  • 둥당디2016.03.04 13:21 정말 도움이 많이 되고 있습니다. 감사합니다 !

  • BlogIcon VallistA2016.03.04 13:35 신고 제 글을 봐주셔서 감사합니다 ^^;
  • 둥당디2016.03.04 15:55 한가지 질문이 있습니다. UILabel 을 쓰려면 NGUI 에셋이 설치되어 있어야 하나요?? 처음 써보는거라.. 찾아봐도 잘 안나오네요.. ㅠ
  • BlogIcon VallistA2016.03.04 19:15 신고 네 UILabel을 쓰려면 NGUI 에셋이 설치가 되어 있어야합니다.
    다만, UGUI로 하셔도 무방합니다.
  • forest2016.03.12 11:33 저도 많은 도움이 되어 로그인 등 외 다른 부분까지 성공했습니다. 감사합니다. ( _ _)
    그런데 구글클라우드세이브/로드에서 막혔습니다ㅜ 해당 부분은 다루실 생각이 없으신지요?
  • BlogIcon VallistA2016.03.13 17:59 신고 아. 구글 클라우드 세이브 로드를 실시간으로 구현을 해본적이 있습니다. 나중에 시간되면 올리도록 하겠습니다.,
  • forest2016.03.14 20:26 어라 갑자기 잘 동작하네요.; 계속 뭐가 안 되길래 헤매다가 VallistA님께 도움을 요청 드린거였는데 구글 쪽에 문제가 있었던거 같습니다. 긍정적인 답변에 감사 드립니다 ( _ _)
  • BlogIcon VallistA2016.03.16 09:12 신고 아하 ^^ 잘된다니 다행이네요 ^^
  • TestUSEr2016.03.13 17:07 안녕하세요. 블로그글 잘 보았습니다. 이렇게 쉽게 잘 정리된 블로그 감탄하고 존경합니다.
    다름이 아니라 Export 후 빌드를 하면 에러가 발생하는데요. 참 이상한거는 유니티에서 그냥 Build를 하면 정상적으로 잘 된다는겁니다...
    이런 에러가 발생하는데요. 혹시 이거에대해서 아시는게 있을까요 ㅠ
    03-13 17:01:57.417: I/Unity(28416): Building GPG services, implicitly attempts silent auth
    03-13 17:01:57.417: I/Unity(28416):
    03-13 17:01:57.417: I/Unity(28416): (Filename: ./artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 37)
    03-13 17:01:57.477: I/Unity(28416): InvalidOperationException: There was an error creating a GameServices object. Check for log errors from GamesNativeSDK
    03-13 17:01:57.477: I/Unity(28416): at GooglePlayGames.Native.PInvoke.GameServicesBuilder.Build (GooglePlayGames.Native.PInvoke.PlatformConfiguration configRef) [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GooglePlayGames.Native.NativeClient.InitializeGameServices () [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GooglePlayGames.Native.NativeClient.Authenticate (System.Action`1 callback, Boolean silent) [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GooglePlayGames.PlayGamesPlatform.Authenticate (System.Action`1 callback, Boolean silent) [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GooglePlayGames.PlayGamesPlatform.Authenticate (System.Action`1 callback) [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GooglePlayGames.PlayGamesLocalUser.Authenticate (System.Action`1 callback) [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GPGSMng.LoginGPGS () [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416): at GPGSBtn2.Start () [0x00000] in <filename unknown>:0
    03-13 17:01:57.477: I/Unity(28416):
    03-13 17:01:57.477: I/Unity(28416): (Filename: Line: -1)
    03-13 17:02:06.037: I/Unity(28416): Building GPG services, implicitly attempts silent auth
    03-13 17:02:06.037: I/Unity(28416):
    03-13 17:02:06.037: I/Unity(28416): (Filename: ./artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 37)
    03-13 17:02:06.047: I/Unity(28416): InvalidOperationException: There was an error creating a GameServices object. Check for log errors from GamesNativeSDK
    03-13 17:02:06.047: I/Unity(28416): at GooglePlayGames.Native.PInvoke.GameServicesBuilder.Build (GooglePlayGames.Native.PInvoke.PlatformConfiguration configRef) [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GooglePlayGames.Native.NativeClient.InitializeGameServices () [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GooglePlayGames.Native.NativeClient.Authenticate (System.Action`1 callback, Boolean silent) [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GooglePlayGames.PlayGamesPlatform.Authenticate (System.Action`1 callback, Boolean silent) [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GooglePlayGames.PlayGamesPlatform.Authenticate (System.Action`1 callback) [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GooglePlayGames.PlayGamesLocalUser.Authenticate (System.Action`1 callback) [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GPGSMng.LoginGPGS () [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at GPGSBtn2.ClickEvent () [0x00000] in <filename unknown>:0
    03-13 17:02:06.047: I/Unity(28416): at UnityEngine.Events.I

  • 나그네2016.03.20 16:16 유니티만 다룰 줄 알아서 난해한 부분이 많았는데 깔끔하게 정리 잘 해주셔서 정말 많은 도움이 되었습니다. 감사합니다.
  • BlogIcon VallistA2016.03.21 13:52 신고 잘 봐주셔서 감사합니다 ^^
  • 대박입니다2016.03.21 00:58 그 어디에도 이런 고퀄 블로그는 없었습니다. 돈을 주고 사라고 해도 살것입니다. 다음 포스팅은 무엇인가요?
  • BlogIcon VallistA2016.03.21 13:53 신고 다음 포스팅은 Unity 관련해서는 구글 클라우드 서비스 연동이 아닌가 싶습니다. 드라이브에서 input output 실시간으로 하는../
  • pmp2016.03.26 23:35 소중한 정보 감사합니다.
    유니티와 GCM에 대한 포스팅도 있으면 좋겠습니다 ㅠㅠ
  • koith2016.04.02 02:26 좋은 글 많은 도움 되고 있습니다.
    NGUI나 GUISkin을 사용하지 않고, 유니티 자체의 UI 기능으로 프로필 이미지를 적용하려면 어떻게 해야 하죠?
    public Sprite userProfileImage;나 public Texture2D userProfileImage; 혹은 public Texture userProfileImage; 등으로 시도해 보았는데 실패합니다.
    GPGSMng 스크립트에서 유저 프로필 이미지를 불러오는 함수를 보니, Texture2D로 저장하는 것 같은데 방법을 찾을 수가 없네요.

    그리고, 자동으로 구글 플레이에 로그인 시키지 않고 버튼을 눌러서 로그인을 하도록 구현했는데, 다른 씬으로 갔다가 돌아오면 자동으로 구글플레이 로그아웃이 됩니다. PlayGamesPlatform.Activate();을 매번 해서 자동으로 로그아웃 되는 것 같기도 한데, 정확히 어느 부분을 수정하면 되는지 도움 부탁드립니다.
    구글링을 해보니 아래와 같은 소스도 찾긴 했으나, void Start()나 void Update()에 넣어도 계속 자동 로그아웃이 되네요.
    (출처 : https://github.com/playgameservices/play-games-plugin-for-unity/issues/362)

    if (! PlayGamesPlatform.Instance.localUser.authenticated) {
    PlayGamesPlatform.Instance.Authenticate ((bool success) => {
    if (success) {
    /// Signed in! Hooray!
    } else {
    /// Not signed in. We'll want to show a sign in button
    }
    }, true); /// <--- That "true" is very important!
    } else {
    Debug.Log("We're already signed in");
    }

    도움을 부탁드립니다.
  • 나쁜남자2016.05.23 18:55 많은 도움이 됐습니다.
    Social.localUser.Authenticate 콜백이 False네요.
    1. 유니티 에디터에선 당연히 False죠?
    2. apk 빌드 후 폰에서 테스트 해봐도 False인데, 구글 계정과 상관있을까요? 현재 알파테스트 중입니다.
  • KGCA272016.05.23 20:22 1.유니티에선 안되구용
    2.구글개발자홈페이지에서 테스터계정등록을 하셔야되용. 테스터그룹에 계정추가하고나서 활성되있는지도 확인해보셔야되구용.
    이쯤에서 저도 질문을 ㅋㅋ 로그인할때 사용했던 구글이메일주소를 불러오려면 어떻게 해야할까용????+_+????
    자답입니당 ㅎ ((GooglePlayGames.PlayGamesLocalUser)Social.localUser).Email;
    테스트는안해봤는데 GitHub에 나와있네용 ㅎ
  • BlogIcon VallistA2016.05.23 22:40 신고 감사합니다 ㅋㅋ
  • 아무로2016.06.23 00:31 안녕하세요. 친절하고 자세한 포스팅 잘 보고 있습니다. 다름이 아니라 올려주신 샘플과 같이 Social.localUser.Authenticate 함수를 써서 로그인을 구현 하였는데요. 구글플레이 게임즈 계정 선택 화면이 떠서 계정을 선택하고 나면 다시 구글 계정 선택화면이 뜨고 있습니다. 로그아웃 하지 않고 앱 종료 후 재실행 후 함수 호출시에는 구글플레이 게임즈는 자동로그인 되는지 로그인뱃지가 뜨고 그위로 구글 계정 선택 화면만 뜨구요. 개발자 콘솔에 테스트 앱을 등록 할때 따로 해줘야 하는 것이 있는지 api쪽에서 사용자 인증관련 부분 세팅시 유의 사항이 있는지.. 아니면 코드에서 손대야 하는 부분이 있는지.. 감이 안잡힌지 일주일째라 망설이다 이렇게 덧글 남깁니다.
  • BlogIcon VallistA2016.06.23 09:09 신고 안녕하세요.
    구글 계정 선택 화면이 나온다면, 개발자 알파 / 베타 테스트 옵션과 베타테스터 아이디를 등록하셨는지 확인을 해보길 권해드립니다.

    만약 확인을 했고, 테스트 옵션을 키고 베타 테스터 아이디 (이메일)을 등록했음에도 안된다면 파트 테스트를 해보셔야 할 것 같습니다.
    새로 앱을 만들고 동일한 구글 계정으로 구글 로그인 서비스를 테스트 해봐주시면 감사하겠습니다.

  • 아무로2016.06.23 12:02 답변 감사드립니다. 밤새 테스트 하다 이유는 알아냈습니다. ^^ GooglePlayGames.PlayGamesPlatform.Instance .GetUserEmail() 이런식으로 이메일이나 관련 정보를 가져오다 보니 구글계정이 호출 되고 있더라구요. 그런데 문제는 ((GooglePlayGames.PlayGamesPlatform)Social.localUser).GetUserEmail(); 값이 계속 null로 호출이 되어서 위의 방식으로 대처 했는데 난감하네요. GetServerAuthCode 호출등 PlayGamesPlatform을 쓸 일이 많은데 모든게 반응이 없어요.
  • BlogIcon VallistA2016.06.23 12:24 신고 로그인이 제대로 안되는 건가요?
    Authenticate Lambda로 값 받을 때 result 받습니다

    자동로그인이 된다는 거면 로그인이 제대로 안된다고 하기도 애매하고..

    결과 값 확인해보실 수 있으실까요?
  • 코알라2016.06.27 15:27 정말 잘 봤습니다. 많은 도움이 되었어요~
    혹시 구글 인앱결제 관련해서 포스팅 하실 계획은 없으신가요? 있으면 정말 좋을것 같네요^^
  • 안경포스2016.08.10 20:50 오... 잘됩니다!! 몇일동안 고생하던게 드디어!! 감사합니다!
  • 동글동글2016.10.29 19:16 안녕하세요. 자세한 설명에 언제나 큰 도움 받고 있습니다.

    로그인은 되는데 프로필 사진을 받아오는 과정에서 문제가 있는지 사진 표시가 안 되네요.

    IEnumerator GetInfo () {
    do {
    yield return null;
    } while (!GPGSMgr.GetInstance.bLogin);
    accName.text = GPGSMgr.GetInstance.GetNameGPGS ();
    accImage.texture = GPGSMgr.GetInstance.GetImageGPGS ();
    }

    유저 이름까지는 정상적으로 받아오는데 로그를 따봐도
    I/Unity (31704): Starting to load image: http://lh3.googleusercontent.com/JxZ96dQscedKCuZpCIG0jIlRzyW07vjrwlSdZ1_wrhgVHoofsVInRcDUd2_AodZRpvc=s96
    까지만 뜨고 텍스쳐가 바뀌질 않네요.

    사이즈 조절의 문제인가요?
  • 동글동글2016.10.29 19:32 플러그인 소스를 뜯어보다 어이없게 해결책을 찾아냈습니다.

    이미지가 완전히 로딩되기 전에 프로필 사진을 호출하려 하면 null만 돌려주네요. 이미지가 완전히 로딩될 때까지 기다렸다가 호출하니 정상적으로 표시됩니다.

    황당한 질문이었지만 다행히 자답에 성공했네요 ㅠㅠ
  • fengnv2017.03.16 18:11 안녕하세요. 저 처음부터 똑같이 따라했는데도 핸드폰에서 로그인 버튼클릭하니까 ...앱을 중지하였습니다.라고 뜨면서 튕겼어요.이걸 어떻하면 좋을까요?
  • fengnv2017.03.16 18:12 프로젝트 아예 지우고 새로 생성헤서 다시 해도 똑같아요.VallistA님 헬프미....
  • Jaeeun2017.03.17 14:53 https://github.com/playgameservices/play-games-plugin-for-unity/issues/1604

    버전다운하면 해결됩니당
    저도 같았어요 ㅋㅋ
  • 2017.03.16 18:14 비밀댓글입니다
  • BlogIcon VallistA2017.03.17 13:21 신고 안녕하세요 옆에 배너에 보시면 제 카카오톡 아이디가 있습니다.

    kingbye1 주시면 되겟습니다.
  • fengnv2017.03.17 16:21 너무 감사합니다.
  • BlogIcon 레오네.2017.04.20 18:28 신고 덕분에 작업이 훨씬 수월해졌습니다. 너무 감사합니다.
  • Makta2017.08.07 14:31 좋은 포스팅 감사합니다
    설명하신데로 하고 나니 "Google Play 게임"이라는 녹색창 까지는 열리는데
    그이후에 로그인 실패를 합니다~
    이것 저것 찾아봤지만 이유를 알지 못하겠네요 ㅠㅠ~
    테스터도 추가했지만 알수가 없어서 남깁니다
댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 14

Total : 404,332

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘