PlayFab
Photon 서버와 같이 쓰려면 PlayFab이랑 같이 많이 쓰는것 같아 보인다.
따라서 PlayFab 사이트에 회원가입을 해준당!
https://developer.playfab.com/
PlayFab
developer.playfab.com
찾아보니 국적과 시간을 프로필 설정해서 설정해준다.
이 사이트에서 unity 용 sdk 설정해준다
Unity용 PlayFab SDK 설치 - PlayFab
이 가이드는 PlayFab Unity 3D SDK를 설치하고 프로젝트를 구성하는 데 도움이 됩니다.
learn.microsoft.com
sdk 다운 받아서 프로젝트에 적용 시키면 PlayFab EdEx가 나온다 없으면 Window-Playfab-Editor Extensions 설정해준다
Settings가서 설정해준다
그러고 잘 연결되었는지 기본 코드를 작성해준다.
적용 시키기 위해서 화면 구성은 기존꺼에서 추가해서 이렇게 해줬다.
InputField -> 닉네임, 아이디, 비밀번호
Button -> 로그인, 회원가입
기본 LoginManager.cs를 만들어서 잘 적용되었는지 Test 해보자
기존 코드는 PlayFab에서 제공된 기본 코드다
TitleId한번 비교 해주고 접속이 되면 자동으로 Custom해서 사용자를 생성하고 들어가진다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LoginManager : MonoBehaviour
{
[SerializeField]
private InputField _idInput;
[SerializeField]
private InputField _pwInput;
[SerializeField]
private InputField _nameInput;
public void Start()
{
if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) PlayFabSettings.TitleId = "1504A";
var request = new LoginWithCustomIDRequest { CustomId="Getting", CreateAccount = true };
PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
}
//로그인 성공시 호출
private void OnLoginSuccess(LoginResult result)
{
Debug.Log("로그인 성공");
SceneManager.LoadScene("KingdomScene");
}
//로그인 실패시 호출
private void OnLoginFailure(PlayFabError error)
{
Debug.LogWarning("로그인 실패");
Debug.LogWarning(error.GenerateErrorReport());
}
}
실행 시키면 Start 하자마자 실행되므로 확인할 수 있다
나도 모르는 한 플레이어가 생겼다 ㅇㅁㅇ!!!
쨋든 잘 연결되어서 성공된거므로 로그인 시스템을 위해서 Email과 PW형식으로 바꿔준다.
또한, 회원가입을 해야지만 아이디 비번을 체크 할 수 있으니 Register()도 같이 만들어준다.
public class LoginManager : MonoBehaviour
{
//...
//Start()->Login()
public void Login()
{
if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) PlayFabSettings.TitleId = "1504A";
//변경 id, pw 받는 형식
var request = new LoginWithEmailAddressRequest { Email = _idInput.text, Password = _pwInput.text };
PlayFabClientAPI.LoginWithEmailAddress(request, OnLoginSuccess, OnLoginFailure);
}
//Register 추가
public void Register()
{
var request = new RegisterPlayFabUserRequest { Email = _idInput.text, Password = _pwInput.text, Username = _nameInput.text};
PlayFabClientAPI.RegisterPlayFabUser(request, RegisterSuccess, RegisterFailure);
}
//가입 성공시
private void RegisterSuccess(RegisterPlayFabUserResult result)
{
Debug.Log("가입 성공");
}
//가입 실패시
private void RegisterFailure(PlayFabError error)
{
Debug.LogWarning("가입 실패");
Debug.LogWarning(error.GenerateErrorReport());
}
}
가입, 로그인 확인을 해보자
보니까 아이디는 이메일 형식이여야 하고 닉네임은 영어로 3글자 이상, 비밀번호는 6글자 이상이여야 한다.
만들어 지는거 확인하면 기존 만들어놨던 Photon과 연결시켜준다.
따라서 NetManager를 Instance로 받는 싱글톤으로 바꿔주고 Connect()를 실행시켜준다.
NetManager는 대신 InputField 변수 없애주고 닉네임을 받는 형식으로 바꿔줬다.
전체코드( NetManager.cs ) ↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using System.Data;
using UnityEngine.SceneManagement;
public class NetManager : MonoBehaviourPunCallbacks
{
public static NetManager Instance { get; private set; }
[SerializeField]
private Button _loginBtn; // 로그인 버튼
[SerializeField]
private Text _statusTxt; // 상태 메시지 텍스트
private bool _isConnectedToMaster = false;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
private void Start()
{
// Photon 서버에 연결 시도
PhotonNetwork.ConnectUsingSettings();
_loginBtn.interactable = false; // 연결되기 전까지 로그인 버튼 비활성화
_statusTxt.text = "Connecting to Master Server..";
}
// 로그인 버튼 클릭 시 호출되는 메서드
public void Connect(string name)
{
// 닉네임 설정
PhotonNetwork.LocalPlayer.NickName = name;
// Photon 서버에 연결되었는지 확인
if (_isConnectedToMaster)
{
_statusTxt.text = "Connecting to Room..";
PhotonNetwork.JoinRandomOrCreateRoom(); // 무작위 방에 접속 또는 새 방 생성
}
else
{
_statusTxt.text = "Offline : failed to Connect";
}
}
// 마스터 서버에 성공적으로 연결되었을 때 호출되는 콜백
public override void OnConnectedToMaster()
{
_isConnectedToMaster = true;
_loginBtn.interactable = true; // 로그인 버튼 활성화
_statusTxt.text = "Online : connected to master server";
}
// 서버 연결이 끊겼을 때 호출 콜백
public override void OnDisconnected(DisconnectCause cause)
{
_isConnectedToMaster = false;
_loginBtn.interactable = false; // 로그인 버튼 비활성화
_statusTxt.text = "Offline : failed to connect.\nreconnecting...";
PhotonNetwork.ConnectUsingSettings(); // 재연결 시도
}
// 무작위 방 참가에 실패했을 때 호출 콜백
public override void OnJoinRandomFailed(short returnCode, string message)
{
_statusTxt.text = "No empty room. creating new room..."; // 빈 방이 없을 때 새 방 생성 메시지
PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = 4 }); // 최대 4명인 새 방 생성
}
// 방에 성공적으로 참가했을 때 호출 콜백
public override void OnJoinedRoom()
{
_statusTxt.text = "Success to join room";
SceneManager.LoadScene("KingdomScene"); // KingdomScene 씬 로드
// PhotonNetwork.LoadLevel("Main"); // 네트워크 연결된 씬 로드 할때 쓰이는 코드
}
}
바꿔주고 아이디로 잘 들어가는 것을 확인해줬다 ! !
닉네임으로 받아서 채팅을 하기 원해서 찾아보니 로그인 성공시 해당 이메일로 받아서 사용자의 닉네임을 받아올 수 있다!
따라서, 완성된 전체코드는 이렇게 되었다.
전체코드(LoginManager.cs) ↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LoginManager : MonoBehaviour
{
[SerializeField]
private InputField _idInput; // 이메일 또는 사용자 이름 입력 필드
[SerializeField]
private InputField _pwInput; // 비밀번호 입력 필드
[SerializeField]
private InputField _nameInput; // 사용자 이름 입력 필드 (회원가입 시 사용)
[SerializeField]
private Text _statusTxt; // 상태 메시지 텍스트
// 로그인
public void Login()
{
// PlayFab Title ID가 설정되지 않은 경우 설정
if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) PlayFabSettings.TitleId = "1504A";
// 이메일과 비밀번호를 사용하여 로그인 요청 생성
var request = new LoginWithEmailAddressRequest { Email = _idInput.text, Password = _pwInput.text };
// PlayFab API를 호출하여 이메일로 로그인 시도
PlayFabClientAPI.LoginWithEmailAddress(request, OnLoginSuccess, OnLoginFailure);
}
// 로그인 성공 시 호출 콜백
private void OnLoginSuccess(LoginResult result)
{
Debug.Log("로그인 성공");
_statusTxt.text = "로그인 성공!";
// 로그인 성공 후 계정 정보 가져오기
GetAccountInfo();
}
// 로그인 실패 시 호출 콜백
private void OnLoginFailure(PlayFabError error)
{
Debug.LogWarning("로그인 실패");
Debug.LogWarning(error.GenerateErrorReport()); // 오류 상세 정보 출력
_statusTxt.text = "로그인 실패ㅠㅠ";
}
// 회원가입
public void Register()
{
//필드 빈칸 처리
if (string.IsNullOrEmpty(_idInput.text))
{
_statusTxt.text = "아이디를 입력해주세요!";
return;
}
else if (string.IsNullOrEmpty(_pwInput.text))
{
_statusTxt.text = "비밀번호를 입력해주세요!";
return;
}
else if (string.IsNullOrEmpty(_nameInput.text))
{
_statusTxt.text = "닉네임을 입력해주세요!";
return;
}
// 이메일, 비밀번호, 사용자 이름을 사용하여 회원가입 요청 생성
var request = new RegisterPlayFabUserRequest { Email = _idInput.text, Password = _pwInput.text, Username = _nameInput.text };
// PlayFab API를 호출하여 사용자 등록 시도
PlayFabClientAPI.RegisterPlayFabUser(request, RegisterSuccess, RegisterFailure);
}
// 회원가입 성공 시 호출 콜백
private void RegisterSuccess(RegisterPlayFabUserResult result)
{
Debug.Log("가입 성공");
_statusTxt.text = "가입 성공!";
}
// 회원가입 실패 시 호출 콜백
private void RegisterFailure(PlayFabError error)
{
Debug.LogWarning("가입 실패");
Debug.LogWarning(error.GenerateErrorReport()); // 오류 상세 정보 출력
_statusTxt.text = "가입 실패ㅠㅠ";
}
// 현재 로그인한 사용자의 계정 정보 가져오기
private void GetAccountInfo()
{
// 이메일을 사용하여 계정 정보 요청 생성
var request = new GetAccountInfoRequest { Email = _idInput.text };
// PlayFab API를 호출하여 계정 정보 가져오기
PlayFabClientAPI.GetAccountInfo(request, OnGetAccountInfoSuccess, OnGetAccountInfoFailure);
}
// 계정 정보 성공적으로 가져왔을 때 호출 콜백
private void OnGetAccountInfoSuccess(GetAccountInfoResult result)
{
// 계정 정보에서 사용자 이름을 가져옴
string username = result.AccountInfo.Username;
if (string.IsNullOrEmpty(username))
{
// 사용자 이름 없는 경우 이메일을 사용자 이름으로 사용
username = result.AccountInfo.PrivateInfo.Email;
}
// NetManager 유저 닉네임 전해주면서 Connect
NetManager.Instance.Connect(username);
}
// 계정 정보 가져오기 실패 시 호출 콜백
private void OnGetAccountInfoFailure(PlayFabError error)
{
Debug.LogWarning("계정 정보 가져오기 실패");
Debug.LogWarning(error.GenerateErrorReport());
}
}
실행영상↓
'공부 좀 해라★彡 > Unity' 카테고리의 다른 글
FixedUpdate 의 Time 수정 방법 (0) | 2024.12.09 |
---|---|
Unity URP 핑크색 깨짐 문제 해결 (0) | 2024.08.21 |
Unity Photon 포톤 서버 채팅 구현 (0) | 2024.07.21 |
Unity Photon 포톤 서버 적용 시키기 (0) | 2024.07.21 |
Unity Photon 포톤 서버 준비하기 (0) | 2024.07.20 |
댓글