본문 바로가기
게임 프로그래밍(C, C# ..)

[유니티 서버 연결하기] City Chat Practice(with Photon Pun2)_1 : 로비 만들기

by Luden59 2022. 9. 19.

포톤 서버를 이용하여 간단한 음성 채팅 프로젝트를 하겠다.

오늘은 그 첫 시작으로 로비를 만들었다.

<오늘 결과물>

220919_CityChatPractice_로비 완성본.mp4
3.26MB
오프닝 씬
로비 씬

<결과 요약>

처음 오프닝 씬에서 이름을 입력하여 로비로 들어간다.

로비에서는 현재 로비에 있는 방 리스트를 볼 수 있다.

방 리스트에서 참여하고 싶은 방의 버튼을 클릭하면 해당 방에 참여할 수 있다.

(*참여할 수 없는 방은 비활성화 되어 있다)

또는 자신이 원하는 방을 만들어 참여할 수 있다.

 

<어려웠던 점>

1. ScrollView의 Content 크기 조절하기

<문제 상황>

  • 로비 씬에서 방 리스트는 ScrollView로 만들어졌다. 해당 부분에 방 리스트는 동적으로 생성되는데, 이에 맞추어 ScrollView 내부의 Content의 크기를 조절하고 싶었다.
    (Content는 ScrollView에서 해당 ScrollView가 보여줄 내용물들이 들어있는 창이다. 이 크기에 따라 스크롤을 할 수 있거나 없게 만들어진다.)

<해결 방법>

  • Content에 다음과 같은 컴포넌트를 추가하여 해결하였다.
  • GridLayout으로 동적으로 추가된 방 리스트가 잘 자리잡게 해주었다.
  • Contents Size Fitter로 추가된 내용물에 따라 가로로 크기를 설정해주었다.

2. 방 리스트 가져오기

<문제 상황>

  • 로비에서 방 리스트를 가져와 보여주고 싶었다.

<해결 방안>

  • MonoBehaviourPunCallbacks의 OnRoomListUpdate를 사용하였다.
    (MonoBehaviourPunCallbacks는 Photon에서 제공하는 클래스로, 다양한 상황에서 사용할 수 있는 콜백함수들을 제공한다.)
  • 해당 함수로 방 리스트를 불러올 수 있었다.
  • 하지만 중요한 것은 해당 함수는 꼭 사용자가 로비에 접근하였을 때 실행이 되었기 때문에 다음과 같은 코드를 작성하게 되었다.
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
	// 받아온 방 리스트로 로비 화면 세팅하기
    setRoomList(roomList);
}

private void setRoomList(List<RoomInfo> roomList)
{
    Debug.Log(roomList);
    foreach(var roomInfo in roomList)
    {
        GameObject newRoomButton = Instantiate(RoomButtonPrefab, roomListScrollRect.content);
        Button button = newRoomButton.GetComponent<Button>();
        button.interactable = (roomInfo.PlayerCount < roomInfo.MaxPlayers);
        string roomName = roomInfo.Name;
        button.onClick.AddListener(() => JoinSelectedRoom(roomName));

        TextMeshProUGUI[] text = newRoomButton.GetComponentsInChildren<TextMeshProUGUI>();
        text[0].text = $"방 이름: {roomInfo.Name}";
        text[1].text = $"플레이어 수: {roomInfo.PlayerCount}/{roomInfo.MaxPlayers}";
    }
}
private void JoinSelectedRoom(string roomName)
{
    PhotonNetwork.JoinRoom(roomName, null);
}
private void showRoomPanel()
{
    setDeactiveStartButton("로비 접속 중입니다!");
    PhotonNetwork.JoinLobby(); //로비 접속하면 위의 코드가 실행됨
}

 

<마무리>

내일은 만들어진 메인에 연결할 인게임 씬을 손볼 예정이다.

역시 서버는 어렵당

 

<참고 링크>

해당 프로젝트 깃허브 링크: https://github.com/csy-59/2022_CityChatPractice_Personal

Photon Pun2 로비에서 방 리스트 연결하기 API: https://doc.photonengine.com/en-us/pun/v2/lobby-and-matchmaking/matchmaking-and-lobby