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




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


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



안녕하세요.


이번 포스팅의 주제는 Google Play Games 플러그인 연동하기 입니다!


유니티 프로젝트에


     Android - 구글 플레이 게임 서비스 (Google Play Games Services)

     iOS - 애플 게임 샌터 (Apple Game Center)


를 연동하고


1. 로그인(SignIn), 2. 로그아웃(SignOut), 3. 업적(Achievement), 4. 리더보드(Leaderboard) 


기능을 구현해보도록 하겠습니다.


물론 Google Play Games plugin for Unity - Github 사이트에 영문으로


업적, 리더보드, 저장된 게임, 퀘스트 등 다양한 기능 연동 가이드가 있습니다.


링크 : https://github.com/playgameservices/play-games-plugin-for-unity





우선 위 링크에서 [Clone or download] -> [Download.ZIP] 하여 플러그인을 다운로드합니다.


압축을 풀고 내용물을 보면





이렇게 되어있는데


맨 위 current-build 폴더에 최신 버전 플러그인.unitypackage가 들어있습니다.


(이 플러그인은 구글 플레이 게임서비스와 애플 게임센터 두 플랫폼 다 지원함)




유니티 프로젝트에 import 해둡니다.




[Android - 구글 플레이 게임 서비스 설정]



먼저, 구글 플레이 개발자 콘솔로 이동하여 (회원가입 후) 로그인 합니다.


플레이 콘솔 사이트 링크 : https://play.google.com/apps/publish/?hl=ko


(Google Play Developer Console의 탐색 기능과 디자인이 업데이트되었으며 이름이 Play Console로 변경되었습니다 - 17년 4월 기준)





우측에 [애플리케이션 만들기] 버튼을 클릭합니다. (플레이 콘솔에 앱을 추가하지 않은 경우만)





언어를 설정하고 제목을 입력한 후 [만들기] 하고


스토어 등록정보 등 기타 내용을 채워서 출시 조건을 맞춰줍니다.





애플리케이션 설정을 완료했다면 [게임 서비스]로 이동하여 [새 게임 추가]를 클릭합니다.





게임 이름을 입력하고 카테고리 선택 후 [계속] 합니다.


애플리케이션 설정과 마찬가지로 [게임 세부정보]에 내용을 채워줍니다.





그 다음 [연결된 앱]으로 이동하고 플랫폼을 선택합니다.





이전에 만들어 두었던 애플리케이션을 게임 서비스와 연결하는 과정입니다.


앱 이름과 패키지 이름, 기타 설정을 마치고 [저장하고 계속] 합니다.





연결이 정상적으로 완료된 모습입니다.







업적과 리더보드를 각각 추가해줍니다.


(참고로, 업적이나 리더보드 아이콘을 넣어주지 않으면 디폴트 아이콘이 보여집니다.)


그러고 나면 하단에 [리소스 받기] 가 보이실텐데요 한번 클릭해 봅시다.





위 처럼 [리소스 내보내기] 라고 뜨는데요


Android 앱은 [ANDROID] 탭을 눌러서 내용을 복사해둡니다.


(iOS 앱은 [OBJECTIVE-C] 탭을 눌러서 복사)


이제 유니티로 돌아옵니다.





플러그인이 정상적으로 임포트 되었다면 Window에 Google Play Games 메뉴가 생깁니다.


그럼 [Window] -> [Google Play Games] -> [Setup] -> [Android setup] 해줍니다.





위와 같은 팝업창이 뜨면 [Resources Definition]


아까 복사해 두었던 리소스를 붙여넣기 합니다.


[Web App Client ID]는 웹 게임용 변수이므로 패스하고 [Setup] 버튼을 누릅니다.





Setup이 완료되었습니다.


[OK]를 누르고 로딩을 기다리면





위 처럼 GPGSIds 라는 .cs 파일이 생성되었을 것입니다.





앞서 만들어둔 업적과 리더보드의 ID를 string 형식으로 담고있는 모습입니다.


업적을 잠금해제하거나 리더보드에 스코어를 올릴 때


static 클래스 GPGSIds의 string 변수를 가져다 쓸 것입니다.




[iOS - 애플 게임센터 설정]



아이튠즈 커넥트 사이트로 이동하여 회원가입 후 로그인 합니다.


iTunes Connect 사이트 링크 : https://itunesconnect.apple.com





로그인 후 메인 페이지에서 [나의 앱] 으로 이동합니다.





[나의 앱] 페이지 좌상단에 있는 [+ 버튼] 을 누른 후 [신규 앱] 을 클릭합니다.


이미 등록된 앱이 있다면 앱 아이콘을 클릭합니다.





플랫폼, 이름, 기본 언어, 번들 ID, SKU 를 입력하고 [생성] 합니다.





앱이 정상적으로 생성되었다면 앱 아이콘을 눌러 앱 페이지로 이동합니다.


그 다음 [앱 내 추가 기능] -> [Game Center] 메뉴로 이동합니다.





순위표와 목표 달성 (각각 리더보드와 업적을 뜻함) 이


비어있는 모습입니다.


먼저 순위표 옆에 있는 +버튼을 눌러줍니다.





개별 순위표를 [선택] 합니다.





개별 순위표 정보를 채워줍니다.


그리고 하단 순위표 현지화에 있는 [언어 추가] 를 눌러줍니다.





현지화 할 언어를 선택합니다.


나머지 정보를 입력하고 (이미지는 선택사항, 이미지를 올리지 않으면 디폴트 이미지가 보여짐) [Save] 합니다.


이제 리더보드가 준비되었습니다.


다음으로 업적을 추가해 봅시다.





목표 달성 옆에 있는 +버튼을 눌러서 업적을 생성합니다.


업적 정보를 입력하고 하단 목표 달성 현지화에 있는 [언어 추가] 를 눌러줍니다.





마찬가지로 현지화 할 언어를 선택하고 제목과 설명을 입력하고 [Save] 합니다.


위는, 업적 아이콘을 원하는 이미지로 직접 설정해 준 모습입니다.





다시 유니티로 돌아와서


[Window] -> [Google Plat Games] -> [Setup] -> [iOS setup...] 합니다.






팝업 창이 뜨면 플레이 콘솔 [리소스 내보내기] 에서 [OBJECTIVE-C] 를 선택하고 


복사 & 붙여넣기 합니다.


그리고 [Setup] 해줍니다.




자, 이제 정말로 연동할 준비가 다 되었습니다!


다음 편에 계속됩니다!


[Unity3D] 구글 플레이 게임 서비스 & 애플 게임 센터 연동 (2/2) #코드편 링크 : http://minhyeokism.tistory.com/72



+ Recent posts