C#/수업내용

2020.08.12. 수업내용 - GPGS 연동 +로그인이 안될 때( 계정 로그인 설정 )

dev_sr 2020. 8. 12. 13:15
 

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

 

 

1. 앱을 알파버전으로 등록함

2. 내부 테스트 버전으로 등록함

3. 콘솔에서 게임 서비스를 누름

 

 

작성해줌

 

4. 연결된 앱을 눌러서 안드로이드를 선택하고 쭉 진행해줌

5. 서명인증서 지문, 클라이언트 ID는 따로 저장해줌

6. xml을 만들어야해서 업적을 하나 추가해줌

7. 테스터 계정에 본인 계정이 등록되어 있는지 확인

 

8. 구글에서 googleplaygameservice unity 검색 뒤, github에 접속함

 

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

 

9. 여기서 zip파일을 받고 current-build에 있는 GooglePlayGamesPlugin-0.10.09 패키지를 유니티 프로젝트에 임포트함

10. auto resoulution 어쩌고 나오면 동의

 

11. 레지스트리 추가해줌

 

apply해줌

 

이러면 window -> Google Play Games -> Setup -> AndroidSetup 생기는 데 눌러봄

 

12. 업적을 만들고 리소스 받기를 눌러서 내용 복사해서 붙여넣음

맨 밑에 클라이언트ID에는 아까 나왔던 클라이언트ID 붙여넣음(사진에서 자름)

그리고 셋업 누르면 success가 두번 나온다.

 

 

*빌드 테스트버전 자동으로 작성해주는 API

this.vtext.text = Application.version;

 

13. GPGS를 관리해주는 스크립트를 만듦

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine.SocialPlatforms;

public class GPGSManager
{
    private static GPGSManager instance;

    private GPGSManager() { }

    public static GPGSManager GetInstance()
    {
        if(GPGSManager.instance==null)
        {
            GPGSManager.instance = new GPGSManager();
        }
        return GPGSManager.instance;

    }

    public void Init()
    {
        PlayGamesClientConfiguration conf = new PlayGamesClientConfiguration.Builder().Build();

        PlayGamesPlatform.InitializeInstance(conf);
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
    }

    public void SignIn(System.Action<SignInStatus> onComplete)
    {
        //CanPromptOnce
        // If automatic sign-in is not successful,
        //they will be prompted to sign in manually with an interactive sign-in screen

        //CanPromptAlways -> 항상 보여줌

        PlayGamesPlatform.Instance.Authenticate(SignInInteractivity.CanPromptOnce, (result) =>
         {
             onComplete(result);
         });
    }
}

 

 

14. APP에서 text 오브젝트를 하나 만들고

로그인 상태를 받아옴

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class App : MonoBehaviour
{
    public UI ui;

    void Start()
    {
        GPGSManager.GetInstance().Init();
        GPGSManager.GetInstance().SignIn((result) =>
        {
            this.ui.loginText.text = result.ToString();
        });


        this.ui.btn.onClick.AddListener(() =>
        {
            ui.CreateRandomPosition();
        });
        
    }

}

 

 

내꺼 GoogleAPIs 에 들어감

쭉 작성

 

SHA-1 인증서 지문

keytool -keystore path-to-debug-or-production-keystore -list -v 에서

path-to-debug-or-production-keystore 이 부분을 본인 keystore가 있는 path로 바꾸고 (keystore 파일 이름 포함)

keystore 비밀번호 복사해서 붙여넣어주면 

SHA1 지문이 나옴

그거 넣어줌

 

 

 

로그인, 로그아웃, 닉네임, 아바타 사진 가져오기

 

 

 

 

전체 코드

 

App

로그인 버튼을 누르면 로그인하고 대리자로 넘어온 result값이 success면

유저이름과 유저 이미지를 가져옴.

유저이미지는 가져와서 스프라이트로 변경하고 이미지 오브젝트에 넣음

 

로그아웃 버튼을 누르면 로그아웃함

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class App : MonoBehaviour
{
    public UI ui;

    void Start()
    {
        GPGSManager.GetInstance().Init();

        this.ui.loginBtn.onClick.AddListener(() =>
        {
            GPGSManager.GetInstance().SignIn((result) =>
            {
                this.ui.loginText.text = result.ToString();

                if(result.ToString()=="Success")
                {
                    string username = GPGSManager.GetInstance().GetUserName();
                    this.ui.userName.text = username;

                    GPGSManager.GetInstance().GetUserImage((texture) =>
                    {
                        Rect rect = new Rect(0, 0, texture.width, texture.height);
                        Sprite sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f));
                        this.ui.userImage.sprite = sprite;
                    });
                }
            });
        });

        this.ui.logoutBtn.onClick.AddListener(() =>
        {
            GPGSManager.GetInstance().SignOut();
            this.ui.loginText.text = "LogOut!";
        });


        this.ui.btn.onClick.AddListener(() =>
        {
            ui.CreateRandomPosition();
        });
        
    }

}

 

UI 

화면 구성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour
{
    public Button btn;
    public Button loginBtn;
    public Button logoutBtn;

    public Text text;
    public Text vtext;
    public Text loginText;
    public Text userName;
    public Image userImage;

    void Start()
    {
        this.vtext.text = Application.version;
    }

    public void CreateRandomPosition()
    {
        float x = Random.Range(-216, 218);
        float y = Random.Range(-853, 830);

        this.text.transform.localPosition = new Vector3(x, y, 0);
    }
    
}

 

GPGSManager

image를 가져올 때는 코루틴을 실행해서 로드될때까지 기다려야함!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine.SocialPlatforms;
using GooglePlayGames.OurUtils;

public class GPGSManager
{
    private static GPGSManager instance;

    private GPGSManager() { }

    public static GPGSManager GetInstance()
    {
        if(GPGSManager.instance==null)
        {
            GPGSManager.instance = new GPGSManager();
        }
        return GPGSManager.instance;

    }

    public void Init()
    {
        PlayGamesClientConfiguration conf = new PlayGamesClientConfiguration.Builder().Build();

        PlayGamesPlatform.InitializeInstance(conf);
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
    }

    public void SignIn(System.Action<SignInStatus> onComplete)
    {
        //CanPromptOnce
        // If automatic sign-in is not successful,
        //they will be prompted to sign in manually with an interactive sign-in screen

        //CanPromptAlways -> 항상 보여줌

        PlayGamesPlatform.Instance.Authenticate(SignInInteractivity.CanPromptAlways, (result) =>
         {
             onComplete(result);
         });
    }

    public void SignOut()
    {
        PlayGamesPlatform.Instance.SignOut();
    }

    public string GetUserName()
    {
        return Social.localUser.userName;
    }

    public void GetUserImage(System.Action<Texture2D> onComplete)
    {
        PlayGamesHelperObject.RunCoroutine(this.LoadImage(() =>
            {
                var texture = Social.localUser.image;

                onComplete(texture);
            }));
    }

    private IEnumerator LoadImage(System.Action onComplete)
    {
        yield return new WaitUntil(() => Social.localUser.image != null);

        onComplete();
    }

}

 

영상

 

 

 

+로그인이 안될 때

상단에 초록색 앱스토어 누르고 스크롤 좀 내리고 Google Play 누름 

 

프로필에 들어감

 

점 3개 누름 -> 설정

 

게임에 로그인에 체크가 되어있는지 확인