내일배움캠프/프로젝트

팀 프로젝트 - 로비 개선

서보훈 2024. 12. 27. 21:00

게임 종료 후, 이전 로비로 돌아오도록 로비를 개선해주었습니다.

해당 개선으로 인해, LobbyManager가 씬을 넘어갈 때 파괴되지 않도록 변경되었습니다.

 

로비 매니저 추가 내용입니다.

게임 종료후, p2p 연결을 끊으면서 BackToLobby 메서드를 호출, 로비의 키 값을 대기중으로 변경해줍니다.

//게임 종료후, 로비 재참여
public async void BackToLobby()
{
    if (!IsLobbyhost()) return;
    try
    {
        Lobby lobby = await Lobbies.Instance.UpdateLobbyAsync(nowLobby.Id, new UpdateLobbyOptions
        {
            //로비의 GameStartKey 대기중 키로 변경
            Data = new Dictionary<string, DataObject>
            {
                {networkKey.GameStartKey, new DataObject(DataObject.VisibilityOptions.Member, networkKey.ReadyKey) }
            }
        });

        nowLobby = lobby;
    }
    catch (Exception e)
    {
        Debug.Log(e);
        LeaveLobby();
    }
}

public void CreateLobbyUI()
{
    LobbyUI ui = UIManager.Instance.CreateUI<LobbyUI>();
    ui.Show();
}

또한, 로비로 돌아오면서 로비씬에 있던 로비 UI를 다시 생성해줄 필요가 있기 때문에, 로비 매니저에 UI 생성기능을 추가해주었습니다.

 

로비 매니저의 업데이트문 변경점 입니다.

protected override void Update()
{
    base.Update();

    MaintainLobbyAlive();

    if (nowLobby != null && IsPlaying == false)
    {
        RefreshLobbyInfo();
    }
}

게임 진행중임을 확인하는 용도의 플래그 변수, IsPlaying 을 만들고, 해당 플래그가 true 일 경우, 로비 정보를 업데이트하지 않도록 변경해주었습니다.

 

MaintainLobbyAlive() 메서드의경우, UGS에서 로비를 유지할 수 있도록 25초마다 신호를 보내는 메서드이기 때문에, 게임 진행중에도 호출되어야하는 메서드이기 때문에 별도의 처리를 하지 않았습니다.

 


트러블슈팅

  • 로비UI 가 다시 불러와지지 않는 문제
    • 로비 UI 생성이 Start에서 진행된 후, 별도로 로비를 호출하지 않아서 발생하는 문제였습니다.
    • 별도로 메서드를 만들어준 뒤, 씬 로드가 끝나면 UI를 생성하도록 변경하여 해결해주었습니다.
  • 클라이언트의 로비 UI가 빈 상태인 문제
    • 기존 로비를 다시 불러오는 Update문의 조건문을 로비 데이터의 게임 키로 진행했었습니다. 그 결과로 호스트측에서 로비 데이터를 변경했지만, 클라이언트측이 로비 업데이트를 진행하지 않아서 변경된 데이터를 받지 못하고 로비 업데이트를 하지 않는 문제가 발생했습니다.
    • 별도의 플래그 변수로 로비 정보 업데이트 조건을 변경하여 해결하였습니다.
//문제 코드 : 클라이언트가 로비 정보를 받아오지 못하게됨
protected override void Update()
{
    base.Update();

    MaintainLobbyAlive();

    if (nowLobby != null && nowLobby.Data[networkKey.GameStartKey].Value == networkKey.ReadyKey)
    {
        RefreshLobbyInfo();
    }
}