[Unity3D] 구글 플레이 게임 서비스 & 애플 게임 센터 연동 (1/2) #설정편 링크 : http://minhyeokism.tistory.com/70
* 본격적으로 진행하기 전에 한 가지 말씀드리자면
UnityEngine.Social.localUser 는 Androiod와 iOS 두 플랫폼을 모두 지원하고
현재 앱의 Platform을 알아서 판단하여
Android는 구글 플레이 게임 서비스의 api를
iOS는 애플 게임선터의 api를 호출하도록 할 수 있습니다.
다시 말해,
1 2 3 4 | Social.localUser.Authenticate((bool success) => { }); | cs |
위 처럼 Social.localUser.~~~ 를 하면 Android 든 iOS 든 알아서! 문제없이! 작동한다는 뜻입니다.
그러나 특별한 상황에서는 구분을 명확하게 해야할 필요가 있습니다. 그럴 때에는
- Android일 경우 PlayGamesPlatform. 을
- iOS일 경우 GameCenterPlatform. 을
쓰시면 됩니다.
또한, iOS 앱에서도 PlayGamesPlatform.을 사용하면 게임센터가 아닌 구글 플레이에 로그인하도록 할 수도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | void Start() { #if UNITY_ANDROID PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder() .EnableSavedGames() .Build(); PlayGamesPlatform.InitializeInstance(config); PlayGamesPlatform.DebugLogEnabled = true; PlayGamesPlatform.Activate(); #elif UNITY_IOS GameCenterPlatform.ShowDefaultAchievementCompletionBanner(true); #endif } | cs |
제일 먼저 Initialization과 Configuration 부분입니다.
구글의 저장된 게임 기능을 사용할 것이라면 (for Android)
.EnableSavedGames() 를 config에 추가해주세요.
마지막 줄에 PlayGamesPlatform.Activate() 를 해줘야 모든 기능이 작동합니다.
iOS는 특별한 config 빌드가 없어도 됩니다.
* 한 가지 주의할 점!
iOS 앱에서 안드로이드 용인 PlayGamesPlatform.Activate() 가 호출되면
애플 게임센터 api가 제대로 작동하지 않는 것을 경험했습니다.
때문에 게임센터에 접근하려면 위 처럼 코드를 #if 와 #elif 로 나눠주는 것이 좋습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public void SignIn() { Social.localUser.Authenticate((bool success) => { if (success) { // to do ... // 로그인 성공 처리 } else { // to do ... // 로그인 실패 처리 } }); } | cs |
Sign In 부분입니다.
Social.localUser로 Authenticate 하고 있기 때문에
Android와 iOS 둘 다 작동합니다.
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 32 33 34 35 36 | public void SignIn() { #if UNITY_ANDROID PlayGamesPlatform.Instance.Authenticate((bool success) => { if (success) { // to do ... // 구글 플레이 게임 서비스 로그인 성공 처리 } else { // to do ... // 구글 플레이 게임 서비스 로그인 실패 처리 } }); #elif UNITY_IOS Social.localUser.Authenticate((bool success) => { if (success) { // to do ... // 애플 게임 센터 로그인 성공 처리 } else { // to do ... // 애플 게임 센터 로그인 실패 처리 } }); #endif } | cs |
필요에 따라 이렇게 명확하게 구분하여 구현해도 됩니다.
(GameCenterPlatform 에는 Authenticate가 없기때문에 Social.localUser로 접근함)
플레이 게임 서비스 Sign Out 은 이렇게 하시면 됩니다.
(게임 센터 Sign Out api는 별도로 확인하지 못 함)
다음으로 업적과 리더보드를 구현해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 | public void UnlockAchievement(int score) { if (score >= 100) { #if UNITY_ANDROID PlayGamesPlatform.Instance.ReportProgress(GPGSIds.achievement_100, 100f, null); #elif UNITY_IOS Social.ReportProgress("Score_100", 100f, null); #endif } } | cs |
먼저, 업적을 잠금해제하는 코드 예시입니다.
Social.ReportProgress("업적ID", 0f~100f, callback);
첫 번째 파라미터에는 잠금해제 할 업적의 고유 ID를 입력해주고
(설정편에서 생성된 GPGSIds.cs에 있는 static 변수를 가져다 쓸 것)
두 번째 파라미터에는 해당 업적의 진행도(0f~100f) 를 넣어줍니다.
진행도가 존재하는 업적의 경우 진행도를 0과 100사이의 float형으로 환산하여 넣어주면 되고
단순히 조건을 충족하면 바로 잠금해제되는 업적일 경우 바로 100f를 넣어주면 됩니다.
세 번째 파라미터에는 callback 함수를 넣어줍니다.
콜백이 필요 없는 경우에는 null
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 | public void ShowAchievementUI() { // Sign In 이 되어있지 않은 상태라면 // Sign In 후 업적 UI 표시 요청할 것 if (Social.localUser.authenticated == false) { Social.localUser.Authenticate((bool success) => { if (success) { // Sign In 성공 // 바로 업적 UI 표시 요청 Social.ShowAchievementsUI(); return; } else { // Sign In 실패 처리 return; } }); } Social.ShowAchievementsUI(); } | cs |
업적 UI를 열려면
Social.ShowAchievementsUI() 를 호출하면 됩니다.
* 소셜에 로그인이 되어있지 않다면 로그인 후 재요청하는 예외처리를 해주는 것이 좋습니다.
좌 : Android - Google Play Games Services 업적 UI 스크린샷
우 : iOS - Apple Game Center 목표 달성 UI 스크린샷
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 32 33 34 35 36 | public void ReportScore(int score) { #if UNITY_ANDROID PlayGamesPlatform.Instance.ReportScore(score, GPGSIds.leaderboard_score, (bool success) => { if (success) { // Report 성공 // 그에 따른 처리 } else { // Report 실패 // 그에 따른 처리 } }); #elif UNITY_IOS Social.ReportScore(score, "Leaderboard_ID", (bool success) => { if (success) { // Report 성공 // 그에 따른 처리 } else { // Report 실패 // 그에 따른 처리 } }); #endif } | cs |
다음은 리더보드에 점수를 기록하는 코드 예시입니다.
Social.ReportScore(점수, "리더보드 고유 ID", callback);
첫 번째 파라미터에는 플레이어가 기록한 점수를 넣어줍니다.
두 번째 파라미터에는 점수를 올릴 리더보드의 고유 ID를 넣어줍니다.
(설정편에서 생성된 GPGSIds.cs에 있는 static 변수를 가져다 쓸 것)
세 번째 파라미터에는 callback 함수를 넣어줍니다.
콜백이 필요 없는 경우에는 null
* ReportScore() 함수 내부에서 플레이어의 기록된 점수와 파라미터로 날아온 점수의 높낮이를 비교하고 필터링하기 때문에
더 낮은 점수일 경우의 예외처리를 할 필요가 없습니다.
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 | public void ShowLeaderboardUI() { // Sign In 이 되어있지 않은 상태라면 // Sign In 후 리더보드 UI 표시 요청할 것 if (Social.localUser.authenticated == false) { Social.localUser.Authenticate((bool success) => { if (success) { // Sign In 성공 // 바로 리더보드 UI 표시 요청 Social.ShowLeaderboardUI(); return; } else { // Sign In 실패 // 그에 따른 처리 return; } }); } #if UNITY_ANDROID PlayGamesPlatform.Instance.ShowLeaderboardUI(); #elif UNITY_IOS GameCenterPlatform.ShowLeaderboardUI("Leaderboard_ID", UnityEngine.SocialPlatforms.TimeScope.AllTime); #endif } | cs |
리더보드의 UI를 열려면
Social.ShowLeaderboardUI()
PlayGamesPlatform.Instance.ShowLeaderboardUI()
GameCenterPlatform.ShowLeaderboardUI("순위표 고유 ID", TimeScope)
를 상황에 맞게 호출합니다.
* 마찬가지로, 소셜에 로그인이 되어있지 않다면 로그인 후 재요청하는 예외처리를 해주도록 합니다.
리더보드 UI를 열 때
위 처럼 TimeScope 를 정해서 넘겨주면 원하는 기간동안의 순위표를 보게할 수도 있습니다.
AllTime - 전체 기간 순위표
Today - 오늘 순위표
Week - 이번 주 순위표
Android - Google Play Games Services 리더보드 UI 스크린샷
iOS - Apple Game Center 순위표 UI 스크린샷
이상으로 포스팅을 마치겠습니다.
궁금한 점이 있다면 댓글 남겨주세요.
'02.Development > Unity3D' 카테고리의 다른 글
[Unity3D] 파티클 사이즈 조절을 쉽게 할 수 있는 ParticleScaler.cs (5) | 2017.05.11 |
---|---|
[Unity3D] 구글 플레이 게임 서비스 & 애플 게임 센터 연동 (1/2) #설정편 (2) | 2017.05.08 |
[Unity3D] Google AdMob 연동하기 (2) | 2017.04.22 |
[Unity3D] AdColony 연동하기 (0) | 2017.04.21 |
[Unity3D] Unity - Gitignore 설정하기 (0) | 2017.04.19 |