포톤, Auth 관련 강의 영상을 보는 중에 메일 회원가입, 인증하는 방법은 없어서 코드를 조금 수정했다.

 

 

이메일 인증을 받지 않은 상태라면 메일을 보내고, 받았다면 로비씬으로 이동하는 코드다.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Firebase;
using Firebase.Auth;
using Firebase.Extensions;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
 
public class AuthManager : MonoBehaviour
{
    public bool IsFirebaseReady { get; private set; }
    public bool IsSignInOnProgress { get; private set; }
 
    public InputField emailField;
    public InputField passwordField;
    public Button signInButton;
 
    public static FirebaseApp firebaseApp;
    public static FirebaseAuth firebaseAuth;
 
    public static FirebaseUser User;
 
    public void Start()
    {
        signInButton.interactable = false;
 
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
            {
                var result = task.Result;
 
                if (result != DependencyStatus.Available)
                {
                    Debug.Log(message: result.ToString());
                    IsFirebaseReady = false;
                }
                else
                {
                    IsFirebaseReady = true;
 
                    firebaseApp = FirebaseApp.DefaultInstance;
                    firebaseAuth = FirebaseAuth.DefaultInstance;
                }
 
                signInButton.interactable = IsFirebaseReady;
            }
        );
    }
 
    public void SignIn()
    {
        if (!IsFirebaseReady || IsSignInOnProgress || User != null)
        {
            return;
        }
 
        IsSignInOnProgress = true;
        signInButton.interactable = false;
 
        firebaseAuth.SignInWithEmailAndPasswordAsync(emailField.text, passwordField.text).ContinueWithOnMainThread(
            (task) =>
                {
                    Debug.Log(message: $"Sign in status : {task.Status}");
 
                    IsSignInOnProgress = false;
                    signInButton.interactable = true;
 
                    if (task.IsFaulted)
                    {
                        Debug.LogError(task.Exception);
                    }
                    else if (task.IsCanceled)
                    {
                        Debug.LogError(message: "Sign-in canceled");
                    }
                    else
                    {
                        User = task.Result;
                        if(User.IsEmailVerified)
                        {
                            Debug.Log(User.Email);
                            SceneManager.LoadScene("Lobby");
                        }
                        else
                        {
                            Firebase.Auth.FirebaseUser user = firebaseAuth.CurrentUser;
                            if (user != null)
                            {
                                user.SendEmailVerificationAsync().ContinueWith(stat => {
                                    if (stat.IsCanceled)
                                    {
                                        Debug.LogError("SendEmailVerificationAsync was canceled.");
                                        return;
                                    }
                                    if (stat.IsFaulted)
                                    {
                                        Debug.LogError("SendEmailVerificationAsync encountered an error: " + stat.Exception);
                                        return;
                                    }
 
                                    Debug.Log("Email sent successfully.");
                                });
                            }
 
                            User = null;
                        }
                    }
                }
            );
    }
 
    public void SignUp()
    {
        firebaseAuth.CreateUserWithEmailAndPasswordAsync(emailField.text, passwordField.text).ContinueWith(task => {
            if (task.IsCanceled)
            {
                Debug.LogError("CreateUserWithEmailAndPasswordAsync was canceled.");
                return;
            }
            if (task.IsFaulted)
            {
                Debug.LogError("CreateUserWithEmailAndPasswordAsync encountered an error: " + task.Exception);
                return;
            }
 
            // Firebase user has been created.
            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("Firebase user created successfully: {0} ({1})",
                newUser.DisplayName, newUser.UserId);
        });
    }
}
cs

 

참고

레트로님 유튜브

www.youtube.com/watch?v=mP6IscbNxOA&list=PLctzObGsrjfwF7kkoraWb235U8Z602gx1&index=5

 

구글 파이어베이스 공식 문서

firebase.google.com/docs/auth/unity/manage-users?hl=ko

Posted by 꿀풍
,
저장을 구현해봅시다.
구글 클라우드에 데이터를 저장하며 형식은 byte[] 한도는 3MB입니다.

 

 

 

1. 개발자 콘솔에서 밑작업하기

 

게임 서비스 -> 해당 게임 선택 -> 게임 세부정보

 

 

저장된 게임 항목을 사용 표시 해야합니다. 한번 사용하기로 결정하면 바꿀수 없습니다.

 

 

 

 

 

2. 스크립트에서 세팅하기

 

 

 

PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().EnableSavedGames().Build();

 

PlayGamesPlatform.InitializeInstance(config);

 

 

 

저장을 사용하기 위해선 위와 같은 코드가 필요합니다.

 

이전 게시글에 올린 코드에서도 포함되어 있습니다.

 

 

 

 

 

3. 저장/로드 구현하기

 

 

 

저장/로드에는 여러단계가 있으며 각 단계에서 문제가 발생시 그에 맞는 리턴값을 보내줍니다.

 

참고한 코드는 다음과 같습니다.

 

 

 

 

 

 

4. 데이터 변환

 

 

 

저같은 경우에는 저장시 class 형식인 저장 데이터를 json 형식에 맞춰서 string으로 변환 후 byte[]로 변환해서 사용합니다.

 

로드시에는 역으로 진행합니다.

 

 

 

예시로 지금 개발중인 게임의 데이터를 보여드리겠습니다.

 

 

 

// 돌이 장착하고 있는 아이템들에 대한 정보
// 돌을 버렸는지 안버렸는지 여부 포함
[System.Serializable]
public class MyStoneData
{
    public int[] ItemID;
    public bool isAlive;
}
 
// 옵션 설정
[System.Serializable]
public class Option
{
    public float BGMValue;
    public float SFMValue;
}
[System.Serializable]
public class AllSaveData
{
    public MyStoneData save_s;
    public Option save_o;
}

 

 

 

AllSaveData m_saveData;

JsonUtility.ToJson(m_saveData);

 

 

 

이런식으로 클래스를 설정 한 다음에 JsonUtility.ToJson(class) 함수를 사용해서 string 자료형으로 변환합니다.

 

 

 

string 자료형을 class 형식으로 변환할시에는 JsonUtility.FromJson<T>(string) 함수를 사용합니다.

 

 

 

 

 

Posted by 꿀풍
,
1. 유니티에서 GPGS 설치하기
 
Window -> Google Play Games -> Setup -> Android setup
위와 같은 창이 뜨게 됩니다.
Resources Definition 칸과 Client ID 칸을 채워야합니다.
 
 
업적 항목에 들어간 다음 아래에 있는 리소스 받기를 클릭합시다
내용들을 전부 복사 한다음  Resources Definition 칸에 붙여넣기.
 
다음은 Client ID칸을 채워봅시다
구글 개발자 콘솔 -> 게임 서비스 (왼쪽 2번째 패드모양 아이콘) -> 게임 세부정보 -> API Project

 

 
클릭시 다음과 같은 화면으로 넘어갑니다
 
사용자 인증 정보 항목에 있는 클라이언트 ID를 복사해서 유니티 Client ID 칸을 채워넣습니다
Setup을 하면 설치가 완료 됩니다.
 
 
2. GPGS 로그인
간단하게 GPGS로그인하는 스크립트를 만들어봅시다
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GooglePlayGames;
using GooglePlayGames.BasicApi;

public class GPGSMng : MonoBehaviour {

    public bool bLogin
    {
        get;
        set;
    }
    void Start()
    {
        InitGPGS();
        LoginGPGS();
    }
    public void InitGPGS()
    {
        bLogin = false;
        PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().EnableSavedGames().Build();
        PlayGamesPlatform.InitializeInstance(config);
        PlayGamesPlatform.DebugLogEnabled = false;

        PlayGamesPlatform.Activate();
    }
    public void LoginGPGS()
    {
        if(!Social.localUser.authenticated)
        {
            Social.localUser.Authenticate(LoginCallbackGPGS);
        }
    }
    public void LoginCallbackGPGS(bool result)
    {
        bLogin = result;
    }
}
 
저같은 경우에는 Manager 클래스들은 싱글톤으로 관리하지만 우선 테스트용으로 작성했습니다
우선 InitGPGS 함수에서 GPGS를 사용하기 위한 세팅을 합니다
그다음 LoginGPGS 함수를 실행시켜 로그인을 시도합니다
bLogin 변수는 로그인 성공시 true 실패시 false 값을 얻게 됩니다.
 
 
3. 실행, 에러 해결
 
베타 버전으로 출시했기 때문에 테스터 계정으로 게임을 실행해봅시다.
별다른 문제가 없으면 구글 플레이 서비스에 로그인이 될 것입니다.
 
17년 4월 12일 기준으로 GPGS 플러그인과 안드로이드 SDK 버전이 충돌하는 문제가 있습니다.
이를 해결해봅시다.
 
 
PlayServicesResolver 폴더 우클릭 -> Play Services Resolver -> Android Resolver -> Settings
 
 
Enable Background resolution 체크 해제
만약 이를 하지 않을시 최신 버전으로 업데이트하라는 알림이 자꾸 뜨게 됩니다.
 
 
위 링크에 들어가서 파일을 다운 받습니다
 
유니티 프로젝트에 있는 Assets/Plugins/Android 폴더에 있는 파일들을 전부 지웁니다.
다운 받은 파일중 GPG_10.01_Patch.unitypackage 파일을 Import합시다.
 
다시 설정을 하고 중간에 나오는 메시지는 전부 Keep 합시다.
 
 
모바일 환경에서 실행시 이런 로그인 화면이 나오면 성공.
다음에는 저장을 구현해봅시다.

 

Posted by 꿀풍
,
모바일 게임 개발자들을 위해서 구글이 제공하는 서비스입니다.
클라우드 저장, 업적, 리더보드 등 다양한 기능을 사용할 수 있습니다.


방법
1. 우선 플러그인을 설치합시다
위 링크에서 다운을 받고 압축을 풀고
current-build/GooglePlayGamesPlugin 를 Import 합시다

2. 안드로이드 SDK 업데이트

Google Play Services
Google Repository
Android Build Tools
Android Support Repository
Android Support Library


3. APK를 구글 개발자 콘솔에 올리기

구글 개발자 콘솔 (https://play.google.com/apps/publish)에 들어가서 애플리케이션을 등록합니다.


출시하기 위해서 필요한 조건들을 채웁시다.
아직 어플이 제 기능을 하지 못하기 때문에 비공개버전으로 출시합니다.

4. 구글 플레이 서비스 연결

왼쪽에 있는 아이콘중에 2번째 아이콘(게임패드)을 선택해서 게임 서비스 항목에 들어간 다음, 우측 상단에 있는 새 게임 추가 버튼을 클릭합시다.


게임에 맞는 이름과 종류를 선택

누르면 이런 창이 나옵니다. 저는 Android 어플을 만들기 때문에 Android 선택

게임 출시를 위한 준비를 모두 합시다. (게임 세부정보, 연결된 앱, 업적 5개)


마지막으로 출시

2편에 계속.

Posted by 꿀풍
,