안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.
이번 시간에는 Unity에서 Game Center(iOS)와 Google Play Games(Android)를 활용하여 리더보드 기능을 구현하는 방법을 알아보겠습니다. 특히 GameCenterScoreSubmission 스크립트를 중심으로, 플랫폼별로 인증하고 점수를 제출하며, 리더보드를 표시하는 방법을 소개해 드릴게요.
이 스크립트를 통해 게임 내에서 플레이어들의 점수를 공유하고 경쟁할 수 있는 환경을 구축할 수 있습니다. 단계별로 필요한 코드와 설명을 함께 제공하니, 프로젝트에서 바로 적용해 보세요.
2024.11.14 - [분류 전체보기] - [외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!
창고에 물건을 보관하면 더이상 보여주지 않고, 오로지 당신의 기억력으로 찾아야해요.
날이 갈수록 늘어나는 상품들과 주문에도 정확하고 빠르게 물건을 찾아 배송해야해요.
과연 당신은 며칠까지 버틸수 있을까요?
당신의 기억력을 시험해봐요. 지금 다운로드하세요.
[아이폰 앱스토어 다운로드]
https://apps.apple.com/kr/app/%EC%99%B8%EC%9B%8C%EB%9D%BC%EC%B0%BD%EA%B3%A0/id6737766088
저희가 챗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
*Google Play 에서 다운로드
https://play.google.com/store/apps/details?id=com.intellione.farmersfirstdream&pcampaignid=web_share
주요 기능 소개
플랫폼별 리더보드 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. 필요한 패키지 및 플러그인 설치
- Android
- Google Play Games 플러그인을 Unity 프로젝트에 설치해야 합니다.
- GitHub - playgameservices/play-games-plugin-for-unity에서 최신 버전을 다운로드하여 설치하세요.
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)였습니다!
감사합니다.
'디지털노마드' 카테고리의 다른 글
챗GPT 게임개발73: Unity iOS Native Plugin으로 텍스트와 이미지 공유하기 (0) | 2024.12.11 |
---|---|
챗GPT 게임개발72: Unity에서 타이머와 애니메이션 제어하기 (4) | 2024.12.04 |
챗GPT 게임개발70: Unity에서 다국어 지원과 언어별 폰트 적용하기 (4) | 2024.12.02 |
챗GPT 게임개발69: Unity에서 광고 쿨다운 시스템 구현하기 (1) | 2024.12.02 |
챗GPT 게임개발68: Unity에서 Google Mobile Ads로 리워드 광고 구현하기 (5) | 2024.11.29 |