FirebaseManager 유니티 코드

그대처럼·2025년 1월 13일
0
using System.Threading.Tasks; // 비동기 작업을 처리하기 위해 사용
using Firebase; // Firebase 기능 사용
using Firebase.Auth; // Firebase 인증 기능 사용
using Firebase.Extensions; // Firebase 비동기 작업 처리
using Google; // Google 로그인을 위한 라이브러리
using TMPro; // TextMeshPro UI 요소 사용
using UnityEngine; // Unity 기본 네임스페이스

/// <summary>
/// Firebase 인증 및 Google 로그인을 관리하는 클래스.
/// </summary>
public class FirebaseManager : MonoBehaviour
{
    /// <summary>
    /// Firebase에서 발급받은 Google API 클라이언트 ID.
    /// </summary>
    public string GoogleAPI = "12596264481-flv7osel724oggsku40h1oolbpe1r8oq.apps.googleusercontent.com";

    private GoogleSignInConfiguration configuration; // Google 로그인 설정
    private FirebaseAuth auth; // Firebase 인증 객체
    private FirebaseUser user; // 현재 인증된 Firebase 사용자
    private bool isFirebaseInitialized; // Firebase 초기화 상태

    /// <summary>
    /// UI 요소: 사용자 이름과 이메일 표시.
    /// </summary>
    public TMP_Text Username, UserEmail;

    /// <summary>
    /// UI 요소: 로그인 및 프로필 화면 오브젝트.
    /// </summary>
    public GameObject LoginScreen, ProfileScreen;

    /// <summary>
    /// Google 로그인 설정을 초기화합니다.
    /// </summary>
    private void Awake()
    {
        configuration = new GoogleSignInConfiguration
        {
            WebClientId = GoogleAPI, // 웹 클라이언트 ID 설정
            RequestIdToken = true, // ID 토큰 요청 활성화
        };
    }

    /// <summary>
    /// Firebase를 비동기적으로 초기화합니다.
    /// </summary>
    private async void Start()
    {
        await InitializeFirebaseAsync();
    }

    /// <summary>
    /// Firebase 초기화 및 의존성 확인.
    /// </summary>
    private async Task InitializeFirebaseAsync()
    {
        var dependencyStatus = await FirebaseApp.CheckAndFixDependenciesAsync();
        
        if (dependencyStatus == DependencyStatus.Available)
        {
            try
            {
                auth = FirebaseAuth.DefaultInstance;
                auth.StateChanged += AuthStateChanged;
                isFirebaseInitialized = true;
                Debug.Log("Firebase initialized successfully");
            }
            catch (System.Exception ex)
            {
                Debug.LogError($"Firebase initialization error: {ex.Message}");
            }
        }
        else
        {
            Debug.LogError($"Firebase dependency status: {dependencyStatus}");
        }
    }

    /// <summary>
    /// Firebase 인증 상태가 변경될 때 호출됩니다.
    /// </summary>
    private void AuthStateChanged(object sender, System.EventArgs args)
    {
        if (sender is FirebaseAuth _auth)
        {
            user = _auth.CurrentUser;
            if (user != null)
            {
                Debug.Log($"User signed in: {user.UserId}");
                UpdateUIForSignedInUser();
            }
            else
            {
                Debug.Log("User signed out");
                UpdateUIForSignedOutUser();
            }
        }
    }

    /// <summary>
    /// 로그인된 사용자를 위한 UI를 업데이트합니다.
    /// </summary>
    private void UpdateUIForSignedInUser()
    {
        if (user == null) return;
        Username.text = user.DisplayName ?? "Anonymous User"; // 사용자 이름 설정
        UserEmail.text = user.Email ?? "No Email"; // 이메일 설정
        LoginScreen.SetActive(false); // 로그인 화면 숨기기
        ProfileScreen.SetActive(true); // 프로필 화면 표시
    }

    /// <summary>
    /// 로그아웃된 사용자를 위한 UI를 업데이트합니다.
    /// </summary>
    private void UpdateUIForSignedOutUser()
    {
        LoginScreen.SetActive(true); // 로그인 화면 표시
        ProfileScreen.SetActive(false); // 프로필 화면 숨기기
        Username.text = ""; // 사용자 이름 초기화
        UserEmail.text = ""; // 이메일 초기화
    }

    /// <summary>
    /// 익명 로그인 기능을 제공합니다.
    /// </summary>
    public async void OnSignAnonymous()
    {
        if (!isFirebaseInitialized || auth == null)
        {
            Debug.LogError("Firebase is not initialized yet");
            return;
        }

        try
        {
            var result = await auth.SignInAnonymouslyAsync();
            Debug.Log($"Anonymous sign-in successful. User ID: {result.User.UserId}");
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Anonymous sign-in failed: {ex.Message}");
        }
    }

    /// <summary>
    /// 현재 로그인된 사용자를 로그아웃합니다.
    /// </summary>
    public void OnSignOut()
    {
        if (auth != null && auth.CurrentUser != null)
        {
            auth.SignOut(); // 현재 사용자 로그아웃
        }
    }

    /// <summary>
    /// Google 로그인을 시작합니다.
    /// </summary>
    public void GoogleSignInClick()
    {
        if (!isFirebaseInitialized)
        {
            Debug.LogError("Firebase is not initialized yet");
            return;
        }

        GoogleSignIn.Configuration = configuration;
        GoogleSignIn.Configuration.UseGameSignIn = false; // 게임 로그인 비활성화
        GoogleSignIn.Configuration.RequestIdToken = true; // ID 토큰 요청
        GoogleSignIn.Configuration.RequestEmail = true; // 이메일 요청

        GoogleSignIn.DefaultInstance.SignIn().ContinueWithOnMainThread(OnGoogleAuthenticatedFinished);
    }

    /// <summary>
    /// Google 인증이 완료된 후 처리합니다.
    /// </summary>
    /// <param name="task">Google 인증 결과 작업.</param>
    private void OnGoogleAuthenticatedFinished(Task<GoogleSignInUser> task)
    {
        if (task.IsFaulted)
        {
            Debug.LogError($"Google sign-in failed: {task.Exception}");
            return;
        }
        
        if (task.IsCanceled)
        {
            Debug.LogError("Google sign-in was cancelled");
            return;
        }

        try
        {
            Credential credential = GoogleAuthProvider.GetCredential(task.Result.IdToken, null);
            auth.SignInWithCredentialAsync(credential).ContinueWithOnMainThread((_task) =>
            {
                if (_task.IsCanceled)
                {
                    Debug.LogError("Firebase sign-in was cancelled");
                    return;
                }

                if (_task.IsFaulted)
                {
                    Debug.LogError($"Firebase sign-in failed: {_task.Exception}");
                    return;
                }

                Debug.Log("Firebase sign-in successful");
                user = _task.Result; // Firebase 사용자 정보 저장
                if (user != null)
                {
                    Username.text = user.DisplayName;
                    UserEmail.text = user.Email;
                }
            });
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Firebase credential error: {ex.Message}");
        }
    }

    /// <summary>
    /// MonoBehaviour가 파괴될 때 호출되며, Firebase 인증 이벤트를 해제합니다.
    /// </summary>
    private void OnDestroy()
    {
        if (auth != null)
        {
            auth.StateChanged -= AuthStateChanged; // 이벤트 해제
        }
    }
}

0개의 댓글

관련 채용 정보