티스토리 뷰

프로그래밍/유니티

유니티 GPGS 연동 (전체)

뽀로로친구에디 2022. 9. 26. 11:40

 

1. 빌드 세팅

 

2. 안드뢰드 스위치 플랫폼 

 

3. 안드로이드 스위치 플랫폼 되면 안드로이드 옆에 유니티 아이콘 생성 확인

그리개 플레이어 세팅 

 

4.  컴패니 네임 

 

5. Other Settings >> Identification

Override Default Package Name 체크

Package Name 소문자로 한다.

Target API Level 타켓 레벨은 그때마다 다르다. 나는 31레벨

Scripting Backend IL2CPP

Api Compatibility Level .NET 4.x

ARM64 체크 

 

6 퍼블리싱 세팅.

 

7. 키스토어 매니저 만들어 준다. 

 

8. 키스토어 >> 크레이트뉴 >> 애니웨어 

 

9. 파일이름 넣고 저장하기 

 

10. 비밀번호 동일하게 4개 작성하고 애드키 

 

11. 구글에서 gpgs unity로 검색

 

 

12. 릴리즈를 눌러준다. 

 

13. 작성일(22.09.29) 기준 최신 버전인 0.11.01에서는 using GooglePlayGames.BasicApi 지시문에 PlayGamesClientConfiguration을 포함하고 있지 않습니다.

이전 버전인 0.10.14 버전을 사용하면 됩니다. 

 

14. 소스코드(ZIP)을 다운받는다. 

 

15. 압축을 풀고 current-build 폴더로 들어간다. 

 

16

 

 

17. 유니티 패키지를 애셋으로 드래그한다. 

 

 

18. 임포트 시켜준다.

 

19. 이네이블 안드로이드 오토-리솔로션나오면 이네이블 버튼 눌러준다.

 

20. 빌드세팅해서 빌드 앱 번들(구글 플레이) 체크 해주고 빌드한다. 

 

 

21. 파일이름 넣고 저장한다. 

 

22. 일단 그냥 오케이 눌러서 넘어간다. 

 

23. 폴더에 aab 파일 생성 확인

 

 

24.  구글플레이콘솔에 들어가서 앱만들기 

 

25.

 

26.

 

27.

 

28.

 

29. 업로드

 

 

30. 업로드 하기

.

 

31. 저장 

 

32. 플레이 게임즈 서비스 >> 설정 

 

33. 아니요 >> 만들기

 

34. 설정

 

35. Google Cloud Platform을 클릭

 

36. OAuth 동의 화면은 외부 타입으로 선택하고 만들기를 클릭한다. 

37. 앱이름, 사용자 지원 이메일 넣는다. 

 

38. 개발자 연락처 정보 넣고 저장후 계속

 

39. 구글플레이콘솔로 다시 돌아간다. 그리고 새로고침한다. 

 

40. 사용자 인증 정보 추가 버튼을 클릭 

 

 

41. 사용자 인증 정보 추가에서 게임 서버를 먼저 만들어 주다. 

 

 

42. OAuth 클라이언트 만들기 클릭

 

 

43. 구글클라우드로 다시 와서 >> 사용자 인증 정보 

 

44. 사용자 인증 정보 만들기 클릭

 

45. OAuth 클라이언트 ID 클릭 

 

46. 웹 애플리케이션 선택

 

47. 이름 넣고 만들기 

 

48. 생성 확인

 

49. 플레이 콘솔로 돌와아서 게임서버 선택하고 OAuth 클라이언트 새로고침하고 OAuth 클라이언트에서 선택한다.

그리고 변경사항 저장한다. 

 

50 다시 설정으로 돌아가서 , 사용자인증정보 추가버튼을 클릭한다. 

 

51. 안드로이드 >> OAuth 클라이언트 만들기 

 

52. 만드는 방법이 나옵니다. 

 

53. 다시 구글클라우드로 와서 >> 사용자 인증 정보 >> 사용자 인증 정보 만들기 >> OAuth 클라이언트 ID 만들기

 

54. 위 이미지 "52번 OAuth클라이언트 만드는 방법"에 나온 이름, 패키지 이름, 지문을 넣고 만든다.

 

 

55. 확인 눌러준다. 

 

 

56. 구글 플레이 콘솔에 돌와가서 다시 새로고침하세요. 그리고 변경사항 저장한다.

 

57. 설정 >> 앱 무결성 >> 업로드 키 인증서 >> SHA-1 인증서 지문을 복사한다. (테스트용)

 

58. 플레이 게임즈 서비스 설정 >> 사용자 인증 정보 추가 

 

 

59. OAuth 클라이언트 만들기 

 

60.

 

 

61. 구글클라우드 >> 사용자 인증 정보 >> OAuth 클라이언트 ID

 

62. 테스트용 만들기 지문은 업로드키 지문으로 

 

1개의 웹 애플리캐이션과 2개의 안드로이드 유형을 만들었다. 

 

63. 플레이콘솔로 돌와아서 새로고침 눌러요.

 

64. 변경사항 저장

 

65. 구글플레이콘솔 설정으로 가서 확인한다. 안드로이드 2개, 게임서버 1개가 생성되었는지 확인한다. 

 

66. 구글클라우드 >> OAuth 동의 화면 >> 앱 게시 선택 >> 확인 ... (이제부터 게임 서버 작동한다.)

 

67. 구글플레이콘솔>> 플레이게임즈서비스 >> 설정 >> 리소스보기 클릭 

 

 

68. 리소스 복사

 

 

69. 유니티 >> Window >> Google Play Games >> Setup >> Android setup

 

 

70. 리소스 붙여넣기

 

71. 구글클라우드 >> 사용자 인증 정보 >> 웹 애플리케이션 >> 웹 클라이언트 ID를 복사

 

72. 클라이언트 ID 붙여넣기 그리고 Setup 버튼 클릭

 

73. Assets >> External Dependency Manager >> Android Resolver >> Fore Resolve 

 

 

74. 유니티에서 코드는 ... 

GPGSBinder.cs 소스입니다



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using GooglePlayGames.BasicApi.SavedGame;
using GooglePlayGames.BasicApi.Events;


public class GPGSBinder
{
    static GPGSBinder inst = new GPGSBinder();
    public static GPGSBinder Inst => inst;



    ISavedGameClient SavedGame => 
        PlayGamesPlatform.Instance.SavedGame;

    IEventsClient Events =>
        PlayGamesPlatform.Instance.Events;



    void Init()
    {
        var config = new PlayGamesClientConfiguration.Builder().EnableSavedGames().Build();
        PlayGamesPlatform.InitializeInstance(config);
        PlayGamesPlatform.DebugLogEnabled = true;
        PlayGamesPlatform.Activate();
    }


    public void Login(Action<bool, UnityEngine.SocialPlatforms.ILocalUser> onLoginSuccess = null)
    {
        Init();
        PlayGamesPlatform.Instance.Authenticate(SignInInteractivity.CanPromptAlways, (success) =>
        {
            onLoginSuccess?.Invoke(success == SignInStatus.Success, Social.localUser);
        });
    }

    public void Logout()
    {
        PlayGamesPlatform.Instance.SignOut();
    }


    public void SaveCloud(string fileName, string saveData, Action<bool> onCloudSaved = null)
    {
        SavedGame.OpenWithAutomaticConflictResolution(fileName, DataSource.ReadCacheOrNetwork,
            ConflictResolutionStrategy.UseLastKnownGood, (status, game) =>
            {
                if (status == SavedGameRequestStatus.Success)
                {
                    var update = new SavedGameMetadataUpdate.Builder().Build();
                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(saveData);
                    SavedGame.CommitUpdate(game, update, bytes, (status2, game2) =>
                    {
                        onCloudSaved?.Invoke(status2 == SavedGameRequestStatus.Success);
                    });
                }
            });
    }

    public void LoadCloud(string fileName, Action<bool, string> onCloudLoaded = null)
    {
        SavedGame.OpenWithAutomaticConflictResolution(fileName, DataSource.ReadCacheOrNetwork, 
            ConflictResolutionStrategy.UseLastKnownGood, (status, game) => 
            {
                if (status == SavedGameRequestStatus.Success)
                {
                    SavedGame.ReadBinaryData(game, (status2, loadedData) =>
                    {
                        if (status2 == SavedGameRequestStatus.Success)
                        {
                            string data = System.Text.Encoding.UTF8.GetString(loadedData);
                            onCloudLoaded?.Invoke(true, data);
                        }
                        else
                            onCloudLoaded?.Invoke(false, null);
                    });
                }
            });
    }

    public void DeleteCloud(string fileName, Action<bool> onCloudDeleted = null)
    {
        SavedGame.OpenWithAutomaticConflictResolution(fileName,
            DataSource.ReadCacheOrNetwork, ConflictResolutionStrategy.UseLongestPlaytime, (status, game) =>
            {
                if (status == SavedGameRequestStatus.Success)
                {
                    SavedGame.Delete(game);
                    onCloudDeleted?.Invoke(true);
                }
                else 
                    onCloudDeleted?.Invoke(false);
            });
    }


    public void ShowAchievementUI() => 
        Social.ShowAchievementsUI();

	public void UnlockAchievement(string gpgsId, Action<bool> onUnlocked = null) => 
        Social.ReportProgress(gpgsId, 100, success => onUnlocked?.Invoke(success));

    public void IncrementAchievement(string gpgsId, int steps, Action<bool> onUnlocked = null) =>
        PlayGamesPlatform.Instance.IncrementAchievement(gpgsId, steps, success => onUnlocked?.Invoke(success));


    public void ShowAllLeaderboardUI() =>
        Social.ShowLeaderboardUI();

    public void ShowTargetLeaderboardUI(string gpgsId) => 
        ((PlayGamesPlatform)Social.Active).ShowLeaderboardUI(gpgsId);

    public void ReportLeaderboard(string gpgsId, long score, Action<bool> onReported = null) =>
        Social.ReportScore(score, gpgsId, success => onReported?.Invoke(success));

	public void LoadAllLeaderboardArray(string gpgsId, Action<UnityEngine.SocialPlatforms.IScore[]> onloaded = null) => 
        Social.LoadScores(gpgsId, onloaded);

    public void LoadCustomLeaderboardArray(string gpgsId, int rowCount, LeaderboardStart leaderboardStart, 
        LeaderboardTimeSpan leaderboardTimeSpan, Action<bool, LeaderboardScoreData> onloaded = null)
    {
        PlayGamesPlatform.Instance.LoadScores(gpgsId, leaderboardStart, rowCount, LeaderboardCollection.Public, leaderboardTimeSpan, data =>
        {
            onloaded?.Invoke(data.Status == ResponseStatus.Success, data);
        });
    }


    public void IncrementEvent(string gpgsId, uint steps) 
    {
        Events.IncrementEvent(gpgsId, steps);
    }

    public void LoadEvent(string gpgsId, Action<bool, IEvent> onEventLoaded = null)
    {
        Events.FetchEvent(DataSource.ReadCacheOrNetwork, gpgsId, (status, iEvent) =>
        {
            onEventLoaded?.Invoke(status == ResponseStatus.Success, iEvent);
        });
    }

    public void LoadAllEvent(Action<bool, List<IEvent>> onEventsLoaded = null)
    {
        Events.FetchAllEvents(DataSource.ReadCacheOrNetwork, (status, events) =>
        {
            onEventsLoaded?.Invoke(status == ResponseStatus.Success, events);
        });
    }

}

 

Test.cs 소스입니다



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    string log;


    void OnGUI()
    {
        GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one * 3);


        if (GUILayout.Button("ClearLog"))
            log = "";

        if (GUILayout.Button("Login"))
            GPGSBinder.Inst.Login((success, localUser) =>
            log = $"{success}, {localUser.userName}, {localUser.id}, {localUser.state}, {localUser.underage}");

        if (GUILayout.Button("Logout"))
            GPGSBinder.Inst.Logout();

      

        GUILayout.Label(log);
    }
}

75. 클라우드 저장, 불러오기 및 삭제 

플레이게임즈 설정 >> 저장된 게임이 사용 설정되지 않음 >> 속성수정 

 

 

76. 사용 버튼 클릭하고 변경사항 저장

 

 

77. 구글 클라우드 플랫폼으로 가기 

 

 

78. + API 및 서비스 사용 설정 클릭 

 

79. 구글 워크스페이스 마켓플레이스 SDK 선택 

 

80. 사용 클릭 

 

 

81.  구글플레이콘솔 >> 대시보드

81-1 대시보드 >> 앱설정

 

81-2 앱 액세스 권한 

 

81-3 >> 특수한 액세스 권한 없이 모든 기능 이용 가능

 

81-4

 

82. 스크립트 추가

Test.cs 소스입니다



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    string log;


    void OnGUI()
    {
        GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one * 3);


        if (GUILayout.Button("ClearLog"))
            log = "";

        if (GUILayout.Button("Login"))
            GPGSBinder.Inst.Login((success, localUser) =>
            log = $"{success}, {localUser.userName}, {localUser.id}, {localUser.state}, {localUser.underage}");

        if (GUILayout.Button("Logout"))
            GPGSBinder.Inst.Logout();

        if (GUILayout.Button("SaveCloud"))
            GPGSBinder.Inst.SaveCloud("mysave", "want data", success => log = $"{success}");

        if (GUILayout.Button("LoadCloud"))
            GPGSBinder.Inst.LoadCloud("mysave", (success, data) => log = $"{success}, {data}");

        if (GUILayout.Button("DeleteCloud"))
            GPGSBinder.Inst.DeleteCloud("mysave", success => log = $"{success}");

      
        GUILayout.Label(log);
    }
}

83. 업적만들기

 

 

84. 업적만들기

 

85. 이름은 영어로, 초기상태 공개 >> 임시보관함에 저장 

 

86.

 

87. 리더보드 생성

 

88. 이벤트 만들기

 

 

89. 리소스 보기

 

 

90. 리소스 복사

 

 

91.

 

92. 리소스 붙여넣기 

 

93. 

 

 

94. GPGSIds.cs 스크립트가 생성됨을 확인한다. 

 

95.

 

96. 소스코드 추가 

 

Test.cs 소스입니다



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    string log;


    void OnGUI()
    {
        GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one * 3);


        if (GUILayout.Button("ClearLog"))
            log = "";

        if (GUILayout.Button("Login"))
            GPGSBinder.Inst.Login((success, localUser) =>
            log = $"{success}, {localUser.userName}, {localUser.id}, {localUser.state}, {localUser.underage}");

        if (GUILayout.Button("Logout"))
            GPGSBinder.Inst.Logout();

        if (GUILayout.Button("SaveCloud"))
            GPGSBinder.Inst.SaveCloud("mysave", "want data", success => log = $"{success}");

        if (GUILayout.Button("LoadCloud"))
            GPGSBinder.Inst.LoadCloud("mysave", (success, data) => log = $"{success}, {data}");

        if (GUILayout.Button("DeleteCloud"))
            GPGSBinder.Inst.DeleteCloud("mysave", success => log = $"{success}");

        if (GUILayout.Button("ShowAchievementUI"))
            GPGSBinder.Inst.ShowAchievementUI();

        if (GUILayout.Button("UnlockAchievement_one"))
            GPGSBinder.Inst.UnlockAchievement(GPGSIds.achievement_one, success => log = $"{success}");

        if (GUILayout.Button("UnlockAchievement_two"))
            GPGSBinder.Inst.UnlockAchievement(GPGSIds.achievement_two, success => log = $"{success}");

        if (GUILayout.Button("IncrementAchievement_three"))
            GPGSBinder.Inst.IncrementAchievement(GPGSIds.achievement_three, 1, success => log = $"{success}");

        if (GUILayout.Button("ShowAllLeaderboardUI"))
            GPGSBinder.Inst.ShowAllLeaderboardUI();

        if (GUILayout.Button("ShowTargetLeaderboardUI_num"))
            GPGSBinder.Inst.ShowTargetLeaderboardUI(GPGSIds.leaderboard_num);

        if (GUILayout.Button("ReportLeaderboard_num"))
            GPGSBinder.Inst.ReportLeaderboard(GPGSIds.leaderboard_num, 1000, success => log = $"{success}");

        if (GUILayout.Button("LoadAllLeaderboardArray_num"))
            GPGSBinder.Inst.LoadAllLeaderboardArray(GPGSIds.leaderboard_num, scores =>
            {
                log = "";
                for (int i = 0; i < scores.Length; i++)
                    log += $"{i}, {scores[i].rank}, {scores[i].value}, {scores[i].userID}, {scores[i].date}\n";
            });

        if (GUILayout.Button("LoadCustomLeaderboardArray_num"))
            GPGSBinder.Inst.LoadCustomLeaderboardArray(GPGSIds.leaderboard_num, 10,
                GooglePlayGames.BasicApi.LeaderboardStart.PlayerCentered, GooglePlayGames.BasicApi.LeaderboardTimeSpan.Daily, (success, scoreData) =>
                {
                    log = $"{success}\n";
                    var scores = scoreData.Scores;
                    for (int i = 0; i < scores.Length; i++)
                        log += $"{i}, {scores[i].rank}, {scores[i].value}, {scores[i].userID}, {scores[i].date}\n";
                });

        if (GUILayout.Button("IncrementEvent_event"))
            GPGSBinder.Inst.IncrementEvent(GPGSIds.event_event, 1);

        if (GUILayout.Button("LoadEvent_event"))
            GPGSBinder.Inst.LoadEvent(GPGSIds.event_event, (success, iEvent) =>
            {
                log = $"{success}, {iEvent.Name}, {iEvent.CurrentCount}";
            });

        if (GUILayout.Button("LoadAllEvent"))
            GPGSBinder.Inst.LoadAllEvent((success, iEvents) =>
            {
                log = $"{success}\n";
                foreach (var iEvent in iEvents)
                    log += $"{iEvent.Name}, {iEvent.CurrentCount}\n";
            });

        GUILayout.Label(log);
    }
}
댓글
최근에 달린 댓글
글 보관함
«   2024/05   »
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
Total
Today
Yesterday
    뽀로로친구에디
    최근에 올라온 글