본문 바로가기
디지털노마드

챗GPT 게임개발71: Unity에서 Game Center 및 Google Play Games 리더보드 구현하기

by 인텔리노마드라이프 2024. 12. 3.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

 

이번 시간에는 Unity에서 Game Center(iOS)와 Google Play Games(Android)를 활용하여 리더보드 기능을 구현하는 방법을 알아보겠습니다. 특히 GameCenterScoreSubmission 스크립트를 중심으로, 플랫폼별로 인증하고 점수를 제출하며, 리더보드를 표시하는 방법을 소개해 드릴게요.

 

이 스크립트를 통해 게임 내에서 플레이어들의 점수를 공유하고 경쟁할 수 있는 환경을 구축할 수 있습니다. 단계별로 필요한 코드와 설명을 함께 제공하니, 프로젝트에서 바로 적용해 보세요.

 


 

신개념 메모리 게임의 탄생. 외워라! 창고.

2024.11.14 - [분류 전체보기] - [외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!

 

[외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!

안녕하세요, 인텔리원스튜디오(IntelliOneStudio)에서 흥미진진한 소식을 가지고 왔어요! 저희가 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다! 이 게임은 챗GPT의 놀라운 AI 기능을

intellinomadlife.tistory.com

 

 

창고에 물건을 보관하면 더이상 보여주지 않고, 오로지 당신의 기억력으로 찾아야해요.

날이 갈수록 늘어나는 상품들과 주문에도 정확하고 빠르게 물건을 찾아 배송해야해요.

과연 당신은 며칠까지 버틸수 있을까요?

당신의 기억력을 시험해봐요. 지금 다운로드하세요.

 

[아이폰 앱스토어 다운로드]

https://apps.apple.com/kr/app/%EC%99%B8%EC%9B%8C%EB%9D%BC%EC%B0%BD%EA%B3%A0/id6737766088

 

‎외워라창고

‎환영합니다. 우리 창고는 매일 새롭게 들어오는 상품을 각기 다른 각기 다른 상자에 보관해요. 주문이 들어오면 그 상품들을 찾아 포장하고, 정확한 주소로 배송하는 것이 여러분의 임무입니

apps.apple.com

 

 


 

저희가 챗GPT를 활용해서 개발한 첫 번째 게임을 여러분께 소개합니다! 이 게임은 챗GPT의 놀라운 AI 기능을 활용해 개발했어요. 즐거움이 가득한 이번 게임은, 챗GPT를 활용해서 누구든지 게임을 재미있게 만들 수 있다는 것을 보여줄 거에요.

 

* APP Store 에서 다운로드 

https://apps.apple.com/kr/app/%EB%86%8D%EB%B6%80%EC%9D%98-%EA%BF%88/id6479183930

 

‎농부의 꿈

‎오래된 전설이 숨겨져 있는 [농부의 꿈]목장 한구석에서 ‘비밀의 문'과 '마법 책'이 발견되었어요. [변신하는 동물들] 병아리가 합쳐져 닭이 되고, 닭이 합쳐져 고슴도치로 변신하며, 점점 더

apps.apple.com

 

 

*Google Play 에서 다운로드

https://play.google.com/store/apps/details?id=com.intellione.farmersfirstdream&pcampaignid=web_share

 

농부의 꿈 - Google Play 앱

평화로운 목장에서 신나는 동물 합치기 무료게임 (바람, 뚫어뻥, 밧줄, 무중력 등 매직 아이템 활용해 병아리를 젖소로 키워보세요.)

play.google.com

 


주요 기능 소개

플랫폼별 리더보드 ID 설정

iOS와 Android에서 각각 다른 리더보드 ID를 사용합니다.

 

플랫폼별 인증 및 초기화

iOS에서는 Game Center를, Android에서는 Google Play Games 서비스를 초기화하고 인증합니다.

 

점수 제출 및 리더보드 표시

인증 후 점수를 리더보드에 제출하고, 리더보드 UI를 표시합니다.

 

 

아래와 같이 ChatGPT에게 질문했어요.

※ ChatGPT 답변 내용 중 제가 별도로 표시한 굵은 글씨를 기준으로 읽으시면 좀 더 이해가 쉽게 될 거예요.


 

[질문]

안녕, ChatGPT. Unity에서 Game Center와 Google Play Games를 사용하여 리더보드 기능을 구현하고 싶어. GameCenterScoreSubmission 스크립트를 작성했는데, 어떻게 동작하는지 자세히 설명해 줄 수 있어?


 

[답변]

안녕하세요! GameCenterScoreSubmission 스크립트를 통해 Unity에서 리더보드 기능을 구현하는 방법을 단계별로 설명해 드릴게요.

 

1. 플랫폼별 리더보드 ID 설정

설명:

  • 플랫폼에 따라 리더보드 ID를 설정합니다.
#if UNITY_IOS
private string leaderboardID = "YOUR_IOS_LEADERBOARD_ID"; // iOS용 리더보드 ID
#elif UNITY_ANDROID
private string leaderboardID = "YOUR_ANDROID_LEADERBOARD_ID"; // Android용 리더보드 ID
#endif
  • iOS와 Android에서 각각 다른 리더보드 ID를 사용해야 합니다.
  • iOS: Game Center에서 생성한 리더보드 ID를 사용합니다.
  • Android: Google Play Console에서 생성한 리더보드 ID를 사용합니다.

2. 플랫폼별 초기화 및 설정

설명:

  • Android의 경우 Google Play Games 서비스를 초기화합니다.
private void Start()
{
#if UNITY_ANDROID
    // Google Play Games 초기화
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().Build();
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.DebugLogEnabled = true; // 디버그 로그 활성화
    PlayGamesPlatform.Activate();
#endif
}
  • iOS의 경우 별도의 초기화가 필요하지 않습니다.

 

3. 사용자 인증 및 리더보드 표시

 

설명:

  • 사용자를 인증하고 리더보드를 표시하는 함수를 구현합니다.
public void AuthenticateAndShowLeaderboard()
{
    AuthenticateUser(() =>
    {
#if UNITY_ANDROID
        PlayGamesPlatform.Instance.ShowLeaderboardUI(leaderboardID);
#elif UNITY_IOS
        Social.ShowLeaderboardUI();
#else
        Debug.Log("Platform not supported");
#endif
    });
}
  • AuthenticateUser() 메서드를 호출하여 사용자 인증을 수행하고, 인증에 성공하면 리더보드 UI를 표시합니다.
  • 플랫폼에 따라 리더보드 UI를 표시하는 방법이 다릅니다.
    • Android: PlayGamesPlatform.Instance.ShowLeaderboardUI(leaderboardID);
    • iOS: Social.ShowLeaderboardUI();

 

4. 사용자 인증 및 점수 제출

 

설명:

  • 사용자를 인증하고 점수를 제출하는 함수를 구현합니다.
public void AuthenticateAndSubmitScore(long score)
{
    this.score = score;
    AuthenticateUser(() =>
    {
        SubmitScore(score);
    });
}
  • AuthenticateUser() 메서드를 통해 인증을 수행하고, 인증에 성공하면 SubmitScore()를 호출하여 점수를 제출합니다.

 

5. 사용자 인증 함수 구현

 

설명:

  • 사용자 인증을 처리하는 함수를 구현합니다.
private void AuthenticateUser(System.Action onAuthenticated)
{
#if UNITY_ANDROID
    Social.localUser.Authenticate(success =>
    {
        if (success)
        {
            Debug.Log("Authentication successful");
            onAuthenticated?.Invoke();
        }
        else
        {
            Debug.Log("Authentication failed");
        }
    });
#elif UNITY_IOS
    Social.localUser.Authenticate(success =>
    {
        if (success)
        {
            Debug.Log("Authentication successful");
            onAuthenticated?.Invoke();
        }
        else
        {
            Debug.Log("Authentication failed");
        }
    });
#else
    Debug.Log("Platform not supported for authentication");
#endif
}
  • Android와 iOS 모두 Social.localUser.Authenticate()를 사용하여 사용자 인증을 처리합니다.
  • 인증에 성공하면 콜백 함수를 호출하여 다음 작업을 수행합니다.

 

6. 점수 제출 함수 구현

 

설명:

  • 점수를 리더보드에 제출하는 함수를 구현합니다.
private void SubmitScore(long score)
{
#if UNITY_ANDROID
    if (Social.localUser.authenticated)
    {
        Social.ReportScore(score, leaderboardID, success =>
        {
            Debug.Log(success ? "Score submitted successfully" : "Score submission failed");
        });
    }
    else
    {
        Debug.Log("User is not authenticated to submit the score");
    }
#elif UNITY_IOS
    if (Social.localUser.authenticated)
    {
        Social.ReportScore(score, leaderboardID, success =>
        {
            Debug.Log(success ? "Score submitted successfully" : "Score submission failed");
        });
    }
    else
    {
        Debug.Log("User is not authenticated to submit the score");
    }
#else
    Debug.Log("Platform not supported for score submission");
#endif
}
  • 사용자가 인증된 상태인지 확인하고, 인증되어 있으면 Social.ReportScore()를 사용하여 점수를 제출합니다.
  • 제출 결과를 콜백으로 받아 성공 여부를 확인할 수 있습니다.

 

전체 코드 정리

 
using UnityEngine;
using UnityEngine.SocialPlatforms;
#if UNITY_ANDROID
using GooglePlayGames;
using GooglePlayGames.BasicApi;
#endif

namespace WarehouseDeliveryQuest.Managers
{
    public class GameCenterScoreSubmission : MonoBehaviour
    {
#if UNITY_IOS
        private string leaderboardID = "YOUR_IOS_LEADERBOARD_ID"; // iOS용 리더보드 ID
#elif UNITY_ANDROID
        private string leaderboardID = "YOUR_ANDROID_LEADERBOARD_ID"; // Android용 리더보드 ID
#endif

        private long score = 0;

        private void Start()
        {
#if UNITY_ANDROID
            // Google Play Games 초기화
            PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().Build();
            PlayGamesPlatform.InitializeInstance(config);
            PlayGamesPlatform.DebugLogEnabled = true; // 디버그 로그 활성화
            PlayGamesPlatform.Activate();
#endif
        }

        // 인증 후 리더보드를 표시하는 함수
        public void AuthenticateAndShowLeaderboard()
        {
            AuthenticateUser(() =>
            {
#if UNITY_ANDROID
                PlayGamesPlatform.Instance.ShowLeaderboardUI(leaderboardID);
#elif UNITY_IOS
                Social.ShowLeaderboardUI();
#else
                Debug.Log("Platform not supported");
#endif
            });
        }

        // 인증 후 점수를 제출하는 함수
        public void AuthenticateAndSubmitScore(long score)
        {
            this.score = score;
            AuthenticateUser(() =>
            {
                SubmitScore(score);
            });
        }

        // 사용자 인증 함수
        private void AuthenticateUser(System.Action onAuthenticated)
        {
#if UNITY_ANDROID
            Social.localUser.Authenticate(success =>
            {
                if (success)
                {
                    Debug.Log("Authentication successful");
                    onAuthenticated?.Invoke();
                }
                else
                {
                    Debug.Log("Authentication failed");
                }
            });
#elif UNITY_IOS
            Social.localUser.Authenticate(success =>
            {
                if (success)
                {
                    Debug.Log("Authentication successful");
                    onAuthenticated?.Invoke();
                }
                else
                {
                    Debug.Log("Authentication failed");
                }
            });
#else
            Debug.Log("Platform not supported for authentication");
#endif
        }

        // 점수를 제출하는 함수
        private void SubmitScore(long score)
        {
#if UNITY_ANDROID
            if (Social.localUser.authenticated)
            {
                Social.ReportScore(score, leaderboardID, success =>
                {
                    Debug.Log(success ? "Score submitted successfully" : "Score submission failed");
                });
            }
            else
            {
                Debug.Log("User is not authenticated to submit the score");
            }
#elif UNITY_IOS
            if (Social.localUser.authenticated)
            {
                Social.ReportScore(score, leaderboardID, success =>
                {
                    Debug.Log(success ? "Score submitted successfully" : "Score submission failed");
                });
            }
            else
            {
                Debug.Log("User is not authenticated to submit the score");
            }
#else
            Debug.Log("Platform not supported for score submission");
#endif
        }
    }
}

 

 


 

[추가 질문]

그렇다면, 이 스크립트를 실제 프로젝트에 적용하려면 어떻게 해야 할까?


 

[추가 답변]

좋은 질문이에요! 이 스크립트를 프로젝트에 적용하는 방법을 알려드릴게요.

 

1. 리더보드 설정

  • iOS (Game Center)
    • Apple Developer 계정에서 App ID를 생성하고, Game Center를 활성화합니다.
    • App Store Connect에서 리더보드를 생성하고, 리더보드 ID를 확인합니다.
    • leaderboardID에 해당 ID를 설정합니다.
  • Android (Google Play Games Services)
    • Google Play Console에서 게임 서비스를 생성합니다.
    • 리더보드를 생성하고, 리더보드 ID를 확인합니다.
    • leaderboardID에 해당 ID를 설정합니다.
    • SHA1 인증서 지문을 등록하고, 앱에 필요한 설정을 완료합니다.

2. 필요한 패키지 및 플러그인 설치

3. 스크립트 적용

  • GameCenterScoreSubmission 스크립트를 생성하고, 제공된 코드를 붙여넣습니다.
  • 이 스크립트를 게임 오브젝트에 추가합니다.

4. 플랫폼별 설정

  • iOS
    • Xcode 프로젝트에서 Capabilities 탭에서 Game Center를 활성화합니다.
  • Android
    • Google Play Games 설정 창에서 Resources Definition을 업데이트합니다.
    • Bundle Identifier가 Google Play Console에 등록된 것과 일치하는지 확인합니다.

5. 빌드 및 테스트

  • 실제 기기에서 빌드하여 테스트합니다.
  • 사용자가 인증되고, 점수가 정상적으로 제출되며, 리더보드가 표시되는지 확인합니다.

 

오늘은 Unity에서 Game Center와 Google Play Games를 활용하여 리더보드 기능을 구현하는 방법을 알아봤어요.

 

GameCenterScoreSubmission 스크립트를 통해 플랫폼에 따라 인증하고 점수를 제출하며, 리더보드를 표시할 수 있습니다.

이 시스템을 통해 플레이어들이 서로 경쟁하며 게임의 재미를 더욱 높일 수 있습니다.

 

지금까지 인텔리원스튜디오(IntelliOneStudio)였습니다!

감사합니다.

728x90