private async void Start()
{
await UnityServices.InitializeAsync(); //유니티 서비스 초기화
//로그인이 완료 될 때 이벤트 수신
AuthenticationService.Instance.SignedIn += () =>
{
Debug.Log("로그인 " + AuthenticationService.Instance.PlayerId);
};
await AuthenticationService.Instance.SignInAnonymouslyAsync();// 익명 사용자 로그인
}
Why? 유니티 서비스가 초기화 되지 않으면 로그인 기능을 사용할 수 없기 때문임. 초기화가 완료 되어야 로그인 했을 때 문제가 없으므로 비동기로 실행 해야 함.
why? 로그인 성공 여부를 확인하고, 현재 로그인한 플레이어 정보를 얻기 위함.
why? 별도의 계정 없이도 빠르게 로그인할 수 있도록 하기 위함.(테스트용, 간편한 접속)
private async void CreateLobby()
{
// 로비를 만들 수 없거나 로비 서버에 연결할 수 없는 경우 예외를 던질 수 있다. 이 예외를 발견하지 못하면 전체 게임이 중단 되므로 try-catch 사용
try
{
string lobbyName = "MyLobby";
int maxPlayers = 4;
Lobby lobby = await LobbyService.Instance.CreateLobbyAsync(lobbyName,maxPlayers); //로비 이름과 최대 플레이어 수 설정
Debug.Log("로비 생성!! " + lobby.Name + " " + lobby.MaxPlayers);
}
catch(LobbyServiceException e)
{
Debug.Log(e);
}
}
why? 오류를 처리하지 않으면 게임이 강제 종료될 수 있기 때문
why? 멀티 게임에서 플레이어들이 모일 공간(로비)가 필요하므로.
private async void ListLobbies()
{
//로비 내부로 이동하여 정적 인스턴스에 액세스
QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync(); //매개변수 비워 두면 로비에서만 반환.
Debug.Log("여러 로비 검색 : 갯수 = queryResponse.Results.Count) ;//로비 내부로 들어가서 찾은 모든 결과가 포함된 로비 목록
foreach(Lobby lobby in queryResponse.Results)
{
Debug.Log("순회 중 ! 로비 이름 : lobby.Name + " " + " 로비 최대 플레이어 수 : " + lobby.MaxPlayers);
}
}
why? 멀티플레이어 게임에서는 기존 로비에 참가할 수 있어야 하기 때문임
why? 사용자가 선택할 수 있는 로비가 얼마나 있는지 확인하기 위함
why? 플레이어가 원하는 로비를 선택할 수 있도록 리스트를 제공해야 하기 때문
private void Update()
{
HandleLobbyHeartbeat();
}
private async void HandleLobbyHeartbeat()
{
if(hostLobby != null)
{
heartbeatTimer -= Time.deltaTime;
if(heartbeatTimer < 0f)
{
float heartbeatTimerMax = 15f;
heartbeatTimer = heartbeatTimerMax;
await LobbyService.Instance.SendHeartbeatPingAsync(hostLobby.Id); //로비 내부로 들어가서 로비를 살아있게 만들기 위해서 작성
}
}
}


[ServerRpc(RequireOwnership = false)] // ServerRpc는 동기 메서드여야 함
private void CreateLobbyServerRpc()
{
// 비동기 작업을 별도의 메서드로 분리하여 처리
Debug.Log("로비 생성 서버로 호출");
CreateLobbyAsync();
}
[ServerRpc(RequireOwnership = false)]
private void ListLobbiesServerRpc()
{
// 비동기 작업을 별도의 메서드로 분리하여 처리
Debug.Log("로비 조회 서버로 호출");
ListLobbiesAsync();
}
public void OnCreateLobbyButtonClicked()
{
Debug.Log("로비 생성");
CreateLobbyServerRpc(); // 서버로 로비 생성 요청
}
public void OnListLobbiesButtonClicked()
{
Debug.Log("로비 조회");
ListLobbiesServerRpc(); // 서버로 로비 리스트 조회 요청
}



private async void JoinLobby()
{
try
{
QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync(); // 로비 목록 조회
await Lobbies.Instance.JoinLobbyByCodeAsync(queryResponse.Results[0].Id); //참가 코드로 로비에 가입할 수 있음.
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
Why? 멀티플레이어 게임에서는 기존 로비에 참가할 수 있어야 하기 때문임. 서버에서 존재하는 로비 목록을 조회하여 사용자가 참가할 수 있는 로비를 선택할 수 있도록 해야 함.
Why? 사용자가 특정 로비에 참가하려면 로비의 ID가 필요함. 첫 번째 로비를 참가하는 예시로 코드가 작성되었음. (실제 앱에서는 사용자가 로비를 선택하게 됨)
Why? 네트워크 요청에서 오류가 발생할 수 있기 때문에 예외를 처리하여 게임이 멈추지 않고 오류 메시지를 출력하여 디버깅을 용이하게 해야 함.
기존 로비를 생성하는 메서드에 다음 코드를 추가한다.

생성될 때 비공개 로비를 만드는 것이다.
실행 결과 - 비공개 로비를 만들었기 때문에 로비 목록을 조회해도 조회되질 않는다.
