[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 스크린샷




이상으로 포스팅을 마치겠습니다.


궁금한 점이 있다면 댓글 남겨주세요.



+ Recent posts