Unity/서버

0623_ 서버 (GPGS4_업적)

minquu 2021. 6. 23. 14:23
반응형

어제 이어 실시 

 

어제 로그인해서 이미지 아이디 유저 네임을 띄우는 곳 까지함

 

정상적으로 adb 에서 섹세스 로그와 어플에서 잘 뜨는지 확인한다.

 

 

-----

 

구글 플레이 콘솔 - 업적

 

 

우리가 전에 만든 최초 업적이 있다.

 

 

 

이 리소스가 유니티  GPGSIds 스크립터로 들어온다.

 

 

 

 

 

 

 

스크립터를 보면 업적 마다의 키가 존재한다.

 

우리가 만든건 게임의 시작 (최초 업적이다. 그냥 게임에 들어오면 업적 성공으로 해준다.)

 

https://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

 

 

업적을 성공하는 메서드이다.

 

"id"에는 GPGSIds 스크립터에 있는 특정 업적의 ID를 넣어준다.

 

 

-----

 

이제하는 것 

 

최초로 접속하면 id가 받아오고, 그 아이디를 DB에 저장하고 - 업적 주고  

 

먼저 id가 잘 들어오면 씬을 넘길 것이다.

 

먼저 버튼으로 테스트 할 것이다 .

 

 

 

즉 id가 잘 넘어오고, 시작 누르면 씬이 넘어가게하기 

 

app스크립터에서

 

 

 

 

enum 타입을 뚫어서 TEST 일 때만 버튼이 보이게한다.

BUILD 일때는 안보이게한다.

 

 

그리고 버튼을 누르게 되면 GameScenes이 로디 되게한다. 비동기 (데이터를 가져와야하면 비동기 추천)

지금은 로드가 되면서 gamaMain 스크립터를 가져와서 초기화에 "홍길동" 값을 넣어준다.

 

나중에는 저 홍길동이 특정 유저의 네임이 될 수 도있다 .

 

이런식으로 데이터를 가져오야하면 비동기로 쓰는게 좋다.

 

 

유니티에서 빈 오보젝트를 만들어주고. version 텍스트를 넣어준다.

 저 오브젝트는 임모탈이 될 것이다. 즉, 계속 켜져있는 오브젝트가 될 것.

 

 

 

임모탈 스크립터를 만들어주고, 오브젝트에 넣어준다.

 

 

 

임모탈 스크립터에 돈디스트로를 달아준다. (씬이 전환되도 사라지지 않음)

 

 

 

 

 

새씬을 만들어서

 

빈오브젝트를 만들어서 GameMain 으로 바꾸주고, 스크립터도 만들어서 넣어준다.

 

한 씬에는 무조건 메인이 되는 스크립터가 있어야한다.

 

 

아까 받아오는 것을 확인할 수있고,

 

        // increment achievement (achievement ID "Cfjewijawiu_QA") by 5 steps
        PlayGamesPlatform.Instance.IncrementAchievement(
            GPGSIds.achievement , 1, (bool success) => {
            // handle success or failure
        });

 

이 코드는 업적을 완성하는 코드이다.

 

스텝은 단계 인데 1이면 바로 업적이 달성이 된다.

 

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

public class GameMain : MonoBehaviour
{
    public Text txtUserName;
    public Button btnAchievement;
    //초기화 할때
    public void Init(string userName) {

        Debug.Log("userName: " + userName);

        this.txtUserName.text = userName;

        this.btnAchievement.onClick.AddListener(() =>
        {
            PlayGamesPlatform.Instance.ShowAchievementsUI();
        });

        //스텝 1은 바로 되게한다.
        PlayGamesPlatform.Instance.IncrementAchievement(
            GPGSIds.achievement , 1, (bool success) => {
                // handle success or failure
                Debug.LogFormat("IncrementAchievement : {0}, {1}", GPGSIds.achievement, success);
        });

    }

}

 

btnAchievement 버튼을 달아주고, 누르면  ShowAchievementsUI() ; 가 보이게한다.

 

 

즉, 게임이 시작되면 업적이 달성되고, 유저의 네임이 게임에서 보여지고, 버튼을 누르면 업적 UI를 볼 수있다.

 

빌드 테스트

 

앱 빌드로 바꾸고, 

 

 

앱이 제일 상단에 있는 지 확인하기

 

 

빌드 실시 ---->

 

업적 UI를 보면 잠겨 있음

 

 

 

IncrementAchievement 는 스텝으로 업적달성이라서 잠겨잇음

 

 

IncrementAchievement -> ReportProgess로 바꾸주고,

 

이건 퍼센트로 업적을 달성하는것, 100.0 넣으면 바로 달성이 될 것이다.

 

 

 

 

정상적으로 업적이 달성된게 보인다.

 

 

업적 한 것을 지우고 다시 할려면 

 

녹스 - 구글 게임 으로 들어간다.

 

 

 

 

내가 한 게임을 삭제한다.

 

다시 게임을 키면

 

무한 로딩이 된다.

 

녹스에서 

 

계정 ->

 

 

구글 클릭

계정 삭제하고 

 

다시 로그인해야한다.

 

그러면 다시 제대로 작동한다.

 

 

----

 

 

 

APP

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

public class App : MonoBehaviour
{
    public enum ePlayMode { 
        TEST, BUILD
    }
    public Text test;
    public Text txtid;
    public Text txtUserName;
    public Text txtState;
    public Image thumb;
    public Button btnStart;
    public ePlayMode playMode;

    // Start is called before the first frame update
    void Start()
    {

        this.test.text = Application.version;

        if (this.playMode == ePlayMode.TEST)
        {
            this.btnStart.gameObject.SetActive(true);
        }
        else {
            this.btnStart.gameObject.SetActive(false);
        }


        this.btnStart.onClick.AddListener(() =>
        {
            //씬전환
            //SceneManager.LoadScene("GameScenes");
            SceneManager.LoadSceneAsync("GameScenes").completed += (oper) =>
            {
                var gameMain = GameObject.FindObjectOfType<GameMain>();
                gameMain.Init(Social.localUser.userName);
            };
        });

        Debug.Log("-----------------> lnit GPGS");

        PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
            .EnableSavedGames()
            .Build();
        PlayGamesPlatform.InitializeInstance(config);
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
        Debug.Log("----------------->Authenticate");

        // authenticate user:
        PlayGamesPlatform.Instance.Authenticate(SignInInteractivity.CanPromptAlways, (result) => {
            // handle results


            Debug.Log("----------------->" + result);
            Debug.Log("----------------->" + Social.localUser);
            Debug.Log("----------------->" + Social.localUser.authenticated);

            if (Social.localUser.authenticated) {

                this.txtid.text = Social.localUser.id;
                this.txtUserName.text = Social.localUser.userName;
                this.txtState.text = Social.localUser.state.ToString();

                Debug.Log("----------------->" + Social.localUser.image);

                StartCoroutine(this.WaitForLoadThumb(() => {
                    Debug.Log(Social.localUser.image);
                    Debug.LogFormat("{0}, {1}", Social.localUser.image.width, Social.localUser.image.height);
                    this.thumb.sprite = Sprite.Create(Social.localUser.image,
                        new Rect(0, 0, Social.localUser.image.width, Social.localUser.image.height),
                        Vector2.zero);
                    this.thumb.SetNativeSize();
                }));

                this.btnStart.gameObject.SetActive(true);
            }

        });
    }
    private IEnumerator WaitForLoadThumb(System.Action callback) {
        while (true) {
            if (Social.localUser.image != null) {
                break;
            }
            yield return null;
        }
        callback();
    }
}

 

immortal

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

public class immortal : MonoBehaviour
{
    private void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}

 

GameMain

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

public class GameMain : MonoBehaviour
{
    public Text txtUserName;
    public Button btnAchievement;
    //초기화 할때
    public void Init(string userName) {

        Debug.Log("userName: " + userName);

        this.txtUserName.text = userName;

        this.btnAchievement.onClick.AddListener(() =>
        {
            PlayGamesPlatform.Instance.ShowAchievementsUI();
        });

        //스텝 1은 바로 되게한다.
        PlayGamesPlatform.Instance.ReportProgress(
            GPGSIds.achievement , 100.0, (bool success) => {
                // handle success or failure
                Debug.LogFormat("IncrementAchievement : {0}, {1}", GPGSIds.achievement, success);
        });
    }

}

 

-----

 

이제 업적을 하나 추가 해볼 것이다. 

 

 

업적 만들기

 

이름 설명 아이콘을 넣어준다.

 

단계별로 2스텝으로한다

 

10마리 = 1 

10마리 = 2 이런식으로 스텝이 증가한다.

 

 

 

저장하기

 

 

 

 

 

업적 추가 되었음.. 이거 복사해서

 

 

 

셋업을 해준다.

 

 

게임씬으로 와준다.

 

이제 버튼을 누르면 잡는 걸로하고

 

현재 잡은 갯수

스텝 

 

을 표기해준다.

 

 

빈오브젝트를 만들고, doing 이다. 이건 하는 중이면 나오는 UI

 

늑대 공격을 누르면 킬 카운터를 늘리고,

10마리를 다 잡으면 스텝이 증가한다.

 

 

 

늑대를 다 끝내면 done 오브젝트가 보이게한다.

 

 

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

public class GameMain : MonoBehaviour
{
    public Text txtUserName;
    public Button btnAchievement;
    public Button btnAttack;
    public GameObject achievementDoing;
    public GameObject achievementDone;

    public Text txtStep;
    public Text txtCount;

    private int goalCount = 10;
    private int totalSteps = 2;
    private int currentCount = 0;
    private int currentStep = 1;

    //초기화 
    public void Init(string userName)
    {
        Debug.Log("userName: " + userName);

        string stepKey = string.Format("{0}_step", GPGSIds.achievement__10_);
        //CgkIoJubiaIZEAIQAw_step
        string currentCountKey = string.Format("{0}_currentCount", GPGSIds.achievement__10_);
        //CgkIoJubiaIZEAIQAw_currentCount

        if (PlayerPrefs.GetInt(stepKey) == 0)
        {
            //처음 이 업적을 실행 
            PlayerPrefs.SetInt(stepKey, currentStep);
        }
        else
        {
            this.currentStep = PlayerPrefs.GetInt(stepKey);
        }

        if (PlayerPrefs.GetInt(currentCountKey) == 0)
        {
            //현재 스텝에서 이 업적 처음 실행하는것 
        }
        else
        {
            this.currentCount = PlayerPrefs.GetInt(currentCountKey);
        }

        //UI업데이트 
        this.txtCount.text = string.Format("kill count: {0}/{1}", this.currentCount, this.goalCount);
        this.txtStep.text = string.Format("step: {0}/{1}", this.currentStep, this.totalSteps);


        this.btnAttack.onClick.AddListener(() => {

            this.currentCount++;

            //저장 
            PlayerPrefs.SetInt(currentCountKey, currentCount);

            //UI업데이트 
            this.txtCount.text = string.Format("kill count: {0}/{1}", this.currentCount, this.goalCount);

            if (this.currentCount >= this.goalCount)
            {

                if (this.currentStep >= this.totalSteps)
                {
                    PlayGamesPlatform.Instance.ReportProgress(GPGSIds.achievement__10_, 100, (success) => {
                        if (success)
                        {

                            //achievement_doing 게임오브젝트를 비활성화 
                            this.achievementDoing.SetActive(false);

                            //achievement_done 게임오브젝트를 활성화 
                            this.achievementDone.SetActive(true);
                        }
                    });
                }
                else
                {
                    PlayGamesPlatform.Instance.ReportProgress(GPGSIds.achievement__10_, 100, (success) => {
                        if (success)
                        {
                            //스텝을 올려준다 
                            this.currentStep++;

                            //저장 
                            PlayerPrefs.SetInt(stepKey, this.currentCount);

                            //UI업데이트 
                            this.txtStep.text = string.Format("step: {0}/{1}", this.currentStep, this.totalSteps);

                            PlayGamesPlatform.Instance.IncrementAchievement(GPGSIds.achievement__10_, this.currentStep, (success) => {

                                Debug.LogFormat("{0} {1} {2}", GPGSIds.achievement__10_, this.currentStep, success);
                            });

                            //초기화 
                            this.currentCount = 0;

                            //저장 
                            PlayerPrefs.SetInt(currentCountKey, this.currentCount);

                            //UI업데이트 
                            this.txtCount.text = string.Format("kill count: {0}/{1}", this.currentCount, this.goalCount);
                        }
                    });
                }
            }
        });





        this.txtUserName.text = userName;

        this.btnAchievement.onClick.AddListener(() => {
            PlayGamesPlatform.Instance.ShowAchievementsUI();
        });

        PlayGamesPlatform.Instance.IncrementAchievement(GPGSIds.achievement, 1, (bool success) => {
            // handle success or failure
            Debug.LogFormat("IncrementAchievement: {0}, {1}", GPGSIds.achievement, success);
        });
    }
}

 

 

코드 적용시 빌드하면 정상적으로 늑대가 잡힌다.

 

 

반응형