새소식

Unity/이론 | 로직 | 연습

[Unity/Theory] 구글 플레이와 연동하여 기능을 구현하자! (리더보드/업적)

  • -

!!! NOTICE !!!
이 글은 유니티의 이론을 다루고 있습니다!
학습한 정보를 제가 기억하고 추후에도 사용해두기 위해 기록해둔 내용입니다!
이 점 유의하고 봐주세요!

지난 글에선
구글 플레이 계정에 로그인까지 해보았습니다.

이번엔 주 기능이라 할 수 있는
리더보드와 업적 등을 사용해보겠습니다.


업적 추가하기

Google Play Console에 들어가 업적 메뉴를 클릭합니다.

업적을 추가해보죠.
업적 추가 버튼을 클릭.

리더보드나 상세정보 때처럼
기본적으로 이름, 설명, 아이콘이 존재합니다만,
몇가지 업적에만 존재하는 요소가 있습니다.

이들에 대한 내용은 다음과 같습니다.

단계별 업적 : 해당 업적을 달성하는데 선행 업적이 존재할 경우.
초기 상태 : 해당 업적 내용의 공개 여부
점수 : 해당 업적을 달성했을시에 계정에 주어지는 점수.
목록 순서 : 업적의 나열 순서.

입맛에 맞게 설정하고 생성해주겠습니다.
 필자의 경우, 이름을 TestAchive로 설정하고 아이콘만 설정해주었습니다.

성공적으로 업적이 등록된 것을 확인할 수 있습니다.


리더보드 추가하기

리더보드를 추가하고 랭킹처럼 사용해보겠습니다.

리더보드 메뉴를 클릭.

 

이미 지난 시간에 로그인을 위해서 만들었던
리더보드가 존재합니다.

이 리더보드는 이대로 두고
새로 생성해서 사용해보겠습니다.
리더보드 추가 버튼 클릭.

여느 때와 같이,
이름과 아이콘을 설정할 수 있습니다만,
리더보드 고유의 설정값도 존재합니다.

이들의 설명은 다음과 같습니다.

점수 표시 방식 : 리더보드에 표시될 점수의 출력 형식.
정렬 : 리더보드에 등록된 점수의 정렬 방식.
조작 방지 사용 설정 : 조작된 점수를 자동으로 감지해서 제외시키는 기능.
제한 : 리더보드에 올릴 수 있는 최저~최고 점수.
목록 순서 : 리더보드의 순서.

간단하게 입맛대로 설정하고 생성해주겠습니다.
필자의 경우, 이름과 아이콘을 설정하고, 정렬은 내림차순, 제한은 0~999999으로 했습니다.

성공적으로 리더보드를 추가 생성했습니다.

이때, 리더보드가 늘어남에 따라 리소스 코드에도 변화가 존재하니
리소스 코드를 유니티에 업데이트 해주는 걸 기억합니다.

 


APIs & 서비스 활성화

유니티에 적용하기 이전에
API 와 서비스를 활성화 해주겠습니다.

세부정보 메뉴에서 사용하고 있는 게임을 클릭해주겠습니다.

그럼 최하단에 다음과 같이
게임 서비스를 실행하려면 사용 설정해야 한다고 합니다.

위 하이퍼링크를 클릭해주세요.

이곳은 Google APIs 입니다.
왼쪽에 사용자 인증 정보를 클릭해주세요.

 

 


유니티 프로젝트에 적용하기

이제 변경된 리소스 코드를 적용하고
업적과 리더보드를 테스트 해보겠습니다.

 리더보드에서 리소스 코드를 복사하고
유니티 프로젝트에서 Window -> Google Play Games -> Setup -> Android Setup을 클릭.

기존에 있던 코드를 새 코드로 붙여넣기 해주세요.

성공적으로 Setup이 진행됬다면
테스트용 코드를 작성하고 테스트해보겠습니다.

 

테스트를 위해서 버튼을 3개 추가했습니다.

Complete Achiv 는 업적 한개 성공하기,
Show Achiv 는 업적 리스트 보기,
Show LeaderBoard 는 리더보드 보기입니다.

다음으로 스크립트를 작성해봅시다.

 

먼저 Complete Achiv 입니다.
업적을 달성하기 위해서는 Social.ReportProgress() 함수를 사용하면 됩니다.

이 함수는 정확히 말하자면
달성보다는 진행상황을 보고하는 용도로 사용할 수 있습니다.
따라서 인자도 그에 맞춰져 있다고 할 수 있는데요,

1번 인자는 보고할 업적의 ID값 입니다.
리소스 코드 변경으로 업적 관련 데이터를 얻을 수 있었는데요,
그 중 하나가 업적 ID값입니다.
이를 이용해서 업적을 구분해서 보고할 수 있습니다.

2번 인자는 보고할 업적의 진행척도 입니다.
업적은 항상 0% 아니면 100% 이진 않습니다.
33% 일수도 있으며, 99%일 수 있습니다.
이 인자는 그 퍼센티지를 float 값으로 전달할 수 있습니다.

3번 인자는 callback 함수입니다.
람다식으로 구현해서 콜백함수를 작성해 보내면
달성 여부에 따른 추가적인 처리를 할 수 있습니다.

        //진행상황 보고 함수.
        //1번 인자 : 보고할 업적 ID
        //2번 인자 : 보고할 업적의 진행척도
        //3번 인자 : callback 함수
        Social.ReportProgress(GPGSIds.achievement_testachive, 100.0f, (bool isSuccess) => {});

 

그 다음은 Show Achiv 입니다.
이 기능은 Social.ShowAchievementsUI() 함수를 사용하면 구현할 수 있습니다.

간단한게 이 함수를 호출하면
업적 리스트를 볼 수 있습니다.

        //업적 리스트 출력하기.
        Social.ShowAchievementsUI();

 

마지막으로 ShowLeaderBoard 입니다.
이 기능에선 리더보드에 점수 등록과 리더보드 출력을 동시에 진행할 것입니다.
이를 위해선 다음의 두 함수를 사용하면 됩니다.

1. Social.ReportScore()
2. Social.ShowLeaderboardUI()

1번 함수는 앞서 말했던
Social.ReportProgress() 함수와 비슷한 뉘앙스로
점수값을 리더보드로 보고하는 흐름입니다.
인자는 다음의 3가지로 이루어져 있습니다.

1번 인자는 보고할 점수값 입니다.
말 그대로, 리더보드에 보고하고자 하는 점수값입니다.

2번 인자는 보고할 대상 리더보드 ID값 입니다.
리더보드는 앞서 보았던 것들처럼 1가지가 아닙니다.
이 인자는 리더보드를 구별하여 전달하고자 하는 대상을 확실시 합니다.
Social.ReportProgress() 함수처럼 리소스 코드를 업데이트 함으로써
ID값을 얻을 수 있었던 것입니다.

3번 인자는 callback 함수 입니다.
이 역시 Social.ReportProgress() 함수의 callback 인자와 똑같은 뉘앙스 입니다.

        //점수 보고 함수.
        //1번 인자 : 보고할 점수
        //2번 인자 : 보고할 대상 리더보드 ID값
        //3번 인자 : callback 함수
        Social.ReportScore(123, GPGSIds.leaderboard_testleaderboard, (bool isSuccess) => { });
        //리더보드 출력하기.
        Social.ShowLeaderboardUI();

 

아래는 전체 코드 입니다.

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

public class GooglePlayLoginSample : MonoBehaviour
{
    private void Awake()
    {
        //초기화 함수. 인스턴스를 만드는 역할.
        PlayGamesPlatform.InitializeInstance(new PlayGamesClientConfiguration.Builder().Build());
        //디버그용 변수
        PlayGamesPlatform.DebugLogEnabled = true;
        //구글 관련 서비스 활성화.
        PlayGamesPlatform.Activate();
    }

    public void Do_Login()
    {
        if(!Social.localUser.authenticated) //현재 기기와 연결된 계정이 인증이 아직 안됬는가?
        {
            //계정 인증
            Social.localUser.Authenticate((bool isSuccess) =>
            {
                if(isSuccess)
                {
                    Debug.Log("인증 성공 -> " + Social.localUser.userName);
                }
                else
                {
                    Debug.Log("인증 실패");
                }
            }
            );
        }
    }

    public void Do_Logout()
    {
        //로그아웃
        ((PlayGamesPlatform)Social.Active).SignOut();
    }

    public void Do_CompleteAchiv()
    {
        //진행상황 보고 함수.
        //1번 인자 : 보고할 업적 ID
        //2번 인자 : 보고할 업적의 진행척도
        //3번 인자 : callback 함수
        Social.ReportProgress(GPGSIds.achievement_testachive, 100.0f, (bool isSuccess) => {});
    }

    public void Do_ShowAchiv()
    {
        //업적 리스트 출력하기.
        Social.ShowAchievementsUI();
    }

    public void Do_ShowLeaderBoard()
    {
        //점수 보고 함수.
        //1번 인자 : 보고할 점수
        //2번 인자 : 보고할 대상 리더보드 ID값
        //3번 인자 : callback 함수
        Social.ReportScore(123, GPGSIds.leaderboard_testleaderboard, (bool isSuccess) => { });
        //리더보드 출력하기.
        Social.ShowLeaderboardUI();
    }
}

 

이제 테스트를 진행하겠습니다.
APK 파일로 빌드하고 제 핸드폰에서 실행시켜보겠습니다.
참고로 테스트 환경은 갤럭시 S10 5G 입니다.

먼저, 로그인 버튼으로 계정을 로그인 했습니다.

이후 Show LeaderBoard 를 누르자,
리더보드 리스트가 출력되었고,

TestLeaderBoard를 클릭하자,
테스트용으로 넣었던 점수가 등록되어 있었습니다.

 

문제는 업적에 있었습니다.
Complete Achiv 를 클릭하자, 아무런 반응이 없었고,
Show Achiv 를 클릭하자, 업적이 등록되어 있지 않다고 출력됬습니다.
무엇이 문제였던걸까요?

빼먹은 요소를 채워넣어보고 (세부정보에서 아이콘 오른쪽 빼먹은거)
업적을 삭제해서 다시 새로운 이름으로 생성해보고,
리소스 코드를 업데이트 해서,
ID 값을 새로이 넣어주어 보았습니다.

이번엔 제대로 업적이 달성되었습니다.

Show Achiv 를 누르자, 업적 리스트도 잘 출력됬습니다.
도대체 무엇이 문제였던걸까요?
안타갑게도 저는 해결책이 무엇이었는지도 모른체 기능을 구현하게 되는
프로그래머 특유의 사태를 맞이했습니다.

이상으로 업적과 리더보드를 등록해보고
유니티에 실사용도 하였습니다.

다음 글은 인앱 결제를 구현해보겠습니다.


아래는 지금까지 구현했던 구글 플레이 샘플을
깃허브에 올려둔 링크입니다.

https://github.com/MrSmokyonion/Sample_Unity-PlayStoreConsole

 

MrSmokyonion/Sample_Unity-PlayStoreConsole

유니티와 Play 스토어 개발자 계정 연동 샘플. Contribute to MrSmokyonion/Sample_Unity-PlayStoreConsole development by creating an account on GitHub.

github.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.