유니티 멀티플레이 구현(Photon) - 매칭 구현
Intro
이번 포스팅에서는 플레이어가 로그인 후, 다른 플레이어와 함께 플레이할 수 있는 매칭시스템을 구현해보았습니다.
GUI
Lobby 씬을 만들어 게임 화면을 다음과 같이 구성하였습니다.
- User Name : 현재 플레이어의 Email 을 표시하도록 하였습니다.
- Connection Info : 현재 접속 상태를 표시하도록 하였습니다.
- Match : 버튼을 클릭하면 매칭을 시작합니다.
구현
플레이어는 LobbyManager 클래스를 통해 포톤환경에 접속 및 매칭을 시도합니다.
public class LobbyManager : MonoBehaviourPunCallbacks
{
[SerializeField] private Button matchButton;
[SerializeField] private TMP_Text infoText;
private readonly string gameVersion = "1"; // 게임 버전
private void Start()
{
PhotonNetwork.GameVersion = gameVersion;
PhotonNetwork.ConnectUsingSettings();
matchButton.interactable = false;
infoText.text = "Connecting to Master Server...";
}
// 마스터 서버에 접속되었을 때
public override void OnConnectedToMaster()
{
matchButton.interactable = true;
infoText.text = "Successed : Connect to Master Server";
}
public override void OnDisconnected(DisconnectCause cause)
{
matchButton.interactable = false;
infoText.text = $"Offline : Connection Disabled {cause.ToString()}";
PhotonNetwork.ConnectUsingSettings(); // 재접속 시도
}
// 버튼 클릭 이벤트
public void Connect()
{
matchButton.interactable = false;
if(PhotonNetwork.IsConnected)
{
infoText.text = "Connecting to Random Room...";
PhotonNetwork.JoinRandomRoom();
}
else
{
infoText.text = $"Offline : Connection Disabled - Try Reconnecting...";
PhotonNetwork.ConnectUsingSettings(); // 재접속 시도
}
}
// 빈 Room이 없을 경우
public override void OnJoinRandomFailed(short returnCode, string message)
{
infoText.text = "There is no empty room. Creating new Room";
PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = 2 }); // 최대 2명
}
// Room에 참가했을 때
public override void OnJoinedRoom()
{
infoText.text = "Connected Successfully";
PhotonNetwork.LoadLevel("Main"); // 동기화된 유저가 함께 이동
}
}
- 플레이어가 로그인을 완료하고 로비씬에 입장하면 마스터서버에 접속을 시도합니다.
- 마스터서버에 접속되기전까지는 매치 버튼이 비활성화됩니다.
-
마스터서버에 성공적으로 접속하게되면 매치 버튼을 활성화시키고, 접속 상태를 갱신합니다.
-
매치 버튼을 누르면 Connect() 호출을 통해 빈 Room 이 있다면 참여, 없다면 새로 생성합니다.
-
Room 에 참가하게되면 Main 씬으로 이동하게됩니다.
- 만약 네트워크 접속이 끊어질 경우, 재접속하도록 시도합니다.
다음 포스팅에서는
동기화된 플레이어간의 상호작용을 하는 원리와 방법에대해 공부한 뒤 다뤄볼 예정입니다.
자주 사용되는 Photon 메서드
자주 사용되는 Photon 메서드들을 정리해보았습니다.
연결 관련 콜백 메서드
-
OnConnected() : 인터넷에 연결되었을 때 호출됨(Photon 서버 연결 전 단계)
-
OnConnectedToMaster() : 마스터 서버에 연결되었을 때 호출됨.
- OnDisconnected(DisconnectCause cause) : 서버에서 연결이 끊겼을 때 호출됨
- 원인은 cause를 통해 확인 가능
-
OnRegionListReceived(RegionHandler regionHandler) : 사용할 수 있는 Region 목록을 받을 때 호출됨. (일반적으로 자동 선택됨)
- OnCustomAuthenticationFailed(string debugMessage) : 커스텀 인증 실패 시 호출됨
로비 및 룸 관련 콜백 메서드
-
OnJoinedLobby() : 로비에 입장했을 때 호출됨.
-
OnLeftLobby() : 로비에서 퇴장했을 때 호출됨.
-
OnRoomListUpdate() : 로비에 있는 동안, 방 목록이 갱신될 때마다 호출됨.
-
OnJoinedRoom() : 방 입장 완료 시 호출됨.
-
OnLeftRoom() : 방에서 퇴장했을 때 호출됨.
-
OnCreatedRoom() : 방을 직접 만들었을 때 호출됨.
-
OnCreateRoomFailed(short returnCode, string message) : 방 만들기 실패 시 호출됨.
-
OnJoinRoomFailed(short returnCode, string message) : 방 입장 실패 시 호출됨.
플레이어 관련 롤백
-
OnPlayerEnteredRoom(Player newPlayer) : 다른 플레이어가 방에 들어왔을 때 호출됨.
-
OnPlayerLeftRoom(Player otherPlayer) : 다른 플레이어가 방에서 퇴장했을 때 호출됨.
-
OnMasterClientSwitched(Player newMasterClient) : 마스터 클라이언트가 바뀌었을 때 호출됨.
댓글남기기