본문 바로가기
▶ SCP전쟁 개발일지

#011 파이어베이스 유니티 구현 (서버 연동, 이메일 계정 생성, 로그인, 로그아웃)

by 곰스타일 2024. 4. 9.
728x90
반응형
SMALL

 

  • 파이어베이스 회원가입 및 프로젝트 생성하기

https://firebase.google.com/?hl=ko

 

 

  • 유니티에 아래와 같이 작업하기

1. 유니티에 다운로드한 FirebaseAnalytics 파일과 FirebaseAuth 파일 두개만 임포트하기

 

 

 

2. 파이어베이스 사이트에서 다운로드한 제이슨 파일 유니티 에셋에 추가

 

 

3. 유니티 하이어라키창에 관련 UI 생성

- inputField 2개(이메일, 패스워드)

- 버튼 3개(계정생성, 로그인, 로그아웃)

- text 1개 (로그인 정보를 전달할 텍스트창)

 

 

 

 

4. 스크립트 2개 생성(FirebaseAuthManager와 Loginsystem)

 

FirebaseAuthManager 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase.Auth;
using System;

public class FirebaseAuthManager
{
    private static FirebaseAuthManager instance = null;
    public static FirebaseAuthManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new FirebaseAuthManager();
            }

            return instance;
        }
    }


    private FirebaseAuth auth; //로그인 회원가입 등에 사용
    private FirebaseUser user; // 인증이 완료된 유저 정보

    public string UserID => user.UserId;

    public Action<bool> LoginState;

    public void Init()
    {
        auth = FirebaseAuth.DefaultInstance;
        auth.StateChanged += OnChanged; //계정상태가 바뀔때마다 호출
    }

    private void OnChanged(object sender, EventArgs e) //이벤트 핸들러
    {
        if (auth.CurrentUser != user) //계정상태가 동일 하다면
        {
            bool signed=(auth.CurrentUser!=user&&auth.CurrentUser!=null);
            if (!signed && user != null)
            {
                Debug.Log("로그아웃");
                LoginState.Invoke(false);
            }

            user = auth.CurrentUser;
            if (signed)
            {
                Debug.Log("로그인");
                LoginState.Invoke(true);
            }
        }
        
    }

    public void Create(string email, string password) //회원가입
    {
        auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                Debug.LogError("회원가입 취소");
                return;
            }

            if (task.IsFaulted)
            {
                //회원가입 실패 이유 (이메일이 비정상, 비밀번호가 너무 간단, 이미 가입된 이메일 등등..
                Debug.LogError("회원가입 실패");
                return;
            }

            AuthResult newUser = task.Result; //새로운 계정을 만들어 task 결과값을 넣음
            Debug.Log("회원가입 완료");
        });
    }

    public void Login(string email, string password) //로그인
    {
        auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                Debug.LogError("로그인 취소");
                return;
            }

            if (task.IsFaulted)
            {
                //로그인 실패 이유
                Debug.LogError("로그인 실패");
                return;
            }

            AuthResult newUser = task.Result; //새로운 계정을 만들어 task 결과값을 넣음
            Debug.Log("로그인 완료");
        });
    }

    public void LogOut() //로그아웃
    {
        auth.SignOut();
        Debug.Log("로그아웃");
    }
}

namespace System
{
    public delegate void EventHandler(object sender, EventArgs e);
}

 


 

Loginsystem 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LoginSystem : MonoBehaviour
{

    public InputField email;
    public InputField password;

    public Text OutputText;
    void Start()
    {
        FirebaseAuthManager.Instance.LoginState += OnChangedState;
        FirebaseAuthManager.Instance.Init();
    }

    private void OnChangedState(bool sign)
    {
        OutputText.text = sign ? "로그인: " : "로그아웃: ";//sign이 참이면 로그인, 거짓이면 로그아웃
        OutputText.text+=FirebaseAuthManager.Instance.UserID;
    }

    public void Create()
    {
        string e = email.text;
        string p = password.text;
        
        FirebaseAuthManager.Instance.Create(e,p);
    }

    public void Login()
    {
        FirebaseAuthManager.Instance.Login(email.text,password.text);
    }

    public void LogOut()
    {
        FirebaseAuthManager.Instance.LogOut();
    }
}

 

 

 

5. Loginsystem 스크립트를 빈오브젝트에 컴포넌트한 후 오브젝트 할당하기

 

6. 게임 실행해보기

- 계정 생성하지 않은 아이디로 로그인 할 경우

 

 

이메일과 패스워드 입력 후 계정생성 버튼 클릭할 경우

아래와 같이 파이어베이스 사이트 Authentication 사용자 목록에서 가입한 이메일과 사용자UID 확인할 수 있음

 

** 관련 오류

is missing the class attribute 'ExtensionOfNativeClass'!

 

라는 오류가 뜬다면, MonoBehaviour를 상속받지 않은 오브젝트가 있다는 뜻임

MonoBehaviour 상속받지 않은 FirebaseAuthManager 스크립트를 오브젝트에 컴포넌트할 경우 발생

728x90
반응형
LIST

댓글