반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

Android Google Play Game 리더보드, 업적 연동하기(네이티브) 본문

Android

Android Google Play Game 리더보드, 업적 연동하기(네이티브)

huiung 2021. 11. 5. 06:31
반응형

로그인에 이어 리더보드와 업적을 연동하는 방법을 알아보겠습니다.

앱 gradle에 아래의 코드를 추가해주면 사용이 가능합니다.

implementation 'com.google.android.gms:play-services-games:21.0.0'

 

먼저 리더보드와 업적은 구글 플레이게임 콘솔에서 추가를 할 수 있습니다. 아래의 메뉴로 들어가셔서 필요한 업적과 리더보드를 생성 해 주시면 됩니다. 각각의 업적과 리더보드는 고유의 키를 가지게 되는데요. 상단의 리소스 보기를 클릭 하시면 프로젝트 내에 붙여넣을 수 있는 xml이 나오게 됩니다. 복사후 프로젝트에 붙여넣어 주시면 됩니다.

 

 

 

아래는 전체 업적과 리더보드를 확인 할 수 있는 코드 입니다.

private fun showLeaderboard() {
        val context = context
        context ?: return

        val lastSignedAccount = GoogleSignIn.getLastSignedInAccount(context)
        lastSignedAccount ?: return
        Games.getLeaderboardsClient(context as Activity, lastSignedAccount)
            .allLeaderboardsIntent
            .addOnSuccessListener {
                    intent -> startActivityForResult(intent, RC_LEADERBOARD_UI)
            }
    }

    private fun showAchievement() {
        val context = context
        context ?: return

        val lastSignedAccount = GoogleSignIn.getLastSignedInAccount(context)
        lastSignedAccount ?: return

        val achievementsClient = Games.getAchievementsClient(context, lastSignedAccount)
        achievementsClient.achievementsIntent
            .addOnSuccessListener { intent -> startActivityForResult(intent, RC_ACHIEVEMENT_UI) }

    }

 

다음은 업적을 클리어하는 코드 입니다. achievementsClient.load(true) 호출 이후 받은 콜백에는 업적들을 담은 buffer가 있습니다. iterator를 통해서 원하는 업적의 현재 state를 확인 할 수 있는데요. state는 아래처럼 총 3가지가 있습니다. 잠금 해제된 업적, 숨겨진 업적, 드러나 있는 업적

 

int STATE_UNLOCKED = 0;
int STATE_REVEALED = 1;
int STATE_HIDDEN = 2;

 

아래 코드는 드러나 있는 업적이 잠금 해제 되지 않은 경우 unlock() 함수를 호출하여 특정 업적을 잠금 해제 하고 있습니다.

setViewForPopups()의 경우 업적 클리어 이후 상단에 이를 표시해주는 UI를 띄워주는 역할을 합니다.

val client = GoogleSignIn.getLastSignedInAccount(this)

        client?.let {

            val achievementsClient =  Games.getAchievementsClient(this, it)
            Games.getGamesClient(this, it)
                .setGravityForPopups(Gravity.TOP or Gravity.CENTER_HORIZONTAL)

            val gamesClient = Games.getGamesClient(this, it)

            achievementsClient.load(true).addOnSuccessListener { achievementBufferAnnotatedData ->
                val buffer = achievementBufferAnnotatedData.get()
                var achievement: Achievement
                val iterator: Iterator<Achievement> = buffer?.iterator() ?: return@addOnSuccessListener
                while (iterator.hasNext()) {
                    achievement = iterator.next()
                    val stageKey = getStageAchievement(stage)
                    if (achievement.achievementId == stageKey && achievement.state == Achievement.STATE_REVEALED) {

                        achievementsClient.unlock(stageKey)
                        gamesClient.setViewForPopups(window.decorView.findViewById(android.R.id.content))                       
                    } else {

                    }
                }
            }
        }

 

다음은 리더보드에 기록을 저장하는 코드 입니다. 키에 해당하는 리더보드에 결과 값을 기록합니다. 현재 저장된 기록보다 좋은 기록일때만 리더보드가 갱신 됩니다.

private fun showLeaderBoard(res: Int) {
        val lastSignedAccount = GoogleSignIn.getLastSignedInAccount(this)
        lastSignedAccount ?: return

        lastSignedAccount.let {
            Games.getLeaderboardsClient(this, it)
                .submitScore(getString(res), 결과 값)
        }        

        Games.getLeaderboardsClient(this, lastSignedAccount)
            .getLeaderboardIntent(getString(res))
            .addOnSuccessListener {
                    intent -> startActivityForResult(intent, FinishActivity.RC_LEADERBOARD_UI)
            }
    }

 

여기까지 네이티브에서 구글플레이 게임 로그인, 리더보드, 업적 연동에 대해서 알아 보았습니다. 사실 네이티브에서 게임 앱을 만들 일이 잘 없기 때문에 이런 작업을 하시는 분이 많이 없을 것(?) 같긴 한데요. 필요하신 분들은 도움 되셨으면 좋겠습니다~

반응형