본문 바로가기

포트폴리오/졸업작품

[MetaEdu] Playfab을 사용하여 로그인씬 구현하기!

1. Playfab 홈페이지에서 회원가입 후 로그인!

 

2. 새로운 타이틀 생성

 

3. Playfab SDK 다운로드

Unity Playfab SDK: https://aka.ms/playfabunitysdkdownload

Unity Playfab Extensions SDK: https://aka.ms/playfabunityextension

※ Playfab Unity3D 링크

 

4. 유니티에 Playfab SDK 임포트

 

5. 편집기 확장에서 플레이팹 로그인 & 설정

※ 로그인 및 설정 방법

 

6. UI 제작 및 관련 스크립트

로그인

회원가입

  캐릭터 생성

  UI 스크립트

더보기
  • FindSelectableOnDown() 메서드를 사용하여 Tab키를 누르면 다음 오브젝트가 선택되게 했다.
  • 버튼.onClick.Invoke() 메서드를 사용하여 Enter(Return)키를 누르면 상황에 맞는 PlayfabManager 스크립트의 함수를 호출하도록 했다.
  • 캐릭터 생성 창의 캐릭터 선택은 토글 버튼을 그룹으로 묶어 하나만 선택하게 하였고, 활성화된 토글의 값을 전달할 수 있게 하였다.
using UnityEngine.EventSystems;

public class UI : MonoBehaviour
{
	void Update()
    {
    	if (Input.GetKeyDown(KeyCode.Tab))
        {
            Selectable next = system.currentSelectedGameObject.GetComponent<Selectable>().FindSelectableOnDown();
            if (next != null)
            {
                next.Select();
            }
        }
        else if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter))
        {
            if (_signupPanelAnim.GetBool("On"))
            {
                _signupButton.onClick.Invoke();
            }
            else if (_characterPanel.activeSelf)
            {
                _crpButton.onClick.Invoke();
            }
            else
            {
                _loginButton.onClick.Invoke();
            }
        }
    }
    
    public void SButton(bool isOn)
    {
        if(isOn)
            _sex = toggleGroup.ActiveToggles().FirstOrDefault().name;
    }
}

 

7. 스크립트 작성

▶ 회원가입

더보기
using PlayFab;
using PlayFab.ClientModels;

public class SignupManager : MonoBehaviour
{
	public Text id; // 아이디
	public Text password; // 비밀번호
    public Text verifyPassword; // 비밀번호 확인
	public Text signupError; // 에러 텍스트

	public void Signup()
    {
    	if ("password".Equals("verifyPassword")) // 비밀번호 확인
        {
            // RequireBothUsernameAndEmail이 false로 설정해주지 않으면 이메일을 설정해줘야 한다.
            var request = new RegisterPlayFabUserRequest { Username = "id", Password = "password", RequireBothUsernameAndEmail = false };
            PlayFabClientAPI.RegisterPlayFabUser(request, OnRegisterSuccess, OnRegisterFailure);
        }
    }
    
    void OnRegisterSuccess(RegisterPlayFabUserResult result)
    {
    	//회원가입 성공 시, 나는 로그인창으로 돌아가도록 설정
    }
    
    void OnRegisterFailure(PlayFabError error)
    {
    	string errorLog = error.GenerateErrorReport();
        if (errorLog.Contains("Username not available"))
            signupError.text = "이미 존재하는 계정입니다.";
        else if (errorLog.Contains("between"))
            signupError.text = "비밀번호가 6자 이상 100자 이하이어야 합니다.";
        else if (errorLog.Contains("Password, EncryptedRequest"))
            signupError.text = ">계정이름이나 비밀번호를 입력해주세요.";
        else if (errorLog.Contains("Invalid username or password"))
            signupError.text = "계정이름이나 패스워드가 잘못되었습니다.";
        else
            Debug.Log(errorLog);
    }
}

▶ 로그인

더보기
using PlayFab;
using PlayFab.ClientModels;

public class LoginManager : MonoBehaviour
{
    public Text id;
    public Text password;
    public Text loginError;
    
    public void Login()
    {
        var request = new LoginWithPlayFabRequest { Username = id, Password = password };
        PlayFabClientAPI.LoginWithPlayFab(request, OnLoginSuccess, OnLoginFailure);
    }
    
    void OnLoginSuccess(LoginResult result)
    {
    	//로그인 성공 시, 플레이팹 아이디를 변수로 저장
        Singleton.Inst.Playfab_ID = result.PlayFabId;
        //유저 정보 불러오기
        var request = new GetAccountInfoRequest { Username = id };
        PlayFabClientAPI.GetAccountInfo(request, GetAccountSuccess, (PlayFabError error) => { Debug.Log("사용자 정보 가져오기 실패"); });
    }
    
    void OnLoginFailure(PlayFabError error)
    {
    	loginError.text = "계정이름이나 비밀번호가 일치하지 않습니다.";
    }
    
    void GetAccountSuccess(GetAccountInfoResult result)
    {
    	// Display Name이 비어있다면 NewCRT 데이터 추가
        string nickname = result.AccountInfo.TitleInfo.DisplayName;
        if (nickname == null)
        {
            var request = new UpdateUserDataRequest() { Data = new Dictionary<string, string>() { { "NewCRT", "N" } } };
            PlayFabClientAPI.UpdateUserData(request, (result) => print("정보 저장 성공"), (Error) => print("정보 저장 실패"));
            캐릭터 생성 패널 활성화
        }
        else
        {
            var request = new GetUserDataRequest() { PlayFabId = Singleton.Inst.Playfab_ID };
            PlayFabClientAPI.GetUserData(request, GetDataSuccess, (error) => print("실패"));
        }
    }
    
    void GetDataSuccess(GetUserDataResult result)
    {
    	// NewCRT로 캐릭터 생성을 했는지 안했는지 파악
        if (result.Data["NewCRT"].Value.Equals("N"))
        {
            캐릭터 생성 패널 활성화
        }
        else if (result.Data["NewCRT"].Value.Equals("Y"))
        {
            포톤 서버 연결
        }
    }
}

▶ 캐릭터 생성

더보기
using PlayFab;
using PlayFab.ClientModels;

public class CreateCharacter : MonoBehaviour
{
	public Text nickNameText; // 유저 이름, DisplayName
    public Text error;

	public void CharacterNickNameOk()
    {
        createError.text = "";
        var request = new UpdateUserTitleDisplayNameRequest { DisplayName = nickNameText.text };
        PlayFabClientAPI.UpdateUserTitleDisplayName(request, DisplayNameUpdateSuccess, (error) => error.text = "사용할 수 없는 닉네임입니다.");
    }

    void DisplayNameUpdateSuccess(UpdateUserTitleDisplayNameResult result)
    {
        var request = new UpdateUserDataRequest() { Data = new Dictionary<string, string>() { { "Sex", _sex }, { "NickName", result.DisplayName }, { "Question", "문제모음" } } };
        PlayFabClientAPI.UpdateUserData(request, NewCRTUpdateSuccess, (Error) => error.text = "캐릭터를 생성에 실패했습니다.");
    }

    void NewCRTUpdateSuccess(UpdateUserDataResult result)
    {
        var request = new UpdateUserDataRequest() { Data = new Dictionary<string, string>() { { "NewCRT", "Y" } } };
        PlayFabClientAPI.UpdateUserData(request, (result) => 포톤 서버 연결, (Error) => error.text = "유저 저장에 실패했습니다.");
    }
}