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; // 이벤트 해제
}
}
}