2 분 소요

Intro

이번 포스팅에서는 플레이어가 로그인 후, 다른 플레이어와 함께 플레이할 수 있는 매칭시스템을 구현해보았습니다.

GUI

Lobby 씬을 만들어 게임 화면을 다음과 같이 구성하였습니다.

image

  • 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 씬으로 이동하게됩니다.

  • 만약 네트워크 접속이 끊어질 경우, 재접속하도록 시도합니다.

image

다음 포스팅에서는

동기화된 플레이어간의 상호작용을 하는 원리와 방법에대해 공부한 뒤 다뤄볼 예정입니다.

자주 사용되는 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) : 마스터 클라이언트가 바뀌었을 때 호출됨.

태그: ,

카테고리:

업데이트:

댓글남기기