유니티 온라인 대전 공부 2 - Firebase를 통한 계정 인증 과정

2023. 9. 7. 01:57Unity/유니티(기본)

728x90
반응형
 

유니티 멀티플레이어 네트워크 게임 한방에 만들기

 

www.youtube.com

 이 글의 모든 내용은 위 동영상 강의 내용의 학습 내용 요약본임.

 

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()
    {
        // 1.   준비가 되지 않았는데, Sign In 버튼이 눌리는 것을 방지함
        signInButton.interactable = false;

        // 2.   Firebase 사용 가능 여부를 검사함
        //      Async 메소드이기 때문에 실행하자 말자, 완료를 기다리지 않고 다음으로 넘어감
        //      따라서 이 메소드가 끝나고나서 뭔가를 실행하려면 Call Back이나 Chain을 걸어야 함
        //          ㄴ> ContinueWith()
        //              만약 ContinueWith()가 에러가 있다면, ContinueWithOnMainThread() 사용
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
            {
                var result = task.Result;

                if (result != DependencyStatus.Available)
                {
                    // 3.   Firebase 사용 불가능한 경우의 처리
                    Debug.LogError(result.ToString());
                    IsFirebaseReady = false;
                }
                else
                {
                    // 4.   Firebase 사용 가능한 경우의 처리
                    IsFirebaseReady = true;

                    //      Firebase앱의 전체적인 기능을 관리하는 오브젝트를 firebaseApp에 가져옴
                    firebaseApp = FirebaseApp.DefaultInstance;
                    firebaseAuth = FirebaseAuth.DefaultInstance;
                }

                signInButton.interactable = IsFirebaseReady;
            }
        );
    }

    public void SignIn()
    {
        if (!IsFirebaseReady || IsSignInOnProgress || User != null)
            return;

        IsSignInOnProgress = true;
        signInButton.interactable = false;

        // 5.   SignInWithEmailAndPasswordAsyn를 이용하여 이메일 계정 인증
        //      만약 구글이나 애플 계정을 이용(외부 서비스를 사용)하여 인증한다면 SignInWithCredentialAsync를 이용
        //          ㄴ> 토큰을 생성하여 처리하는 과정이 필요함
        firebaseAuth.SignInWithEmailAndPasswordAsync(emailField.text, passwordField.text).ContinueWithOnMainThread(task =>
            {
                //  현재 로그인 상태를 출력
                Debug.Log($"Sign in status : {task.Status}");

                IsSignInOnProgress = false;
                signInButton.interactable = true;

                if(task.IsFaulted)
                {
                    //  제대로 동작하지 않아서 task가 실패했을때의 출력
                    Debug.LogError(task.Exception);
                }
                else if(task.IsCanceled)
                {
                    //  모종의 이유로 중단된 경우의 출력
                    Debug.LogError("Sign-in canceled");
                }
                else
                {
                    //  6.  사용자 인증에 성공하여 로그인 한 경우, Lobby 씬으로 이동한다
                    //      이때, 씬 이동전에 사용자의 정보(이메일)을 출력함
                    User = task.Result.User;
                    Debug.Log(User.Email);
                    SceneManager.LoadScene("Lobby");
                }
            }
        );
    }
}
728x90
반응형